• Tuong Lien's avatar
    tipc: fix link overflow issue at socket shutdown · 49afb806
    Tuong Lien authored
    When a socket is suddenly shutdown or released, it will reject all the
    unreceived messages in its receive queue. This applies to a connected
    socket too, whereas there is only one 'FIN' message required to be sent
    back to its peer in this case.
    
    In case there are many messages in the queue and/or some connections
    with such messages are shutdown at the same time, the link layer will
    easily get overflowed at the 'TIPC_SYSTEM_IMPORTANCE' backlog level
    because of the message rejections. As a result, the link will be taken
    down. Moreover, immediately when the link is re-established, the socket
    layer can continue to reject the messages and the same issue happens...
    
    The commit refactors the '__tipc_shutdown()' function to only send one
    'FIN' in the situation mentioned above. For the connectionless case, it
    is unavoidable but usually there is no rejections for such socket
    messages because they are 'dest-droppable' by default.
    
    In addition, the new code makes the other socket states clear
    (e.g.'TIPC_LISTEN') and treats as a separate case to avoid misbehaving.
    Acked-by: default avatarYing Xue <ying.xue@windriver.com>
    Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarTuong Lien <tuong.t.lien@dektech.com.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    49afb806
socket.c 102 KB