diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 8 | 
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 827fe7385078..aae4938f3dea 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -158,13 +158,14 @@ static struct sock *udp6_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 = udp6_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;  			}  			result = sk; @@ -1230,6 +1231,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)  	ipcm6_init(&ipc6);  	ipc6.gso_size = up->gso_size;  	ipc6.sockc.tsflags = sk->sk_tsflags; +	ipc6.sockc.mark = sk->sk_mark;  	/* destination address check */  	if (sin6) { @@ -1352,7 +1354,7 @@ do_udp_sendmsg:  	if (!fl6.flowi6_oif)  		fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex; -	fl6.flowi6_mark = sk->sk_mark; +	fl6.flowi6_mark = ipc6.sockc.mark;  	fl6.flowi6_uid = sk->sk_uid;  	if (msg->msg_controllen) {  |