]> git.proxmox.com Git - ovs.git/blame - datapath/linux/compat/include/net/geneve.h
datapath: Use kernel Geneve implementation on 4.0 and above.
[ovs.git] / datapath / linux / compat / include / net / geneve.h
CommitLineData
c1fc1411
JG
1#ifndef __NET_GENEVE_WRAPPER_H
2#define __NET_GENEVE_WRAPPER_H 1
3
15c69d2d
JG
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
a19920cc
JG
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
c1fc1411
JG
32struct 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
a19920cc 46 u8 opt_data[];
c1fc1411
JG
47};
48
a19920cc
JG
49#define GENEVE_CRIT_OPT_TYPE (1 << 7)
50
51struct 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;
c1fc1411 64#endif
a19920cc
JG
65 __be16 proto_type;
66 u8 vni[3];
67 u8 rsvd2;
68 struct geneve_opt options[];
69};
70
71#ifdef CONFIG_INET
72struct geneve_sock;
73
74typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb);
75
76struct 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
bedf02f4
AW
86#define geneve_sock_add rpl_geneve_sock_add
87struct geneve_sock *rpl_geneve_sock_add(struct net *net, __be16 port,
88 geneve_rcv_t *rcv, void *data,
89 bool no_share, bool ipv6);
a19920cc 90
bedf02f4
AW
91#define geneve_sock_release rpl_geneve_sock_release
92void rpl_geneve_sock_release(struct geneve_sock *vs);
a19920cc 93
bedf02f4
AW
94#define geneve_xmit_skb rpl_geneve_xmit_skb
95int 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);
a19920cc
JG
100#endif /*ifdef CONFIG_INET */
101
15c69d2d
JG
102#endif /* kernel < 4.0 */
103
a19920cc 104#endif /*ifdef__NET_GENEVE_WRAPPER_H */