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 */