Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
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 : :
13 : : struct udp_port_cfg {
14 : : u8 family;
15 : :
16 : : /* Used only for kernel-created sockets */
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 : :
40 : : int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
41 : : struct socket **sockp);
42 : :
43 : : #if IS_ENABLED(CONFIG_IPV6)
44 : : int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
45 : : struct socket **sockp);
46 : : #else
47 : : static 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 : :
54 : : static 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 : :
67 : : typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
68 : : typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *sk,
69 : : struct sk_buff *skb);
70 : : typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
71 : : typedef struct sk_buff *(*udp_tunnel_gro_receive_t)(struct sock *sk,
72 : : struct list_head *head,
73 : : struct sk_buff *skb);
74 : : typedef int (*udp_tunnel_gro_complete_t)(struct sock *sk, struct sk_buff *skb,
75 : : int nhoff);
76 : :
77 : : struct udp_tunnel_sock_cfg {
78 : : void *sk_user_data; /* user data used by encap_rcv call back */
79 : : /* Used for setting up udp_sock fields, see udp.h for details */
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 : : /* Setup the given (UDP) sock to receive UDP encapsulated packets */
89 : : void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
90 : : struct udp_tunnel_sock_cfg *sock_cfg);
91 : :
92 : : /* -- List of parsable UDP tunnel types --
93 : : *
94 : : * Adding to this list will result in serious debate. The main issue is
95 : : * that this list is essentially a list of workarounds for either poorly
96 : : * designed tunnels, or poorly designed device offloads.
97 : : *
98 : : * The parsing supported via these types should really be used for Rx
99 : : * traffic only as the network stack will have already inserted offsets for
100 : : * the location of the headers in the skb. In addition any ports that are
101 : : * pushed should be kept within the namespace without leaking to other
102 : : * devices such as VFs or other ports on the same device.
103 : : *
104 : : * It is strongly encouraged to use CHECKSUM_COMPLETE for Rx to avoid the
105 : : * need to use this for Rx checksum offload. It should not be necessary to
106 : : * call this function to perform Tx offloads on outgoing traffic.
107 : : */
108 : : enum udp_parsable_tunnel_type {
109 : : UDP_TUNNEL_TYPE_VXLAN, /* RFC 7348 */
110 : : UDP_TUNNEL_TYPE_GENEVE, /* draft-ietf-nvo3-geneve */
111 : : UDP_TUNNEL_TYPE_VXLAN_GPE, /* draft-ietf-nvo3-vxlan-gpe */
112 : : };
113 : :
114 : : struct udp_tunnel_info {
115 : : unsigned short type;
116 : : sa_family_t sa_family;
117 : : __be16 port;
118 : : };
119 : :
120 : : /* Notify network devices of offloadable types */
121 : : void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
122 : : unsigned short type);
123 : : void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
124 : : unsigned short type);
125 : : void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type);
126 : : void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type);
127 : :
128 : 0 : static inline void udp_tunnel_get_rx_info(struct net_device *dev)
129 : : {
130 [ # # # # ]: 0 : ASSERT_RTNL();
131 : : call_netdevice_notifiers(NETDEV_UDP_TUNNEL_PUSH_INFO, dev);
132 : 0 : }
133 : :
134 : 0 : static inline void udp_tunnel_drop_rx_info(struct net_device *dev)
135 : : {
136 [ # # # # ]: 0 : ASSERT_RTNL();
137 : : call_netdevice_notifiers(NETDEV_UDP_TUNNEL_DROP_INFO, dev);
138 : 0 : }
139 : :
140 : : /* Transmit the skb using UDP encapsulation. */
141 : : void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
142 : : __be32 src, __be32 dst, __u8 tos, __u8 ttl,
143 : : __be16 df, __be16 src_port, __be16 dst_port,
144 : : bool xnet, bool nocheck);
145 : :
146 : : #if IS_ENABLED(CONFIG_IPV6)
147 : : int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
148 : : struct sk_buff *skb,
149 : : struct net_device *dev, struct in6_addr *saddr,
150 : : struct in6_addr *daddr,
151 : : __u8 prio, __u8 ttl, __be32 label,
152 : : __be16 src_port, __be16 dst_port, bool nocheck);
153 : : #endif
154 : :
155 : : void udp_tunnel_sock_release(struct socket *sock);
156 : :
157 : : struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family,
158 : : __be16 flags, __be64 tunnel_id,
159 : : int md_size);
160 : :
161 : : #ifdef CONFIG_INET
162 : : static inline int udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum)
163 : : {
164 : : int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
165 : :
166 : : return iptunnel_handle_offloads(skb, type);
167 : : }
168 : : #endif
169 : :
170 : 0 : static inline void udp_tunnel_encap_enable(struct socket *sock)
171 : : {
172 : 0 : struct udp_sock *up = udp_sk(sock->sk);
173 : :
174 [ # # ]: 0 : if (up->encap_enabled)
175 : 0 : return;
176 : :
177 : 0 : up->encap_enabled = 1;
178 : : #if IS_ENABLED(CONFIG_IPV6)
179 [ # # ]: 0 : if (sock->sk->sk_family == PF_INET6)
180 : 0 : ipv6_stub->udpv6_encap_enable();
181 : : else
182 : : #endif
183 : : udp_encap_enable();
184 : : }
185 : :
186 : : #endif
|