]>
Commit | Line | Data |
---|---|---|
535e3acf | 1 | /* Copyright (c) 2009-2017 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 | ||
07a3cd5c | 18 | /* ofproto-dpif -- DPIF based ofproto implementation. |
e1ec7dd4 | 19 | * |
07a3cd5c | 20 | * ofproto-dpif provides an ofproto implementation for those platforms which |
e1ec7dd4 EJ |
21 | * implement the netdev and dpif interface defined in netdev.h and dpif.h. The |
22 | * most important of which is the Linux Kernel Module (dpif-linux), but | |
23 | * alternatives are supported such as a userspace only implementation | |
24 | * (dpif-netdev), and a dummy implementation used for unit testing. | |
25 | * | |
07a3cd5c | 26 | * ofproto-dpif is divided into three major chunks. |
e1ec7dd4 EJ |
27 | * |
28 | * - ofproto-dpif.c | |
29 | * The main ofproto-dpif module is responsible for implementing the | |
30 | * provider interface, installing and removing datapath flows, maintaining | |
31 | * packet statistics, running protocols (BFD, LACP, STP, etc), and | |
32 | * configuring relevant submodules. | |
33 | * | |
34 | * - ofproto-dpif-upcall.c | |
07a3cd5c | 35 | * ofproto-dpif-upcall is responsible for retrieving upcalls from the kernel, |
e1ec7dd4 EJ |
36 | * processing miss upcalls, and handing more complex ones up to the main |
37 | * ofproto-dpif module. Miss upcall processing boils down to figuring out | |
38 | * what each packet's actions are, executing them (i.e. asking the kernel to | |
39 | * forward it), and handing it up to ofproto-dpif to decided whether or not | |
40 | * to install a kernel flow. | |
41 | * | |
42 | * - ofproto-dpif-xlate.c | |
07a3cd5c BP |
43 | * ofproto-dpif-xlate is responsible for translating OpenFlow actions into |
44 | * datapath actions. | |
45 | */ | |
46 | ||
47 | #include <stdint.h> | |
48 | ||
49 | #include "dpif.h" | |
50 | #include "fail-open.h" | |
51 | #include "hmapx.h" | |
52 | #include "odp-util.h" | |
53 | #include "openvswitch/ofp-util.h" | |
333ad77d | 54 | #include "id-pool.h" |
07a3cd5c BP |
55 | #include "ovs-thread.h" |
56 | #include "ofproto-provider.h" | |
57 | #include "util.h" | |
58 | #include "ovs-thread.h" | |
59 | ||
60 | struct dpif_flow_stats; | |
61 | struct ofproto_async_msg; | |
62 | struct ofproto_dpif; | |
911b4a7e | 63 | struct uuid; |
07a3cd5c BP |
64 | struct xlate_cache; |
65 | ||
66 | /* Number of implemented OpenFlow tables. */ | |
67 | enum { N_TABLES = 255 }; | |
68 | enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */ | |
69 | BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255); | |
70 | ||
71 | struct rule_dpif { | |
72 | struct rule up; | |
73 | ||
74 | /* These statistics: | |
75 | * | |
76 | * - Do include packets and bytes from datapath flows which have not | |
77 | * recently been processed by a revalidator. */ | |
78 | struct ovs_mutex stats_mutex; | |
79 | struct dpif_flow_stats stats OVS_GUARDED; | |
80 | ||
81 | /* In non-NULL, will point to a new rule (for which a reference is held) to | |
82 | * which all the stats updates should be forwarded. This exists only | |
83 | * transitionally when flows are replaced. | |
84 | * | |
85 | * Protected by stats_mutex. If both 'rule->stats_mutex' and | |
86 | * 'rule->new_rule->stats_mutex' must be held together, acquire them in that | |
87 | * order, */ | |
88 | struct rule_dpif *new_rule OVS_GUARDED; | |
89 | bool forward_counts OVS_GUARDED; /* Forward counts? 'used' time will be | |
90 | * forwarded in all cases. */ | |
91 | ||
92 | /* If non-zero then the recirculation id that has | |
93 | * been allocated for use with this rule. | |
94 | * The recirculation id and associated internal flow should | |
95 | * be freed when the rule is freed */ | |
96 | uint32_t recirc_id; | |
97 | }; | |
98 | ||
99 | struct rule_dpif *rule_dpif_lookup_from_table(struct ofproto_dpif *, | |
100 | ovs_version_t, struct flow *, | |
101 | struct flow_wildcards *, | |
102 | const struct dpif_flow_stats *, | |
103 | uint8_t *table_id, | |
104 | ofp_port_t in_port, | |
105 | bool may_packet_in, | |
106 | bool honor_table_miss, | |
107 | struct xlate_cache *); | |
108 | ||
109 | void rule_dpif_credit_stats(struct rule_dpif *, | |
110 | const struct dpif_flow_stats *); | |
111 | ||
112 | void rule_set_recirc_id(struct rule *, uint32_t id); | |
113 | ||
114 | /* Returns true if 'rule' is an internal rule, false otherwise. */ | |
115 | static inline bool | |
116 | rule_dpif_is_internal(const struct rule_dpif *rule) | |
117 | { | |
118 | return rule->up.table_id == TBL_INTERNAL; | |
119 | } | |
120 | \f | |
121 | /* Groups. */ | |
122 | ||
123 | struct group_dpif { | |
124 | struct ofgroup up; | |
125 | ||
126 | /* These statistics: | |
127 | * | |
128 | * - Do include packets and bytes from datapath flows which have not | |
129 | * recently been processed by a revalidator. */ | |
130 | struct ovs_mutex stats_mutex; | |
131 | uint64_t packet_count OVS_GUARDED; /* Number of packets received. */ | |
132 | uint64_t byte_count OVS_GUARDED; /* Number of bytes received. */ | |
133 | }; | |
134 | ||
135 | void group_dpif_credit_stats(struct group_dpif *, | |
136 | struct ofputil_bucket *, | |
137 | const struct dpif_flow_stats *); | |
138 | struct group_dpif *group_dpif_lookup(struct ofproto_dpif *, | |
139 | uint32_t group_id, ovs_version_t version, | |
140 | bool take_ref); | |
141 | \f | |
142 | /* Backers. | |
143 | * | |
144 | * A "backer" is the datapath (dpif) on which an dpif-based bridge (an | |
145 | * ofproto-dpif) resides. A backer can host several bridges, but a bridge is | |
146 | * backed by only a single dpif. */ | |
e1ec7dd4 | 147 | |
b440dd8c | 148 | |
1c2f091b AZ |
149 | /* DPIF_SUPPORT_FIELD(TYPE, FIELD_NAME, FIELD_DESCRIPTION) |
150 | * | |
151 | * Each 'DPIF_SUPPORT_FIELD' defines a member in 'struct dpif_backer_support' | |
152 | * and represents support for a datapath action. | |
153 | * They are defined as macros to keep 'dpif_show_support()' in sync | |
154 | * as new fields are added. */ | |
155 | #define DPIF_SUPPORT_FIELDS \ | |
1c2f091b AZ |
156 | /* True if the datapath supports masked data in OVS_ACTION_ATTR_SET \ |
157 | * actions. */ \ | |
158 | DPIF_SUPPORT_FIELD(bool, masked_set_action, "Masked set action") \ | |
159 | \ | |
160 | /* True if the datapath supports tnl_push and pop actions. */ \ | |
161 | DPIF_SUPPORT_FIELD(bool, tnl_push_pop, "Tunnel push pop") \ | |
162 | \ | |
163 | /* True if the datapath supports OVS_FLOW_ATTR_UFID. */ \ | |
164 | DPIF_SUPPORT_FIELD(bool, ufid, "Ufid") \ | |
165 | \ | |
166 | /* True if the datapath supports OVS_ACTION_ATTR_TRUNC action. */ \ | |
167 | DPIF_SUPPORT_FIELD(bool, trunc, "Truncate action") \ | |
168 | \ | |
169 | /* True if the datapath supports OVS_ACTION_ATTR_CLONE action. */ \ | |
170 | DPIF_SUPPORT_FIELD(bool, clone, "Clone action") \ | |
171 | \ | |
172 | /* Maximum level of nesting allowed by OVS_ACTION_ATTR_SAMPLE action. */\ | |
adfe7a0b JR |
173 | DPIF_SUPPORT_FIELD(size_t, sample_nesting, "Sample nesting") \ |
174 | \ | |
175 | /* OVS_CT_ATTR_EVENTMASK supported by OVS_ACTION_ATTR_CT action. */ \ | |
176 | DPIF_SUPPORT_FIELD(bool, ct_eventmask, "Conntrack eventmask") | |
2494ccd7 | 177 | |
1c2f091b AZ |
178 | /* Stores the various features which the corresponding backer supports. */ |
179 | struct dpif_backer_support { | |
180 | #define DPIF_SUPPORT_FIELD(TYPE, NAME, TITLE) TYPE NAME; | |
181 | DPIF_SUPPORT_FIELDS | |
182 | #undef DPIF_SUPPORT_FIELD | |
aaca4fe0 | 183 | |
2494ccd7 JS |
184 | /* Each member represents support for related OVS_KEY_ATTR_* fields. */ |
185 | struct odp_support odp; | |
b440dd8c JS |
186 | }; |
187 | ||
07a3cd5c BP |
188 | /* Reasons that we might need to revalidate every datapath flow, and |
189 | * corresponding coverage counters. | |
190 | * | |
191 | * A value of 0 means that there is no need to revalidate. | |
192 | * | |
193 | * It would be nice to have some cleaner way to integrate with coverage | |
194 | * counters, but with only a few reasons I guess this is good enough for | |
195 | * now. */ | |
196 | enum revalidate_reason { | |
197 | REV_RECONFIGURE = 1, /* Switch configuration changed. */ | |
198 | REV_STP, /* Spanning tree protocol port status change. */ | |
199 | REV_RSTP, /* RSTP port status change. */ | |
200 | REV_BOND, /* Bonding changed. */ | |
201 | REV_PORT_TOGGLED, /* Port enabled or disabled by CFM, LACP, ...*/ | |
202 | REV_FLOW_TABLE, /* Flow table changed. */ | |
203 | REV_MAC_LEARNING, /* Mac learning changed. */ | |
204 | REV_MCAST_SNOOPING, /* Multicast snooping changed. */ | |
205 | }; | |
621b8064 | 206 | |
07a3cd5c BP |
207 | /* All datapaths of a given type share a single dpif backer instance. */ |
208 | struct dpif_backer { | |
209 | char *type; | |
210 | int refcount; | |
211 | struct dpif *dpif; | |
212 | struct udpif *udpif; | |
a027899e | 213 | |
07a3cd5c BP |
214 | struct ovs_rwlock odp_to_ofport_lock; |
215 | struct hmap odp_to_ofport_map OVS_GUARDED; /* Contains "struct ofport"s. */ | |
a027899e | 216 | |
07a3cd5c | 217 | struct simap tnl_backers; /* Set of dpif ports backing tunnels. */ |
70742c7f | 218 | |
07a3cd5c | 219 | enum revalidate_reason need_revalidate; /* Revalidate all flows. */ |
70742c7f | 220 | |
07a3cd5c | 221 | bool recv_set_enable; /* Enables or disables receiving packets. */ |
70742c7f | 222 | |
333ad77d AZ |
223 | /* Meter. */ |
224 | struct id_pool *meter_ids; /* Datapath meter allocation. */ | |
225 | ||
07a3cd5c BP |
226 | /* Version string of the datapath stored in OVSDB. */ |
227 | char *dp_version_string; | |
003ce655 | 228 | |
07a3cd5c | 229 | /* Datapath feature support. */ |
88186383 AZ |
230 | struct dpif_backer_support bt_support; /* Boot time support. Set once |
231 | when vswitch starts up, then | |
232 | it is read only through out | |
233 | the life time of vswitchd. */ | |
234 | struct dpif_backer_support rt_support; /* Runtime support. Can be | |
235 | set to a lower level in | |
236 | feature than 'bt_support'. */ | |
237 | ||
07a3cd5c BP |
238 | struct atomic_count tnl_count; |
239 | }; | |
70742c7f | 240 | |
07a3cd5c BP |
241 | /* All existing ofproto_backer instances, indexed by ofproto->up.type. */ |
242 | extern struct shash all_dpif_backers; | |
56c091ec | 243 | |
07a3cd5c BP |
244 | struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t); |
245 | \f | |
246 | /* A bridge based on a "dpif" datapath. */ | |
247 | ||
248 | struct ofproto_dpif { | |
911b4a7e JP |
249 | /* In 'all_ofproto_dpifs_by_name'. */ |
250 | struct hmap_node all_ofproto_dpifs_by_name_node; | |
251 | ||
252 | /* In 'all_ofproto_dpifs_by_uuid'. */ | |
253 | struct hmap_node all_ofproto_dpifs_by_uuid_node; | |
254 | ||
07a3cd5c BP |
255 | struct ofproto up; |
256 | struct dpif_backer *backer; | |
257 | ||
258 | /* Unique identifier for this instantiation of this bridge in this running | |
259 | * process. */ | |
260 | struct uuid uuid; | |
261 | ||
262 | ATOMIC(ovs_version_t) tables_version; /* For classifier lookups. */ | |
263 | ||
264 | uint64_t dump_seq; /* Last read of udpif_dump_seq(). */ | |
265 | ||
266 | /* Special OpenFlow rules. */ | |
267 | struct rule_dpif *miss_rule; /* Sends flow table misses to controller. */ | |
268 | struct rule_dpif *no_packet_in_rule; /* Drops flow table misses. */ | |
269 | struct rule_dpif *drop_frags_rule; /* Used in OFPUTIL_FRAG_DROP mode. */ | |
270 | ||
271 | /* Bridging. */ | |
272 | struct netflow *netflow; | |
273 | struct dpif_sflow *sflow; | |
274 | struct dpif_ipfix *ipfix; | |
275 | struct hmap bundles; /* Contains "struct ofbundle"s. */ | |
276 | struct mac_learning *ml; | |
277 | struct mcast_snooping *ms; | |
278 | bool has_bonded_bundles; | |
279 | bool lacp_enabled; | |
280 | struct mbridge *mbridge; | |
281 | ||
282 | struct ovs_mutex stats_mutex; | |
283 | struct netdev_stats stats OVS_GUARDED; /* To account packets generated and | |
284 | * consumed in userspace. */ | |
285 | ||
286 | /* Spanning tree. */ | |
287 | struct stp *stp; | |
288 | long long int stp_last_tick; | |
289 | ||
290 | /* Rapid Spanning Tree. */ | |
291 | struct rstp *rstp; | |
292 | long long int rstp_last_tick; | |
293 | ||
294 | /* Ports. */ | |
295 | struct sset ports; /* Set of standard port names. */ | |
296 | struct sset ghost_ports; /* Ports with no datapath port. */ | |
297 | struct sset port_poll_set; /* Queued names for port_poll() reply. */ | |
298 | int port_poll_errno; /* Last errno for port_poll() reply. */ | |
299 | uint64_t change_seq; /* Connectivity status changes. */ | |
300 | ||
301 | /* Work queues. */ | |
302 | struct guarded_list ams; /* Contains "struct ofproto_async_msgs"s. */ | |
303 | struct seq *ams_seq; /* For notifying 'ams' reception. */ | |
304 | uint64_t ams_seqno; | |
305 | }; | |
ad3efdcb | 306 | |
911b4a7e JP |
307 | struct ofproto_dpif *ofproto_dpif_lookup_by_name(const char *name); |
308 | struct ofproto_dpif *ofproto_dpif_lookup_by_uuid(const struct uuid *uuid); | |
d13ee228 | 309 | |
07a3cd5c | 310 | ovs_version_t ofproto_dpif_get_tables_version(struct ofproto_dpif *); |
9583bc14 | 311 | |
07a3cd5c BP |
312 | void ofproto_dpif_credit_table_stats(struct ofproto_dpif *, uint8_t table_id, |
313 | uint64_t n_matches, uint64_t n_misses); | |
f4fb341b | 314 | |
1f4a8933 JR |
315 | int ofproto_dpif_execute_actions(struct ofproto_dpif *, ovs_version_t, |
316 | const struct flow *, struct rule_dpif *, | |
317 | const struct ofpact *, size_t ofpacts_len, | |
318 | struct dp_packet *); | |
319 | int ofproto_dpif_execute_actions__(struct ofproto_dpif *, ovs_version_t, | |
320 | const struct flow *, struct rule_dpif *, | |
321 | const struct ofpact *, size_t ofpacts_len, | |
2d9b49dd | 322 | int depth, int resubmits, |
790c5d26 | 323 | struct dp_packet *); |
a2b53dec BP |
324 | void ofproto_dpif_send_async_msg(struct ofproto_dpif *, |
325 | struct ofproto_async_msg *); | |
2eb79142 JG |
326 | int ofproto_dpif_send_packet(const struct ofport_dpif *, bool oam, |
327 | struct dp_packet *); | |
07a3cd5c BP |
328 | enum ofperr ofproto_dpif_flow_mod_init_for_learn( |
329 | struct ofproto_dpif *, const struct ofputil_flow_mod *, | |
330 | struct ofproto_flow_mod *); | |
46c88433 | 331 | |
e672ff9b JR |
332 | struct ofport_dpif *ofp_port_to_ofport(const struct ofproto_dpif *, |
333 | ofp_port_t); | |
8449c4d6 | 334 | |
adcf00ba | 335 | int ofproto_dpif_add_internal_flow(struct ofproto_dpif *, |
fe99c360 | 336 | const struct match *, int priority, |
290ad78a | 337 | uint16_t idle_timeout, |
adcf00ba AZ |
338 | const struct ofpbuf *ofpacts, |
339 | struct rule **rulep); | |
340 | int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *, | |
341 | int priority); | |
290835f9 | 342 | |
07a3cd5c | 343 | bool ovs_native_tunneling_is_on(struct ofproto_dpif *); |
003ce655 | 344 | |
9583bc14 | 345 | #endif /* ofproto-dpif.h */ |