linux/include/net/udp_tunnel.h
<<
>>
Prefs
   1#ifndef __NET_UDP_TUNNEL_H
   2#define __NET_UDP_TUNNEL_H
   3
   4#include <net/ip_tunnels.h>
   5#include <net/udp.h>
   6
   7#if IS_ENABLED(CONFIG_IPV6)
   8#include <net/ipv6.h>
   9#include <net/addrconf.h>
  10#endif
  11
  12struct udp_port_cfg {
  13        u8                      family;
  14
  15        /* Used only for kernel-created sockets */
  16        union {
  17                struct in_addr          local_ip;
  18#if IS_ENABLED(CONFIG_IPV6)
  19                struct in6_addr         local_ip6;
  20#endif
  21        };
  22
  23        union {
  24                struct in_addr          peer_ip;
  25#if IS_ENABLED(CONFIG_IPV6)
  26                struct in6_addr         peer_ip6;
  27#endif
  28        };
  29
  30        __be16                  local_udp_port;
  31        __be16                  peer_udp_port;
  32        unsigned int            use_udp_checksums:1,
  33                                use_udp6_tx_checksums:1,
  34                                use_udp6_rx_checksums:1;
  35};
  36
  37int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
  38                     struct socket **sockp);
  39
  40#if IS_ENABLED(CONFIG_IPV6)
  41int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
  42                     struct socket **sockp);
  43#else
  44static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
  45                                   struct socket **sockp)
  46{
  47        return 0;
  48}
  49#endif
  50
  51static inline int udp_sock_create(struct net *net,
  52                                  struct udp_port_cfg *cfg,
  53                                  struct socket **sockp)
  54{
  55        if (cfg->family == AF_INET)
  56                return udp_sock_create4(net, cfg, sockp);
  57
  58        if (cfg->family == AF_INET6)
  59                return udp_sock_create6(net, cfg, sockp);
  60
  61        return -EPFNOSUPPORT;
  62}
  63
  64typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
  65typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
  66
  67struct udp_tunnel_sock_cfg {
  68        void *sk_user_data;     /* user data used by encap_rcv call back */
  69        /* Used for setting up udp_sock fields, see udp.h for details */
  70        __u8  encap_type;
  71        udp_tunnel_encap_rcv_t encap_rcv;
  72        udp_tunnel_encap_destroy_t encap_destroy;
  73};
  74
  75/* Setup the given (UDP) sock to receive UDP encapsulated packets */
  76void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
  77                           struct udp_tunnel_sock_cfg *sock_cfg);
  78
  79/* Transmit the skb using UDP encapsulation. */
  80int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
  81                        __be32 src, __be32 dst, __u8 tos, __u8 ttl,
  82                        __be16 df, __be16 src_port, __be16 dst_port,
  83                        bool xnet, bool nocheck);
  84
  85#if IS_ENABLED(CONFIG_IPV6)
  86int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
  87                         struct sk_buff *skb,
  88                         struct net_device *dev, struct in6_addr *saddr,
  89                         struct in6_addr *daddr,
  90                         __u8 prio, __u8 ttl, __be16 src_port,
  91                         __be16 dst_port, bool nocheck);
  92#endif
  93
  94void udp_tunnel_sock_release(struct socket *sock);
  95
  96static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb,
  97                                                         bool udp_csum)
  98{
  99        int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
 100
 101        return iptunnel_handle_offloads(skb, udp_csum, type);
 102}
 103
 104static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff)
 105{
 106        struct udphdr *uh;
 107
 108        uh = (struct udphdr *)(skb->data + nhoff - sizeof(struct udphdr));
 109        skb_shinfo(skb)->gso_type |= uh->check ?
 110                                SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
 111}
 112
 113static inline void udp_tunnel_encap_enable(struct socket *sock)
 114{
 115#if IS_ENABLED(CONFIG_IPV6)
 116        if (sock->sk->sk_family == PF_INET6)
 117                ipv6_stub->udpv6_encap_enable();
 118        else
 119#endif
 120                udp_encap_enable();
 121}
 122
 123#endif
 124