diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/af_inet6.c | 2 | ||||
| -rw-r--r-- | net/ipv6/datagram.c | 8 | ||||
| -rw-r--r-- | net/ipv6/inet6_connection_sock.c | 15 | 
3 files changed, 12 insertions, 13 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 3192aa02ba5..3f9e86b15e0 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -200,7 +200,7 @@ lookup_protocol:  	inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk);  	np->hop_limit	= -1; -	np->mcast_hops	= -1; +	np->mcast_hops	= IPV6_DEFAULT_MCASTHOPS;  	np->mc_loop	= 1;  	np->pmtudisc	= IPV6_PMTUDISC_WANT;  	np->ipv6only	= net->ipv6.sysctl.bindv6only; diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 622dc7939a1..61573885e45 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -222,6 +222,8 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,  	if (!skb)  		return; +	skb->protocol = htons(ETH_P_IPV6); +  	serr = SKB_EXT_ERR(skb);  	serr->ee.ee_errno = err;  	serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6; @@ -255,6 +257,8 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)  	if (!skb)  		return; +	skb->protocol = htons(ETH_P_IPV6); +  	skb_put(skb, sizeof(struct ipv6hdr));  	skb_reset_network_header(skb);  	iph = ipv6_hdr(skb); @@ -319,7 +323,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)  		sin->sin6_flowinfo = 0;  		sin->sin6_port = serr->port;  		sin->sin6_scope_id = 0; -		if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { +		if (skb->protocol == htons(ETH_P_IPV6)) {  			ipv6_addr_copy(&sin->sin6_addr,  				  (struct in6_addr *)(nh + serr->addr_offset));  			if (np->sndflow) @@ -341,7 +345,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)  		sin->sin6_family = AF_INET6;  		sin->sin6_flowinfo = 0;  		sin->sin6_scope_id = 0; -		if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { +		if (skb->protocol == htons(ETH_P_IPV6)) {  			ipv6_addr_copy(&sin->sin6_addr, &ipv6_hdr(skb)->saddr);  			if (np->rxopt.all)  				datagram_recv_ctl(sk, msg, skb); diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 3a4d92b5a83..628db24bcf2 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c @@ -42,16 +42,11 @@ int inet6_csk_bind_conflict(const struct sock *sk,  		if (sk != sk2 &&  		    (!sk->sk_bound_dev_if ||  		     !sk2->sk_bound_dev_if || -		     sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { -			if ((!sk->sk_reuse || !sk2->sk_reuse || -			     sk2->sk_state == TCP_LISTEN) && -			     ipv6_rcv_saddr_equal(sk, sk2)) -				break; -			else if (sk->sk_reuse && sk2->sk_reuse && -				!ipv6_addr_any(inet6_rcv_saddr(sk)) && -				ipv6_rcv_saddr_equal(sk, sk2)) -				break; -		} +		     sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && +		    (!sk->sk_reuse || !sk2->sk_reuse || +		     sk2->sk_state == TCP_LISTEN) && +		     ipv6_rcv_saddr_equal(sk, sk2)) +			break;  	}  	return node != NULL;  |