1
2#ifndef __NET_UDP_TUNNEL_H
3#define __NET_UDP_TUNNEL_H
4
5#include <net/ip_tunnels.h>
6#include <net/udp.h>
7
8#if IS_ENABLED(CONFIG_IPV6)
9#include <net/ipv6.h>
10#include <net/ipv6_stubs.h>
11#endif
12
13struct udp_port_cfg {
14 u8 family;
15
16
17 union {
18 struct in_addr local_ip;
19#if IS_ENABLED(CONFIG_IPV6)
20 struct in6_addr local_ip6;
21#endif
22 };
23
24 union {
25 struct in_addr peer_ip;
26#if IS_ENABLED(CONFIG_IPV6)
27 struct in6_addr peer_ip6;
28#endif
29 };
30
31 __be16 local_udp_port;
32 __be16 peer_udp_port;
33 int bind_ifindex;
34 unsigned int use_udp_checksums:1,
35 use_udp6_tx_checksums:1,
36 use_udp6_rx_checksums:1,
37 ipv6_v6only:1;
38};
39
40int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
41 struct socket **sockp);
42
43#if IS_ENABLED(CONFIG_IPV6)
44int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
45 struct socket **sockp);
46#else
47static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
48 struct socket **sockp)
49{
50 return 0;
51}
52#endif
53
54static inline int udp_sock_create(struct net *net,
55 struct udp_port_cfg *cfg,
56 struct socket **sockp)
57{
58 if (cfg->family == AF_INET)
59 return udp_sock_create4(net, cfg, sockp);
60
61 if (cfg->family == AF_INET6)
62 return udp_sock_create6(net, cfg, sockp);
63
64 return -EPFNOSUPPORT;
65}
66
67typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
68typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *sk,
69 struct sk_buff *skb);
70typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
71typedef struct sk_buff *(*udp_tunnel_gro_receive_t)(struct sock *sk,
72 struct list_head *head,
73 struct sk_buff *skb);
74typedef int (*udp_tunnel_gro_complete_t)(struct sock *sk, struct sk_buff *skb,
75 int nhoff);
76
77struct udp_tunnel_sock_cfg {
78 void *sk_user_data;
79
80 __u8 encap_type;
81 udp_tunnel_encap_rcv_t encap_rcv;
82 udp_tunnel_encap_err_lookup_t encap_err_lookup;
83 udp_tunnel_encap_destroy_t encap_destroy;
84 udp_tunnel_gro_receive_t gro_receive;
85 udp_tunnel_gro_complete_t gro_complete;
86};
87
88
89void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
90 struct udp_tunnel_sock_cfg *sock_cfg);
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108enum udp_parsable_tunnel_type {
109 UDP_TUNNEL_TYPE_VXLAN = BIT(0),
110 UDP_TUNNEL_TYPE_GENEVE = BIT(1),
111 UDP_TUNNEL_TYPE_VXLAN_GPE = BIT(2),
112};
113
114struct udp_tunnel_info {
115 unsigned short type;
116 sa_family_t sa_family;
117 __be16 port;
118 u8 hw_priv;
119};
120
121
122void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
123 unsigned short type);
124void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
125 unsigned short type);
126void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type);
127void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type);
128
129static inline void udp_tunnel_get_rx_info(struct net_device *dev)
130{
131 ASSERT_RTNL();
132 if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
133 return;
134 call_netdevice_notifiers(NETDEV_UDP_TUNNEL_PUSH_INFO, dev);
135}
136
137static inline void udp_tunnel_drop_rx_info(struct net_device *dev)
138{
139 ASSERT_RTNL();
140 if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
141 return;
142 call_netdevice_notifiers(NETDEV_UDP_TUNNEL_DROP_INFO, dev);
143}
144
145
146void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
147 __be32 src, __be32 dst, __u8 tos, __u8 ttl,
148 __be16 df, __be16 src_port, __be16 dst_port,
149 bool xnet, bool nocheck);
150
151int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
152 struct sk_buff *skb,
153 struct net_device *dev, struct in6_addr *saddr,
154 struct in6_addr *daddr,
155 __u8 prio, __u8 ttl, __be32 label,
156 __be16 src_port, __be16 dst_port, bool nocheck);
157
158void udp_tunnel_sock_release(struct socket *sock);
159
160struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family,
161 __be16 flags, __be64 tunnel_id,
162 int md_size);
163
164#ifdef CONFIG_INET
165static inline int udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum)
166{
167 int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
168
169 return iptunnel_handle_offloads(skb, type);
170}
171#endif
172
173static inline void udp_tunnel_encap_enable(struct socket *sock)
174{
175 struct udp_sock *up = udp_sk(sock->sk);
176
177 if (up->encap_enabled)
178 return;
179
180 up->encap_enabled = 1;
181#if IS_ENABLED(CONFIG_IPV6)
182 if (sock->sk->sk_family == PF_INET6)
183 ipv6_stub->udpv6_encap_enable();
184#endif
185 udp_encap_enable();
186}
187
188#define UDP_TUNNEL_NIC_MAX_TABLES 4
189
190enum udp_tunnel_nic_info_flags {
191
192 UDP_TUNNEL_NIC_INFO_MAY_SLEEP = BIT(0),
193
194
195
196 UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
197
198 UDP_TUNNEL_NIC_INFO_IPV4_ONLY = BIT(2),
199
200
201
202
203 UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = BIT(3),
204};
205
206struct udp_tunnel_nic;
207
208#define UDP_TUNNEL_NIC_MAX_SHARING_DEVICES (U16_MAX / 2)
209
210struct udp_tunnel_nic_shared {
211 struct udp_tunnel_nic *udp_tunnel_nic_info;
212
213 struct list_head devices;
214};
215
216struct udp_tunnel_nic_shared_node {
217 struct net_device *dev;
218 struct list_head list;
219};
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250struct udp_tunnel_nic_info {
251
252 int (*set_port)(struct net_device *dev,
253 unsigned int table, unsigned int entry,
254 struct udp_tunnel_info *ti);
255 int (*unset_port)(struct net_device *dev,
256 unsigned int table, unsigned int entry,
257 struct udp_tunnel_info *ti);
258
259
260 int (*sync_table)(struct net_device *dev, unsigned int table);
261
262 struct udp_tunnel_nic_shared *shared;
263
264 unsigned int flags;
265
266 struct udp_tunnel_nic_table_info {
267 unsigned int n_entries;
268 unsigned int tunnel_types;
269 } tables[UDP_TUNNEL_NIC_MAX_TABLES];
270};
271
272
273
274
275
276
277
278
279
280
281
282struct udp_tunnel_nic_ops {
283 void (*get_port)(struct net_device *dev, unsigned int table,
284 unsigned int idx, struct udp_tunnel_info *ti);
285 void (*set_port_priv)(struct net_device *dev, unsigned int table,
286 unsigned int idx, u8 priv);
287 void (*add_port)(struct net_device *dev, struct udp_tunnel_info *ti);
288 void (*del_port)(struct net_device *dev, struct udp_tunnel_info *ti);
289 void (*reset_ntf)(struct net_device *dev);
290
291 size_t (*dump_size)(struct net_device *dev, unsigned int table);
292 int (*dump_write)(struct net_device *dev, unsigned int table,
293 struct sk_buff *skb);
294};
295
296#ifdef CONFIG_INET
297extern const struct udp_tunnel_nic_ops *udp_tunnel_nic_ops;
298#else
299#define udp_tunnel_nic_ops ((struct udp_tunnel_nic_ops *)NULL)
300#endif
301
302static inline void
303udp_tunnel_nic_get_port(struct net_device *dev, unsigned int table,
304 unsigned int idx, struct udp_tunnel_info *ti)
305{
306
307
308
309
310
311
312 memset(ti, 0, sizeof(*ti));
313
314 if (udp_tunnel_nic_ops)
315 udp_tunnel_nic_ops->get_port(dev, table, idx, ti);
316}
317
318static inline void
319udp_tunnel_nic_set_port_priv(struct net_device *dev, unsigned int table,
320 unsigned int idx, u8 priv)
321{
322 if (udp_tunnel_nic_ops)
323 udp_tunnel_nic_ops->set_port_priv(dev, table, idx, priv);
324}
325
326static inline void
327udp_tunnel_nic_add_port(struct net_device *dev, struct udp_tunnel_info *ti)
328{
329 if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
330 return;
331 if (udp_tunnel_nic_ops)
332 udp_tunnel_nic_ops->add_port(dev, ti);
333}
334
335static inline void
336udp_tunnel_nic_del_port(struct net_device *dev, struct udp_tunnel_info *ti)
337{
338 if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
339 return;
340 if (udp_tunnel_nic_ops)
341 udp_tunnel_nic_ops->del_port(dev, ti);
342}
343
344
345
346
347
348
349
350
351
352
353
354
355
356static inline void udp_tunnel_nic_reset_ntf(struct net_device *dev)
357{
358 if (udp_tunnel_nic_ops)
359 udp_tunnel_nic_ops->reset_ntf(dev);
360}
361
362static inline size_t
363udp_tunnel_nic_dump_size(struct net_device *dev, unsigned int table)
364{
365 if (!udp_tunnel_nic_ops)
366 return 0;
367 return udp_tunnel_nic_ops->dump_size(dev, table);
368}
369
370static inline int
371udp_tunnel_nic_dump_write(struct net_device *dev, unsigned int table,
372 struct sk_buff *skb)
373{
374 if (!udp_tunnel_nic_ops)
375 return 0;
376 return udp_tunnel_nic_ops->dump_write(dev, table, skb);
377}
378#endif
379