1 /* Copyright (c) 2009-2017 Nicira, Inc.
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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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. */
15 #ifndef OFPROTO_DPIF_H
16 #define OFPROTO_DPIF_H 1
18 /* ofproto-dpif -- DPIF based ofproto implementation.
20 * ofproto-dpif provides an ofproto implementation for those platforms which
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.
26 * ofproto-dpif is divided into three major chunks.
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.
34 * - ofproto-dpif-upcall.c
35 * ofproto-dpif-upcall is responsible for retrieving upcalls from the kernel,
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.
42 * - ofproto-dpif-xlate.c
43 * ofproto-dpif-xlate is responsible for translating OpenFlow actions into
50 #include "fail-open.h"
53 #include "openvswitch/ofp-util.h"
55 #include "ovs-thread.h"
56 #include "ofproto-provider.h"
58 #include "ovs-thread.h"
60 struct dpif_flow_stats
;
61 struct ofproto_async_msg
;
65 /* Number of implemented OpenFlow tables. */
66 enum { N_TABLES
= 255 };
67 enum { TBL_INTERNAL
= N_TABLES
- 1 }; /* Used for internal hidden rules. */
68 BUILD_ASSERT_DECL(N_TABLES
>= 2 && N_TABLES
<= 255);
75 * - Do include packets and bytes from datapath flows which have not
76 * recently been processed by a revalidator. */
77 struct ovs_mutex stats_mutex
;
78 struct dpif_flow_stats stats OVS_GUARDED
;
80 /* In non-NULL, will point to a new rule (for which a reference is held) to
81 * which all the stats updates should be forwarded. This exists only
82 * transitionally when flows are replaced.
84 * Protected by stats_mutex. If both 'rule->stats_mutex' and
85 * 'rule->new_rule->stats_mutex' must be held together, acquire them in that
87 struct rule_dpif
*new_rule OVS_GUARDED
;
88 bool forward_counts OVS_GUARDED
; /* Forward counts? 'used' time will be
89 * forwarded in all cases. */
91 /* If non-zero then the recirculation id that has
92 * been allocated for use with this rule.
93 * The recirculation id and associated internal flow should
94 * be freed when the rule is freed */
98 struct rule_dpif
*rule_dpif_lookup_from_table(struct ofproto_dpif
*,
99 ovs_version_t
, struct flow
*,
100 struct flow_wildcards
*,
101 const struct dpif_flow_stats
*,
105 bool honor_table_miss
,
106 struct xlate_cache
*);
108 void rule_dpif_credit_stats(struct rule_dpif
*,
109 const struct dpif_flow_stats
*);
111 void rule_set_recirc_id(struct rule
*, uint32_t id
);
113 /* Returns true if 'rule' is an internal rule, false otherwise. */
115 rule_dpif_is_internal(const struct rule_dpif
*rule
)
117 return rule
->up
.table_id
== TBL_INTERNAL
;
127 * - Do include packets and bytes from datapath flows which have not
128 * recently been processed by a revalidator. */
129 struct ovs_mutex stats_mutex
;
130 uint64_t packet_count OVS_GUARDED
; /* Number of packets received. */
131 uint64_t byte_count OVS_GUARDED
; /* Number of bytes received. */
134 void group_dpif_credit_stats(struct group_dpif
*,
135 struct ofputil_bucket
*,
136 const struct dpif_flow_stats
*);
137 struct group_dpif
*group_dpif_lookup(struct ofproto_dpif
*,
138 uint32_t group_id
, ovs_version_t version
,
143 * A "backer" is the datapath (dpif) on which an dpif-based bridge (an
144 * ofproto-dpif) resides. A backer can host several bridges, but a bridge is
145 * backed by only a single dpif. */
148 /* DPIF_SUPPORT_FIELD(TYPE, FIELD_NAME, FIELD_DESCRIPTION)
150 * Each 'DPIF_SUPPORT_FIELD' defines a member in 'struct dpif_backer_support'
151 * and represents support for a datapath action.
152 * They are defined as macros to keep 'dpif_show_support()' in sync
153 * as new fields are added. */
154 #define DPIF_SUPPORT_FIELDS \
155 /* True if the datapath supports variable-length \
156 * OVS_USERSPACE_ATTR_USERDATA in OVS_ACTION_ATTR_USERSPACE actions. \
157 * False if the datapath supports only 8-byte (or shorter) userdata. */ \
158 DPIF_SUPPORT_FIELD(bool, variable_length_userdata, \
159 "Variable length userdata") \
161 /* True if the datapath supports masked data in OVS_ACTION_ATTR_SET \
163 DPIF_SUPPORT_FIELD(bool, masked_set_action, "Masked set action") \
165 /* True if the datapath supports tnl_push and pop actions. */ \
166 DPIF_SUPPORT_FIELD(bool, tnl_push_pop, "Tunnel push pop") \
168 /* True if the datapath supports OVS_FLOW_ATTR_UFID. */ \
169 DPIF_SUPPORT_FIELD(bool, ufid, "Ufid") \
171 /* True if the datapath supports OVS_ACTION_ATTR_TRUNC action. */ \
172 DPIF_SUPPORT_FIELD(bool, trunc, "Truncate action") \
174 /* True if the datapath supports OVS_ACTION_ATTR_CLONE action. */ \
175 DPIF_SUPPORT_FIELD(bool, clone, "Clone action") \
177 /* Maximum level of nesting allowed by OVS_ACTION_ATTR_SAMPLE action. */\
178 DPIF_SUPPORT_FIELD(size_t, sample_nesting, "Sample nesting") \
180 /* OVS_CT_ATTR_EVENTMASK supported by OVS_ACTION_ATTR_CT action. */ \
181 DPIF_SUPPORT_FIELD(bool, ct_eventmask, "Conntrack eventmask")
183 /* Stores the various features which the corresponding backer supports. */
184 struct dpif_backer_support
{
185 #define DPIF_SUPPORT_FIELD(TYPE, NAME, TITLE) TYPE NAME;
187 #undef DPIF_SUPPORT_FIELD
189 /* Each member represents support for related OVS_KEY_ATTR_* fields. */
190 struct odp_support odp
;
193 /* Reasons that we might need to revalidate every datapath flow, and
194 * corresponding coverage counters.
196 * A value of 0 means that there is no need to revalidate.
198 * It would be nice to have some cleaner way to integrate with coverage
199 * counters, but with only a few reasons I guess this is good enough for
201 enum revalidate_reason
{
202 REV_RECONFIGURE
= 1, /* Switch configuration changed. */
203 REV_STP
, /* Spanning tree protocol port status change. */
204 REV_RSTP
, /* RSTP port status change. */
205 REV_BOND
, /* Bonding changed. */
206 REV_PORT_TOGGLED
, /* Port enabled or disabled by CFM, LACP, ...*/
207 REV_FLOW_TABLE
, /* Flow table changed. */
208 REV_MAC_LEARNING
, /* Mac learning changed. */
209 REV_MCAST_SNOOPING
, /* Multicast snooping changed. */
212 /* All datapaths of a given type share a single dpif backer instance. */
219 struct ovs_rwlock odp_to_ofport_lock
;
220 struct hmap odp_to_ofport_map OVS_GUARDED
; /* Contains "struct ofport"s. */
222 struct simap tnl_backers
; /* Set of dpif ports backing tunnels. */
224 enum revalidate_reason need_revalidate
; /* Revalidate all flows. */
226 bool recv_set_enable
; /* Enables or disables receiving packets. */
229 struct id_pool
*meter_ids
; /* Datapath meter allocation. */
231 /* Version string of the datapath stored in OVSDB. */
232 char *dp_version_string
;
234 /* Datapath feature support. */
235 struct dpif_backer_support bt_support
; /* Boot time support. Set once
236 when vswitch starts up, then
237 it is read only through out
238 the life time of vswitchd. */
239 struct dpif_backer_support rt_support
; /* Runtime support. Can be
240 set to a lower level in
241 feature than 'bt_support'. */
243 struct atomic_count tnl_count
;
246 /* All existing ofproto_backer instances, indexed by ofproto->up.type. */
247 extern struct shash all_dpif_backers
;
249 struct ofport_dpif
*odp_port_to_ofport(const struct dpif_backer
*, odp_port_t
);
251 /* A bridge based on a "dpif" datapath. */
253 struct ofproto_dpif
{
254 struct hmap_node all_ofproto_dpifs_node
; /* In 'all_ofproto_dpifs'. */
256 struct dpif_backer
*backer
;
258 /* Unique identifier for this instantiation of this bridge in this running
262 ATOMIC(ovs_version_t
) tables_version
; /* For classifier lookups. */
264 uint64_t dump_seq
; /* Last read of udpif_dump_seq(). */
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. */
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
;
280 struct mbridge
*mbridge
;
282 struct ovs_mutex stats_mutex
;
283 struct netdev_stats stats OVS_GUARDED
; /* To account packets generated and
284 * consumed in userspace. */
288 long long int stp_last_tick
;
290 /* Rapid Spanning Tree. */
292 long long int rstp_last_tick
;
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. */
302 struct guarded_list ams
; /* Contains "struct ofproto_async_msgs"s. */
303 struct seq
*ams_seq
; /* For notifying 'ams' reception. */
307 /* All existing ofproto_dpif instances, indexed by ->up.name. */
308 extern struct hmap all_ofproto_dpifs
;
310 struct ofproto_dpif
*ofproto_dpif_lookup(const char *name
);
312 ovs_version_t
ofproto_dpif_get_tables_version(struct ofproto_dpif
*);
314 void ofproto_dpif_credit_table_stats(struct ofproto_dpif
*, uint8_t table_id
,
315 uint64_t n_matches
, uint64_t n_misses
);
317 int ofproto_dpif_execute_actions(struct ofproto_dpif
*, ovs_version_t
,
318 const struct flow
*, struct rule_dpif
*,
319 const struct ofpact
*, size_t ofpacts_len
,
321 int ofproto_dpif_execute_actions__(struct ofproto_dpif
*, ovs_version_t
,
322 const struct flow
*, struct rule_dpif
*,
323 const struct ofpact
*, size_t ofpacts_len
,
324 int depth
, int resubmits
,
326 void ofproto_dpif_send_async_msg(struct ofproto_dpif
*,
327 struct ofproto_async_msg
*);
328 int ofproto_dpif_send_packet(const struct ofport_dpif
*, bool oam
,
330 enum ofperr
ofproto_dpif_flow_mod_init_for_learn(
331 struct ofproto_dpif
*, const struct ofputil_flow_mod
*,
332 struct ofproto_flow_mod
*);
334 struct ofport_dpif
*ofp_port_to_ofport(const struct ofproto_dpif
*,
337 int ofproto_dpif_add_internal_flow(struct ofproto_dpif
*,
338 const struct match
*, int priority
,
339 uint16_t idle_timeout
,
340 const struct ofpbuf
*ofpacts
,
341 struct rule
**rulep
);
342 int ofproto_dpif_delete_internal_flow(struct ofproto_dpif
*, struct match
*,
345 bool ovs_native_tunneling_is_on(struct ofproto_dpif
*);
347 #endif /* ofproto-dpif.h */