Blame view

include/net/vxlan.h 13.9 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
2
3
  #ifndef __NET_VXLAN_H
  #define __NET_VXLAN_H 1
5f35227ea   Jesse Gross   net: Generalize n...
4
  #include <linux/if_vlan.h>
86a980572   Alexander Duyck   vxlan/geneve: Inc...
5
  #include <net/udp_tunnel.h>
ee122c79d   Thomas Graf   vxlan: Flow based...
6
  #include <net/dst_metadata.h>
5ff4ff4fe   Ido Schimmel   net: Add netif_is...
7
  #include <net/rtnetlink.h>
9a9973531   Petr Machata   vxlan: Add switch...
8
  #include <net/switchdev.h>
1274e1cc4   Roopa Prabhu   vxlan: ecmp suppo...
9
  #include <net/nexthop.h>
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
10

bea964107   Moshe Shemesh   net: Add IANA_VXL...
11
  #define IANA_VXLAN_UDP_PORT     4789
828788ac9   Jiri Benc   vxlan: restructur...
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  /* VXLAN protocol (RFC 7348) header:
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |R|R|R|R|I|R|R|R|               Reserved                        |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |                VXLAN Network Identifier (VNI) |   Reserved    |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   *
   * I = VXLAN Network Identifier (VNI) present.
   */
  struct vxlanhdr {
  	__be32 vx_flags;
  	__be32 vx_vni;
  };
  
  /* VXLAN header flags. */
54bfd872b   Jiri Benc   vxlan: keep flags...
27
  #define VXLAN_HF_VNI	cpu_to_be32(BIT(27))
828788ac9   Jiri Benc   vxlan: restructur...
28
29
30
  
  #define VXLAN_N_VID     (1u << 24)
  #define VXLAN_VID_MASK  (VXLAN_N_VID - 1)
54bfd872b   Jiri Benc   vxlan: keep flags...
31
  #define VXLAN_VNI_MASK	cpu_to_be32(VXLAN_VID_MASK << 8)
828788ac9   Jiri Benc   vxlan: restructur...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
  
  #define VNI_HASH_BITS	10
  #define VNI_HASH_SIZE	(1<<VNI_HASH_BITS)
  #define FDB_HASH_BITS	8
  #define FDB_HASH_SIZE	(1<<FDB_HASH_BITS)
  
  /* Remote checksum offload for VXLAN (VXLAN_F_REMCSUM_[RT]X):
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |R|R|R|R|I|R|R|R|R|R|C|              Reserved                   |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |           VXLAN Network Identifier (VNI)      |O| Csum start  |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   *
   * C = Remote checksum offload bit. When set indicates that the
   *     remote checksum offload data is present.
   *
   * O = Offset bit. Indicates the checksum offset relative to
   *     checksum start.
   *
   * Csum start = Checksum start divided by two.
   *
   * http://tools.ietf.org/html/draft-herbert-vxlan-rco
   */
  
  /* VXLAN-RCO header flags. */
54bfd872b   Jiri Benc   vxlan: keep flags...
58
  #define VXLAN_HF_RCO	cpu_to_be32(BIT(21))
828788ac9   Jiri Benc   vxlan: restructur...
59
60
  
  /* Remote checksum offload header option */
54bfd872b   Jiri Benc   vxlan: keep flags...
61
62
63
  #define VXLAN_RCO_MASK	cpu_to_be32(0x7f)  /* Last byte of vni field */
  #define VXLAN_RCO_UDP	cpu_to_be32(0x80)  /* Indicate UDP RCO (TCP when not set *) */
  #define VXLAN_RCO_SHIFT	1		   /* Left shift of start */
828788ac9   Jiri Benc   vxlan: restructur...
64
  #define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1)
54bfd872b   Jiri Benc   vxlan: keep flags...
65
  #define VXLAN_MAX_REMCSUM_START (0x7f << VXLAN_RCO_SHIFT)
828788ac9   Jiri Benc   vxlan: restructur...
66

3511494ce   Thomas Graf   vxlan: Group Poli...
67
  /*
828788ac9   Jiri Benc   vxlan: restructur...
68
   * VXLAN Group Based Policy Extension (VXLAN_F_GBP):
3511494ce   Thomas Graf   vxlan: Group Poli...
69
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
828788ac9   Jiri Benc   vxlan: restructur...
70
   * |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R|        Group Policy ID        |
3511494ce   Thomas Graf   vxlan: Group Poli...
71
72
73
74
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |                VXLAN Network Identifier (VNI) |   Reserved    |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   *
828788ac9   Jiri Benc   vxlan: restructur...
75
76
   * G = Group Policy ID present.
   *
3511494ce   Thomas Graf   vxlan: Group Poli...
77
78
79
80
81
82
83
   * D = Don't Learn bit. When set, this bit indicates that the egress
   *     VTEP MUST NOT learn the source address of the encapsulated frame.
   *
   * A = Indicates that the group policy has already been applied to
   *     this packet. Policies MUST NOT be applied by devices when the
   *     A bit is set.
   *
828788ac9   Jiri Benc   vxlan: restructur...
84
   * https://tools.ietf.org/html/draft-smith-vxlan-group-policy
3511494ce   Thomas Graf   vxlan: Group Poli...
85
86
   */
  struct vxlanhdr_gbp {
0e715d6fb   Jiri Benc   vxlan: cleanup types
87
  	u8	vx_flags;
3511494ce   Thomas Graf   vxlan: Group Poli...
88
  #ifdef __LITTLE_ENDIAN_BITFIELD
0e715d6fb   Jiri Benc   vxlan: cleanup types
89
  	u8	reserved_flags1:3,
3511494ce   Thomas Graf   vxlan: Group Poli...
90
91
92
93
94
  		policy_applied:1,
  		reserved_flags2:2,
  		dont_learn:1,
  		reserved_flags3:1;
  #elif defined(__BIG_ENDIAN_BITFIELD)
0e715d6fb   Jiri Benc   vxlan: cleanup types
95
  	u8	reserved_flags1:1,
3511494ce   Thomas Graf   vxlan: Group Poli...
96
97
98
99
100
101
102
103
104
105
  		dont_learn:1,
  		reserved_flags2:2,
  		policy_applied:1,
  		reserved_flags3:3;
  #else
  #error	"Please fix <asm/byteorder.h>"
  #endif
  	__be16	policy_id;
  	__be32	vx_vni;
  };
828788ac9   Jiri Benc   vxlan: restructur...
106
  /* VXLAN-GBP header flags. */
54bfd872b   Jiri Benc   vxlan: keep flags...
107
  #define VXLAN_HF_GBP	cpu_to_be32(BIT(31))
828788ac9   Jiri Benc   vxlan: restructur...
108

54bfd872b   Jiri Benc   vxlan: keep flags...
109
  #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | cpu_to_be32(0xFFFFFF))
3511494ce   Thomas Graf   vxlan: Group Poli...
110
111
112
113
114
115
116
117
118
119
  
  /* skb->mark mapping
   *
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R|        Group Policy ID        |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   */
  #define VXLAN_GBP_DONT_LEARN		(BIT(6) << 16)
  #define VXLAN_GBP_POLICY_APPLIED	(BIT(3) << 16)
  #define VXLAN_GBP_ID_MASK		(0xFFFF)
13e6ce98a   Xin Long   net: sched: only ...
120
121
  #define VXLAN_GBP_MASK (VXLAN_GBP_DONT_LEARN | VXLAN_GBP_POLICY_APPLIED | \
  			VXLAN_GBP_ID_MASK)
e1e5314de   Jiri Benc   vxlan: implement GPE
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  /*
   * VXLAN Generic Protocol Extension (VXLAN_F_GPE):
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |R|R|Ver|I|P|R|O|       Reserved                |Next Protocol  |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   * |                VXLAN Network Identifier (VNI) |   Reserved    |
   * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   *
   * Ver = Version. Indicates VXLAN GPE protocol version.
   *
   * P = Next Protocol Bit. The P bit is set to indicate that the
   *     Next Protocol field is present.
   *
   * O = OAM Flag Bit. The O bit is set to indicate that the packet
   *     is an OAM packet.
   *
   * Next Protocol = This 8 bit field indicates the protocol header
   * immediately following the VXLAN GPE header.
   *
   * https://tools.ietf.org/html/draft-ietf-nvo3-vxlan-gpe-01
   */
  
  struct vxlanhdr_gpe {
  #if defined(__LITTLE_ENDIAN_BITFIELD)
  	u8	oam_flag:1,
  		reserved_flags1:1,
  		np_applied:1,
  		instance_applied:1,
  		version:2,
f1c8d3720   William Tu   vxlan: trivial in...
151
  		reserved_flags2:2;
e1e5314de   Jiri Benc   vxlan: implement GPE
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  #elif defined(__BIG_ENDIAN_BITFIELD)
  	u8	reserved_flags2:2,
  		version:2,
  		instance_applied:1,
  		np_applied:1,
  		reserved_flags1:1,
  		oam_flag:1;
  #endif
  	u8	reserved_flags3;
  	u8	reserved_flags4;
  	u8	next_protocol;
  	__be32	vx_vni;
  };
  
  /* VXLAN-GPE header flags. */
  #define VXLAN_HF_VER	cpu_to_be32(BIT(29) | BIT(28))
  #define VXLAN_HF_NP	cpu_to_be32(BIT(26))
  #define VXLAN_HF_OAM	cpu_to_be32(BIT(24))
  
  #define VXLAN_GPE_USED_BITS (VXLAN_HF_VER | VXLAN_HF_NP | VXLAN_HF_OAM | \
  			     cpu_to_be32(0xff))
3511494ce   Thomas Graf   vxlan: Group Poli...
173
  struct vxlan_metadata {
3511494ce   Thomas Graf   vxlan: Group Poli...
174
175
  	u32		gbp;
  };
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
176
177
178
  /* per UDP socket information */
  struct vxlan_sock {
  	struct hlist_node hlist;
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
179
  	struct socket	 *sock;
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
180
  	struct hlist_head vni_list[VNI_HASH_SIZE];
66af846fe   Reshetova, Elena   net, vxlan: conve...
181
  	refcount_t	  refcnt;
dfd8645ea   Tom Herbert   vxlan: Remote che...
182
  	u32		  flags;
012a5729f   Pravin B Shelar   vxlan: Extend vxl...
183
  };
0dfbdf410   Thomas Graf   vxlan: Factor out...
184
185
186
187
188
189
190
191
192
  union vxlan_addr {
  	struct sockaddr_in sin;
  	struct sockaddr_in6 sin6;
  	struct sockaddr sa;
  };
  
  struct vxlan_rdst {
  	union vxlan_addr	 remote_ip;
  	__be16			 remote_port;
0efe11733   Petr Machata   vxlan: Support ma...
193
  	u8			 offloaded:1;
54bfd872b   Jiri Benc   vxlan: keep flags...
194
  	__be32			 remote_vni;
0dfbdf410   Thomas Graf   vxlan: Factor out...
195
  	u32			 remote_ifindex;
0ce1822c2   Taehee Yoo   vxlan: add adjace...
196
  	struct net_device	 *remote_dev;
0dfbdf410   Thomas Graf   vxlan: Factor out...
197
198
  	struct list_head	 list;
  	struct rcu_head		 rcu;
0c1d70af9   Paolo Abeni   net: use dst_cach...
199
  	struct dst_cache	 dst_cache;
0dfbdf410   Thomas Graf   vxlan: Factor out...
200
201
202
203
204
  };
  
  struct vxlan_config {
  	union vxlan_addr	remote_ip;
  	union vxlan_addr	saddr;
54bfd872b   Jiri Benc   vxlan: keep flags...
205
  	__be32			vni;
0dfbdf410   Thomas Graf   vxlan: Factor out...
206
207
208
  	int			remote_ifindex;
  	int			mtu;
  	__be16			dst_port;
0e715d6fb   Jiri Benc   vxlan: cleanup types
209
210
211
212
  	u16			port_min;
  	u16			port_max;
  	u8			tos;
  	u8			ttl;
e7f70af11   Daniel Borkmann   vxlan: support se...
213
  	__be32			label;
0dfbdf410   Thomas Graf   vxlan: Factor out...
214
215
216
217
  	u32			flags;
  	unsigned long		age_interval;
  	unsigned int		addrmax;
  	bool			no_share;
b4d306978   Stefano Brivio   vxlan: Allow conf...
218
  	enum ifla_vxlan_df	df;
0dfbdf410   Thomas Graf   vxlan: Factor out...
219
  };
69e766612   Jiri Benc   vxlan: fix hlist ...
220
221
222
223
  struct vxlan_dev_node {
  	struct hlist_node hlist;
  	struct vxlan_dev *vxlan;
  };
0dfbdf410   Thomas Graf   vxlan: Factor out...
224
225
  /* Pseudo network device */
  struct vxlan_dev {
69e766612   Jiri Benc   vxlan: fix hlist ...
226
227
228
229
  	struct vxlan_dev_node hlist4;	/* vni hash table for IPv4 socket */
  #if IS_ENABLED(CONFIG_IPV6)
  	struct vxlan_dev_node hlist6;	/* vni hash table for IPv6 socket */
  #endif
0dfbdf410   Thomas Graf   vxlan: Factor out...
230
  	struct list_head  next;		/* vxlan's per namespace list */
c6fcc4fc5   pravin shelar   vxlan: avoid usin...
231
  	struct vxlan_sock __rcu *vn4_sock;	/* listening socket for IPv4 */
b1be00a6c   Jiri Benc   vxlan: support bo...
232
  #if IS_ENABLED(CONFIG_IPV6)
c6fcc4fc5   pravin shelar   vxlan: avoid usin...
233
  	struct vxlan_sock __rcu *vn6_sock;	/* listening socket for IPv6 */
b1be00a6c   Jiri Benc   vxlan: support bo...
234
  #endif
0dfbdf410   Thomas Graf   vxlan: Factor out...
235
236
237
  	struct net_device *dev;
  	struct net	  *net;		/* netns for packet i/o */
  	struct vxlan_rdst default_dst;	/* default destination */
0dfbdf410   Thomas Graf   vxlan: Factor out...
238
239
  
  	struct timer_list age_timer;
fe1e0713b   Litao jiao   vxlan: Use FDB_HA...
240
  	spinlock_t	  hash_lock[FDB_HASH_SIZE];
0dfbdf410   Thomas Graf   vxlan: Factor out...
241
  	unsigned int	  addrcnt;
58ce31cca   Tom Herbert   vxlan: GRO suppor...
242
  	struct gro_cells  gro_cells;
0dfbdf410   Thomas Graf   vxlan: Factor out...
243
244
245
246
247
  
  	struct vxlan_config	cfg;
  
  	struct hlist_head fdb_head[FDB_HASH_SIZE];
  };
359a0ea98   Tom Herbert   vxlan: Add suppor...
248
249
250
251
252
253
  #define VXLAN_F_LEARN			0x01
  #define VXLAN_F_PROXY			0x02
  #define VXLAN_F_RSC			0x04
  #define VXLAN_F_L2MISS			0x08
  #define VXLAN_F_L3MISS			0x10
  #define VXLAN_F_IPV6			0x20
6ceb31ca5   Alexander Duyck   VXLAN: Support ou...
254
  #define VXLAN_F_UDP_ZERO_CSUM_TX	0x40
359a0ea98   Tom Herbert   vxlan: Add suppor...
255
256
  #define VXLAN_F_UDP_ZERO_CSUM6_TX	0x80
  #define VXLAN_F_UDP_ZERO_CSUM6_RX	0x100
dfd8645ea   Tom Herbert   vxlan: Remote che...
257
258
  #define VXLAN_F_REMCSUM_TX		0x200
  #define VXLAN_F_REMCSUM_RX		0x400
3511494ce   Thomas Graf   vxlan: Group Poli...
259
  #define VXLAN_F_GBP			0x800
0ace2ca89   Tom Herbert   vxlan: Use checks...
260
  #define VXLAN_F_REMCSUM_NOPARTIAL	0x1000
ee122c79d   Thomas Graf   vxlan: Flow based...
261
  #define VXLAN_F_COLLECT_METADATA	0x2000
e1e5314de   Jiri Benc   vxlan: implement GPE
262
  #define VXLAN_F_GPE			0x4000
0f22a3c68   Matthias Schiffer   vxlan: check vali...
263
  #define VXLAN_F_IPV6_LINKLOCAL		0x8000
72f6d71e4   Hangbin Liu   vxlan: add ttl in...
264
  #define VXLAN_F_TTL_INHERIT		0x10000
359a0ea98   Tom Herbert   vxlan: Add suppor...
265

d299ce149   Simon Horman   vxlan: Correct pa...
266
  /* Flags that are used in the receive path. These flags must match in
af33c1ada   Tom Herbert   vxlan: Eliminate ...
267
268
269
   * order for a socket to be shareable
   */
  #define VXLAN_F_RCV_FLAGS		(VXLAN_F_GBP |			\
e1e5314de   Jiri Benc   vxlan: implement GPE
270
  					 VXLAN_F_GPE |			\
af33c1ada   Tom Herbert   vxlan: Eliminate ...
271
  					 VXLAN_F_UDP_ZERO_CSUM6_RX |	\
0ace2ca89   Tom Herbert   vxlan: Use checks...
272
  					 VXLAN_F_REMCSUM_RX |		\
ee122c79d   Thomas Graf   vxlan: Flow based...
273
  					 VXLAN_F_REMCSUM_NOPARTIAL |	\
da8b43c0e   Alexei Starovoitov   vxlan: combine VX...
274
  					 VXLAN_F_COLLECT_METADATA)
ac5132d1a   Thomas Graf   vxlan: Only bind ...
275

e1e5314de   Jiri Benc   vxlan: implement GPE
276
277
278
  /* Flags that can be set together with VXLAN_F_GPE. */
  #define VXLAN_F_ALLOWED_GPE		(VXLAN_F_GPE |			\
  					 VXLAN_F_IPV6 |			\
0f22a3c68   Matthias Schiffer   vxlan: check vali...
279
  					 VXLAN_F_IPV6_LINKLOCAL |	\
e1e5314de   Jiri Benc   vxlan: implement GPE
280
281
282
283
  					 VXLAN_F_UDP_ZERO_CSUM_TX |	\
  					 VXLAN_F_UDP_ZERO_CSUM6_TX |	\
  					 VXLAN_F_UDP_ZERO_CSUM6_RX |	\
  					 VXLAN_F_COLLECT_METADATA)
0dfbdf410   Thomas Graf   vxlan: Factor out...
284
285
  struct net_device *vxlan_dev_create(struct net *net, const char *name,
  				    u8 name_assign_type, struct vxlan_config *conf);
5f35227ea   Jesse Gross   net: Generalize n...
286
287
  static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,
  						     netdev_features_t features)
11bf7828a   Joe Stringer   vxlan: Inline vxl...
288
  {
5f35227ea   Jesse Gross   net: Generalize n...
289
290
291
292
293
294
295
296
297
298
299
300
301
  	u8 l4_hdr = 0;
  
  	if (!skb->encapsulation)
  		return features;
  
  	switch (vlan_get_protocol(skb)) {
  	case htons(ETH_P_IP):
  		l4_hdr = ip_hdr(skb)->protocol;
  		break;
  	case htons(ETH_P_IPV6):
  		l4_hdr = ipv6_hdr(skb)->nexthdr;
  		break;
  	default:
5ef7e0ba1   Luis de Bethencourt   vxlan: Fix traili...
302
  		return features;
5f35227ea   Jesse Gross   net: Generalize n...
303
304
305
  	}
  
  	if ((l4_hdr == IPPROTO_UDP) &&
11bf7828a   Joe Stringer   vxlan: Inline vxl...
306
307
308
  	    (skb->inner_protocol_type != ENCAP_TYPE_ETHER ||
  	     skb->inner_protocol != htons(ETH_P_TEB) ||
  	     (skb_inner_mac_header(skb) - skb_transport_header(skb) !=
af67eb9e7   Alexander Duyck   vxlan: Add checks...
309
310
311
  	      sizeof(struct udphdr) + sizeof(struct vxlanhdr)) ||
  	     (skb->ip_summed != CHECKSUM_NONE &&
  	      !can_checksum_protocol(features, inner_eth_hdr(skb)->h_proto))))
a188222b6   Tom Herbert   net: Rename NETIF...
312
  		return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
11bf7828a   Joe Stringer   vxlan: Inline vxl...
313

5f35227ea   Jesse Gross   net: Generalize n...
314
  	return features;
11bf7828a   Joe Stringer   vxlan: Inline vxl...
315
  }
23e62de33   Joe Stringer   net: Add vxlan_gs...
316

e6cd988c2   Joseph Gasparakis   vxlan: Have the N...
317
318
319
320
  /* IP header + UDP + VXLAN + Ethernet header */
  #define VXLAN_HEADROOM (20 + 8 + 8 + 14)
  /* IPv6 header + UDP + VXLAN + Ethernet header */
  #define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
d4ac05ff3   Jiri Benc   vxlan: introduce ...
321
322
323
324
  static inline struct vxlanhdr *vxlan_hdr(struct sk_buff *skb)
  {
  	return (struct vxlanhdr *)(udp_hdr(skb) + 1);
  }
54bfd872b   Jiri Benc   vxlan: keep flags...
325
326
327
  static inline __be32 vxlan_vni(__be32 vni_field)
  {
  #if defined(__BIG_ENDIAN)
5692d7ea4   Jiri Benc   vxlan: fix sparse...
328
  	return (__force __be32)((__force u32)vni_field >> 8);
54bfd872b   Jiri Benc   vxlan: keep flags...
329
  #else
5692d7ea4   Jiri Benc   vxlan: fix sparse...
330
  	return (__force __be32)((__force u32)(vni_field & VXLAN_VNI_MASK) << 8);
54bfd872b   Jiri Benc   vxlan: keep flags...
331
332
333
334
335
336
  #endif
  }
  
  static inline __be32 vxlan_vni_field(__be32 vni)
  {
  #if defined(__BIG_ENDIAN)
5692d7ea4   Jiri Benc   vxlan: fix sparse...
337
  	return (__force __be32)((__force u32)vni << 8);
54bfd872b   Jiri Benc   vxlan: keep flags...
338
  #else
5692d7ea4   Jiri Benc   vxlan: fix sparse...
339
  	return (__force __be32)((__force u32)vni >> 8);
54bfd872b   Jiri Benc   vxlan: keep flags...
340
341
  #endif
  }
54bfd872b   Jiri Benc   vxlan: keep flags...
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  static inline size_t vxlan_rco_start(__be32 vni_field)
  {
  	return be32_to_cpu(vni_field & VXLAN_RCO_MASK) << VXLAN_RCO_SHIFT;
  }
  
  static inline size_t vxlan_rco_offset(__be32 vni_field)
  {
  	return (vni_field & VXLAN_RCO_UDP) ?
  		offsetof(struct udphdr, check) :
  		offsetof(struct tcphdr, check);
  }
  
  static inline __be32 vxlan_compute_rco(unsigned int start, unsigned int offset)
  {
  	__be32 vni_field = cpu_to_be32(start >> VXLAN_RCO_SHIFT);
  
  	if (offset == offsetof(struct udphdr, check))
  		vni_field |= VXLAN_RCO_UDP;
  	return vni_field;
  }
705cc62f6   Jiri Benc   vxlan: provide ac...
362
363
364
365
  static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
  {
  	return vs->sock->sk->sk_family;
  }
48e92c44b   Jiri Benc   vxlan: fix multip...
366

cca45e054   Ido Schimmel   vxlan: Export add...
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
  #if IS_ENABLED(CONFIG_IPV6)
  
  static inline bool vxlan_addr_any(const union vxlan_addr *ipa)
  {
  	if (ipa->sa.sa_family == AF_INET6)
  		return ipv6_addr_any(&ipa->sin6.sin6_addr);
  	else
  		return ipa->sin.sin_addr.s_addr == htonl(INADDR_ANY);
  }
  
  static inline bool vxlan_addr_multicast(const union vxlan_addr *ipa)
  {
  	if (ipa->sa.sa_family == AF_INET6)
  		return ipv6_addr_is_multicast(&ipa->sin6.sin6_addr);
  	else
842841ece   Dave Taht   Convert usage of ...
382
  		return ipv4_is_multicast(ipa->sin.sin_addr.s_addr);
cca45e054   Ido Schimmel   vxlan: Export add...
383
384
385
386
387
388
389
390
391
392
393
  }
  
  #else /* !IS_ENABLED(CONFIG_IPV6) */
  
  static inline bool vxlan_addr_any(const union vxlan_addr *ipa)
  {
  	return ipa->sin.sin_addr.s_addr == htonl(INADDR_ANY);
  }
  
  static inline bool vxlan_addr_multicast(const union vxlan_addr *ipa)
  {
842841ece   Dave Taht   Convert usage of ...
394
  	return ipv4_is_multicast(ipa->sin.sin_addr.s_addr);
cca45e054   Ido Schimmel   vxlan: Export add...
395
396
397
  }
  
  #endif /* IS_ENABLED(CONFIG_IPV6) */
5ff4ff4fe   Ido Schimmel   net: Add netif_is...
398
399
400
401
402
  static inline bool netif_is_vxlan(const struct net_device *dev)
  {
  	return dev->rtnl_link_ops &&
  	       !strcmp(dev->rtnl_link_ops->kind, "vxlan");
  }
9a9973531   Petr Machata   vxlan: Add switch...
403
404
405
406
407
408
409
410
  struct switchdev_notifier_vxlan_fdb_info {
  	struct switchdev_notifier_info info; /* must be first */
  	union vxlan_addr remote_ip;
  	__be16 remote_port;
  	__be32 remote_vni;
  	u32 remote_ifindex;
  	u8 eth_addr[ETH_ALEN];
  	__be32 vni;
0efe11733   Petr Machata   vxlan: Support ma...
411
  	bool offloaded;
45598c1ce   Petr Machata   vxlan: Mark user-...
412
  	bool added_by_user;
9a9973531   Petr Machata   vxlan: Add switch...
413
  };
1941f1d64   Petr Machata   vxlan: Add vxlan_...
414
415
416
  #if IS_ENABLED(CONFIG_VXLAN)
  int vxlan_fdb_find_uc(struct net_device *dev, const u8 *mac, __be32 vni,
  		      struct switchdev_notifier_vxlan_fdb_info *fdb_info);
4f89f5b53   Petr Machata   vxlan: Add vxlan_...
417
  int vxlan_fdb_replay(const struct net_device *dev, __be32 vni,
4c59b7d16   Petr Machata   vxlan: Add extack...
418
419
  		     struct notifier_block *nb,
  		     struct netlink_ext_ack *extack);
e5ff4b195   Petr Machata   vxlan: Add vxlan_...
420
  void vxlan_fdb_clear_offload(const struct net_device *dev, __be32 vni);
4f89f5b53   Petr Machata   vxlan: Add vxlan_...
421

1941f1d64   Petr Machata   vxlan: Add vxlan_...
422
423
424
425
426
427
428
  #else
  static inline int
  vxlan_fdb_find_uc(struct net_device *dev, const u8 *mac, __be32 vni,
  		  struct switchdev_notifier_vxlan_fdb_info *fdb_info)
  {
  	return -ENOENT;
  }
4f89f5b53   Petr Machata   vxlan: Add vxlan_...
429
430
  
  static inline int vxlan_fdb_replay(const struct net_device *dev, __be32 vni,
4c59b7d16   Petr Machata   vxlan: Add extack...
431
432
  				   struct notifier_block *nb,
  				   struct netlink_ext_ack *extack)
4f89f5b53   Petr Machata   vxlan: Add vxlan_...
433
434
435
  {
  	return -EOPNOTSUPP;
  }
e5ff4b195   Petr Machata   vxlan: Add vxlan_...
436
437
438
439
440
  
  static inline void
  vxlan_fdb_clear_offload(const struct net_device *dev, __be32 vni)
  {
  }
1941f1d64   Petr Machata   vxlan: Add vxlan_...
441
  #endif
70fb08288   Roopa Prabhu   vxlan: add extack...
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
  static inline void vxlan_flag_attr_error(int attrtype,
  					 struct netlink_ext_ack *extack)
  {
  #define VXLAN_FLAG(flg) \
  	case IFLA_VXLAN_##flg: \
  		NL_SET_ERR_MSG_MOD(extack, \
  				   "cannot change " #flg " flag"); \
  		break
  	switch (attrtype) {
  	VXLAN_FLAG(TTL_INHERIT);
  	VXLAN_FLAG(LEARNING);
  	VXLAN_FLAG(PROXY);
  	VXLAN_FLAG(RSC);
  	VXLAN_FLAG(L2MISS);
  	VXLAN_FLAG(L3MISS);
  	VXLAN_FLAG(COLLECT_METADATA);
  	VXLAN_FLAG(UDP_ZERO_CSUM6_TX);
  	VXLAN_FLAG(UDP_ZERO_CSUM6_RX);
  	VXLAN_FLAG(REMCSUM_TX);
  	VXLAN_FLAG(REMCSUM_RX);
  	VXLAN_FLAG(GBP);
  	VXLAN_FLAG(GPE);
  	VXLAN_FLAG(REMCSUM_NOPARTIAL);
  	default:
  		NL_SET_ERR_MSG_MOD(extack, \
  				   "cannot change flag");
  		break;
  	}
  #undef VXLAN_FLAG
  }
1274e1cc4   Roopa Prabhu   vxlan: ecmp suppo...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
  static inline bool vxlan_fdb_nh_path_select(struct nexthop *nh,
  					    int hash,
  					    struct vxlan_rdst *rdst)
  {
  	struct fib_nh_common *nhc;
  
  	nhc = nexthop_path_fdb_result(nh, hash);
  	if (unlikely(!nhc))
  		return false;
  
  	switch (nhc->nhc_gw_family) {
  	case AF_INET:
  		rdst->remote_ip.sin.sin_addr.s_addr = nhc->nhc_gw.ipv4;
  		rdst->remote_ip.sa.sa_family = AF_INET;
  		break;
  	case AF_INET6:
  		rdst->remote_ip.sin6.sin6_addr = nhc->nhc_gw.ipv6;
  		rdst->remote_ip.sa.sa_family = AF_INET6;
  		break;
  	}
  
  	return true;
  }
48e92c44b   Jiri Benc   vxlan: fix multip...
495
  #endif