• Chris Perl's avatar
    rpc: xs_bind - do not bind when requesting a random ephemeral port · 0f7a622c
    Chris Perl authored
    When attempting to establish a local ephemeral endpoint for a TCP or UDP
    socket, do not explicitly call bind, instead let it happen implicilty when the
    socket is first used.
    
    The main motivating factor for this change is when TCP runs out of unique
    ephemeral ports (i.e.  cannot find any ephemeral ports which are not a part of
    *any* TCP connection).  In this situation if you explicitly call bind, then the
    call will fail with EADDRINUSE.  However, if you allow the allocation of an
    ephemeral port to happen implicitly as part of connect (or other functions),
    then ephemeral ports can be reused, so long as the combination of (local_ip,
    local_port, remote_ip, remote_port) is unique for TCP sockets on the system.
    
    This doesn't matter for UDP sockets, but it seemed easiest to treat TCP and UDP
    sockets the same.
    
    This can allow mount.nfs(8) to continue to function successfully, even in the
    face of misbehaving applications which are creating a large number of TCP
    connections.
    Signed-off-by: default avatarChris Perl <chris.perl@gmail.com>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    0f7a622c
xprtsock.c 81.5 KB