]>
Commit | Line | Data |
---|---|---|
a097c0b2 PS |
1 | /* |
2 | * Copyright (c) 2007-2013 Nicira, Inc. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of version 2 of the GNU General Public | |
6 | * License as published by the Free Software Foundation. | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | * General Public License for more details. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * along with this program; if not, write to the Free Software | |
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
16 | * 02110-1301, USA | |
17 | */ | |
18 | ||
19 | #ifndef FLOW_TABLE_H | |
20 | #define FLOW_TABLE_H 1 | |
21 | ||
22 | #include <linux/kernel.h> | |
23 | #include <linux/netlink.h> | |
24 | #include <linux/openvswitch.h> | |
25 | #include <linux/spinlock.h> | |
26 | #include <linux/types.h> | |
27 | #include <linux/rcupdate.h> | |
28 | #include <linux/if_ether.h> | |
29 | #include <linux/in6.h> | |
30 | #include <linux/jiffies.h> | |
31 | #include <linux/time.h> | |
32 | #include <linux/flex_array.h> | |
33 | ||
34 | #include <net/inet_ecn.h> | |
35 | #include <net/ip_tunnels.h> | |
36 | ||
37 | #include "flow.h" | |
38 | ||
5604935e PS |
39 | struct mask_cache_entry { |
40 | u32 skb_hash; | |
41 | u32 mask_index; | |
42 | }; | |
43 | ||
d49fc3ff PS |
44 | struct mask_array { |
45 | struct rcu_head rcu; | |
46 | int count, max; | |
47 | struct sw_flow_mask __rcu *masks[]; | |
48 | }; | |
49 | ||
994dc286 | 50 | struct table_instance { |
a097c0b2 | 51 | struct flex_array *buckets; |
994dc286 | 52 | unsigned int n_buckets; |
a097c0b2 | 53 | struct rcu_head rcu; |
a097c0b2 PS |
54 | int node_ver; |
55 | u32 hash_seed; | |
56 | bool keep_flows; | |
57 | }; | |
58 | ||
994dc286 PS |
59 | struct flow_table { |
60 | struct table_instance __rcu *ti; | |
bc619e29 | 61 | struct table_instance __rcu *ufid_ti; |
5604935e | 62 | struct mask_cache_entry __percpu *mask_cache; |
d49fc3ff | 63 | struct mask_array __rcu *mask_array; |
994dc286 PS |
64 | unsigned long last_rehash; |
65 | unsigned int count; | |
bc619e29 | 66 | unsigned int ufid_count; |
994dc286 PS |
67 | }; |
68 | ||
9ac56358 JR |
69 | extern struct kmem_cache *flow_stats_cache; |
70 | ||
a097c0b2 PS |
71 | int ovs_flow_init(void); |
72 | void ovs_flow_exit(void); | |
73 | ||
df65fec1 | 74 | struct sw_flow *ovs_flow_alloc(void); |
a097c0b2 PS |
75 | void ovs_flow_free(struct sw_flow *, bool deferred); |
76 | ||
994dc286 | 77 | int ovs_flow_tbl_init(struct flow_table *); |
f1f60b85 | 78 | int ovs_flow_tbl_count(const struct flow_table *table); |
e379e4d1 | 79 | void ovs_flow_tbl_destroy(struct flow_table *table); |
994dc286 | 80 | int ovs_flow_tbl_flush(struct flow_table *flow_table); |
a097c0b2 | 81 | |
0585f7a8 | 82 | int ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow, |
f1f60b85 | 83 | const struct sw_flow_mask *mask); |
a097c0b2 | 84 | void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow); |
4fa72a95 | 85 | int ovs_flow_tbl_num_masks(const struct flow_table *table); |
994dc286 | 86 | struct sw_flow *ovs_flow_tbl_dump_next(struct table_instance *table, |
a097c0b2 | 87 | u32 *bucket, u32 *idx); |
4f88b5e5 | 88 | struct sw_flow *ovs_flow_tbl_lookup_stats(struct flow_table *, |
5604935e PS |
89 | const struct sw_flow_key *, |
90 | u32 skb_hash, | |
91 | u32 *n_mask_hit); | |
4f88b5e5 AZ |
92 | struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *, |
93 | const struct sw_flow_key *); | |
7d16c847 | 94 | struct sw_flow *ovs_flow_tbl_lookup_exact(struct flow_table *tbl, |
f1f60b85 | 95 | const struct sw_flow_match *match); |
bc619e29 JS |
96 | struct sw_flow *ovs_flow_tbl_lookup_ufid(struct flow_table *, |
97 | const struct sw_flow_id *); | |
98 | ||
99 | bool ovs_flow_cmp(const struct sw_flow *, const struct sw_flow_match *); | |
a097c0b2 | 100 | |
a097c0b2 | 101 | void ovs_flow_mask_key(struct sw_flow_key *dst, const struct sw_flow_key *src, |
ad4adec2 | 102 | bool full, const struct sw_flow_mask *mask); |
a097c0b2 | 103 | #endif /* flow_table.h */ |