datapath: Add support for 4.2 kernel.
[cascardo/ovs.git] / datapath / linux / compat / include / net / geneve.h
1 #ifndef __NET_GENEVE_WRAPPER_H
2 #define __NET_GENEVE_WRAPPER_H  1
3
4 #include <linux/version.h>
5
6 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)
7 #include_next <net/geneve.h>
8 #else
9
10 #ifdef CONFIG_INET
11 #include <net/udp_tunnel.h>
12 #endif
13
14
15 /* Geneve Header:
16  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17  *  |Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
18  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19  *  |        Virtual Network Identifier (VNI)       |    Reserved   |
20  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21  *  |                    Variable Length Options                    |
22  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23  *
24  * Option Header:
25  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26  *  |          Option Class         |      Type     |R|R|R| Length  |
27  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28  *  |                      Variable Option Data                     |
29  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
30  */
31
32 struct geneve_opt {
33         __be16  opt_class;
34         u8      type;
35 #ifdef __LITTLE_ENDIAN_BITFIELD
36         u8      length:5;
37         u8      r3:1;
38         u8      r2:1;
39         u8      r1:1;
40 #else
41         u8      r1:1;
42         u8      r2:1;
43         u8      r3:1;
44         u8      length:5;
45 #endif
46         u8      opt_data[];
47 };
48
49 #define GENEVE_CRIT_OPT_TYPE (1 << 7)
50
51 struct genevehdr {
52 #ifdef __LITTLE_ENDIAN_BITFIELD
53         u8 opt_len:6;
54         u8 ver:2;
55         u8 rsvd1:6;
56         u8 critical:1;
57         u8 oam:1;
58 #else
59         u8 ver:2;
60         u8 opt_len:6;
61         u8 oam:1;
62         u8 critical:1;
63         u8 rsvd1:6;
64 #endif
65         __be16 proto_type;
66         u8 vni[3];
67         u8 rsvd2;
68         struct geneve_opt options[];
69 };
70
71 #ifdef CONFIG_INET
72 struct geneve_sock;
73
74 typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb);
75
76 struct geneve_sock {
77         geneve_rcv_t            *rcv;
78         void                    *rcv_data;
79         struct socket           *sock;
80         struct rcu_head         rcu;
81 };
82
83 #define GENEVE_VER 0
84 #define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr))
85
86 #define geneve_sock_add rpl_geneve_sock_add
87 struct geneve_sock *rpl_geneve_sock_add(struct net *net, __be16 port,
88                                         geneve_rcv_t *rcv, void *data,
89                                         bool no_share, bool ipv6);
90
91 #define geneve_sock_release rpl_geneve_sock_release
92 void rpl_geneve_sock_release(struct geneve_sock *vs);
93
94 #define geneve_xmit_skb rpl_geneve_xmit_skb
95 int rpl_geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
96                         struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
97                         __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
98                         __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
99                         bool csum, bool xnet);
100 #endif /*ifdef CONFIG_INET */
101
102 #endif /* kernel < 4.0 */
103
104 #ifndef HAVE_GENEVE_HDR
105 static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
106 {
107         return (struct genevehdr *)(udp_hdr(skb) + 1);
108 }
109 #endif
110
111 #endif /*ifdef__NET_GENEVE_WRAPPER_H */