|
@@ -96,34 +96,28 @@ void ip_send_check(struct iphdr *iph)
|
|
|
}
|
|
|
EXPORT_SYMBOL(ip_send_check);
|
|
|
|
|
|
-static int __ip_local_out_sk(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);
|
|
|
struct iphdr *iph = ip_hdr(skb);
|
|
|
|
|
|
iph->tot_len = htons(skb->len);
|
|
|
ip_send_check(iph);
|
|
|
return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT,
|
|
|
net, sk, skb, NULL, skb_dst(skb)->dev,
|
|
|
- dst_output_okfn);
|
|
|
+ dst_output);
|
|
|
}
|
|
|
|
|
|
-int __ip_local_out(struct sk_buff *skb)
|
|
|
-{
|
|
|
- return __ip_local_out_sk(skb->sk, skb);
|
|
|
-}
|
|
|
-
|
|
|
-int ip_local_out_sk(struct sock *sk, struct sk_buff *skb)
|
|
|
+int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
- err = __ip_local_out(skb);
|
|
|
+ err = __ip_local_out(net, sk, skb);
|
|
|
if (likely(err == 1))
|
|
|
- err = dst_output(sk, skb);
|
|
|
+ err = dst_output(net, sk, skb);
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(ip_local_out_sk);
|
|
|
+EXPORT_SYMBOL_GPL(ip_local_out);
|
|
|
|
|
|
static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
|
|
|
{
|
|
@@ -143,6 +137,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
|
|
|
{
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
struct rtable *rt = skb_rtable(skb);
|
|
|
+ struct net *net = sock_net(sk);
|
|
|
struct iphdr *iph;
|
|
|
|
|
|
/* Build the IP header. */
|
|
@@ -161,7 +156,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
|
|
|
iph->id = 0;
|
|
|
} else {
|
|
|
iph->frag_off = 0;
|
|
|
- __ip_select_ident(sock_net(sk), iph, 1);
|
|
|
+ __ip_select_ident(net, iph, 1);
|
|
|
}
|
|
|
|
|
|
if (opt && opt->opt.optlen) {
|
|
@@ -173,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);
|
|
|
+ return ip_local_out(net, skb->sk, skb);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ip_build_and_send_pkt);
|
|
|
|
|
@@ -276,7 +271,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
|
|
|
/* Policy lookup after SNAT yielded a new policy */
|
|
|
if (skb_dst(skb)->xfrm) {
|
|
|
IPCB(skb)->flags |= IPSKB_REROUTED;
|
|
|
- return dst_output(sk, skb);
|
|
|
+ return dst_output(net, sk, skb);
|
|
|
}
|
|
|
#endif
|
|
|
mtu = ip_skb_dst_mtu(skb);
|
|
@@ -289,11 +284,10 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
|
|
|
return ip_finish_output2(net, sk, skb);
|
|
|
}
|
|
|
|
|
|
-int ip_mc_output(struct sock *sk, struct sk_buff *skb)
|
|
|
+int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct rtable *rt = skb_rtable(skb);
|
|
|
struct net_device *dev = rt->dst.dev;
|
|
|
- struct net *net = dev_net(dev);
|
|
|
|
|
|
/*
|
|
|
* If the indicated interface is up and running, send the packet.
|
|
@@ -352,10 +346,9 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb)
|
|
|
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
|
|
}
|
|
|
|
|
|
-int ip_output(struct sock *sk, struct sk_buff *skb)
|
|
|
+int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct net_device *dev = skb_dst(skb)->dev;
|
|
|
- struct net *net = dev_net(dev);
|
|
|
|
|
|
IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len);
|
|
|
|
|
@@ -386,6 +379,7 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)
|
|
|
int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
|
|
{
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
+ struct net *net = sock_net(sk);
|
|
|
struct ip_options_rcu *inet_opt;
|
|
|
struct flowi4 *fl4;
|
|
|
struct rtable *rt;
|
|
@@ -416,7 +410,7 @@ int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
|
|
* keep trying until route appears or the connection times
|
|
|
* itself out.
|
|
|
*/
|
|
|
- rt = ip_route_output_ports(sock_net(sk), fl4, sk,
|
|
|
+ rt = ip_route_output_ports(net, fl4, sk,
|
|
|
daddr, inet->inet_saddr,
|
|
|
inet->inet_dport,
|
|
|
inet->inet_sport,
|
|
@@ -453,20 +447,20 @@ packet_routed:
|
|
|
ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt, 0);
|
|
|
}
|
|
|
|
|
|
- ip_select_ident_segs(sock_net(sk), skb, sk,
|
|
|
+ ip_select_ident_segs(net, skb, sk,
|
|
|
skb_shinfo(skb)->gso_segs ?: 1);
|
|
|
|
|
|
/* TODO : should we use skb->sk here instead of sk ? */
|
|
|
skb->priority = sk->sk_priority;
|
|
|
skb->mark = sk->sk_mark;
|
|
|
|
|
|
- res = ip_local_out(skb);
|
|
|
+ res = ip_local_out(net, sk, skb);
|
|
|
rcu_read_unlock();
|
|
|
return res;
|
|
|
|
|
|
no_route:
|
|
|
rcu_read_unlock();
|
|
|
- IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
|
|
+ IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
|
|
|
kfree_skb(skb);
|
|
|
return -EHOSTUNREACH;
|
|
|
}
|
|
@@ -1440,7 +1434,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
- err = ip_local_out(skb);
|
|
|
+ err = ip_local_out(net, skb->sk, skb);
|
|
|
if (err) {
|
|
|
if (err > 0)
|
|
|
err = net_xmit_errno(err);
|