Branch data Line data Source code
1 : : /* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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 "fail-open.h"
21 : : #include "hmapx.h"
22 : : #include "odp-util.h"
23 : : #include "openvswitch/ofp-util.h"
24 : : #include "ovs-thread.h"
25 : : #include "ofproto-provider.h"
26 : : #include "timer.h"
27 : : #include "util.h"
28 : : #include "ovs-thread.h"
29 : :
30 : : /* Priority for internal rules created to handle recirculation */
31 : : #define RECIRC_RULE_PRIORITY 20
32 : :
33 : : union user_action_cookie;
34 : : struct dpif_flow_stats;
35 : : struct ofproto;
36 : : struct ofproto_async_msg;
37 : : struct ofproto_dpif;
38 : : struct ofport_dpif;
39 : : struct dpif_backer;
40 : : struct OVS_LOCKABLE rule_dpif;
41 : : struct OVS_LOCKABLE group_dpif;
42 : :
43 : : /* Number of implemented OpenFlow tables. */
44 : : enum { N_TABLES = 255 };
45 : : enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */
46 : : BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255);
47 : :
48 : : /* Ofproto-dpif -- DPIF based ofproto implementation.
49 : : *
50 : : * Ofproto-dpif provides an ofproto implementation for those platforms which
51 : : * implement the netdev and dpif interface defined in netdev.h and dpif.h. The
52 : : * most important of which is the Linux Kernel Module (dpif-linux), but
53 : : * alternatives are supported such as a userspace only implementation
54 : : * (dpif-netdev), and a dummy implementation used for unit testing.
55 : : *
56 : : * Ofproto-dpif is divided into three major chunks.
57 : : *
58 : : * - ofproto-dpif.c
59 : : * The main ofproto-dpif module is responsible for implementing the
60 : : * provider interface, installing and removing datapath flows, maintaining
61 : : * packet statistics, running protocols (BFD, LACP, STP, etc), and
62 : : * configuring relevant submodules.
63 : : *
64 : : * - ofproto-dpif-upcall.c
65 : : * Ofproto-dpif-upcall is responsible for retrieving upcalls from the kernel,
66 : : * processing miss upcalls, and handing more complex ones up to the main
67 : : * ofproto-dpif module. Miss upcall processing boils down to figuring out
68 : : * what each packet's actions are, executing them (i.e. asking the kernel to
69 : : * forward it), and handing it up to ofproto-dpif to decided whether or not
70 : : * to install a kernel flow.
71 : : *
72 : : * - ofproto-dpif-xlate.c
73 : : * Ofproto-dpif-xlate is responsible for translating OpenFlow actions into
74 : : * datapath actions. */
75 : :
76 : : /* Stores the various features which the corresponding backer supports. */
77 : : struct dpif_backer_support {
78 : : /* True if the datapath supports variable-length
79 : : * OVS_USERSPACE_ATTR_USERDATA in OVS_ACTION_ATTR_USERSPACE actions.
80 : : * False if the datapath supports only 8-byte (or shorter) userdata. */
81 : : bool variable_length_userdata;
82 : :
83 : : /* True if the datapath supports masked data in OVS_ACTION_ATTR_SET
84 : : * actions. */
85 : : bool masked_set_action;
86 : :
87 : : /* True if the datapath supports tnl_push and pop actions. */
88 : : bool tnl_push_pop;
89 : :
90 : : /* True if the datapath supports OVS_FLOW_ATTR_UFID. */
91 : : bool ufid;
92 : :
93 : : /* True if the datapath supports OVS_ACTION_ATTR_TRUNC action. */
94 : : bool trunc;
95 : :
96 : : /* Each member represents support for related OVS_KEY_ATTR_* fields. */
97 : : struct odp_support odp;
98 : : };
99 : :
100 : : bool ofproto_dpif_get_enable_ufid(const struct dpif_backer *backer);
101 : : struct dpif_backer_support *ofproto_dpif_get_support(const struct ofproto_dpif *);
102 : :
103 : : ovs_version_t ofproto_dpif_get_tables_version(struct ofproto_dpif *);
104 : :
105 : : struct rule_dpif *rule_dpif_lookup_from_table(struct ofproto_dpif *,
106 : : ovs_version_t, struct flow *,
107 : : struct flow_wildcards *,
108 : : const struct dpif_flow_stats *,
109 : : uint8_t *table_id,
110 : : ofp_port_t in_port,
111 : : bool may_packet_in,
112 : : bool honor_table_miss);
113 : :
114 : : static inline void rule_dpif_ref(struct rule_dpif *);
115 : : static inline void rule_dpif_unref(struct rule_dpif *);
116 : :
117 : : void rule_dpif_credit_stats(struct rule_dpif *rule ,
118 : : const struct dpif_flow_stats *);
119 : :
120 : : static inline bool rule_dpif_is_fail_open(const struct rule_dpif *);
121 : : static inline bool rule_dpif_is_table_miss(const struct rule_dpif *);
122 : : static inline bool rule_dpif_is_internal(const struct rule_dpif *);
123 : :
124 : : uint8_t rule_dpif_get_table(const struct rule_dpif *);
125 : :
126 : : bool table_is_internal(uint8_t table_id);
127 : :
128 : : const struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *);
129 : : void rule_set_recirc_id(struct rule *, uint32_t id);
130 : :
131 : : ovs_be64 rule_dpif_get_flow_cookie(const struct rule_dpif *rule);
132 : :
133 : : void rule_dpif_reduce_timeouts(struct rule_dpif *rule, uint16_t idle_timeout,
134 : : uint16_t hard_timeout);
135 : :
136 : : void group_dpif_credit_stats(struct group_dpif *,
137 : : struct ofputil_bucket *,
138 : : const struct dpif_flow_stats *);
139 : : struct group_dpif *group_dpif_lookup(struct ofproto_dpif *ofproto,
140 : : uint32_t group_id, ovs_version_t version,
141 : : bool take_ref);
142 : : const struct ovs_list *group_dpif_get_buckets(const struct group_dpif *group);
143 : :
144 : : enum ofp11_group_type group_dpif_get_type(const struct group_dpif *group);
145 : : const char *group_dpif_get_selection_method(const struct group_dpif *group);
146 : : uint64_t group_dpif_get_selection_method_param(const struct group_dpif *group);
147 : : const struct field_array *group_dpif_get_fields(const struct group_dpif *group);
148 : :
149 : : int ofproto_dpif_execute_actions(struct ofproto_dpif *, const struct flow *,
150 : : struct rule_dpif *, const struct ofpact *,
151 : : size_t ofpacts_len, struct dp_packet *);
152 : : int ofproto_dpif_execute_actions__(struct ofproto_dpif *, const struct flow *,
153 : : struct rule_dpif *, const struct ofpact *,
154 : : size_t ofpacts_len, int indentation,
155 : : int depth, int resubmits,
156 : : struct dp_packet *);
157 : : void ofproto_dpif_send_async_msg(struct ofproto_dpif *,
158 : : struct ofproto_async_msg *);
159 : : bool ofproto_dpif_wants_packet_in_on_miss(struct ofproto_dpif *);
160 : : int ofproto_dpif_send_packet(const struct ofport_dpif *, bool oam,
161 : : struct dp_packet *);
162 : : void ofproto_dpif_flow_mod(struct ofproto_dpif *,
163 : : const struct ofputil_flow_mod *);
164 : :
165 : : struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t);
166 : : struct ofport_dpif *ofp_port_to_ofport(const struct ofproto_dpif *,
167 : : ofp_port_t);
168 : :
169 : : bool ofproto_dpif_backer_enabled(struct dpif_backer* backer);
170 : :
171 : : int ofproto_dpif_add_internal_flow(struct ofproto_dpif *,
172 : : const struct match *, int priority,
173 : : uint16_t idle_timeout,
174 : : const struct ofpbuf *ofpacts,
175 : : struct rule **rulep);
176 : : int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *,
177 : : int priority);
178 : :
179 : : const struct uuid *ofproto_dpif_get_uuid(const struct ofproto_dpif *);
180 : :
181 : : /* struct rule_dpif has struct rule as it's first member. */
182 : : #define RULE_CAST(RULE) ((struct rule *)RULE)
183 : : #define GROUP_CAST(GROUP) ((struct ofgroup *)GROUP)
184 : :
185 : : static inline struct group_dpif* group_dpif_ref(struct group_dpif *group)
186 : : {
187 : : if (group) {
188 : : ofproto_group_ref(GROUP_CAST(group));
189 : : }
190 : : return group;
191 : : }
192 : :
193 : 50 : static inline void group_dpif_unref(struct group_dpif *group)
194 : : {
195 [ + - ]: 50 : if (group) {
196 : 50 : ofproto_group_unref(GROUP_CAST(group));
197 : : }
198 : 50 : }
199 : :
200 : 1139820 : static inline void rule_dpif_ref(struct rule_dpif *rule)
201 : : {
202 [ + - ]: 1139820 : if (rule) {
203 : 1139820 : ofproto_rule_ref(RULE_CAST(rule));
204 : : }
205 : 1139820 : }
206 : :
207 : 1139801 : static inline void rule_dpif_unref(struct rule_dpif *rule)
208 : : {
209 [ + - ]: 1139801 : if (rule) {
210 : 1139801 : ofproto_rule_unref(RULE_CAST(rule));
211 : : }
212 : 1139801 : }
213 : :
214 : : static inline bool rule_dpif_is_fail_open(const struct rule_dpif *rule)
215 : : {
216 : : return is_fail_open_rule(RULE_CAST(rule));
217 : : }
218 : :
219 : 680 : static inline bool rule_dpif_is_table_miss(const struct rule_dpif *rule)
220 : : {
221 : 680 : return rule_is_table_miss(RULE_CAST(rule));
222 : : }
223 : :
224 : : /* Returns true if 'rule' is an internal rule, false otherwise. */
225 : 1176903 : static inline bool rule_dpif_is_internal(const struct rule_dpif *rule)
226 : : {
227 : 1176903 : return RULE_CAST(rule)->table_id == TBL_INTERNAL;
228 : : }
229 : :
230 : : #undef RULE_CAST
231 : :
232 : : bool ovs_native_tunneling_is_on(struct ofproto_dpif *ofproto);
233 : : #endif /* ofproto-dpif.h */
|