diff options
| author | Nikhil Chandru Rao | 2006-08-09 17:04:26 +0200 |
|---|---|---|
| committer | Nikhil Chandru Rao | 2006-08-09 17:04:26 +0200 |
| commit | 3aff701001cf3f3355d204e987f02e48da7046c8 (patch) | |
| tree | b1ec1a875a0e3c7357c814c3a59101b7e3a28610 /src | |
| parent | Temporarily work around the bug when port numbers are reused between (diff) | |
| download | ipxe-3aff701001cf3f3355d204e987f02e48da7046c8.tar.gz ipxe-3aff701001cf3f3355d204e987f02e48da7046c8.tar.xz ipxe-3aff701001cf3f3355d204e987f02e48da7046c8.zip | |
Changed the TCP state machines behaviour in the ESTABLISHED state
Diffstat (limited to 'src')
| -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; |
