cafff79547f1d9b17d069335d8d63e0afa949324
[cascardo/ovs.git] / datapath / linux / compat / include / net / vxlan.h
1 #ifndef __NET_VXLAN_WRAPPER_H
2 #define __NET_VXLAN_WRAPPER_H  1
3
4 #include <linux/skbuff.h>
5 #include <linux/netdevice.h>
6 #include <linux/udp.h>
7 #include <net/gre.h>
8
9 #include <linux/version.h>
10
11 #ifdef HAVE_VXLAN_METADATA
12 #define USE_UPSTREAM_VXLAN
13
14 #include_next <net/vxlan.h>
15 #endif
16
17 #ifndef VXLAN_HLEN
18 /* VXLAN header flags. */
19 #define VXLAN_HF_VNI 0x08000000
20 #ifndef VXLAN_HF_GBP
21 #define VXLAN_HF_GBP 0x80000000
22 #endif
23
24 #define VXLAN_N_VID     (1u << 24)
25 #define VXLAN_VID_MASK  (VXLAN_N_VID - 1)
26 #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
27 #endif
28
29 #ifndef VXLAN_GBP_USED_BITS
30 /*
31  * VXLAN Group Based Policy Extension:
32  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33  * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R|        Group Policy ID        |
34  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35  * |                VXLAN Network Identifier (VNI) |   Reserved    |
36  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37  *
38  * D = Don't Learn bit. When set, this bit indicates that the egress
39  *     VTEP MUST NOT learn the source address of the encapsulated frame.
40  *
41  * A = Indicates that the group policy has already been applied to
42  *     this packet. Policies MUST NOT be applied by devices when the
43  *     A bit is set.
44  *
45  * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy
46  */
47 struct vxlanhdr_gbp {
48         __u8    vx_flags;
49 #ifdef __LITTLE_ENDIAN_BITFIELD
50         __u8    reserved_flags1:3,
51                 policy_applied:1,
52                 reserved_flags2:2,
53                 dont_learn:1,
54                 reserved_flags3:1;
55 #elif defined(__BIG_ENDIAN_BITFIELD)
56         __u8    reserved_flags1:1,
57                 dont_learn:1,
58                 reserved_flags2:2,
59                 policy_applied:1,
60                 reserved_flags3:3;
61 #else
62 #error  "Please fix <asm/byteorder.h>"
63 #endif
64         __be16  policy_id;
65         __be32  vx_vni;
66 };
67 #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF)
68
69 /* skb->mark mapping
70  *
71  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72  * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R|        Group Policy ID        |
73  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74  */
75 #define VXLAN_GBP_DONT_LEARN            (BIT(6) << 16)
76 #define VXLAN_GBP_POLICY_APPLIED        (BIT(3) << 16)
77 #define VXLAN_GBP_ID_MASK               (0xFFFF)
78
79 #define VXLAN_F_GBP                     0x800
80 #endif
81
82 #ifndef VXLAN_F_UDP_CSUM
83 #define VXLAN_F_UDP_CSUM                0x40
84 #endif
85
86 #ifndef VXLAN_F_RCV_FLAGS
87 #define VXLAN_F_RCV_FLAGS                       VXLAN_F_GBP
88 #endif
89
90 #ifdef USE_UPSTREAM_VXLAN
91 static inline int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk,
92                    struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
93                    __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
94                    struct vxlan_metadata *md, bool xnet, u32 vxflags)
95 {
96         if (skb_is_gso(skb) && skb_is_encapsulated(skb)) {
97                 kfree_skb(skb);
98                 return -ENOSYS;
99         }
100
101 #if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
102         return vxlan_xmit_skb(rt, skb, src, dst, tos, ttl, df,
103 #else
104         return vxlan_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
105 #endif
106                               src_port, dst_port, md, xnet, vxflags);
107 }
108
109 #define vxlan_xmit_skb rpl_vxlan_xmit_skb
110 #else /* USE_UPSTREAM_VXLAN */
111
112 struct vxlan_metadata {
113         __be32          vni;
114         u32             gbp;
115 };
116
117 #define vxlan_sock rpl_vxlan_sock
118 struct rpl_vxlan_sock;
119
120 #define vxlan_rcv_t rpl_vxlan_rcv_t
121 typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb,
122                            struct vxlan_metadata *md);
123
124 /* per UDP socket information */
125 struct vxlan_sock {
126         struct hlist_node hlist;
127         vxlan_rcv_t      *rcv;
128         void             *data;
129         struct work_struct del_work;
130         struct socket    *sock;
131         struct rcu_head   rcu;
132         u32               flags;
133 };
134
135 #define vxlan_sock_add rpl_vxlan_sock_add
136 struct vxlan_sock *rpl_vxlan_sock_add(struct net *net, __be16 port,
137                                       vxlan_rcv_t *rcv, void *data,
138                                       bool no_share, u32 flags);
139
140 #define vxlan_sock_release rpl_vxlan_sock_release
141 void rpl_vxlan_sock_release(struct vxlan_sock *vs);
142
143 #define vxlan_xmit_skb rpl_vxlan_xmit_skb
144 int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
145                        __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
146                        __be16 src_port, __be16 dst_port,
147                        struct vxlan_metadata *md, bool xnet, u32 vxflags);
148
149 #endif /* !HAVE_VXLAN_METADATA */
150 #endif