Blame view
include/net/udp_tunnel.h
4.83 KB
8024e0287
|
1 2 |
#ifndef __NET_UDP_TUNNEL_H #define __NET_UDP_TUNNEL_H |
6a93cc905
|
3 4 5 6 7 8 9 |
#include <net/ip_tunnels.h> #include <net/udp.h> #if IS_ENABLED(CONFIG_IPV6) #include <net/ipv6.h> #include <net/addrconf.h> #endif |
8024e0287
|
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
struct udp_port_cfg { u8 family; /* Used only for kernel-created sockets */ union { struct in_addr local_ip; #if IS_ENABLED(CONFIG_IPV6) struct in6_addr local_ip6; #endif }; union { struct in_addr peer_ip; #if IS_ENABLED(CONFIG_IPV6) struct in6_addr peer_ip6; #endif }; __be16 local_udp_port; __be16 peer_udp_port; unsigned int use_udp_checksums:1, use_udp6_tx_checksums:1, |
a43a9ef6a
|
32 33 |
use_udp6_rx_checksums:1, ipv6_v6only:1; |
8024e0287
|
34 |
}; |
fd384412e
|
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg, struct socket **sockp); #if IS_ENABLED(CONFIG_IPV6) int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, struct socket **sockp); #else static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, struct socket **sockp) { return 0; } #endif static inline int udp_sock_create(struct net *net, struct udp_port_cfg *cfg, struct socket **sockp) { if (cfg->family == AF_INET) return udp_sock_create4(net, cfg, sockp); if (cfg->family == AF_INET6) return udp_sock_create6(net, cfg, sockp); return -EPFNOSUPPORT; } |
8024e0287
|
61 |
|
6a93cc905
|
62 63 |
typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb); typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk); |
38fd2af24
|
64 65 66 67 68 |
typedef struct sk_buff **(*udp_tunnel_gro_receive_t)(struct sock *sk, struct sk_buff **head, struct sk_buff *skb); typedef int (*udp_tunnel_gro_complete_t)(struct sock *sk, struct sk_buff *skb, int nhoff); |
6a93cc905
|
69 70 71 72 73 74 75 |
struct udp_tunnel_sock_cfg { void *sk_user_data; /* user data used by encap_rcv call back */ /* Used for setting up udp_sock fields, see udp.h for details */ __u8 encap_type; udp_tunnel_encap_rcv_t encap_rcv; udp_tunnel_encap_destroy_t encap_destroy; |
38fd2af24
|
76 77 |
udp_tunnel_gro_receive_t gro_receive; udp_tunnel_gro_complete_t gro_complete; |
6a93cc905
|
78 79 80 81 82 |
}; /* Setup the given (UDP) sock to receive UDP encapsulated packets */ void setup_udp_tunnel_sock(struct net *net, struct socket *sock, struct udp_tunnel_sock_cfg *sock_cfg); |
e7b3db5e6
|
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
/* -- List of parsable UDP tunnel types -- * * Adding to this list will result in serious debate. The main issue is * that this list is essentially a list of workarounds for either poorly * designed tunnels, or poorly designed device offloads. * * The parsing supported via these types should really be used for Rx * traffic only as the network stack will have already inserted offsets for * the location of the headers in the skb. In addition any ports that are * pushed should be kept within the namespace without leaking to other * devices such as VFs or other ports on the same device. * * It is strongly encouraged to use CHECKSUM_COMPLETE for Rx to avoid the * need to use this for Rx checksum offload. It should not be necessary to * call this function to perform Tx offloads on outgoing traffic. */ enum udp_parsable_tunnel_type { UDP_TUNNEL_TYPE_VXLAN, /* RFC 7348 */ UDP_TUNNEL_TYPE_GENEVE, /* draft-ietf-nvo3-geneve */ |
b9adcd69b
|
102 |
UDP_TUNNEL_TYPE_VXLAN_GPE, /* draft-ietf-nvo3-vxlan-gpe */ |
e7b3db5e6
|
103 104 105 106 107 108 109 110 111 112 113 114 115 |
}; struct udp_tunnel_info { unsigned short type; sa_family_t sa_family; __be16 port; }; /* Notify network devices of offloadable types */ void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock, unsigned short type); void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type); void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type); |
7c46a640d
|
116 117 118 119 120 |
static inline void udp_tunnel_get_rx_info(struct net_device *dev) { ASSERT_RTNL(); call_netdevice_notifiers(NETDEV_UDP_TUNNEL_PUSH_INFO, dev); } |
6a93cc905
|
121 |
/* Transmit the skb using UDP encapsulation. */ |
039f50629
|
122 123 124 125 |
void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, bool xnet, bool nocheck); |
6a93cc905
|
126 127 |
#if IS_ENABLED(CONFIG_IPV6) |
79b16aade
|
128 129 |
int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb, |
d998f8efa
|
130 131 |
struct net_device *dev, struct in6_addr *saddr, struct in6_addr *daddr, |
134611446
|
132 133 |
__u8 prio, __u8 ttl, __be32 label, __be16 src_port, __be16 dst_port, bool nocheck); |
6a93cc905
|
134 135 136 |
#endif void udp_tunnel_sock_release(struct socket *sock); |
c29a70d2c
|
137 138 139 |
struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family, __be16 flags, __be64 tunnel_id, int md_size); |
86a980572
|
140 |
#ifdef CONFIG_INET |
aed069df0
|
141 |
static inline int udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum) |
6a93cc905
|
142 143 |
{ int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; |
6fa79666e
|
144 |
return iptunnel_handle_offloads(skb, type); |
6a93cc905
|
145 |
} |
86a980572
|
146 |
#endif |
6a93cc905
|
147 148 149 150 151 152 153 154 155 156 |
static inline void udp_tunnel_encap_enable(struct socket *sock) { #if IS_ENABLED(CONFIG_IPV6) if (sock->sk->sk_family == PF_INET6) ipv6_stub->udpv6_encap_enable(); else #endif udp_encap_enable(); } |
8024e0287
|
157 |
#endif |