diff options
author | Nikhil Chandru Rao <nikhilcrao@users.sourceforge.net> | 2006-08-09 15:04:26 +0000 |
---|---|---|
committer | Nikhil Chandru Rao <nikhilcrao@users.sourceforge.net> | 2006-08-09 15:04:26 +0000 |
commit | 3aff701001cf3f3355d204e987f02e48da7046c8 (patch) | |
tree | b1ec1a875a0e3c7357c814c3a59101b7e3a28610 | |
parent | dc8b96b4467f897faa2501c1a187231df8c969f9 (diff) | |
download | ipxe-3aff701001cf3f3355d204e987f02e48da7046c8.tar.gz |
Changed the TCP state machines behaviour in the ESTABLISHED state
-rw-r--r-- | src/net/tcp.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/net/tcp.c b/src/net/tcp.c index 0de629e84..c3b7271d9 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -314,6 +314,9 @@ void tcp_set_flags ( struct tcp_connection *conn ) { if ( conn->tcp_lstate == TCP_CLOSE_WAIT ) { conn->tcp_flags |= TCP_FIN; } + if ( conn->tcp_lstate == TCP_ESTABLISHED ) { + conn->tcp_flags |= ( TCP_FIN | TCP_ACK ); + } break; default: DBG ( "TCP_INVALID state %d\n", conn->tcp_state ); @@ -909,10 +912,13 @@ static int tcp_rx ( struct pk_buff *pkb, ntohl ( tcphdr->seq ), conn->rcv_nxt ); } - /* Acknowledge new data */ - conn->tcp_flags |= TCP_ACK; - if ( !( tcphdr->flags & TCP_ACK ) ) { - goto send_tcp_nomsg; + /* Send an ACK only if required to */ + if ( conn->rcv_nxt <= ntohl ( tcphdr->seq ) ) { + /* Acknowledge new data */ + conn->tcp_flags |= TCP_ACK; + if ( !( tcphdr->flags & TCP_ACK ) ) { + goto send_tcp_nomsg; + } } } @@ -934,8 +940,12 @@ static int tcp_rx ( struct pk_buff *pkb, /* If the connection is in ESTABLISHED and it receives a FIN */ if ( conn->tcp_state == ESTABLISHED && ( tcphdr->flags & TCP_FIN ) ) { + if ( tcphdr->flags & TCP_ACK ) { + tcp_trans ( conn, TCP_LAST_ACK ); + goto send_tcp_nomsg; + } tcp_trans ( conn, TCP_CLOSE_WAIT ); - conn->tcp_op->closed ( conn, CONN_SNDCLOSE ); +// conn->tcp_op->closed ( conn, CONN_SNDCLOSE ); conn->rcv_nxt++; if ( ! ( tcphdr->flags & TCP_ACK ) ) { conn->tcp_flags |= TCP_ACK; |