diff options
Diffstat (limited to 'net/openvswitch/flow.h')
| -rw-r--r-- | net/openvswitch/flow.h | 89 | 
1 files changed, 65 insertions, 24 deletions
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index 66ef7220293e..212fbf7510c4 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h  | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * Copyright (c) 2007-2011 Nicira, Inc. | 2 | * Copyright (c) 2007-2013 Nicira, Inc. | 
| 3 | * | 3 | * | 
| 4 | * This program is free software; you can redistribute it and/or | 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 | 5 | * modify it under the terms of version 2 of the GNU General Public | 
| @@ -33,6 +33,8 @@ | |||
| 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; | ||
| 36 | 38 | ||
| 37 | struct sw_flow_actions { | 39 | struct sw_flow_actions { | 
| 38 | struct rcu_head rcu; | 40 | struct rcu_head rcu; | 
| @@ -97,8 +99,8 @@ struct sw_flow_key { | |||
| 97 | } addr; | 99 | } addr; | 
| 98 | union { | 100 | union { | 
| 99 | struct { | 101 | struct { | 
| 100 | __be16 src; /* TCP/UDP source port. */ | 102 | __be16 src; /* TCP/UDP/SCTP source port. */ | 
| 101 | __be16 dst; /* TCP/UDP destination port. */ | 103 | __be16 dst; /* TCP/UDP/SCTP destination port. */ | 
| 102 | } tp; | 104 | } tp; | 
| 103 | struct { | 105 | struct { | 
| 104 | u8 sha[ETH_ALEN]; /* ARP source hardware address. */ | 106 | u8 sha[ETH_ALEN]; /* ARP source hardware address. */ | 
| @@ -113,8 +115,8 @@ struct sw_flow_key { | |||
| 113 | } addr; | 115 | } addr; | 
| 114 | __be32 label; /* IPv6 flow label. */ | 116 | __be32 label; /* IPv6 flow label. */ | 
| 115 | struct { | 117 | struct { | 
| 116 | __be16 src; /* TCP/UDP source port. */ | 118 | __be16 src; /* TCP/UDP/SCTP source port. */ | 
| 117 | __be16 dst; /* TCP/UDP destination port. */ | 119 | __be16 dst; /* TCP/UDP/SCTP destination port. */ | 
| 118 | } tp; | 120 | } tp; | 
| 119 | struct { | 121 | struct { | 
| 120 | struct in6_addr target; /* ND target address. */ | 122 | struct in6_addr target; /* ND target address. */ | 
| @@ -123,7 +125,7 @@ struct sw_flow_key { | |||
| 123 | } nd; | 125 | } nd; | 
| 124 | } ipv6; | 126 | } ipv6; | 
| 125 | }; | 127 | }; | 
| 126 | }; | 128 | } __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */ | 
| 127 | 129 | ||
| 128 | struct sw_flow { | 130 | struct sw_flow { | 
| 129 | struct rcu_head rcu; | 131 | struct rcu_head rcu; | 
| @@ -131,6 +133,8 @@ struct sw_flow { | |||
| 131 | u32 hash; | 133 | u32 hash; | 
| 132 | 134 | ||
| 133 | struct sw_flow_key key; | 135 | struct sw_flow_key key; | 
| 136 | struct sw_flow_key unmasked_key; | ||
| 137 | struct sw_flow_mask *mask; | ||
| 134 | struct sw_flow_actions __rcu *sf_acts; | 138 | struct sw_flow_actions __rcu *sf_acts; | 
| 135 | 139 | ||
| 136 | spinlock_t lock; /* Lock for values below. */ | 140 | spinlock_t lock; /* Lock for values below. */ | 
| @@ -140,6 +144,20 @@ struct sw_flow { | |||
| 140 | u8 tcp_flags; /* Union of seen TCP flags. */ | 144 | u8 tcp_flags; /* Union of seen TCP flags. */ | 
| 141 | }; | 145 | }; | 
| 142 | 146 | ||
| 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 | |||
| 143 | struct arp_eth_header { | 161 | struct arp_eth_header { | 
| 144 | __be16 ar_hrd; /* format of hardware address */ | 162 | __be16 ar_hrd; /* format of hardware address */ | 
| 145 | __be16 ar_pro; /* format of protocol address */ | 163 | __be16 ar_pro; /* format of protocol address */ | 
| @@ -159,21 +177,21 @@ void ovs_flow_exit(void); | |||
| 159 | 177 | ||
| 160 | struct sw_flow *ovs_flow_alloc(void); | 178 | struct sw_flow *ovs_flow_alloc(void); | 
| 161 | void ovs_flow_deferred_free(struct sw_flow *); | 179 | void ovs_flow_deferred_free(struct sw_flow *); | 
| 162 | void ovs_flow_free(struct sw_flow *flow); | 180 | void ovs_flow_free(struct sw_flow *, bool deferred); | 
| 163 | 181 | ||
| 164 | struct sw_flow_actions *ovs_flow_actions_alloc(int actions_len); | 182 | struct sw_flow_actions *ovs_flow_actions_alloc(int actions_len); | 
| 165 | void ovs_flow_deferred_free_acts(struct sw_flow_actions *); | 183 | void ovs_flow_deferred_free_acts(struct sw_flow_actions *); | 
| 166 | 184 | ||
| 167 | int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *, | 185 | int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *); | 
| 168 | int *key_lenp); | ||
| 169 | void ovs_flow_used(struct sw_flow *, struct sk_buff *); | 186 | void ovs_flow_used(struct sw_flow *, struct sk_buff *); | 
| 170 | u64 ovs_flow_used_time(unsigned long flow_jiffies); | 187 | u64 ovs_flow_used_time(unsigned long flow_jiffies); | 
| 171 | 188 | int ovs_flow_to_nlattrs(const struct sw_flow_key *, | |
| 172 | int ovs_flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *); | 189 | const struct sw_flow_key *, struct sk_buff *); | 
| 173 | int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, | 190 | int ovs_match_from_nlattrs(struct sw_flow_match *match, | 
| 191 | const struct nlattr *, | ||
| 174 | const struct nlattr *); | 192 | const struct nlattr *); | 
| 175 | int ovs_flow_metadata_from_nlattrs(struct sw_flow *flow, int key_len, | 193 | int ovs_flow_metadata_from_nlattrs(struct sw_flow *flow, | 
| 176 | const struct nlattr *attr); | 194 | const struct nlattr *attr); | 
| 177 | 195 | ||
| 178 | #define MAX_ACTIONS_BUFSIZE (32 * 1024) | 196 | #define MAX_ACTIONS_BUFSIZE (32 * 1024) | 
| 179 | #define TBL_MIN_BUCKETS 1024 | 197 | #define TBL_MIN_BUCKETS 1024 | 
| @@ -182,6 +200,7 @@ struct flow_table { | |||
| 182 | struct flex_array *buckets; | 200 | struct flex_array *buckets; | 
| 183 | unsigned int count, n_buckets; | 201 | unsigned int count, n_buckets; | 
| 184 | struct rcu_head rcu; | 202 | struct rcu_head rcu; | 
| 203 | struct list_head *mask_list; | ||
| 185 | int node_ver; | 204 | int node_ver; | 
| 186 | u32 hash_seed; | 205 | u32 hash_seed; | 
| 187 | bool keep_flows; | 206 | bool keep_flows; | 
| @@ -197,22 +216,44 @@ static inline int ovs_flow_tbl_need_to_expand(struct flow_table *table) | |||
| 197 | return (table->count > table->n_buckets); | 216 | return (table->count > table->n_buckets); | 
| 198 | } | 217 | } | 
| 199 | 218 | ||
| 200 | struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *table, | 219 | struct sw_flow *ovs_flow_lookup(struct flow_table *, | 
| 201 | struct sw_flow_key *key, int len); | 220 | const struct sw_flow_key *); | 
| 202 | void ovs_flow_tbl_destroy(struct flow_table *table); | 221 | struct sw_flow *ovs_flow_lookup_unmasked_key(struct flow_table *table, | 
| 203 | void ovs_flow_tbl_deferred_destroy(struct flow_table *table); | 222 | struct sw_flow_match *match); | 
| 223 | |||
| 224 | void ovs_flow_tbl_destroy(struct flow_table *table, bool deferred); | ||
| 204 | struct flow_table *ovs_flow_tbl_alloc(int new_size); | 225 | struct flow_table *ovs_flow_tbl_alloc(int new_size); | 
| 205 | struct flow_table *ovs_flow_tbl_expand(struct flow_table *table); | 226 | struct flow_table *ovs_flow_tbl_expand(struct flow_table *table); | 
| 206 | struct flow_table *ovs_flow_tbl_rehash(struct flow_table *table); | 227 | struct flow_table *ovs_flow_tbl_rehash(struct flow_table *table); | 
| 207 | void ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow, | ||
| 208 | struct sw_flow_key *key, int key_len); | ||
| 209 | void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow); | ||
| 210 | 228 | ||
| 211 | struct sw_flow *ovs_flow_tbl_next(struct flow_table *table, u32 *bucket, u32 *idx); | 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); | ||
| 212 | extern const int ovs_key_lens[OVS_KEY_ATTR_MAX + 1]; | 233 | extern const int ovs_key_lens[OVS_KEY_ATTR_MAX + 1]; | 
| 213 | int ovs_ipv4_tun_from_nlattr(const struct nlattr *attr, | 234 | int ovs_ipv4_tun_from_nlattr(const struct nlattr *attr, | 
| 214 | struct ovs_key_ipv4_tunnel *tun_key); | 235 | struct sw_flow_match *match, bool is_mask); | 
| 215 | int ovs_ipv4_tun_to_nlattr(struct sk_buff *skb, | 236 | int ovs_ipv4_tun_to_nlattr(struct sk_buff *skb, | 
| 216 | const struct ovs_key_ipv4_tunnel *tun_key); | 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 | }; | ||
| 217 | 250 | ||
| 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); | ||
| 218 | #endif /* flow.h */ | 259 | #endif /* flow.h */ | 
