From: Michael Brown Date: Wed, 27 Dec 2006 23:44:05 +0000 (+0000) Subject: Don't send a second FIN if we receive a FIN while in FIN_WAIT_2 X-Git-Tag: v0.9.3~822 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=be31970e36cb7fee49d81e8b0455cd3deac84390;p=thirdparty%2Fipxe.git Don't send a second FIN if we receive a FIN while in FIN_WAIT_2 --- diff --git a/src/net/tcp.c b/src/net/tcp.c index 9cb2cf7eb..1b5f76c07 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -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 );