ipv4, ipv6: Pass net into ip_local_out and ip6_local_out
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 7 Oct 2015 21:48:46 +0000 (16:48 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 8 Oct 2015 11:27:02 +0000 (04:27 -0700)
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
18 files changed:
drivers/net/ipvlan/ipvlan_core.c
drivers/net/ppp/pptp.c
drivers/net/vrf.c
include/net/ip.h
include/net/ip6_tunnel.h
include/net/ipv6.h
net/ipv4/igmp.c
net/ipv4/ip_output.c
net/ipv4/ip_tunnel_core.c
net/ipv4/netfilter/ipt_SYNPROXY.c
net/ipv4/netfilter/nf_dup_ipv4.c
net/ipv4/netfilter/nf_reject_ipv4.c
net/ipv6/ip6_output.c
net/ipv6/netfilter/ip6t_SYNPROXY.c
net/ipv6/netfilter/nf_dup_ipv6.c
net/ipv6/netfilter/nf_reject_ipv6.c
net/ipv6/output_core.c
net/netfilter/ipvs/ip_vs_xmit.c

index 976f30b291f6a9f4769fb57cc21f2e408dea7712..24f8dbcf854f08a5c274e0894431b1ef45703784 100644 (file)
@@ -365,7 +365,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
        }
        skb_dst_drop(skb);
        skb_dst_set(skb, &rt->dst);
-       err = ip_local_out(skb->sk, skb);
+       err = ip_local_out(net, skb->sk, skb);
        if (unlikely(net_xmit_eval(err)))
                dev->stats.tx_errors++;
        else
@@ -403,7 +403,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
        }
        skb_dst_drop(skb);
        skb_dst_set(skb, dst);
-       err = ip6_local_out(skb->sk, skb);
+       err = ip6_local_out(net, skb->sk, skb);
        if (unlikely(net_xmit_eval(err)))
                dev->stats.tx_errors++;
        else
index 5243ab6ed4d4e06492a22fe4273c847964501370..fc69e41d09506e96b38f067fa05175bd680fa36b 100644 (file)
@@ -283,7 +283,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
        ip_select_ident(net, skb, NULL);
        ip_send_check(iph);
 
-       ip_local_out(skb->sk, skb);
+       ip_local_out(net, skb->sk, skb);
        return 1;
 
 tx_error:
index b27dc11cd3f26410b2514a57ac9f50540944d591..21bb7deb6d5882212bd54b34f770dc6fd29903b7 100644 (file)
@@ -76,7 +76,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)
 
 static int vrf_ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
-       return ip_local_out(sk, skb);
+       return ip_local_out(net, sk, skb);
 }
 
 static unsigned int vrf_v4_mtu(const struct dst_entry *dst)
@@ -222,7 +222,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb,
                                               RT_SCOPE_LINK);
        }
 
-       ret = ip_local_out(skb->sk, skb);
+       ret = ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
        if (unlikely(net_xmit_eval(ret)))
                vrf_dev->stats.tx_errors++;
        else
index 34b40381fb9ba056a3c189ffc49b6323711ab765..7febbab784cdfa4635fd4cf499ce78d78934db22 100644 (file)
@@ -113,7 +113,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
                   int (*output)(struct net *, struct sock *, struct sk_buff *));
 void ip_send_check(struct iphdr *ip);
 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
-int ip_local_out(struct sock *sk, struct sk_buff *skb);
+int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
 
 int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
 void ip_init(void);
index 8f18a8b126e92ac9014f3700646611b6974adb47..aaee6fa02cf1d2a756eb6b97559501c47af1c635 100644 (file)
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
        int pkt_len, err;
 
        pkt_len = skb->len - skb_inner_network_offset(skb);
-       err = ip6_local_out(sk, skb);
+       err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
 
        if (net_xmit_eval(err) == 0) {
                struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
index 42834039cf20b7ade04ca4c37b32576dda9ffc7e..fce8120c2be33e066d1a1d3d38e97c99d67f2c43 100644 (file)
@@ -866,7 +866,7 @@ int ip6_input(struct sk_buff *skb);
 int ip6_mc_input(struct sk_buff *skb);
 
 int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
-int ip6_local_out(struct sock *sk, struct sk_buff *skb);
+int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
 
 /*
  *     Extension header (options) processing
index 43375d9e02abce2f9059e4dfb2f8ed8d71f03b64..64aaf3522a59f30672689f7309987606773ccb0c 100644 (file)
@@ -397,7 +397,7 @@ static int igmpv3_sendpack(struct sk_buff *skb)
 
        pig->csum = ip_compute_csum(igmp_hdr(skb), igmplen);
 
-       return ip_local_out(skb->sk, skb);
+       return ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
 }
 
 static int grec_size(struct ip_mc_list *pmc, int type, int gdel, int sdel)
@@ -739,7 +739,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
        ih->group = group;
        ih->csum = ip_compute_csum((void *)ih, sizeof(struct igmphdr));
 
-       return ip_local_out(skb->sk, skb);
+       return ip_local_out(net, skb->sk, skb);
 }
 
 static void igmp_gq_timer_expire(unsigned long data)
index 39d3fbe66c6822904f940b7fa4e1dd42a70859ea..9fe100a41e5dc26fc1db856b78c6f044b0bd548a 100644 (file)
@@ -107,9 +107,8 @@ int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
                       dst_output);
 }
 
-int ip_local_out(struct sock *sk, struct sk_buff *skb)
+int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
-       struct net *net = dev_net(skb_dst(skb)->dev);
        int err;
 
        err = __ip_local_out(net, sk, skb);
@@ -169,7 +168,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
        skb->mark = sk->sk_mark;
 
        /* Send it out. */
-       return ip_local_out(skb->sk, skb);
+       return ip_local_out(net, skb->sk, skb);
 }
 EXPORT_SYMBOL_GPL(ip_build_and_send_pkt);
 
@@ -457,7 +456,7 @@ packet_routed:
        skb->priority = sk->sk_priority;
        skb->mark = sk->sk_mark;
 
-       res = ip_local_out(sk, skb);
+       res = ip_local_out(net, sk, skb);
        rcu_read_unlock();
        return res;
 
@@ -1437,7 +1436,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb)
 {
        int err;
 
-       err = ip_local_out(skb->sk, skb);
+       err = ip_local_out(net, skb->sk, skb);
        if (err) {
                if (err > 0)
                        err = net_xmit_errno(err);
index caef8e2c281dbacc70821bf4360ab1d12427c4f2..6cb9009c3d96785e566a3cb2cd065860e05980e1 100644 (file)
@@ -79,7 +79,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
        iph->ttl        =       ttl;
        __ip_select_ident(net, iph, skb_shinfo(skb)->gso_segs ?: 1);
 
-       err = ip_local_out(sk, skb);
+       err = ip_local_out(net, sk, skb);
        if (unlikely(net_xmit_eval(err)))
                pkt_len = 0;
        return pkt_len;
index 473faf73b194e5eac22f9fcefc0097aa7726878d..f1a8df8ecc1f344d58aa834fb7230b12e0fa1bc2 100644 (file)
@@ -63,7 +63,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,
                nf_conntrack_get(nfct);
        }
 
-       ip_local_out(nskb->sk, nskb);
+       ip_local_out(net, nskb->sk, nskb);
        return;
 
 free_nskb:
index 0b9abfbf65770bcb6d58b2f73d22bbebeb98345e..ceb187308120675c6f5d51000e5e7112a48b3670 100644 (file)
@@ -92,7 +92,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,
 
        if (nf_dup_ipv4_route(net, skb, gw, oif)) {
                __this_cpu_write(nf_skb_duplicated, true);
-               ip_local_out(skb->sk, skb);
+               ip_local_out(net, skb->sk, skb);
                __this_cpu_write(nf_skb_duplicated, false);
        } else {
                kfree_skb(skb);
index dcc125cb0441eb50940dbd2ddffea29f2b93ab2b..c747b2d9eb7703388762c71a7222a567e2ce5cde 100644 (file)
@@ -157,7 +157,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook)
                dev_queue_xmit(nskb);
        } else
 #endif
-               ip_local_out(nskb->sk, nskb);
+               ip_local_out(net, nskb->sk, nskb);
 
        return;
 
index 31c686b7fcc0b2c3a2ef97574c74d47c4e93a34c..98510fac94e9e854a25b3d5d6cf7b5da588ae380 100644 (file)
@@ -1692,7 +1692,7 @@ int ip6_send_skb(struct sk_buff *skb)
        struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
        int err;
 
-       err = ip6_local_out(skb->sk, skb);
+       err = ip6_local_out(net, skb->sk, skb);
        if (err) {
                if (err > 0)
                        err = net_xmit_errno(err);
index c38c3411150b42efa0dd0af261b413e1b7c070f1..a10a2a9e9f94129e2d4a92b0c58012eb346485b3 100644 (file)
@@ -76,7 +76,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,
                nf_conntrack_get(nfct);
        }
 
-       ip6_local_out(nskb->sk, nskb);
+       ip6_local_out(net, nskb->sk, nskb);
        return;
 
 free_nskb:
index 64f3fe5e2719df7e6b0ebedd25409e0c20bdefba..6989c70ae29f1541e0216d36d58ee142934a83c2 100644 (file)
@@ -68,7 +68,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum,
        }
        if (nf_dup_ipv6_route(net, skb, gw, oif)) {
                __this_cpu_write(nf_skb_duplicated, true);
-               ip6_local_out(skb->sk, skb);
+               ip6_local_out(net, skb->sk, skb);
                __this_cpu_write(nf_skb_duplicated, false);
        } else {
                kfree_skb(skb);
index a4f73e235ca5d95c9f82cae88fb4ad41ce35c819..7309e475f68b405d040e53069b123663914ffd7b 100644 (file)
@@ -206,7 +206,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook)
                dev_queue_xmit(nskb);
        } else
 #endif
-               ip6_local_out(nskb->sk, nskb);
+               ip6_local_out(net, nskb->sk, nskb);
 }
 EXPORT_SYMBOL_GPL(nf_send_reset6);
 
index 7f64d67b637d8764eec3dc00cadf97201deb77a4..462f2a76b5c2270dba806e193a4c5bde57e14a39 100644 (file)
@@ -154,9 +154,8 @@ int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
 }
 EXPORT_SYMBOL_GPL(__ip6_local_out);
 
-int ip6_local_out(struct sock *sk, struct sk_buff *skb)
+int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
-       struct net *net = dev_net(skb_dst(skb)->dev);
        int err;
 
        err = __ip6_local_out(net, sk, skb);
index 2042b9303136606db348a4dc52e7137ab8f8fbce..3264cb49b333620d6013cf1f6686f09bf07f9b8a 100644 (file)
@@ -1049,7 +1049,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
 
        ret = ip_vs_tunnel_xmit_prepare(skb, cp);
        if (ret == NF_ACCEPT)
-               ip_local_out(skb->sk, skb);
+               ip_local_out(net, skb->sk, skb);
        else if (ret == NF_DROP)
                kfree_skb(skb);
        rcu_read_unlock();
@@ -1141,7 +1141,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
 
        ret = ip_vs_tunnel_xmit_prepare(skb, cp);
        if (ret == NF_ACCEPT)
-               ip6_local_out(skb->sk, skb);
+               ip6_local_out(cp->ipvs->net, skb->sk, skb);
        else if (ret == NF_DROP)
                kfree_skb(skb);
        rcu_read_unlock();