diff options
Diffstat (limited to 'net/ipv4/udp_tunnel.c')
| -rw-r--r-- | net/ipv4/udp_tunnel.c | 25 | 
1 files changed, 24 insertions, 1 deletions
diff --git a/net/ipv4/udp_tunnel.c b/net/ipv4/udp_tunnel.c index 933ea903f7b8..aba428626b52 100644 --- a/net/ipv4/udp_tunnel.c +++ b/net/ipv4/udp_tunnel.c @@ -4,9 +4,10 @@  #include <linux/udp.h>  #include <linux/types.h>  #include <linux/kernel.h> +#include <net/dst_metadata.h> +#include <net/net_namespace.h>  #include <net/udp.h>  #include <net/udp_tunnel.h> -#include <net/net_namespace.h>  int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,  		     struct socket **sockp) @@ -103,4 +104,26 @@ void udp_tunnel_sock_release(struct socket *sock)  }  EXPORT_SYMBOL_GPL(udp_tunnel_sock_release); +struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb,  unsigned short family, +				    __be16 flags, __be64 tunnel_id, int md_size) +{ +	struct metadata_dst *tun_dst; +	struct ip_tunnel_info *info; + +	if (family == AF_INET) +		tun_dst = ip_tun_rx_dst(skb, flags, tunnel_id, md_size); +	else +		tun_dst = ipv6_tun_rx_dst(skb, flags, tunnel_id, md_size); +	if (!tun_dst) +		return NULL; + +	info = &tun_dst->u.tun_info; +	info->key.tp_src = udp_hdr(skb)->source; +	info->key.tp_dst = udp_hdr(skb)->dest; +	if (udp_hdr(skb)->check) +		info->key.tun_flags |= TUNNEL_CSUM; +	return tun_dst; +} +EXPORT_SYMBOL_GPL(udp_tun_rx_dst); +  MODULE_LICENSE("GPL");  |