]>
Commit | Line | Data |
---|---|---|
290835f9 | 1 | /* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. |
9583bc14 EJ |
2 | * |
3 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
4 | * you may not use this file except in compliance with the License. | |
5 | * You may obtain a copy of the License at: | |
6 | * | |
7 | * http://www.apache.org/licenses/LICENSE-2.0 | |
8 | * | |
9 | * Unless required by applicable law or agreed to in writing, software | |
10 | * distributed under the License is distributed on an "AS IS" BASIS, | |
11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 | * See the License for the specific language governing permissions and | |
13 | * limitations under the License. */ | |
14 | ||
15 | #ifndef OFPROTO_DPIF_H | |
16 | #define OFPROTO_DPIF_H 1 | |
17 | ||
18 | #include <stdint.h> | |
19 | ||
003ce655 | 20 | #include "fail-open.h" |
9583bc14 | 21 | #include "hmapx.h" |
e1ec7dd4 | 22 | #include "odp-util.h" |
f4248336 | 23 | #include "openvswitch/ofp-util.h" |
9fbe253e | 24 | #include "ovs-thread.h" |
adcf00ba | 25 | #include "ofproto-provider.h" |
9583bc14 EJ |
26 | #include "timer.h" |
27 | #include "util.h" | |
ec89fc6f | 28 | #include "ovs-thread.h" |
9583bc14 | 29 | |
4ae48dcd SH |
30 | /* Priority for internal rules created to handle recirculation */ |
31 | #define RECIRC_RULE_PRIORITY 20 | |
32 | ||
9583bc14 | 33 | union user_action_cookie; |
70742c7f | 34 | struct dpif_flow_stats; |
f5374617 | 35 | struct ofproto; |
a2b53dec | 36 | struct ofproto_async_msg; |
46c88433 EJ |
37 | struct ofproto_dpif; |
38 | struct ofport_dpif; | |
8449c4d6 | 39 | struct dpif_backer; |
70742c7f | 40 | struct OVS_LOCKABLE rule_dpif; |
f4fb341b | 41 | struct OVS_LOCKABLE group_dpif; |
9583bc14 | 42 | |
0c7812e5 AW |
43 | /* Number of implemented OpenFlow tables. */ |
44 | enum { N_TABLES = 255 }; | |
45 | enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */ | |
46 | BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255); | |
47 | ||
e1ec7dd4 EJ |
48 | /* Ofproto-dpif -- DPIF based ofproto implementation. |
49 | * | |
50 | * Ofproto-dpif provides an ofproto implementation for those platforms which | |
51 | * implement the netdev and dpif interface defined in netdev.h and dpif.h. The | |
52 | * most important of which is the Linux Kernel Module (dpif-linux), but | |
53 | * alternatives are supported such as a userspace only implementation | |
54 | * (dpif-netdev), and a dummy implementation used for unit testing. | |
55 | * | |
56 | * Ofproto-dpif is divided into three major chunks. | |
57 | * | |
58 | * - ofproto-dpif.c | |
59 | * The main ofproto-dpif module is responsible for implementing the | |
60 | * provider interface, installing and removing datapath flows, maintaining | |
61 | * packet statistics, running protocols (BFD, LACP, STP, etc), and | |
62 | * configuring relevant submodules. | |
63 | * | |
64 | * - ofproto-dpif-upcall.c | |
65 | * Ofproto-dpif-upcall is responsible for retrieving upcalls from the kernel, | |
66 | * processing miss upcalls, and handing more complex ones up to the main | |
67 | * ofproto-dpif module. Miss upcall processing boils down to figuring out | |
68 | * what each packet's actions are, executing them (i.e. asking the kernel to | |
69 | * forward it), and handing it up to ofproto-dpif to decided whether or not | |
70 | * to install a kernel flow. | |
71 | * | |
72 | * - ofproto-dpif-xlate.c | |
cf9cf2e8 YT |
73 | * Ofproto-dpif-xlate is responsible for translating OpenFlow actions into |
74 | * datapath actions. */ | |
e1ec7dd4 | 75 | |
b440dd8c JS |
76 | /* Stores the various features which the corresponding backer supports. */ |
77 | struct dpif_backer_support { | |
78 | /* True if the datapath supports variable-length | |
79 | * OVS_USERSPACE_ATTR_USERDATA in OVS_ACTION_ATTR_USERSPACE actions. | |
80 | * False if the datapath supports only 8-byte (or shorter) userdata. */ | |
81 | bool variable_length_userdata; | |
82 | ||
b440dd8c JS |
83 | /* True if the datapath supports masked data in OVS_ACTION_ATTR_SET |
84 | * actions. */ | |
85 | bool masked_set_action; | |
86 | ||
b440dd8c JS |
87 | /* True if the datapath supports tnl_push and pop actions. */ |
88 | bool tnl_push_pop; | |
89 | ||
90 | /* True if the datapath supports OVS_FLOW_ATTR_UFID. */ | |
91 | bool ufid; | |
2494ccd7 | 92 | |
aaca4fe0 WT |
93 | /* True if the datapath supports OVS_ACTION_ATTR_TRUNC action. */ |
94 | bool trunc; | |
95 | ||
2494ccd7 JS |
96 | /* Each member represents support for related OVS_KEY_ATTR_* fields. */ |
97 | struct odp_support odp; | |
b440dd8c JS |
98 | }; |
99 | ||
2494ccd7 JS |
100 | bool ofproto_dpif_get_enable_ufid(const struct dpif_backer *backer); |
101 | struct dpif_backer_support *ofproto_dpif_get_support(const struct ofproto_dpif *); | |
8bfd0fda | 102 | |
44e0c35d | 103 | ovs_version_t ofproto_dpif_get_tables_version(struct ofproto_dpif *); |
621b8064 | 104 | |
34dd0d78 | 105 | struct rule_dpif *rule_dpif_lookup_from_table(struct ofproto_dpif *, |
44e0c35d | 106 | ovs_version_t, struct flow *, |
34dd0d78 | 107 | struct flow_wildcards *, |
34dd0d78 JR |
108 | const struct dpif_flow_stats *, |
109 | uint8_t *table_id, | |
110 | ofp_port_t in_port, | |
111 | bool may_packet_in, | |
112 | bool honor_table_miss); | |
70742c7f | 113 | |
003ce655 JR |
114 | static inline void rule_dpif_ref(struct rule_dpif *); |
115 | static inline void rule_dpif_unref(struct rule_dpif *); | |
70742c7f | 116 | |
cd1acaab SH |
117 | void rule_dpif_credit_stats(struct rule_dpif *rule , |
118 | const struct dpif_flow_stats *); | |
70742c7f | 119 | |
003ce655 JR |
120 | static inline bool rule_dpif_is_fail_open(const struct rule_dpif *); |
121 | static inline bool rule_dpif_is_table_miss(const struct rule_dpif *); | |
122 | static inline bool rule_dpif_is_internal(const struct rule_dpif *); | |
123 | ||
adcf00ba | 124 | uint8_t rule_dpif_get_table(const struct rule_dpif *); |
70742c7f | 125 | |
56c091ec SH |
126 | bool table_is_internal(uint8_t table_id); |
127 | ||
dc723c44 | 128 | const struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *); |
888ac0d7 | 129 | void rule_set_recirc_id(struct rule *, uint32_t id); |
ad3efdcb | 130 | |
70742c7f | 131 | ovs_be64 rule_dpif_get_flow_cookie(const struct rule_dpif *rule); |
9583bc14 | 132 | |
70742c7f EJ |
133 | void rule_dpif_reduce_timeouts(struct rule_dpif *rule, uint16_t idle_timeout, |
134 | uint16_t hard_timeout); | |
9583bc14 | 135 | |
1e684d7d RW |
136 | void group_dpif_credit_stats(struct group_dpif *, |
137 | struct ofputil_bucket *, | |
138 | const struct dpif_flow_stats *); | |
db88b35c | 139 | struct group_dpif *group_dpif_lookup(struct ofproto_dpif *ofproto, |
5d08a275 JR |
140 | uint32_t group_id, ovs_version_t version, |
141 | bool take_ref); | |
db88b35c | 142 | const struct ovs_list *group_dpif_get_buckets(const struct group_dpif *group); |
f4fb341b | 143 | |
f4fb341b | 144 | enum ofp11_group_type group_dpif_get_type(const struct group_dpif *group); |
7565c3e4 | 145 | const char *group_dpif_get_selection_method(const struct group_dpif *group); |
0c4b9393 SH |
146 | uint64_t group_dpif_get_selection_method_param(const struct group_dpif *group); |
147 | const struct field_array *group_dpif_get_fields(const struct group_dpif *group); | |
f4fb341b | 148 | |
419460f4 AW |
149 | int ofproto_dpif_execute_actions(struct ofproto_dpif *, const struct flow *, |
150 | struct rule_dpif *, const struct ofpact *, | |
cf62fa4c | 151 | size_t ofpacts_len, struct dp_packet *); |
cdd42eda JG |
152 | int ofproto_dpif_execute_actions__(struct ofproto_dpif *, const struct flow *, |
153 | struct rule_dpif *, const struct ofpact *, | |
9a9b001a | 154 | size_t ofpacts_len, int indentation, |
790c5d26 BP |
155 | int depth, int resubmits, |
156 | struct dp_packet *); | |
a2b53dec BP |
157 | void ofproto_dpif_send_async_msg(struct ofproto_dpif *, |
158 | struct ofproto_async_msg *); | |
6b83a3c5 | 159 | bool ofproto_dpif_wants_packet_in_on_miss(struct ofproto_dpif *); |
2eb79142 JG |
160 | int ofproto_dpif_send_packet(const struct ofport_dpif *, bool oam, |
161 | struct dp_packet *); | |
8be00367 JR |
162 | void ofproto_dpif_flow_mod(struct ofproto_dpif *, |
163 | const struct ofputil_flow_mod *); | |
1ebeaaa7 | 164 | struct rule_dpif *ofproto_dpif_refresh_rule(struct rule_dpif *); |
46c88433 | 165 | |
8449c4d6 | 166 | struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t); |
e672ff9b JR |
167 | struct ofport_dpif *ofp_port_to_ofport(const struct ofproto_dpif *, |
168 | ofp_port_t); | |
8449c4d6 | 169 | |
d997f23f ZK |
170 | bool ofproto_dpif_backer_enabled(struct dpif_backer* backer); |
171 | ||
adcf00ba | 172 | int ofproto_dpif_add_internal_flow(struct ofproto_dpif *, |
fe99c360 | 173 | const struct match *, int priority, |
290ad78a | 174 | uint16_t idle_timeout, |
adcf00ba AZ |
175 | const struct ofpbuf *ofpacts, |
176 | struct rule **rulep); | |
177 | int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *, | |
178 | int priority); | |
290835f9 BP |
179 | |
180 | const struct uuid *ofproto_dpif_get_uuid(const struct ofproto_dpif *); | |
003ce655 JR |
181 | \f |
182 | /* struct rule_dpif has struct rule as it's first member. */ | |
183 | #define RULE_CAST(RULE) ((struct rule *)RULE) | |
809c7548 RW |
184 | #define GROUP_CAST(GROUP) ((struct ofgroup *)GROUP) |
185 | ||
186 | static inline struct group_dpif* group_dpif_ref(struct group_dpif *group) | |
187 | { | |
188 | if (group) { | |
189 | ofproto_group_ref(GROUP_CAST(group)); | |
190 | } | |
191 | return group; | |
192 | } | |
193 | ||
194 | static inline void group_dpif_unref(struct group_dpif *group) | |
195 | { | |
196 | if (group) { | |
197 | ofproto_group_unref(GROUP_CAST(group)); | |
198 | } | |
199 | } | |
003ce655 JR |
200 | |
201 | static inline void rule_dpif_ref(struct rule_dpif *rule) | |
202 | { | |
203 | if (rule) { | |
204 | ofproto_rule_ref(RULE_CAST(rule)); | |
205 | } | |
206 | } | |
207 | ||
208 | static inline void rule_dpif_unref(struct rule_dpif *rule) | |
209 | { | |
210 | if (rule) { | |
211 | ofproto_rule_unref(RULE_CAST(rule)); | |
212 | } | |
213 | } | |
214 | ||
215 | static inline bool rule_dpif_is_fail_open(const struct rule_dpif *rule) | |
216 | { | |
217 | return is_fail_open_rule(RULE_CAST(rule)); | |
218 | } | |
219 | ||
220 | static inline bool rule_dpif_is_table_miss(const struct rule_dpif *rule) | |
221 | { | |
222 | return rule_is_table_miss(RULE_CAST(rule)); | |
223 | } | |
224 | ||
225 | /* Returns true if 'rule' is an internal rule, false otherwise. */ | |
226 | static inline bool rule_dpif_is_internal(const struct rule_dpif *rule) | |
227 | { | |
228 | return RULE_CAST(rule)->table_id == TBL_INTERNAL; | |
229 | } | |
230 | ||
231 | #undef RULE_CAST | |
232 | ||
a36de779 | 233 | bool ovs_native_tunneling_is_on(struct ofproto_dpif *ofproto); |
9583bc14 | 234 | #endif /* ofproto-dpif.h */ |