david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Changed the TCP state machines behaviour in the ESTABLISHED state

This commit is contained in:
Nikhil Chandru Rao 2006-08-09 15:04:26 +00:00
parent dc8b96b446
commit 3aff701001
1 changed files with 15 additions and 5 deletions

View File

@ -314,6 +314,9 @@ void tcp_set_flags ( struct tcp_connection *conn ) {
if ( conn->tcp_lstate == TCP_CLOSE_WAIT ) { if ( conn->tcp_lstate == TCP_CLOSE_WAIT ) {
conn->tcp_flags |= TCP_FIN; conn->tcp_flags |= TCP_FIN;
} }
if ( conn->tcp_lstate == TCP_ESTABLISHED ) {
conn->tcp_flags |= ( TCP_FIN | TCP_ACK );
}
break; break;
default: default:
DBG ( "TCP_INVALID state %d\n", conn->tcp_state ); 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 ); ntohl ( tcphdr->seq ), conn->rcv_nxt );
} }
/* Acknowledge new data */ /* Send an ACK only if required to */
conn->tcp_flags |= TCP_ACK; if ( conn->rcv_nxt <= ntohl ( tcphdr->seq ) ) {
if ( !( tcphdr->flags & TCP_ACK ) ) { /* Acknowledge new data */
goto send_tcp_nomsg; 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 the connection is in ESTABLISHED and it receives a FIN */
if ( conn->tcp_state == ESTABLISHED && ( tcphdr->flags & TCP_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 ); tcp_trans ( conn, TCP_CLOSE_WAIT );
conn->tcp_op->closed ( conn, CONN_SNDCLOSE ); // conn->tcp_op->closed ( conn, CONN_SNDCLOSE );
conn->rcv_nxt++; conn->rcv_nxt++;
if ( ! ( tcphdr->flags & TCP_ACK ) ) { if ( ! ( tcphdr->flags & TCP_ACK ) ) {
conn->tcp_flags |= TCP_ACK; conn->tcp_flags |= TCP_ACK;