]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - include/net/vxlan.h
vxlan: remove duplicated macros
[mirror_ubuntu-zesty-kernel.git] / include / net / vxlan.h
CommitLineData
012a5729
PS
1#ifndef __NET_VXLAN_H
2#define __NET_VXLAN_H 1
3
5f35227e
JG
4#include <linux/ip.h>
5#include <linux/ipv6.h>
6#include <linux/if_vlan.h>
012a5729
PS
7#include <linux/skbuff.h>
8#include <linux/netdevice.h>
9#include <linux/udp.h>
ee122c79 10#include <net/dst_metadata.h>
012a5729 11
3511494c
TG
12/*
13 * VXLAN Group Based Policy Extension:
14 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
15 * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R| Group Policy ID |
16 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17 * | VXLAN Network Identifier (VNI) | Reserved |
18 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19 *
20 * D = Don't Learn bit. When set, this bit indicates that the egress
21 * VTEP MUST NOT learn the source address of the encapsulated frame.
22 *
23 * A = Indicates that the group policy has already been applied to
24 * this packet. Policies MUST NOT be applied by devices when the
25 * A bit is set.
26 *
27 * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy
28 */
29struct vxlanhdr_gbp {
0e715d6f 30 u8 vx_flags;
3511494c 31#ifdef __LITTLE_ENDIAN_BITFIELD
0e715d6f 32 u8 reserved_flags1:3,
3511494c
TG
33 policy_applied:1,
34 reserved_flags2:2,
35 dont_learn:1,
36 reserved_flags3:1;
37#elif defined(__BIG_ENDIAN_BITFIELD)
0e715d6f 38 u8 reserved_flags1:1,
3511494c
TG
39 dont_learn:1,
40 reserved_flags2:2,
41 policy_applied:1,
42 reserved_flags3:3;
43#else
44#error "Please fix <asm/byteorder.h>"
45#endif
46 __be16 policy_id;
47 __be32 vx_vni;
48};
49
50#define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF)
51
52/* skb->mark mapping
53 *
54 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55 * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID |
56 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57 */
58#define VXLAN_GBP_DONT_LEARN (BIT(6) << 16)
59#define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16)
60#define VXLAN_GBP_ID_MASK (0xFFFF)
61
62/* VXLAN protocol header:
63 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64 * |G|R|R|R|I|R|R|C| Reserved |
65 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66 * | VXLAN Network Identifier (VNI) | Reserved |
67 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 *
69 * G = 1 Group Policy (VXLAN-GBP)
70 * I = 1 VXLAN Network Identifier (VNI) present
71 * C = 1 Remote checksum offload (RCO)
72 */
11bf7828
JS
73struct vxlanhdr {
74 __be32 vx_flags;
75 __be32 vx_vni;
76};
77
3bf39475 78/* VXLAN header flags. */
c5fb8caa 79#define VXLAN_HF_RCO BIT(21)
3511494c
TG
80#define VXLAN_HF_VNI BIT(27)
81#define VXLAN_HF_GBP BIT(31)
dfd8645e
TH
82
83/* Remote checksum offload header option */
84#define VXLAN_RCO_MASK 0x7f /* Last byte of vni field */
85#define VXLAN_RCO_UDP 0x80 /* Indicate UDP RCO (TCP when not set *) */
86#define VXLAN_RCO_SHIFT 1 /* Left shift of start */
87#define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1)
88#define VXLAN_MAX_REMCSUM_START (VXLAN_RCO_MASK << VXLAN_RCO_SHIFT)
3bf39475
TH
89
90#define VXLAN_N_VID (1u << 24)
91#define VXLAN_VID_MASK (VXLAN_N_VID - 1)
40fb70f3 92#define VXLAN_VNI_MASK (VXLAN_VID_MASK << 8)
3bf39475
TH
93#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
94
0dfbdf41
TG
95#define VNI_HASH_BITS 10
96#define VNI_HASH_SIZE (1<<VNI_HASH_BITS)
97#define FDB_HASH_BITS 8
98#define FDB_HASH_SIZE (1<<FDB_HASH_BITS)
99
3511494c 100struct vxlan_metadata {
3511494c
TG
101 u32 gbp;
102};
103
012a5729
PS
104/* per UDP socket information */
105struct vxlan_sock {
106 struct hlist_node hlist;
012a5729
PS
107 struct work_struct del_work;
108 struct socket *sock;
109 struct rcu_head rcu;
110 struct hlist_head vni_list[VNI_HASH_SIZE];
111 atomic_t refcnt;
dc01e7d3 112 struct udp_offload udp_offloads;
dfd8645e 113 u32 flags;
012a5729
PS
114};
115
0dfbdf41
TG
116union vxlan_addr {
117 struct sockaddr_in sin;
118 struct sockaddr_in6 sin6;
119 struct sockaddr sa;
120};
121
122struct vxlan_rdst {
123 union vxlan_addr remote_ip;
124 __be16 remote_port;
125 u32 remote_vni;
126 u32 remote_ifindex;
127 struct list_head list;
128 struct rcu_head rcu;
129};
130
131struct vxlan_config {
132 union vxlan_addr remote_ip;
133 union vxlan_addr saddr;
134 u32 vni;
135 int remote_ifindex;
136 int mtu;
137 __be16 dst_port;
0e715d6f
JB
138 u16 port_min;
139 u16 port_max;
140 u8 tos;
141 u8 ttl;
0dfbdf41
TG
142 u32 flags;
143 unsigned long age_interval;
144 unsigned int addrmax;
145 bool no_share;
146};
147
148/* Pseudo network device */
149struct vxlan_dev {
150 struct hlist_node hlist; /* vni hash table */
151 struct list_head next; /* vxlan's per namespace list */
b1be00a6
JB
152 struct vxlan_sock *vn4_sock; /* listening socket for IPv4 */
153#if IS_ENABLED(CONFIG_IPV6)
154 struct vxlan_sock *vn6_sock; /* listening socket for IPv6 */
155#endif
0dfbdf41
TG
156 struct net_device *dev;
157 struct net *net; /* netns for packet i/o */
158 struct vxlan_rdst default_dst; /* default destination */
159 u32 flags; /* VXLAN_F_* in vxlan.h */
160
161 struct timer_list age_timer;
162 spinlock_t hash_lock;
163 unsigned int addrcnt;
58ce31cc 164 struct gro_cells gro_cells;
0dfbdf41
TG
165
166 struct vxlan_config cfg;
167
168 struct hlist_head fdb_head[FDB_HASH_SIZE];
169};
170
359a0ea9
TH
171#define VXLAN_F_LEARN 0x01
172#define VXLAN_F_PROXY 0x02
173#define VXLAN_F_RSC 0x04
174#define VXLAN_F_L2MISS 0x08
175#define VXLAN_F_L3MISS 0x10
176#define VXLAN_F_IPV6 0x20
177#define VXLAN_F_UDP_CSUM 0x40
178#define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80
179#define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100
dfd8645e
TH
180#define VXLAN_F_REMCSUM_TX 0x200
181#define VXLAN_F_REMCSUM_RX 0x400
3511494c 182#define VXLAN_F_GBP 0x800
0ace2ca8 183#define VXLAN_F_REMCSUM_NOPARTIAL 0x1000
ee122c79 184#define VXLAN_F_COLLECT_METADATA 0x2000
359a0ea9 185
d299ce14 186/* Flags that are used in the receive path. These flags must match in
af33c1ad
TH
187 * order for a socket to be shareable
188 */
189#define VXLAN_F_RCV_FLAGS (VXLAN_F_GBP | \
190 VXLAN_F_UDP_ZERO_CSUM6_RX | \
0ace2ca8 191 VXLAN_F_REMCSUM_RX | \
ee122c79 192 VXLAN_F_REMCSUM_NOPARTIAL | \
da8b43c0 193 VXLAN_F_COLLECT_METADATA)
ac5132d1 194
0dfbdf41
TG
195struct net_device *vxlan_dev_create(struct net *net, const char *name,
196 u8 name_assign_type, struct vxlan_config *conf);
197
b1be00a6
JB
198static inline __be16 vxlan_dev_dst_port(struct vxlan_dev *vxlan,
199 unsigned short family)
614732ea 200{
b1be00a6
JB
201#if IS_ENABLED(CONFIG_IPV6)
202 if (family == AF_INET6)
203 return inet_sk(vxlan->vn6_sock->sock->sk)->inet_sport;
204#endif
205 return inet_sk(vxlan->vn4_sock->sock->sk)->inet_sport;
614732ea 206}
49560532 207
5f35227e
JG
208static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,
209 netdev_features_t features)
11bf7828 210{
5f35227e
JG
211 u8 l4_hdr = 0;
212
213 if (!skb->encapsulation)
214 return features;
215
216 switch (vlan_get_protocol(skb)) {
217 case htons(ETH_P_IP):
218 l4_hdr = ip_hdr(skb)->protocol;
219 break;
220 case htons(ETH_P_IPV6):
221 l4_hdr = ipv6_hdr(skb)->nexthdr;
222 break;
223 default:
224 return features;;
225 }
226
227 if ((l4_hdr == IPPROTO_UDP) &&
11bf7828
JS
228 (skb->inner_protocol_type != ENCAP_TYPE_ETHER ||
229 skb->inner_protocol != htons(ETH_P_TEB) ||
230 (skb_inner_mac_header(skb) - skb_transport_header(skb) !=
231 sizeof(struct udphdr) + sizeof(struct vxlanhdr))))
a188222b 232 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
11bf7828 233
5f35227e 234 return features;
11bf7828 235}
23e62de3 236
e6cd988c
JG
237/* IP header + UDP + VXLAN + Ethernet header */
238#define VXLAN_HEADROOM (20 + 8 + 8 + 14)
239/* IPv6 header + UDP + VXLAN + Ethernet header */
240#define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
241
242#if IS_ENABLED(CONFIG_VXLAN)
53cf5275 243void vxlan_get_rx_port(struct net_device *netdev);
e6cd988c
JG
244#else
245static inline void vxlan_get_rx_port(struct net_device *netdev)
246{
247}
248#endif
705cc62f
JB
249
250static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
251{
252 return vs->sock->sk->sk_family;
253}
48e92c44
JB
254
255#endif