udp: rehash on disconnect
authorWillem de Bruijn <willemb@google.com>
Wed, 19 Feb 2020 19:16:32 +0000 (14:16 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Feb 2020 00:34:11 +0000 (16:34 -0800)
commit303d0403b8c25e994e4a6e45389e173cf8706fb5
tree043d03baaef43149dd22fe737df9559f7724ef7c
parent06f5201c6392f998a49ca9c9173e2930c8eb51d8
udp: rehash on disconnect

As of the below commit, udp sockets bound to a specific address can
coexist with one bound to the any addr for the same port.

The commit also phased out the use of socket hashing based only on
port (hslot), in favor of always hashing on {addr, port} (hslot2).

The change broke the following behavior with disconnect (AF_UNSPEC):

    server binds to 0.0.0.0:1337
    server connects to 127.0.0.1:80
    server disconnects
    client connects to 127.0.0.1:1337
    client sends "hello"
    server reads "hello" // times out, packet did not find sk

On connect the server acquires a specific source addr suitable for
routing to its destination. On disconnect it reverts to the any addr.

The connect call triggers a rehash to a different hslot2. On
disconnect, add the same to return to the original hslot2.

Skip this step if the socket is going to be unhashed completely.

Fixes: 4cdeeee9252a ("net: udp: prefer listeners bound to an address")
Reported-by: Pavel Roskin <plroskin@gmail.com>
Signed-off-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/udp.c