diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/addrconf.c | 15 | ||||
| -rw-r--r-- | net/ipv6/inet6_connection_sock.c | 3 | ||||
| -rw-r--r-- | net/ipv6/ip6_gre.c | 8 | ||||
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 1 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 3 | ||||
| -rw-r--r-- | net/ipv6/netfilter/ip6table_nat.c | 4 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 4 | ||||
| -rw-r--r-- | net/ipv6/route.c | 4 | 
8 files changed, 24 insertions, 18 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d7c56f8a5b4..0424e4e2741 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -3064,14 +3064,15 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq, loff_t pos)  		struct hlist_node *n;  		hlist_for_each_entry_rcu_bh(ifa, n, &inet6_addr_lst[state->bucket],  					 addr_lst) { +			if (!net_eq(dev_net(ifa->idev->dev), net)) +				continue;  			/* sync with offset */  			if (p < state->offset) {  				p++;  				continue;  			}  			state->offset++; -			if (net_eq(dev_net(ifa->idev->dev), net)) -				return ifa; +			return ifa;  		}  		/* prepare for next bucket */ @@ -3089,18 +3090,20 @@ static struct inet6_ifaddr *if6_get_next(struct seq_file *seq,  	struct hlist_node *n = &ifa->addr_lst;  	hlist_for_each_entry_continue_rcu_bh(ifa, n, addr_lst) { +		if (!net_eq(dev_net(ifa->idev->dev), net)) +			continue;  		state->offset++; -		if (net_eq(dev_net(ifa->idev->dev), net)) -			return ifa; +		return ifa;  	}  	while (++state->bucket < IN6_ADDR_HSIZE) {  		state->offset = 0;  		hlist_for_each_entry_rcu_bh(ifa, n,  				     &inet6_addr_lst[state->bucket], addr_lst) { +			if (!net_eq(dev_net(ifa->idev->dev), net)) +				continue;  			state->offset++; -			if (net_eq(dev_net(ifa->idev->dev), net)) -				return ifa; +			return ifa;  		}  	} diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index c4f934176ca..30647857a37 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c @@ -252,6 +252,7 @@ struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu)  		return NULL;  	dst->ops->update_pmtu(dst, sk, NULL, mtu); -	return inet6_csk_route_socket(sk, &fl6); +	dst = inet6_csk_route_socket(sk, &fl6); +	return IS_ERR(dst) ? NULL : dst;  }  EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu); diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 0185679c5f5..d5cb3c4e66f 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -1633,9 +1633,9 @@ static size_t ip6gre_get_size(const struct net_device *dev)  		/* IFLA_GRE_OKEY */  		nla_total_size(4) +  		/* IFLA_GRE_LOCAL */ -		nla_total_size(4) + +		nla_total_size(sizeof(struct in6_addr)) +  		/* IFLA_GRE_REMOTE */ -		nla_total_size(4) + +		nla_total_size(sizeof(struct in6_addr)) +  		/* IFLA_GRE_TTL */  		nla_total_size(1) +  		/* IFLA_GRE_TOS */ @@ -1659,8 +1659,8 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev)  	    nla_put_be16(skb, IFLA_GRE_OFLAGS, p->o_flags) ||  	    nla_put_be32(skb, IFLA_GRE_IKEY, p->i_key) ||  	    nla_put_be32(skb, IFLA_GRE_OKEY, p->o_key) || -	    nla_put(skb, IFLA_GRE_LOCAL, sizeof(struct in6_addr), &p->raddr) || -	    nla_put(skb, IFLA_GRE_REMOTE, sizeof(struct in6_addr), &p->laddr) || +	    nla_put(skb, IFLA_GRE_LOCAL, sizeof(struct in6_addr), &p->laddr) || +	    nla_put(skb, IFLA_GRE_REMOTE, sizeof(struct in6_addr), &p->raddr) ||  	    nla_put_u8(skb, IFLA_GRE_TTL, p->hop_limit) ||  	    /*nla_put_u8(skb, IFLA_GRE_TOS, t->priority) ||*/  	    nla_put_u8(skb, IFLA_GRE_ENCAP_LIMIT, p->encap_limit) || diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index ba6d13d1f1e..e02faed6d17 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -827,6 +827,7 @@ pref_skip_coa:  		if (val < 0 || val > 255)  			goto e_inval;  		np->min_hopcount = val; +		retv = 0;  		break;  	case IPV6_DONTFRAG:  		np->dontfrag = valbool; diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index ff36194a71a..2edce30ef73 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -535,7 +535,7 @@ static void ndisc_send_unsol_na(struct net_device *dev)  {  	struct inet6_dev *idev;  	struct inet6_ifaddr *ifa; -	struct in6_addr mcaddr; +	struct in6_addr mcaddr = IN6ADDR_LINKLOCAL_ALLNODES_INIT;  	idev = in6_dev_get(dev);  	if (!idev) @@ -543,7 +543,6 @@ static void ndisc_send_unsol_na(struct net_device *dev)  	read_lock_bh(&idev->lock);  	list_for_each_entry(ifa, &idev->addr_list, if_list) { -		addrconf_addr_solict_mult(&ifa->addr, &mcaddr);  		ndisc_send_na(dev, NULL, &mcaddr, &ifa->addr,  			      /*router=*/ !!idev->cnf.forwarding,  			      /*solicited=*/ false, /*override=*/ true, diff --git a/net/ipv6/netfilter/ip6table_nat.c b/net/ipv6/netfilter/ip6table_nat.c index e418bd6350a..d57dab17a18 100644 --- a/net/ipv6/netfilter/ip6table_nat.c +++ b/net/ipv6/netfilter/ip6table_nat.c @@ -186,7 +186,8 @@ nf_nat_ipv6_out(unsigned int hooknum,  		if (!nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.src.u3,  				      &ct->tuplehash[!dir].tuple.dst.u3) || -		    (ct->tuplehash[dir].tuple.src.u.all != +		    (ct->tuplehash[dir].tuple.dst.protonum != IPPROTO_ICMPV6 && +		     ct->tuplehash[dir].tuple.src.u.all !=  		     ct->tuplehash[!dir].tuple.dst.u.all))  			if (nf_xfrm_me_harder(skb, AF_INET6) < 0)  				ret = NF_DROP; @@ -222,6 +223,7 @@ nf_nat_ipv6_local_fn(unsigned int hooknum,  		}  #ifdef CONFIG_XFRM  		else if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && +			 ct->tuplehash[dir].tuple.dst.protonum != IPPROTO_ICMPV6 &&  			 ct->tuplehash[dir].tuple.dst.u.all !=  			 ct->tuplehash[!dir].tuple.src.u.all)  			if (nf_xfrm_me_harder(skb, AF_INET6)) diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 18bd9bbbd1c..22c8ea95118 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c @@ -85,7 +85,7 @@ static struct ctl_table nf_ct_frag6_sysctl_table[] = {  	{ }  }; -static int __net_init nf_ct_frag6_sysctl_register(struct net *net) +static int nf_ct_frag6_sysctl_register(struct net *net)  {  	struct ctl_table *table;  	struct ctl_table_header *hdr; @@ -127,7 +127,7 @@ static void __net_exit nf_ct_frags6_sysctl_unregister(struct net *net)  }  #else -static int __net_init nf_ct_frag6_sysctl_register(struct net *net) +static int nf_ct_frag6_sysctl_register(struct net *net)  {  	return 0;  } diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 7c7e963260e..b1e6cf0b95f 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -219,7 +219,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {  };  static const u32 ip6_template_metrics[RTAX_MAX] = { -	[RTAX_HOPLIMIT - 1] = 255, +	[RTAX_HOPLIMIT - 1] = 0,  };  static const struct rt6_info ip6_null_entry_template = { @@ -1232,7 +1232,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,  	rt->rt6i_dst.addr = fl6->daddr;  	rt->rt6i_dst.plen = 128;  	rt->rt6i_idev     = idev; -	dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); +	dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);  	spin_lock_bh(&icmp6_dst_lock);  	rt->dst.next = icmp6_dst_gc_list;  |