• Saied Kazemi's avatar
    Do not call listen() when SO_REUSEADDR is off · 1b4e9058
    Saied Kazemi authored
    For an established TCP connection, the send queue is restored in two
    steps: in step (1), we retransmit the data that was sent before but not
    yet acknowledged, and in step (2), we transmit the data that was never
    sent outside before.  The TCP_REPAIR option is disabled before step (2)
    and re-enabled after step (2) (without this patch).
    
    If the amount of data to be sent in step (2) is large, the TCP_REPAIR
    flag on the socket can remain off for some time (O(milliseconds)).  If a
    listen() is called on another socket bound to the same port during this
    time window, it fails. This is because -- turning TCP_REPAIR off clears
    the SO_REUSEADDR flag on the socket.
    
    This patch adds a mutex (reuseaddr_lock) per port number, so that a
    listen() on a port number does not happen while SO_REUSEADDR for another
    socket on the same port is off.
    
    Thanks to Amey Deshpande <ameyd@google.com> for debugging.
    Signed-off-by: 's avatarSaied Kazemi <saied@google.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
    1b4e9058
sk-tcp.c 14.7 KB