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                                ipv6_v6only:1;
  36};
  37
  38int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
  39                     struct socket **sockp);
  40
  41#if IS_ENABLED(CONFIG_IPV6)
  42int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
  43                     struct socket **sockp);
  44#else
  45static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
  46                                   struct socket **sockp)
  47{
  48        return 0;
  49}
  50#endif
  51
  52static inline int udp_sock_create(struct net *net,
  53                                  struct udp_port_cfg *cfg,
  54                                  struct socket **sockp)
  55{
  56        if (cfg->family == AF_INET)
  57                return udp_sock_create4(net, cfg, sockp);
  58
  59        if (cfg->family == AF_INET6)
  60                return udp_sock_create6(net, cfg, sockp);
  61
  62        return -EPFNOSUPPORT;
  63}
  64
  65typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
  66typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
  67
  68struct udp_tunnel_sock_cfg {
  69        void *sk_user_data;     /* user data used by encap_rcv call back */
  70        /* Used for setting up udp_sock fields, see udp.h for details */
  71        __u8  encap_type;
  72        udp_tunnel_encap_rcv_t encap_rcv;
  73        udp_tunnel_encap_destroy_t encap_destroy;
  74};
  75
  76/* Setup the given (UDP) sock to receive UDP encapsulated packets */
  77void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
  78                           struct udp_tunnel_sock_cfg *sock_cfg);
  79
  80/* Transmit the skb using UDP encapsulation. */
  81void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
  82                         __be32 src, __be32 dst, __u8 tos, __u8 ttl,
  83                         __be16 df, __be16 src_port, __be16 dst_port,
  84                         bool xnet, bool nocheck);
  85
  86#if IS_ENABLED(CONFIG_IPV6)
  87int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
  88                         struct sk_buff *skb,
  89                         struct net_device *dev, struct in6_addr *saddr,
  90                         struct in6_addr *daddr,
  91                         __u8 prio, __u8 ttl, __be32 label,
  92                         __be16 src_port, __be16 dst_port, bool nocheck);
  93#endif
  94
  95void udp_tunnel_sock_release(struct socket *sock);
  96
  97struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family,
  98                                    __be16 flags, __be64 tunnel_id,
  99                                    int md_size);
 100
 101static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb,
 102                                                         bool udp_csum)
 103{
 104        int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
 105
 106        return iptunnel_handle_offloads(skb, type);
 107}
 108
 109static inline void udp_tunnel_encap_enable(struct socket *sock)
 110{
 111#if IS_ENABLED(CONFIG_IPV6)
 112        if (sock->sk->sk_family == PF_INET6)
 113                ipv6_stub->udpv6_encap_enable();
 114        else
 115#endif
 116                udp_encap_enable();
 117}
 118
 119#endif
 120