mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									33224b16ff
								
							
						
					
					
						commit
						ede2059dba
					
				
					 18 changed files with 45 additions and 53 deletions
				
			
		| 
						 | 
					@ -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 {
 | 
				
			||||||
	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,
 | 
				
			||||||
	__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)
 | 
				
			||||||
/* 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,
 | 
				
			||||||
	   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,
 | 
				
			||||||
 *	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 {
 | 
				
			||||||
	__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 {
 | 
				
			||||||
	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,
 | 
				
			||||||
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,
 | 
				
			||||||
	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 {
 | 
				
			||||||
						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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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);
 | 
				
			||||||
__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)
 | 
				
			||||||
	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,
 | 
				
			||||||
	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)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	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 = {
 | 
				
			||||||
	.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)
 | 
				
			||||||
		 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,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
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)
 | 
				
			||||||
	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
 | 
				
			||||||
	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)
 | 
				
			||||||
 * 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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
 | 
				
			||||||
	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)
 | 
				
			||||||
			    !(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)
 | 
				
			||||||
		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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		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)
 | 
				
			||||||
	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)
 | 
				
			||||||
	*(__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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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
 | 
				
			||||||
		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 *,
 | 
				
			||||||
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 = {
 | 
				
			||||||
		.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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		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)
 | 
				
			||||||
		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)
 | 
				
			||||||
	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)
 | 
				
			||||||
	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)
 | 
				
			||||||
	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)
 | 
				
			||||||
	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)
 | 
				
			||||||
	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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue