diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2013-10-03 21:16:47 -0400 |
---|---|---|
committer | Jesse Gross <jesse@nicira.com> | 2013-10-03 21:16:47 -0400 |
commit | e64457191a259537bbbfaebeba9a8043786af96f (patch) | |
tree | 579f47d3124b69a94b07878d65d27f71c4f7c9c5 /net/openvswitch/flow.h | |
parent | f0627cfa24389cab25c67bb7ca902912216a8a2d (diff) |
openvswitch: Restructure datapath.c and flow.c
Over the time datapath.c and flow.c has became pretty large files.
Following patch restructures functionality of component into three
different components:
flow.c: contains flow extract.
flow_netlink.c: netlink flow api.
flow_table.c: flow table api.
This patch restructures code without changing logic.
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'net/openvswitch/flow.h')
-rw-r--r-- | net/openvswitch/flow.h | 128 |
1 files changed, 26 insertions, 102 deletions
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index 212fbf7510c4..098fd1db6a23 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h | |||
@@ -33,14 +33,6 @@ | |||
33 | #include <net/inet_ecn.h> | 33 | #include <net/inet_ecn.h> |
34 | 34 | ||
35 | struct sk_buff; | 35 | struct sk_buff; |
36 | struct sw_flow_mask; | ||
37 | struct flow_table; | ||
38 | |||
39 | struct sw_flow_actions { | ||
40 | struct rcu_head rcu; | ||
41 | u32 actions_len; | ||
42 | struct nlattr actions[]; | ||
43 | }; | ||
44 | 36 | ||
45 | /* Used to memset ovs_key_ipv4_tunnel padding. */ | 37 | /* Used to memset ovs_key_ipv4_tunnel padding. */ |
46 | #define OVS_TUNNEL_KEY_SIZE \ | 38 | #define OVS_TUNNEL_KEY_SIZE \ |
@@ -127,6 +119,31 @@ struct sw_flow_key { | |||
127 | }; | 119 | }; |
128 | } __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */ | 120 | } __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */ |
129 | 121 | ||
122 | struct sw_flow_key_range { | ||
123 | size_t start; | ||
124 | size_t end; | ||
125 | }; | ||
126 | |||
127 | struct sw_flow_mask { | ||
128 | int ref_count; | ||
129 | struct rcu_head rcu; | ||
130 | struct list_head list; | ||
131 | struct sw_flow_key_range range; | ||
132 | struct sw_flow_key key; | ||
133 | }; | ||
134 | |||
135 | struct sw_flow_match { | ||
136 | struct sw_flow_key *key; | ||
137 | struct sw_flow_key_range range; | ||
138 | struct sw_flow_mask *mask; | ||
139 | }; | ||
140 | |||
141 | struct sw_flow_actions { | ||
142 | struct rcu_head rcu; | ||
143 | u32 actions_len; | ||
144 | struct nlattr actions[]; | ||
145 | }; | ||
146 | |||
130 | struct sw_flow { | 147 | struct sw_flow { |
131 | struct rcu_head rcu; | 148 | struct rcu_head rcu; |
132 | struct hlist_node hash_node[2]; | 149 | struct hlist_node hash_node[2]; |
@@ -144,20 +161,6 @@ struct sw_flow { | |||
144 | u8 tcp_flags; /* Union of seen TCP flags. */ | 161 | u8 tcp_flags; /* Union of seen TCP flags. */ |
145 | }; | 162 | }; |
146 | 163 | ||
147 | struct sw_flow_key_range { | ||
148 | size_t start; | ||
149 | size_t end; | ||
150 | }; | ||
151 | |||
152 | struct sw_flow_match { | ||
153 | struct sw_flow_key *key; | ||
154 | struct sw_flow_key_range range; | ||
155 | struct sw_flow_mask *mask; | ||
156 | }; | ||
157 | |||
158 | void ovs_match_init(struct sw_flow_match *match, | ||
159 | struct sw_flow_key *key, struct sw_flow_mask *mask); | ||
160 | |||
161 | struct arp_eth_header { | 164 | struct arp_eth_header { |
162 | __be16 ar_hrd; /* format of hardware address */ | 165 | __be16 ar_hrd; /* format of hardware address */ |
163 | __be16 ar_pro; /* format of protocol address */ | 166 | __be16 ar_pro; /* format of protocol address */ |
@@ -172,88 +175,9 @@ struct arp_eth_header { | |||
172 | unsigned char ar_tip[4]; /* target IP address */ | 175 | unsigned char ar_tip[4]; /* target IP address */ |
173 | } __packed; | 176 | } __packed; |
174 | 177 | ||
175 | int ovs_flow_init(void); | ||
176 | void ovs_flow_exit(void); | ||
177 | |||
178 | struct sw_flow *ovs_flow_alloc(void); | ||
179 | void ovs_flow_deferred_free(struct sw_flow *); | ||
180 | void ovs_flow_free(struct sw_flow *, bool deferred); | ||
181 | |||
182 | struct sw_flow_actions *ovs_flow_actions_alloc(int actions_len); | ||
183 | void ovs_flow_deferred_free_acts(struct sw_flow_actions *); | ||
184 | |||
185 | int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *); | ||
186 | void ovs_flow_used(struct sw_flow *, struct sk_buff *); | 178 | void ovs_flow_used(struct sw_flow *, struct sk_buff *); |
187 | u64 ovs_flow_used_time(unsigned long flow_jiffies); | 179 | u64 ovs_flow_used_time(unsigned long flow_jiffies); |
188 | int ovs_flow_to_nlattrs(const struct sw_flow_key *, | ||
189 | const struct sw_flow_key *, struct sk_buff *); | ||
190 | int ovs_match_from_nlattrs(struct sw_flow_match *match, | ||
191 | const struct nlattr *, | ||
192 | const struct nlattr *); | ||
193 | int ovs_flow_metadata_from_nlattrs(struct sw_flow *flow, | ||
194 | const struct nlattr *attr); | ||
195 | 180 | ||
196 | #define MAX_ACTIONS_BUFSIZE (32 * 1024) | 181 | int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *); |
197 | #define TBL_MIN_BUCKETS 1024 | ||
198 | |||
199 | struct flow_table { | ||
200 | struct flex_array *buckets; | ||
201 | unsigned int count, n_buckets; | ||
202 | struct rcu_head rcu; | ||
203 | struct list_head *mask_list; | ||
204 | int node_ver; | ||
205 | u32 hash_seed; | ||
206 | bool keep_flows; | ||
207 | }; | ||
208 | |||
209 | static inline int ovs_flow_tbl_count(struct flow_table *table) | ||
210 | { | ||
211 | return table->count; | ||
212 | } | ||
213 | |||
214 | static inline int ovs_flow_tbl_need_to_expand(struct flow_table *table) | ||
215 | { | ||
216 | return (table->count > table->n_buckets); | ||
217 | } | ||
218 | |||
219 | struct sw_flow *ovs_flow_lookup(struct flow_table *, | ||
220 | const struct sw_flow_key *); | ||
221 | struct sw_flow *ovs_flow_lookup_unmasked_key(struct flow_table *table, | ||
222 | struct sw_flow_match *match); | ||
223 | |||
224 | void ovs_flow_tbl_destroy(struct flow_table *table, bool deferred); | ||
225 | struct flow_table *ovs_flow_tbl_alloc(int new_size); | ||
226 | struct flow_table *ovs_flow_tbl_expand(struct flow_table *table); | ||
227 | struct flow_table *ovs_flow_tbl_rehash(struct flow_table *table); | ||
228 | |||
229 | void ovs_flow_insert(struct flow_table *table, struct sw_flow *flow); | ||
230 | void ovs_flow_remove(struct flow_table *table, struct sw_flow *flow); | ||
231 | |||
232 | struct sw_flow *ovs_flow_dump_next(struct flow_table *table, u32 *bucket, u32 *idx); | ||
233 | extern const int ovs_key_lens[OVS_KEY_ATTR_MAX + 1]; | ||
234 | int ovs_ipv4_tun_from_nlattr(const struct nlattr *attr, | ||
235 | struct sw_flow_match *match, bool is_mask); | ||
236 | int ovs_ipv4_tun_to_nlattr(struct sk_buff *skb, | ||
237 | const struct ovs_key_ipv4_tunnel *tun_key, | ||
238 | const struct ovs_key_ipv4_tunnel *output); | ||
239 | |||
240 | bool ovs_flow_cmp_unmasked_key(const struct sw_flow *flow, | ||
241 | const struct sw_flow_key *key, int key_end); | ||
242 | |||
243 | struct sw_flow_mask { | ||
244 | int ref_count; | ||
245 | struct rcu_head rcu; | ||
246 | struct list_head list; | ||
247 | struct sw_flow_key_range range; | ||
248 | struct sw_flow_key key; | ||
249 | }; | ||
250 | 182 | ||
251 | struct sw_flow_mask *ovs_sw_flow_mask_alloc(void); | ||
252 | void ovs_sw_flow_mask_add_ref(struct sw_flow_mask *); | ||
253 | void ovs_sw_flow_mask_del_ref(struct sw_flow_mask *, bool deferred); | ||
254 | void ovs_sw_flow_mask_insert(struct flow_table *, struct sw_flow_mask *); | ||
255 | struct sw_flow_mask *ovs_sw_flow_mask_find(const struct flow_table *, | ||
256 | const struct sw_flow_mask *); | ||
257 | void ovs_flow_key_mask(struct sw_flow_key *dst, const struct sw_flow_key *src, | ||
258 | const struct sw_flow_mask *mask); | ||
259 | #endif /* flow.h */ | 183 | #endif /* flow.h */ |