diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
| commit | bf61c8840efe60fd8f91446860b63338fb424158 (patch) | |
| tree | 7a71832407a4f0d6346db773343f4c3ae2257b19 /net/ipv4/ip_vti.c | |
| parent | 5846115b30f3a881e542c8bfde59a699c1c13740 (diff) | |
| parent | 0c6a61657da78098472fd0eb71cc01f2387fa1bb (diff) | |
| download | olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.tar.xz olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.zip  | |
Merge branch 'next' into for-linus
Prepare first set of updates for 3.10 merge window.
Diffstat (limited to 'net/ipv4/ip_vti.c')
| -rw-r--r-- | net/ipv4/ip_vti.c | 31 | 
1 files changed, 11 insertions, 20 deletions
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 1831092f999..c3a4233c0ac 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c @@ -66,20 +66,6 @@ static void vti_tunnel_setup(struct net_device *dev);  static void vti_dev_free(struct net_device *dev);  static int vti_tunnel_bind_dev(struct net_device *dev); -/* Locking : hash tables are protected by RCU and RTNL */ - -#define for_each_ip_tunnel_rcu(start) \ -	for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) - -/* often modified stats are per cpu, other are shared (netdev->stats) */ -struct pcpu_tstats { -	u64	rx_packets; -	u64	rx_bytes; -	u64	tx_packets; -	u64	tx_bytes; -	struct	u64_stats_sync	syncp; -}; -  #define VTI_XMIT(stats1, stats2) do {				\  	int err;						\  	int pkt_len = skb->len;					\ @@ -142,19 +128,19 @@ static struct ip_tunnel *vti_tunnel_lookup(struct net *net,  	struct ip_tunnel *t;  	struct vti_net *ipn = net_generic(net, vti_net_id); -	for_each_ip_tunnel_rcu(ipn->tunnels_r_l[h0 ^ h1]) +	for_each_ip_tunnel_rcu(t, ipn->tunnels_r_l[h0 ^ h1])  		if (local == t->parms.iph.saddr &&  		    remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))  			return t; -	for_each_ip_tunnel_rcu(ipn->tunnels_r[h0]) +	for_each_ip_tunnel_rcu(t, ipn->tunnels_r[h0])  		if (remote == t->parms.iph.daddr && (t->dev->flags&IFF_UP))  			return t; -	for_each_ip_tunnel_rcu(ipn->tunnels_l[h1]) +	for_each_ip_tunnel_rcu(t, ipn->tunnels_l[h1])  		if (local == t->parms.iph.saddr && (t->dev->flags&IFF_UP))  			return t; -	for_each_ip_tunnel_rcu(ipn->tunnels_wc[0]) +	for_each_ip_tunnel_rcu(t, ipn->tunnels_wc[0])  		if (t && (t->dev->flags&IFF_UP))  			return t;  	return NULL; @@ -338,12 +324,17 @@ static int vti_rcv(struct sk_buff *skb)  	if (tunnel != NULL) {  		struct pcpu_tstats *tstats; +		if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) +			return -1; +  		tstats = this_cpu_ptr(tunnel->dev->tstats);  		u64_stats_update_begin(&tstats->syncp);  		tstats->rx_packets++;  		tstats->rx_bytes += skb->len;  		u64_stats_update_end(&tstats->syncp); +		skb->mark = 0; +		secpath_reset(skb);  		skb->dev = tunnel->dev;  		return 1;  	} @@ -497,7 +488,7 @@ vti_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  	case SIOCADDTUNNEL:  	case SIOCCHGTUNNEL:  		err = -EPERM; -		if (!capable(CAP_NET_ADMIN)) +		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))  			goto done;  		err = -EFAULT; @@ -562,7 +553,7 @@ vti_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  	case SIOCDELTUNNEL:  		err = -EPERM; -		if (!capable(CAP_NET_ADMIN)) +		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))  			goto done;  		if (dev == ipn->fb_tunnel_dev) {  |