提交 ede2059d 编写于 作者: E Eric W. Biederman 提交者: David S. Miller

dst: Pass net into dst->output

The network namespace is already passed into dst_output pass it into
dst->output lwt->output and friends.
Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 33224b16
...@@ -312,10 +312,9 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s ...@@ -312,10 +312,9 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
return ret; return ret;
} }
static int vrf_output(struct sock *sk, struct sk_buff *skb) static int vrf_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct net_device *dev = skb_dst(skb)->dev; struct net_device *dev = skb_dst(skb)->dev;
struct net *net = dev_net(dev);
IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len);
......
...@@ -45,7 +45,7 @@ struct dst_entry { ...@@ -45,7 +45,7 @@ struct dst_entry {
void *__pad1; void *__pad1;
#endif #endif
int (*input)(struct sk_buff *); int (*input)(struct sk_buff *);
int (*output)(struct sock *sk, struct sk_buff *skb); int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
unsigned short flags; unsigned short flags;
#define DST_HOST 0x0001 #define DST_HOST 0x0001
...@@ -365,10 +365,10 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev, ...@@ -365,10 +365,10 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev,
__skb_tunnel_rx(skb, dev, net); __skb_tunnel_rx(skb, dev, net);
} }
int dst_discard_sk(struct sock *sk, struct sk_buff *skb); int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
static inline int dst_discard(struct sk_buff *skb) static inline int dst_discard(struct sk_buff *skb)
{ {
return dst_discard_sk(skb->sk, skb); return dst_discard_out(&init_net, skb->sk, skb);
} }
void *dst_alloc(struct dst_ops *ops, struct net_device *dev, int initial_ref, void *dst_alloc(struct dst_ops *ops, struct net_device *dev, int initial_ref,
int initial_obsolete, unsigned short flags); int initial_obsolete, unsigned short flags);
...@@ -456,7 +456,7 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout) ...@@ -456,7 +456,7 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)
/* Output packet to network from transport. */ /* Output packet to network from transport. */
static inline int dst_output(struct net *net, struct sock *sk, struct sk_buff *skb) static inline int dst_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
return skb_dst(skb)->output(sk, skb); return skb_dst(skb)->output(net, sk, skb);
} }
/* Input packet from network to transport. */ /* Input packet from network to transport. */
......
...@@ -107,8 +107,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, ...@@ -107,8 +107,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
struct net_device *orig_dev); struct net_device *orig_dev);
int ip_local_deliver(struct sk_buff *skb); int ip_local_deliver(struct sk_buff *skb);
int ip_mr_input(struct sk_buff *skb); int ip_mr_input(struct sk_buff *skb);
int ip_output(struct sock *sk, struct sk_buff *skb); int ip_output(struct net *net, struct sock *sk, struct sk_buff *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);
int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
int (*output)(struct net *, struct sock *, struct sk_buff *)); int (*output)(struct net *, struct sock *, struct sk_buff *));
void ip_send_check(struct iphdr *ip); void ip_send_check(struct iphdr *ip);
......
...@@ -860,7 +860,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, ...@@ -860,7 +860,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net,
* skb processing functions * skb processing functions
*/ */
int ip6_output(struct sock *sk, struct sk_buff *skb); int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
int ip6_forward(struct sk_buff *skb); int ip6_forward(struct sk_buff *skb);
int ip6_input(struct sk_buff *skb); int ip6_input(struct sk_buff *skb);
int ip6_mc_input(struct sk_buff *skb); int ip6_mc_input(struct sk_buff *skb);
......
...@@ -18,7 +18,7 @@ struct lwtunnel_state { ...@@ -18,7 +18,7 @@ struct lwtunnel_state {
__u16 type; __u16 type;
__u16 flags; __u16 flags;
atomic_t refcnt; atomic_t refcnt;
int (*orig_output)(struct sock *sk, struct sk_buff *skb); int (*orig_output)(struct net *net, struct sock *sk, struct sk_buff *skb);
int (*orig_input)(struct sk_buff *); int (*orig_input)(struct sk_buff *);
int len; int len;
__u8 data[0]; __u8 data[0];
...@@ -28,7 +28,7 @@ struct lwtunnel_encap_ops { ...@@ -28,7 +28,7 @@ struct lwtunnel_encap_ops {
int (*build_state)(struct net_device *dev, struct nlattr *encap, int (*build_state)(struct net_device *dev, struct nlattr *encap,
unsigned int family, const void *cfg, unsigned int family, const void *cfg,
struct lwtunnel_state **ts); struct lwtunnel_state **ts);
int (*output)(struct sock *sk, struct sk_buff *skb); int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
int (*input)(struct sk_buff *skb); int (*input)(struct sk_buff *skb);
int (*fill_encap)(struct sk_buff *skb, int (*fill_encap)(struct sk_buff *skb,
struct lwtunnel_state *lwtstate); struct lwtunnel_state *lwtstate);
...@@ -88,7 +88,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb, ...@@ -88,7 +88,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb,
int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate); int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len); struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len);
int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b); int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
int lwtunnel_output(struct sock *sk, struct sk_buff *skb); int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb);
int lwtunnel_input(struct sk_buff *skb); int lwtunnel_input(struct sk_buff *skb);
#else #else
...@@ -160,7 +160,7 @@ static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a, ...@@ -160,7 +160,7 @@ static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,
return 0; return 0;
} }
static inline int lwtunnel_output(struct sock *sk, struct sk_buff *skb) static inline int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -333,7 +333,7 @@ struct xfrm_state_afinfo { ...@@ -333,7 +333,7 @@ struct xfrm_state_afinfo {
const xfrm_address_t *saddr); const xfrm_address_t *saddr);
int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
int (*output)(struct sock *sk, struct sk_buff *skb); int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
int (*output_finish)(struct sock *sk, struct sk_buff *skb); int (*output_finish)(struct sock *sk, struct sk_buff *skb);
int (*extract_input)(struct xfrm_state *x, int (*extract_input)(struct xfrm_state *x,
struct sk_buff *skb); struct sk_buff *skb);
...@@ -1527,7 +1527,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) ...@@ -1527,7 +1527,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb); int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb); int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
int xfrm4_output(struct sock *sk, struct sk_buff *skb); int xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb);
int xfrm4_output_finish(struct sock *sk, struct sk_buff *skb); int xfrm4_output_finish(struct sock *sk, struct sk_buff *skb);
int xfrm4_rcv_cb(struct sk_buff *skb, u8 protocol, int err); int xfrm4_rcv_cb(struct sk_buff *skb, u8 protocol, int err);
int xfrm4_protocol_register(struct xfrm4_protocol *handler, unsigned char protocol); int xfrm4_protocol_register(struct xfrm4_protocol *handler, unsigned char protocol);
...@@ -1552,7 +1552,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); ...@@ -1552,7 +1552,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr); __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
int xfrm6_output(struct sock *sk, struct sk_buff *skb); int xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb); int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb);
int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb, int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
u8 **prevhdr); u8 **prevhdr);
......
...@@ -144,12 +144,12 @@ static void dst_gc_task(struct work_struct *work) ...@@ -144,12 +144,12 @@ static void dst_gc_task(struct work_struct *work)
mutex_unlock(&dst_gc_mutex); mutex_unlock(&dst_gc_mutex);
} }
int dst_discard_sk(struct sock *sk, struct sk_buff *skb) int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
} }
EXPORT_SYMBOL(dst_discard_sk); EXPORT_SYMBOL(dst_discard_out);
const u32 dst_default_metrics[RTAX_MAX + 1] = { const u32 dst_default_metrics[RTAX_MAX + 1] = {
/* This initializer is needed to force linker to place this variable /* This initializer is needed to force linker to place this variable
...@@ -177,7 +177,7 @@ void dst_init(struct dst_entry *dst, struct dst_ops *ops, ...@@ -177,7 +177,7 @@ void dst_init(struct dst_entry *dst, struct dst_ops *ops,
dst->xfrm = NULL; dst->xfrm = NULL;
#endif #endif
dst->input = dst_discard; dst->input = dst_discard;
dst->output = dst_discard_sk; dst->output = dst_discard_out;
dst->error = 0; dst->error = 0;
dst->obsolete = initial_obsolete; dst->obsolete = initial_obsolete;
dst->header_len = 0; dst->header_len = 0;
...@@ -224,7 +224,7 @@ static void ___dst_free(struct dst_entry *dst) ...@@ -224,7 +224,7 @@ static void ___dst_free(struct dst_entry *dst)
*/ */
if (dst->dev == NULL || !(dst->dev->flags&IFF_UP)) { if (dst->dev == NULL || !(dst->dev->flags&IFF_UP)) {
dst->input = dst_discard; dst->input = dst_discard;
dst->output = dst_discard_sk; dst->output = dst_discard_out;
} }
dst->obsolete = DST_OBSOLETE_DEAD; dst->obsolete = DST_OBSOLETE_DEAD;
} }
...@@ -352,7 +352,7 @@ static struct dst_ops md_dst_ops = { ...@@ -352,7 +352,7 @@ static struct dst_ops md_dst_ops = {
.family = AF_UNSPEC, .family = AF_UNSPEC,
}; };
static int dst_md_discard_sk(struct sock *sk, struct sk_buff *skb) static int dst_md_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
WARN_ONCE(1, "Attempting to call output on metadata dst\n"); WARN_ONCE(1, "Attempting to call output on metadata dst\n");
kfree_skb(skb); kfree_skb(skb);
...@@ -375,7 +375,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen) ...@@ -375,7 +375,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen)
DST_METADATA | DST_NOCACHE | DST_NOCOUNT); DST_METADATA | DST_NOCACHE | DST_NOCOUNT);
dst->input = dst_md_discard; dst->input = dst_md_discard;
dst->output = dst_md_discard_sk; dst->output = dst_md_discard_out;
memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst)); memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst));
} }
...@@ -430,7 +430,7 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev, ...@@ -430,7 +430,7 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
if (!unregister) { if (!unregister) {
dst->input = dst_discard; dst->input = dst_discard;
dst->output = dst_discard_sk; dst->output = dst_discard_out;
} else { } else {
dst->dev = dev_net(dst->dev)->loopback_dev; dst->dev = dev_net(dst->dev)->loopback_dev;
dev_hold(dst->dev); dev_hold(dst->dev);
......
...@@ -180,7 +180,7 @@ int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b) ...@@ -180,7 +180,7 @@ int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b)
} }
EXPORT_SYMBOL(lwtunnel_cmp_encap); EXPORT_SYMBOL(lwtunnel_cmp_encap);
int lwtunnel_output(struct sock *sk, struct sk_buff *skb) int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
const struct lwtunnel_encap_ops *ops; const struct lwtunnel_encap_ops *ops;
...@@ -199,7 +199,7 @@ int lwtunnel_output(struct sock *sk, struct sk_buff *skb) ...@@ -199,7 +199,7 @@ int lwtunnel_output(struct sock *sk, struct sk_buff *skb)
rcu_read_lock(); rcu_read_lock();
ops = rcu_dereference(lwtun_encaps[lwtstate->type]); ops = rcu_dereference(lwtun_encaps[lwtstate->type]);
if (likely(ops && ops->output)) if (likely(ops && ops->output))
ret = ops->output(sk, skb); ret = ops->output(net, sk, skb);
rcu_read_unlock(); rcu_read_unlock();
if (ret == -EOPNOTSUPP) if (ret == -EOPNOTSUPP)
......
...@@ -744,7 +744,7 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type ...@@ -744,7 +744,7 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
return NET_RX_DROP; return NET_RX_DROP;
} }
static int dn_output(struct sock *sk, struct sk_buff *skb) static int dn_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
struct dn_route *rt = (struct dn_route *)dst; struct dn_route *rt = (struct dn_route *)dst;
...@@ -832,7 +832,7 @@ static int dn_forward(struct sk_buff *skb) ...@@ -832,7 +832,7 @@ static int dn_forward(struct sk_buff *skb)
* Used to catch bugs. This should never normally get * Used to catch bugs. This should never normally get
* called. * called.
*/ */
static int dn_rt_bug_sk(struct sock *sk, struct sk_buff *skb) static int dn_rt_bug_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct dn_skb_cb *cb = DN_SKB_CB(skb); struct dn_skb_cb *cb = DN_SKB_CB(skb);
...@@ -1469,7 +1469,7 @@ static int dn_route_input_slow(struct sk_buff *skb) ...@@ -1469,7 +1469,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
rt->n = neigh; rt->n = neigh;
rt->dst.lastuse = jiffies; rt->dst.lastuse = jiffies;
rt->dst.output = dn_rt_bug_sk; rt->dst.output = dn_rt_bug_out;
switch (res.type) { switch (res.type) {
case RTN_UNICAST: case RTN_UNICAST:
rt->dst.input = dn_forward; rt->dst.input = dn_forward;
......
...@@ -284,11 +284,10 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk ...@@ -284,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); 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 rtable *rt = skb_rtable(skb);
struct net_device *dev = rt->dst.dev; struct net_device *dev = rt->dst.dev;
struct net *net = dev_net(dev);
/* /*
* If the indicated interface is up and running, send the packet. * If the indicated interface is up and running, send the packet.
...@@ -347,10 +346,9 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb) ...@@ -347,10 +346,9 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb)
!(IPCB(skb)->flags & IPSKB_REROUTED)); !(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_device *dev = skb_dst(skb)->dev;
struct net *net = dev_net(dev);
IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len);
......
...@@ -1152,7 +1152,7 @@ static void ipv4_link_failure(struct sk_buff *skb) ...@@ -1152,7 +1152,7 @@ static void ipv4_link_failure(struct sk_buff *skb)
dst_set_expires(&rt->dst, 0); dst_set_expires(&rt->dst, 0);
} }
static int ip_rt_bug(struct sock *sk, struct sk_buff *skb) static int ip_rt_bug(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
pr_debug("%s: %pI4 -> %pI4, %s\n", pr_debug("%s: %pI4 -> %pI4, %s\n",
__func__, &ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr, __func__, &ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr,
...@@ -2303,7 +2303,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or ...@@ -2303,7 +2303,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
new->__use = 1; new->__use = 1;
new->input = dst_discard; new->input = dst_discard;
new->output = dst_discard_sk; new->output = dst_discard_out;
new->dev = ort->dst.dev; new->dev = ort->dst.dev;
if (new->dev) if (new->dev)
......
...@@ -94,10 +94,8 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb) ...@@ -94,10 +94,8 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)
return x->outer_mode->afinfo->output_finish(sk, skb); return x->outer_mode->afinfo->output_finish(sk, skb);
} }
int xfrm4_output(struct sock *sk, struct sk_buff *skb) int xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct net *net = dev_net(skb_dst(skb)->dev);
return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING,
net, sk, skb, NULL, skb_dst(skb)->dev, net, sk, skb, NULL, skb_dst(skb)->dev,
__xfrm4_output, __xfrm4_output,
......
...@@ -91,7 +91,7 @@ static void update_ipv6_locator(struct sk_buff *skb, struct ila_params *p) ...@@ -91,7 +91,7 @@ static void update_ipv6_locator(struct sk_buff *skb, struct ila_params *p)
*(__be64 *)&ip6h->daddr = p->locator; *(__be64 *)&ip6h->daddr = p->locator;
} }
static int ila_output(struct sock *sk, struct sk_buff *skb) static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
...@@ -100,7 +100,7 @@ static int ila_output(struct sock *sk, struct sk_buff *skb) ...@@ -100,7 +100,7 @@ static int ila_output(struct sock *sk, struct sk_buff *skb)
update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate)); update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate));
return dst->lwtstate->orig_output(sk, skb); return dst->lwtstate->orig_output(net, sk, skb);
drop: drop:
kfree_skb(skb); kfree_skb(skb);
......
...@@ -130,11 +130,10 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *s ...@@ -130,11 +130,10 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
return ip6_finish_output2(net, sk, skb); return ip6_finish_output2(net, sk, skb);
} }
int ip6_output(struct sock *sk, struct sk_buff *skb) int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct net_device *dev = skb_dst(skb)->dev; struct net_device *dev = skb_dst(skb)->dev;
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
struct net *net = dev_net(dev);
if (unlikely(idev->cnf.disable_ipv6)) { if (unlikely(idev->cnf.disable_ipv6)) {
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
......
...@@ -86,9 +86,9 @@ static void ip6_dst_ifdown(struct dst_entry *, ...@@ -86,9 +86,9 @@ static void ip6_dst_ifdown(struct dst_entry *,
static int ip6_dst_gc(struct dst_ops *ops); static int ip6_dst_gc(struct dst_ops *ops);
static int ip6_pkt_discard(struct sk_buff *skb); static int ip6_pkt_discard(struct sk_buff *skb);
static int ip6_pkt_discard_out(struct sock *sk, struct sk_buff *skb); static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
static int ip6_pkt_prohibit(struct sk_buff *skb); static int ip6_pkt_prohibit(struct sk_buff *skb);
static int ip6_pkt_prohibit_out(struct sock *sk, struct sk_buff *skb); static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
static void ip6_link_failure(struct sk_buff *skb); static void ip6_link_failure(struct sk_buff *skb);
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, u32 mtu); struct sk_buff *skb, u32 mtu);
...@@ -308,7 +308,7 @@ static const struct rt6_info ip6_blk_hole_entry_template = { ...@@ -308,7 +308,7 @@ static const struct rt6_info ip6_blk_hole_entry_template = {
.obsolete = DST_OBSOLETE_FORCE_CHK, .obsolete = DST_OBSOLETE_FORCE_CHK,
.error = -EINVAL, .error = -EINVAL,
.input = dst_discard, .input = dst_discard,
.output = dst_discard_sk, .output = dst_discard_out,
}, },
.rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
.rt6i_protocol = RTPROT_KERNEL, .rt6i_protocol = RTPROT_KERNEL,
...@@ -1195,7 +1195,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori ...@@ -1195,7 +1195,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
new->__use = 1; new->__use = 1;
new->input = dst_discard; new->input = dst_discard;
new->output = dst_discard_sk; new->output = dst_discard_out;
if (dst_metrics_read_only(&ort->dst)) if (dst_metrics_read_only(&ort->dst))
new->_metrics = ort->dst._metrics; new->_metrics = ort->dst._metrics;
...@@ -1853,7 +1853,7 @@ int ip6_route_info_create(struct fib6_config *cfg, struct rt6_info **rt_ret) ...@@ -1853,7 +1853,7 @@ int ip6_route_info_create(struct fib6_config *cfg, struct rt6_info **rt_ret)
switch (cfg->fc_type) { switch (cfg->fc_type) {
case RTN_BLACKHOLE: case RTN_BLACKHOLE:
rt->dst.error = -EINVAL; rt->dst.error = -EINVAL;
rt->dst.output = dst_discard_sk; rt->dst.output = dst_discard_out;
rt->dst.input = dst_discard; rt->dst.input = dst_discard;
break; break;
case RTN_PROHIBIT: case RTN_PROHIBIT:
...@@ -2446,7 +2446,7 @@ static int ip6_pkt_discard(struct sk_buff *skb) ...@@ -2446,7 +2446,7 @@ static int ip6_pkt_discard(struct sk_buff *skb)
return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES); return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
} }
static int ip6_pkt_discard_out(struct sock *sk, struct sk_buff *skb) static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
skb->dev = skb_dst(skb)->dev; skb->dev = skb_dst(skb)->dev;
return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES); return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
...@@ -2457,7 +2457,7 @@ static int ip6_pkt_prohibit(struct sk_buff *skb) ...@@ -2457,7 +2457,7 @@ static int ip6_pkt_prohibit(struct sk_buff *skb)
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES); return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
} }
static int ip6_pkt_prohibit_out(struct sock *sk, struct sk_buff *skb) static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
skb->dev = skb_dst(skb)->dev; skb->dev = skb_dst(skb)->dev;
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
......
...@@ -173,10 +173,8 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb) ...@@ -173,10 +173,8 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
return x->outer_mode->afinfo->output_finish(sk, skb); return x->outer_mode->afinfo->output_finish(sk, skb);
} }
int xfrm6_output(struct sock *sk, struct sk_buff *skb) int xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct net *net = dev_net(skb_dst(skb)->dev);
return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING,
net, sk, skb, NULL, skb_dst(skb)->dev, net, sk, skb, NULL, skb_dst(skb)->dev,
__xfrm6_output, __xfrm6_output,
......
...@@ -37,7 +37,7 @@ static unsigned int mpls_encap_size(struct mpls_iptunnel_encap *en) ...@@ -37,7 +37,7 @@ static unsigned int mpls_encap_size(struct mpls_iptunnel_encap *en)
return en->labels * sizeof(struct mpls_shim_hdr); return en->labels * sizeof(struct mpls_shim_hdr);
} }
int mpls_output(struct sock *sk, struct sk_buff *skb) int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct mpls_iptunnel_encap *tun_encap_info; struct mpls_iptunnel_encap *tun_encap_info;
struct mpls_shim_hdr *hdr; struct mpls_shim_hdr *hdr;
......
...@@ -1957,7 +1957,7 @@ static void xfrm_policy_queue_process(unsigned long arg) ...@@ -1957,7 +1957,7 @@ static void xfrm_policy_queue_process(unsigned long arg)
xfrm_pol_put(pol); xfrm_pol_put(pol);
} }
static int xdst_queue_output(struct sock *sk, struct sk_buff *skb) static int xdst_queue_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
unsigned long sched_next; unsigned long sched_next;
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册