]> git.proxmox.com Git - mirror_ovs.git/blob - ofproto/ofproto-dpif.h
ofproto-dpif-xlate: Actually drop packets on mirror ports.
[mirror_ovs.git] / ofproto / ofproto-dpif.h
1 /* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
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
20 #include "hmapx.h"
21 #include "ofproto/ofproto-provider.h"
22 #include "tag.h"
23 #include "timer.h"
24 #include "util.h"
25
26 union user_action_cookie;
27
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);
32
33 struct rule_dpif {
34 struct rule up;
35
36 /* These statistics:
37 *
38 * - Do include packets and bytes from facets that have been deleted or
39 * whose own statistics have been folded into the rule.
40 *
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()).
44 *
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.
48 */
49 uint64_t packet_count; /* Number of packets received. */
50 uint64_t byte_count; /* Number of bytes received. */
51
52 tag_type tag; /* Caches rule_calculate_tag() result. */
53
54 struct list facets; /* List of "struct facet"s. */
55 };
56
57 /* Extra information about a classifier table.
58 * Currently used just for optimized flow revalidation. */
59 struct table_dpif {
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. */
66 };
67
68 struct ofproto_dpif {
69 struct hmap_node all_ofproto_dpifs_node; /* In 'all_ofproto_dpifs'. */
70 struct ofproto up;
71 struct dpif_backer *backer;
72
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. */
77
78 /* Bridging. */
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;
86
87 /* Facets. */
88 struct classifier facets; /* Contains 'struct facet's. */
89 long long int consistency_rl;
90
91 /* Revalidation. */
92 struct table_dpif tables[N_TABLES];
93
94 /* Support for debugging async flow mods. */
95 struct list completions;
96
97 struct netdev_stats stats; /* To account packets generated and consumed in
98 * userspace. */
99
100 /* Spanning tree. */
101 struct stp *stp;
102 long long int stp_last_tick;
103
104 /* VLAN splinters. */
105 struct hmap realdev_vid_map; /* (realdev,vid) -> vlandev. */
106 struct hmap vlandev_map; /* vlandev -> (realdev,vid). */
107
108 /* Ports. */
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. */
113
114 /* Per ofproto's dpif stats. */
115 uint64_t n_hit;
116 uint64_t n_missed;
117 };
118
119 struct ofport_dpif {
120 struct hmap_node odp_port_node; /* In dpif_backer's "odp_to_ofport_map". */
121 struct ofport up;
122
123 odp_port_t odp_port;
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. */
133
134 /* Spanning tree. */
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;
138
139 struct hmap priorities; /* Map of attached 'priority_to_dscp's. */
140
141 /* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
142 *
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;
148 int vlandev_vid;
149 };
150
151 struct ofbundle {
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. */
156
157 /* Configuration. */
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? */
166
167 /* Status. */
168 bool floodable; /* True if no port has OFPUTIL_PC_NO_FLOOD set. */
169 };
170
171 static inline struct rule_dpif *rule_dpif_cast(const struct rule *rule)
172 {
173 return rule ? CONTAINER_OF(rule, struct rule_dpif, up) : NULL;
174 }
175
176 static inline struct ofproto_dpif *
177 ofproto_dpif_cast(const struct ofproto *ofproto)
178 {
179 ovs_assert(ofproto->ofproto_class == &ofproto_dpif_class);
180 return CONTAINER_OF(ofproto, struct ofproto_dpif, up);
181 }
182
183 static inline struct ofport_dpif *
184 ofbundle_get_a_port(const struct ofbundle *bundle)
185 {
186 return CONTAINER_OF(list_front(&bundle->ports), struct ofport_dpif,
187 bundle_node);
188 }
189
190 struct ofport_dpif *get_ofp_port(const struct ofproto_dpif *,
191 ofp_port_t ofp_port);
192
193 struct ofport_dpif *get_odp_port(const struct ofproto_dpif *,
194 odp_port_t odp_port);
195
196 odp_port_t ofp_port_to_odp_port(const struct ofproto_dpif *,
197 ofp_port_t ofp_port);
198
199 struct rule_dpif *rule_dpif_lookup_in_table(struct ofproto_dpif *,
200 const struct flow *,
201 struct flow_wildcards *,
202 uint8_t table_id);
203
204 tag_type rule_calculate_tag(const struct flow *flow, const struct minimask *,
205 uint32_t secret);
206
207 struct rule_dpif *rule_dpif_miss_rule(struct ofproto_dpif *ofproto,
208 const struct flow *);
209
210 void rule_credit_stats(struct rule_dpif *, const struct dpif_flow_stats *);
211
212 void ofproto_trace(struct ofproto_dpif *, const struct flow *,
213 const struct ofpbuf *packet, struct ds *);
214
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);
219
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);
223
224 ofp_port_t vsp_realdev_to_vlandev(const struct ofproto_dpif *,
225 ofp_port_t realdev_ofp_port,
226 ovs_be16 vlan_tci);
227
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 *);
234
235 #endif /* ofproto-dpif.h */