These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / ipv4 / udp_tunnel.c
index 6bb98cc..aba4286 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)
@@ -15,12 +16,10 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
        struct socket *sock = NULL;
        struct sockaddr_in udp_addr;
 
-       err = sock_create_kern(AF_INET, SOCK_DGRAM, 0, &sock);
+       err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock);
        if (err < 0)
                goto error;
 
-       sk_change_net(sock->sk, net);
-
        udp_addr.sin_family = AF_INET;
        udp_addr.sin_addr = cfg->local_ip;
        udp_addr.sin_port = cfg->local_udp_port;
@@ -47,7 +46,7 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
 error:
        if (sock) {
                kernel_sock_shutdown(sock, SHUT_RDWR);
-               sk_release_kernel(sock->sk);
+               sock_release(sock);
        }
        *sockp = NULL;
        return err;
@@ -101,8 +100,30 @@ void udp_tunnel_sock_release(struct socket *sock)
 {
        rcu_assign_sk_user_data(sock->sk, NULL);
        kernel_sock_shutdown(sock, SHUT_RDWR);
-       sk_release_kernel(sock->sk);
+       sock_release(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");