aboutsummaryrefslogtreecommitdiffstats
path: root/net/openvswitch/flow.h
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2015-07-21 04:43:54 -0400
committerDavid S. Miller <davem@davemloft.net>2015-07-21 13:39:05 -0400
commit1d8fff907342d2339796dbd27ea47d0e76a6a2d0 (patch)
tree0c8e93fba52efc6e893e7c3ceb2f45091dcdf936 /net/openvswitch/flow.h
parente3e4712ec0961ed586a8db340bd994c4ad7f5dba (diff)
ip_tunnel: Make ovs_tunnel_info and ovs_key_ipv4_tunnel generic
Rename the tunnel metadata data structures currently internal to OVS and make them generic for use by all IP tunnels. Both structures are kernel internal and will stay that way. Their members are exposed to user space through individual Netlink attributes by OVS. It will therefore be possible to extend/modify these structures without affecting user ABI. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch/flow.h')
-rw-r--r--net/openvswitch/flow.h76
1 files changed, 3 insertions, 73 deletions
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h
index a076e445ccc2..cadc6c5c3545 100644
--- a/net/openvswitch/flow.h
+++ b/net/openvswitch/flow.h
@@ -32,31 +32,10 @@
32#include <linux/time.h> 32#include <linux/time.h>
33#include <linux/flex_array.h> 33#include <linux/flex_array.h>
34#include <net/inet_ecn.h> 34#include <net/inet_ecn.h>
35#include <net/ip_tunnels.h>
35 36
36struct sk_buff; 37struct sk_buff;
37 38
38/* Used to memset ovs_key_ipv4_tunnel padding. */
39#define OVS_TUNNEL_KEY_SIZE \
40 (offsetof(struct ovs_key_ipv4_tunnel, tp_dst) + \
41 FIELD_SIZEOF(struct ovs_key_ipv4_tunnel, tp_dst))
42
43struct ovs_key_ipv4_tunnel {
44 __be64 tun_id;
45 __be32 ipv4_src;
46 __be32 ipv4_dst;
47 __be16 tun_flags;
48 u8 ipv4_tos;
49 u8 ipv4_ttl;
50 __be16 tp_src;
51 __be16 tp_dst;
52} __packed __aligned(4); /* Minimize padding. */
53
54struct ovs_tunnel_info {
55 struct ovs_key_ipv4_tunnel tunnel;
56 const void *options;
57 u8 options_len;
58};
59
60/* Store options at the end of the array if they are less than the 39/* Store options at the end of the array if they are less than the
61 * maximum size. This allows us to get the benefits of variable length 40 * maximum size. This allows us to get the benefits of variable length
62 * matching for small options. 41 * matching for small options.
@@ -66,55 +45,6 @@ struct ovs_tunnel_info {
66#define TUN_METADATA_OPTS(flow_key, opt_len) \ 45#define TUN_METADATA_OPTS(flow_key, opt_len) \
67 ((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len))) 46 ((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len)))
68 47
69static inline void __ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
70 __be32 saddr, __be32 daddr,
71 u8 tos, u8 ttl,
72 __be16 tp_src,
73 __be16 tp_dst,
74 __be64 tun_id,
75 __be16 tun_flags,
76 const void *opts,
77 u8 opts_len)
78{
79 tun_info->tunnel.tun_id = tun_id;
80 tun_info->tunnel.ipv4_src = saddr;
81 tun_info->tunnel.ipv4_dst = daddr;
82 tun_info->tunnel.ipv4_tos = tos;
83 tun_info->tunnel.ipv4_ttl = ttl;
84 tun_info->tunnel.tun_flags = tun_flags;
85
86 /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of
87 * the upper tunnel are used.
88 * E.g: GRE over IPSEC, the tp_src and tp_port are zero.
89 */
90 tun_info->tunnel.tp_src = tp_src;
91 tun_info->tunnel.tp_dst = tp_dst;
92
93 /* Clear struct padding. */
94 if (sizeof(tun_info->tunnel) != OVS_TUNNEL_KEY_SIZE)
95 memset((unsigned char *)&tun_info->tunnel + OVS_TUNNEL_KEY_SIZE,
96 0, sizeof(tun_info->tunnel) - OVS_TUNNEL_KEY_SIZE);
97
98 tun_info->options = opts;
99 tun_info->options_len = opts_len;
100}
101
102static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
103 const struct iphdr *iph,
104 __be16 tp_src,
105 __be16 tp_dst,
106 __be64 tun_id,
107 __be16 tun_flags,
108 const void *opts,
109 u8 opts_len)
110{
111 __ovs_flow_tun_info_init(tun_info, iph->saddr, iph->daddr,
112 iph->tos, iph->ttl,
113 tp_src, tp_dst,
114 tun_id, tun_flags,
115 opts, opts_len);
116}
117
118#define OVS_SW_FLOW_KEY_METADATA_SIZE \ 48#define OVS_SW_FLOW_KEY_METADATA_SIZE \
119 (offsetof(struct sw_flow_key, recirc_id) + \ 49 (offsetof(struct sw_flow_key, recirc_id) + \
120 FIELD_SIZEOF(struct sw_flow_key, recirc_id)) 50 FIELD_SIZEOF(struct sw_flow_key, recirc_id))
@@ -122,7 +52,7 @@ static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info,
122struct sw_flow_key { 52struct sw_flow_key {
123 u8 tun_opts[255]; 53 u8 tun_opts[255];
124 u8 tun_opts_len; 54 u8 tun_opts_len;
125 struct ovs_key_ipv4_tunnel tun_key; /* Encapsulating tunnel key. */ 55 struct ip_tunnel_key tun_key; /* Encapsulating tunnel key. */
126 struct { 56 struct {
127 u32 priority; /* Packet QoS priority. */ 57 u32 priority; /* Packet QoS priority. */
128 u32 skb_mark; /* SKB mark. */ 58 u32 skb_mark; /* SKB mark. */
@@ -273,7 +203,7 @@ void ovs_flow_stats_clear(struct sw_flow *);
273u64 ovs_flow_used_time(unsigned long flow_jiffies); 203u64 ovs_flow_used_time(unsigned long flow_jiffies);
274 204
275int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key); 205int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key);
276int ovs_flow_key_extract(const struct ovs_tunnel_info *tun_info, 206int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,
277 struct sk_buff *skb, 207 struct sk_buff *skb,
278 struct sw_flow_key *key); 208 struct sw_flow_key *key);
279/* Extract key from packet coming from userspace. */ 209/* Extract key from packet coming from userspace. */