diff options
Diffstat (limited to 'net/ipv4/udp.c')
| -rw-r--r-- | net/ipv4/udp.c | 7 | 
1 files changed, 4 insertions, 3 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index d88821c794fb..cf755156a684 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -423,12 +423,13 @@ static struct sock *udp4_lib_lookup2(struct net *net,  		score = compute_score(sk, net, saddr, sport,  				      daddr, hnum, dif, sdif);  		if (score > badness) { -			if (sk->sk_reuseport) { +			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) +				if (result && !reuseport_has_conns(sk, false))  					return result;  			}  			badness = score; @@ -1130,7 +1131,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  		fl4 = &fl4_stack; -		flowi4_init_output(fl4, ipc.oif, sk->sk_mark, tos, +		flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark, tos,  				   RT_SCOPE_UNIVERSE, sk->sk_protocol,  				   flow_flags,  				   faddr, saddr, dport, inet->inet_sport,  |