]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ipv4/udp_tunnel.c
Merge remote-tracking branches 'regulator/fix/anatop', 'regulator/fix/gpio', 'regulat...
[karo-tx-linux.git] / net / ipv4 / udp_tunnel.c
index 933ea903f7b8fffc02fb7f82deab9c98c35e2daf..aba428626b5290ddf68c8b350b8b2879119d136b 100644 (file)
@@ -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");