]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv4/ip_fragment.c
Merge remote-tracking branch 'ipsec/master'
[karo-tx-linux.git] / net / ipv4 / ip_fragment.c
index fa7f15305f9a2c1fa2f25d98047a161b6011ead1..1fe55ae817818abf9f10fa4c06a222476d3d3c45 100644 (file)
@@ -48,7 +48,7 @@
 #include <linux/inet.h>
 #include <linux/netfilter_ipv4.h>
 #include <net/inet_ecn.h>
-#include <net/vrf.h>
+#include <net/l3mdev.h>
 
 /* NOTE. Logic of IP defragmentation is parallel to corresponding IPv6
  * code now. If you change something here, _PLEASE_ update ipv6/reassembly.c
@@ -78,7 +78,7 @@ struct ipq {
        u8              ecn; /* RFC3168 support */
        u16             max_df_size; /* largest frag with DF set seen */
        int             iif;
-       int             vif;   /* VRF device index */
+       int             vif;   /* L3 master device index */
        unsigned int    rid;
        struct inet_peer *peer;
 };
@@ -654,11 +654,10 @@ out_fail:
 }
 
 /* Process an incoming IP datagram fragment. */
-int ip_defrag(struct sk_buff *skb, u32 user)
+int ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
 {
        struct net_device *dev = skb->dev ? : skb_dst(skb)->dev;
-       int vif = vrf_master_ifindex_rcu(dev);
-       struct net *net = dev_net(dev);
+       int vif = l3mdev_master_ifindex_rcu(dev);
        struct ipq *qp;
 
        IP_INC_STATS_BH(net, IPSTATS_MIB_REASMREQDS);
@@ -683,7 +682,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)
 }
 EXPORT_SYMBOL(ip_defrag);
 
-struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)
+struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
 {
        struct iphdr iph;
        int netoff;
@@ -712,7 +711,7 @@ struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)
                        if (pskb_trim_rcsum(skb, netoff + len))
                                return skb;
                        memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
-                       if (ip_defrag(skb, user))
+                       if (ip_defrag(net, skb, user))
                                return NULL;
                        skb_clear_hash(skb);
                }
@@ -840,6 +839,8 @@ static void __init ip4_frags_ctl_register(void)
 
 static int __net_init ipv4_frags_init_net(struct net *net)
 {
+       int res;
+
        /* Fragment cache limits.
         *
         * The fragment memory accounting code, (tries to) account for
@@ -863,9 +864,13 @@ static int __net_init ipv4_frags_init_net(struct net *net)
         */
        net->ipv4.frags.timeout = IP_FRAG_TIME;
 
-       inet_frags_init_net(&net->ipv4.frags);
-
-       return ip4_frags_ns_ctl_register(net);
+       res = inet_frags_init_net(&net->ipv4.frags);
+       if (res)
+               return res;
+       res = ip4_frags_ns_ctl_register(net);
+       if (res)
+               inet_frags_uninit_net(&net->ipv4.frags);
+       return res;
 }
 
 static void __net_exit ipv4_frags_exit_net(struct net *net)