diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 8c254191518..4f96b5c6368 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -238,7 +238,7 @@ exact_match:  	return result;  } -static struct sock *__udp6_lib_lookup(struct net *net, +struct sock *__udp6_lib_lookup(struct net *net,  				      const struct in6_addr *saddr, __be16 sport,  				      const struct in6_addr *daddr, __be16 dport,  				      int dif, struct udp_table *udptable) @@ -305,6 +305,7 @@ begin:  	rcu_read_unlock();  	return result;  } +EXPORT_SYMBOL_GPL(__udp6_lib_lookup);  static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb,  					  __be16 sport, __be16 dport, @@ -418,8 +419,7 @@ try_again:  			ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,  					       &sin6->sin6_addr);  		else { -			ipv6_addr_copy(&sin6->sin6_addr, -				       &ipv6_hdr(skb)->saddr); +			sin6->sin6_addr = ipv6_hdr(skb)->saddr;  			if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)  				sin6->sin6_scope_id = IP6CB(skb)->iif;  		} @@ -539,7 +539,9 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)  			goto drop;  	} -	if ((rc = ip_queue_rcv_skb(sk, skb)) < 0) { +	skb_dst_drop(skb); +	rc = sock_queue_rcv_skb(sk, skb); +	if (rc < 0) {  		/* Note that an ENOMEM error is charged twice */  		if (rc == -ENOMEM)  			UDP6_INC_STATS_BH(sock_net(sk), @@ -1114,11 +1116,11 @@ do_udp_sendmsg:  	fl6.flowi6_proto = sk->sk_protocol;  	if (!ipv6_addr_any(daddr)) -		ipv6_addr_copy(&fl6.daddr, daddr); +		fl6.daddr = *daddr;  	else  		fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */  	if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) -		ipv6_addr_copy(&fl6.saddr, &np->saddr); +		fl6.saddr = np->saddr;  	fl6.fl6_sport = inet->inet_sport;  	final_p = fl6_update_dst(&fl6, opt, &final); @@ -1299,7 +1301,8 @@ static int udp6_ufo_send_check(struct sk_buff *skb)  	return 0;  } -static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features) +static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, +	netdev_features_t features)  {  	struct sk_buff *segs = ERR_PTR(-EINVAL);  	unsigned int mss;  |