Don't send a second FIN if we receive a FIN while in FIN_WAIT_2
authorMichael Brown <mcb30@etherboot.org>
Wed, 27 Dec 2006 23:44:05 +0000 (23:44 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 27 Dec 2006 23:44:05 +0000 (23:44 +0000)
src/net/tcp.c

index 9cb2cf7..1b5f76c 100644 (file)
@@ -573,13 +573,14 @@ static int tcp_rx_fin ( struct tcp_connection *conn, uint32_t seq ) {
        if ( ( conn->rcv_ack - seq ) > 0 )
                return 0;
 
-       /* Mark FIN as received and send our own FIN */
-       conn->tcp_state |= ( TCP_STATE_RCVD ( TCP_FIN ) |
-                            TCP_STATE_SENDING ( TCP_FIN ) );
-
-       /* Acknowledge FIN */
+       /* Mark FIN as received and acknowledge it */
+       conn->tcp_state |= TCP_STATE_RCVD ( TCP_FIN );
        conn->rcv_ack++;
 
+       /* If we haven't already sent our FIN, send a FIN */
+       if ( ! ( conn->tcp_state & TCP_STATE_ACKED ( TCP_FIN ) ) )
+               conn->tcp_state |= TCP_STATE_SENDING ( TCP_FIN );
+
        /* Break association with application */
        tcp_disassociate ( conn );