1 /* Copyright (c) 2009, 2010, 2011, 2012, 2013 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
21 #include "ofproto/ofproto-provider.h"
26 union user_action_cookie;
28 /* Number of implemented OpenFlow tables. */
29 enum { N_TABLES = 255 };
30 enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */
31 BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255);
38 * - Do include packets and bytes from facets that have been deleted or
39 * whose own statistics have been folded into the rule.
41 * - Do include packets and bytes sent "by hand" that were accounted to
42 * the rule without any facet being involved (this is a rare corner
43 * case in rule_execute()).
45 * - Do not include packet or bytes that can be obtained from any facet's
46 * packet_count or byte_count member or that can be obtained from the
47 * datapath by, e.g., dpif_flow_get() for any subfacet.
49 uint64_t packet_count; /* Number of packets received. */
50 uint64_t byte_count; /* Number of bytes received. */
52 tag_type tag; /* Caches rule_calculate_tag() result. */
54 struct list facets; /* List of "struct facet"s. */
57 /* Extra information about a classifier table.
58 * Currently used just for optimized flow revalidation. */
60 /* If either of these is nonnull, then this table has a form that allows
61 * flows to be tagged to avoid revalidating most flows for the most common
62 * kinds of flow table changes. */
63 struct cls_table *catchall_table; /* Table that wildcards all fields. */
64 struct cls_table *other_table; /* Table with any other wildcard set. */
65 uint32_t basis; /* Keeps each table's tags separate. */
69 struct hmap_node all_ofproto_dpifs_node; /* In 'all_ofproto_dpifs'. */
71 struct dpif_backer *backer;
73 /* Special OpenFlow rules. */
74 struct rule_dpif *miss_rule; /* Sends flow table misses to controller. */
75 struct rule_dpif *no_packet_in_rule; /* Drops flow table misses. */
76 struct rule_dpif *drop_frags_rule; /* Used in OFPC_FRAG_DROP mode. */
79 struct netflow *netflow;
80 struct dpif_sflow *sflow;
81 struct dpif_ipfix *ipfix;
82 struct hmap bundles; /* Contains "struct ofbundle"s. */
83 struct mac_learning *ml;
84 bool has_bonded_bundles;
85 struct mbridge *mbridge;
88 struct classifier facets; /* Contains 'struct facet's. */
89 long long int consistency_rl;
92 struct table_dpif tables[N_TABLES];
94 /* Support for debugging async flow mods. */
95 struct list completions;
97 struct netdev_stats stats; /* To account packets generated and consumed in
102 long long int stp_last_tick;
104 /* VLAN splinters. */
105 struct hmap realdev_vid_map; /* (realdev,vid) -> vlandev. */
106 struct hmap vlandev_map; /* vlandev -> (realdev,vid). */
109 struct sset ports; /* Set of standard port names. */
110 struct sset ghost_ports; /* Ports with no datapath port. */
111 struct sset port_poll_set; /* Queued names for port_poll() reply. */
112 int port_poll_errno; /* Last errno for port_poll() reply. */
114 /* Per ofproto's dpif stats. */
120 struct hmap_node odp_port_node; /* In dpif_backer's "odp_to_ofport_map". */
124 struct ofbundle *bundle; /* Bundle that contains this port, if any. */
125 struct list bundle_node; /* In struct ofbundle's "ports" list. */
126 struct cfm *cfm; /* Connectivity Fault Management, if any. */
127 struct bfd *bfd; /* BFD, if any. */
128 tag_type tag; /* Tag associated with this port. */
129 bool may_enable; /* May be enabled in bonds. */
130 bool is_tunnel; /* This port is a tunnel. */
131 long long int carrier_seq; /* Carrier status changes. */
132 struct ofport_dpif *peer; /* Peer if patch port. */
135 struct stp_port *stp_port; /* Spanning Tree Protocol, if any. */
136 enum stp_state stp_state; /* Always STP_DISABLED if STP not in use. */
137 long long int stp_state_entered;
139 struct hmap priorities; /* Map of attached 'priority_to_dscp's. */
141 /* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
143 * This is deprecated. It is only for compatibility with broken device
144 * drivers in old versions of Linux that do not properly support VLANs when
145 * VLAN devices are not used. When broken device drivers are no longer in
146 * widespread use, we will delete these interfaces. */
147 ofp_port_t realdev_ofp_port;
152 struct hmap_node hmap_node; /* In struct ofproto's "bundles" hmap. */
153 struct ofproto_dpif *ofproto; /* Owning ofproto. */
154 void *aux; /* Key supplied by ofproto's client. */
155 char *name; /* Identifier for log messages. */
158 struct list ports; /* Contains "struct ofport"s. */
159 enum port_vlan_mode vlan_mode; /* VLAN mode */
160 int vlan; /* -1=trunk port, else a 12-bit VLAN ID. */
161 unsigned long *trunks; /* Bitmap of trunked VLANs, if 'vlan' == -1.
162 * NULL if all VLANs are trunked. */
163 struct lacp *lacp; /* LACP if LACP is enabled, otherwise NULL. */
164 struct bond *bond; /* Nonnull iff more than one port. */
165 bool use_priority_tags; /* Use 802.1p tag for frames in VLAN 0? */
168 bool floodable; /* True if no port has OFPUTIL_PC_NO_FLOOD set. */
171 static inline struct rule_dpif *rule_dpif_cast(const struct rule *rule)
173 return rule ? CONTAINER_OF(rule, struct rule_dpif, up) : NULL;
176 static inline struct ofproto_dpif *
177 ofproto_dpif_cast(const struct ofproto *ofproto)
179 ovs_assert(ofproto->ofproto_class == &ofproto_dpif_class);
180 return CONTAINER_OF(ofproto, struct ofproto_dpif, up);
183 static inline struct ofport_dpif *
184 ofbundle_get_a_port(const struct ofbundle *bundle)
186 return CONTAINER_OF(list_front(&bundle->ports), struct ofport_dpif,
190 struct ofport_dpif *get_ofp_port(const struct ofproto_dpif *,
191 ofp_port_t ofp_port);
193 struct ofport_dpif *get_odp_port(const struct ofproto_dpif *,
194 odp_port_t odp_port);
196 odp_port_t ofp_port_to_odp_port(const struct ofproto_dpif *,
197 ofp_port_t ofp_port);
199 struct rule_dpif *rule_dpif_lookup_in_table(struct ofproto_dpif *,
201 struct flow_wildcards *,
204 tag_type rule_calculate_tag(const struct flow *flow, const struct minimask *,
207 struct rule_dpif *rule_dpif_miss_rule(struct ofproto_dpif *ofproto,
208 const struct flow *);
210 void rule_credit_stats(struct rule_dpif *, const struct dpif_flow_stats *);
212 void ofproto_trace(struct ofproto_dpif *, const struct flow *,
213 const struct ofpbuf *packet, struct ds *);
215 size_t put_userspace_action(const struct ofproto_dpif *,
216 struct ofpbuf *odp_actions, const struct flow *,
217 const union user_action_cookie *,
218 const size_t cookie_size);
220 bool stp_should_process_flow(const struct flow *, struct flow_wildcards *);
221 void stp_process_packet(const struct ofport_dpif *,
222 const struct ofpbuf *packet);
224 ofp_port_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,
225 ofp_port_t realdev_ofp_port,
228 bool ofproto_dpif_dscp_from_priority(const struct ofport_dpif *,
229 uint32_t priority, uint8_t *dscp);
230 int ofproto_dpif_queue_to_priority(const struct ofproto_dpif *,
231 uint32_t queue_id, uint32_t *priority);
232 tag_type calculate_flow_tag(struct ofproto_dpif *, const struct flow *,
233 uint8_t table_id, struct rule_dpif *);
235 #endif /* ofproto-dpif.h */