• Willem de Bruijn's avatar
    udp: rehash on disconnect · 303d0403
    Willem de Bruijn authored
    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: 4cdeeee9 ("net: udp: prefer listeners bound to an address")
    Reported-by: default avatarPavel Roskin <plroskin@gmail.com>
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    303d0403
udp.c 77.9 KB