diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 2c8beb3896d1..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, | |||
158 | score = compute_score(sk, net, saddr, sport, | 158 | score = compute_score(sk, net, saddr, sport, |
159 | daddr, hnum, dif, sdif); | 159 | daddr, hnum, dif, sdif); |
160 | if (score > badness) { | 160 | if (score > badness) { |
161 | if (sk->sk_reuseport) { | 161 | if (sk->sk_reuseport && |
162 | sk->sk_state != TCP_ESTABLISHED) { | ||
162 | hash = udp6_ehashfn(net, daddr, hnum, | 163 | hash = udp6_ehashfn(net, daddr, hnum, |
163 | saddr, sport); | 164 | saddr, sport); |
164 | 165 | ||
165 | result = reuseport_select_sock(sk, hash, skb, | 166 | result = reuseport_select_sock(sk, hash, skb, |
166 | sizeof(struct udphdr)); | 167 | sizeof(struct udphdr)); |
167 | if (result) | 168 | if (result && !reuseport_has_conns(sk, false)) |
168 | return result; | 169 | return result; |
169 | } | 170 | } |
170 | result = sk; | 171 | result = sk; |