diff options
Diffstat (limited to 'net/ipv4/udp.c')
| -rw-r--r-- | net/ipv4/udp.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 1b7ebbcae497..4077d589b72e 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -416,7 +416,7 @@ static struct sock *udp4_lib_lookup2(struct net *net,  				     struct udp_hslot *hslot2,  				     struct sk_buff *skb)  { -	struct sock *sk, *result; +	struct sock *sk, *result, *reuseport_result;  	int score, badness;  	u32 hash = 0; @@ -426,17 +426,20 @@ static struct sock *udp4_lib_lookup2(struct net *net,  		score = compute_score(sk, net, saddr, sport,  				      daddr, hnum, dif, sdif);  		if (score > badness) { +			reuseport_result = NULL; +  			if (sk->sk_reuseport &&  			    sk->sk_state != TCP_ESTABLISHED) {  				hash = udp_ehashfn(net, daddr, hnum,  						   saddr, sport); -				result = reuseport_select_sock(sk, hash, skb, -							sizeof(struct udphdr)); -				if (result && !reuseport_has_conns(sk, false)) -					return result; +				reuseport_result = reuseport_select_sock(sk, hash, skb, +									 sizeof(struct udphdr)); +				if (reuseport_result && !reuseport_has_conns(sk, false)) +					return reuseport_result;  			} + +			result = reuseport_result ? : sk;  			badness = score; -			result = sk;  		}  	}  	return result; @@ -2051,7 +2054,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)  	/*  	 * 	UDP-Lite specific tests, ignored on UDP sockets  	 */ -	if ((is_udplite & UDPLITE_RECV_CC)  &&  UDP_SKB_CB(skb)->partial_cov) { +	if ((up->pcflag & UDPLITE_RECV_CC)  &&  UDP_SKB_CB(skb)->partial_cov) {  		/*  		 * MIB statistics other than incrementing the error count are  | 
