ofproto-dpif: Modularize mirror code.
[sliver-openvswitch.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 */