udp: Copy has_conns in reuseport_grow().
If an unconnected socket in a UDP reuseport group connect()s, has_conns is
set to 1. Then, when a packet is received, udp[46]_lib_lookup2() scans all
sockets in udp_hslot looking for the connected socket with the highest
score.
However, when the number of sockets bound to the port exceeds max_socks,
reuseport_grow() resets has_conns to 0. It can cause udp[46]_lib_lookup2()
to return without scanning all sockets, resulting in that packets sent to
connected sockets may be distributed to unconnected sockets.
Therefore, reuseport_grow() should copy has_conns.
Fixes: acdcecc612
("udp: correct reuseport selection with connected sockets")
CC: Willem de Bruijn <willemb@google.com>
Reviewed-by: Benjamin Herrenschmidt <benh@amazon.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6ef9dcb780
commit
f2b2c55e51
|
@ -101,6 +101,7 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse)
|
||||||
more_reuse->prog = reuse->prog;
|
more_reuse->prog = reuse->prog;
|
||||||
more_reuse->reuseport_id = reuse->reuseport_id;
|
more_reuse->reuseport_id = reuse->reuseport_id;
|
||||||
more_reuse->bind_inany = reuse->bind_inany;
|
more_reuse->bind_inany = reuse->bind_inany;
|
||||||
|
more_reuse->has_conns = reuse->has_conns;
|
||||||
|
|
||||||
memcpy(more_reuse->socks, reuse->socks,
|
memcpy(more_reuse->socks, reuse->socks,
|
||||||
reuse->num_socks * sizeof(struct sock *));
|
reuse->num_socks * sizeof(struct sock *));
|
||||||
|
|
Loading…
Reference in New Issue