Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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