diff options
Diffstat (limited to 'net/ipv6/af_inet6.c')
| -rw-r--r-- | net/ipv6/af_inet6.c | 29 | 
1 files changed, 16 insertions, 13 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index d27c797f9f0..273f48d1df2 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -347,7 +347,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  			 */  			v4addr = LOOPBACK4_IPV6;  			if (!(addr_type & IPV6_ADDR_MULTICAST))	{ -				if (!inet->transparent && +				if (!(inet->freebind || inet->transparent) &&  				    !ipv6_chk_addr(net, &addr->sin6_addr,  						   dev, 0)) {  					err = -EADDRNOTAVAIL; @@ -361,10 +361,10 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  	inet->inet_rcv_saddr = v4addr;  	inet->inet_saddr = v4addr; -	ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr); +	np->rcv_saddr = addr->sin6_addr;  	if (!(addr_type & IPV6_ADDR_MULTICAST)) -		ipv6_addr_copy(&np->saddr, &addr->sin6_addr); +		np->saddr = addr->sin6_addr;  	/* Make sure we are allowed to bind here. */  	if (sk->sk_prot->get_port(sk, snum)) { @@ -458,14 +458,14 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,  		    peer == 1)  			return -ENOTCONN;  		sin->sin6_port = inet->inet_dport; -		ipv6_addr_copy(&sin->sin6_addr, &np->daddr); +		sin->sin6_addr = np->daddr;  		if (np->sndflow)  			sin->sin6_flowinfo = np->flow_label;  	} else {  		if (ipv6_addr_any(&np->rcv_saddr)) -			ipv6_addr_copy(&sin->sin6_addr, &np->saddr); +			sin->sin6_addr = np->saddr;  		else -			ipv6_addr_copy(&sin->sin6_addr, &np->rcv_saddr); +			sin->sin6_addr = np->rcv_saddr;  		sin->sin6_port = inet->inet_sport;  	} @@ -660,8 +660,8 @@ int inet6_sk_rebuild_header(struct sock *sk)  		memset(&fl6, 0, sizeof(fl6));  		fl6.flowi6_proto = sk->sk_protocol; -		ipv6_addr_copy(&fl6.daddr, &np->daddr); -		ipv6_addr_copy(&fl6.saddr, &np->saddr); +		fl6.daddr = np->daddr; +		fl6.saddr = np->saddr;  		fl6.flowlabel = np->flow_label;  		fl6.flowi6_oif = sk->sk_bound_dev_if;  		fl6.flowi6_mark = sk->sk_mark; @@ -769,7 +769,8 @@ out:  	return err;  } -static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, u32 features) +static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, +	netdev_features_t features)  {  	struct sk_buff *segs = ERR_PTR(-EINVAL);  	struct ipv6hdr *ipv6h; @@ -985,9 +986,9 @@ static int __net_init ipv6_init_mibs(struct net *net)  			  sizeof(struct icmpv6_mib),  			  __alignof__(struct icmpv6_mib)) < 0)  		goto err_icmp_mib; -	if (snmp_mib_init((void __percpu **)net->mib.icmpv6msg_statistics, -			  sizeof(struct icmpv6msg_mib), -			  __alignof__(struct icmpv6msg_mib)) < 0) +	net->mib.icmpv6msg_statistics = kzalloc(sizeof(struct icmpv6msg_mib), +						GFP_KERNEL); +	if (!net->mib.icmpv6msg_statistics)  		goto err_icmpmsg_mib;  	return 0; @@ -1008,7 +1009,7 @@ static void ipv6_cleanup_mibs(struct net *net)  	snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6);  	snmp_mib_free((void __percpu **)net->mib.ipv6_statistics);  	snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics); -	snmp_mib_free((void __percpu **)net->mib.icmpv6msg_statistics); +	kfree(net->mib.icmpv6msg_statistics);  }  static int __net_init inet6_net_init(struct net *net) @@ -1115,6 +1116,8 @@ static int __init inet6_init(void)  	if (err)  		goto static_sysctl_fail;  #endif +	tcpv6_prot.sysctl_mem = init_net.ipv4.sysctl_tcp_mem; +  	/*  	 *	ipngwg API draft makes clear that the correct semantics  	 *	for TCP and UDP is to consider one TCP and UDP instance  |