Browse Source

Call closed() method only when the connection is genuinely in the

TCP_CLOSED state (i.e. after the final FIN/ACK exchange), and has been
removed from the list of TCP connections.
tags/v0.9.3
Michael Brown 18 years ago
parent
commit
cc0b92652f
1 changed files with 19 additions and 14 deletions
  1. 19
    14
      src/net/tcp.c

+ 19
- 14
src/net/tcp.c View File

@@ -378,21 +378,27 @@ void tcp_init_conn ( struct tcp_connection *conn ) {
378 378
  * @v over	Failure indicator
379 379
  */
380 380
 void tcp_expired ( struct retry_timer *timer, int over ) {
381
-	struct tcp_connection *conn;
382
-	conn = ( struct tcp_connection * ) container_of ( timer, 
383
-					struct tcp_connection, timer );
381
+	struct tcp_connection *conn =
382
+		container_of ( timer, struct tcp_connection, timer );
383
+
384 384
 	DBG ( "Timer expired in %s\n", tcp_states[conn->tcp_state] );
385 385
 	switch ( conn->tcp_state ) {
386 386
 	case TCP_SYN_SENT:
387 387
 		if ( over ) {
388
+			list_del ( &conn->list );
388 389
 			tcp_trans ( conn, TCP_CLOSED );
390
+			if ( conn->tcp_op->closed )
391
+				conn->tcp_op->closed ( conn, -ETIMEDOUT );
389 392
 			DBG ( "Timeout! Connection closed\n" );
390 393
 			return;
391 394
 		}
392 395
 		goto send_tcp_nomsg;
393 396
 	case TCP_SYN_RCVD:
394 397
 		if ( over ) {
398
+			list_del ( &conn->list );
395 399
 			tcp_trans ( conn, TCP_CLOSED );
400
+			if ( conn->tcp_op->closed )
401
+				conn->tcp_op->closed ( conn, -ETIMEDOUT );
396 402
 			goto send_tcp_nomsg;
397 403
 		}
398 404
 		goto send_tcp_nomsg;
@@ -416,7 +422,10 @@ void tcp_expired ( struct retry_timer *timer, int over ) {
416 422
 		}
417 423
 		return;
418 424
 	case TCP_TIME_WAIT:
425
+		list_del ( &conn->list );
419 426
 		tcp_trans ( conn, TCP_CLOSED );
427
+		if ( conn->tcp_op->closed )
428
+			conn->tcp_op->closed ( conn, 0 );
420 429
 		return;
421 430
 	}
422 431
 	/* Retransmit the data */
@@ -496,8 +505,6 @@ int tcp_close ( struct tcp_connection *conn ) {
496 505
 	case TCP_SYN_RCVD:
497 506
 	case TCP_ESTABLISHED:
498 507
 		tcp_trans ( conn, TCP_FIN_WAIT_1 );
499
-		if ( conn->tcp_op->closed )
500
-			conn->tcp_op->closed ( conn, CONN_SNDCLOSE ); /* TODO: Check! */
501 508
 		/* FIN consumes one byte on the snd stream */
502 509
 //		conn->snd_una++;
503 510
 		goto send_tcp_nomsg;
@@ -511,12 +518,10 @@ int tcp_close ( struct tcp_connection *conn ) {
511 518
 		list_del ( &conn->list );
512 519
 		tcp_trans ( conn, TCP_CLOSED );
513 520
 		if ( conn->tcp_op->closed )
514
-			conn->tcp_op->closed ( conn, CONN_SNDCLOSE );
521
+			conn->tcp_op->closed ( conn, 0 );
515 522
 		return 0;
516 523
 	case TCP_CLOSE_WAIT:
517 524
 		tcp_trans ( conn, TCP_LAST_ACK );
518
-		if ( conn->tcp_op->closed )
519
-			conn->tcp_op->closed ( conn, CONN_SNDCLOSE ); /* TODO: Check! */
520 525
 		/* FIN consumes one byte on the snd stream */
521 526
 //		conn->snd_una++;
522 527
 		goto send_tcp_nomsg;
@@ -715,8 +720,8 @@ static int tcp_rx ( struct pk_buff *pkb,
715 720
 		    struct sockaddr_tcpip *st_dest __unused ) {
716 721
 	struct tcp_connection *conn;
717 722
 	struct tcp_header *tcphdr;
718
-	uint32_t acked, toack;
719
-	int hlen;
723
+	int32_t acked, toack;
724
+	unsigned int hlen;
720 725
 	int rc;
721 726
 
722 727
 	/* Sanity check */
@@ -817,7 +822,7 @@ static int tcp_rx ( struct pk_buff *pkb,
817 822
 		if ( tcphdr->flags & TCP_RST ) {
818 823
 			tcp_trans ( conn, TCP_LISTEN );
819 824
 			if ( conn->tcp_op->closed )
820
-				conn->tcp_op->closed ( conn, CONN_RESTART );
825
+				conn->tcp_op->closed ( conn, -ECONNRESET );
821 826
 			rc = 0;
822 827
 			goto done;
823 828
 		}
@@ -855,9 +860,6 @@ static int tcp_rx ( struct pk_buff *pkb,
855 860
 		if ( tcphdr->flags & TCP_FIN ) {
856 861
 			conn->rcv_nxt++;
857 862
 			conn->tcp_flags |= TCP_ACK;
858
-			if ( conn->tcp_op->closed )
859
-				conn->tcp_op->closed ( conn, CONN_SNDCLOSE );
860
-
861 863
 			if ( tcphdr->flags & TCP_ACK ) {
862 864
 				tcp_trans ( conn, TCP_TIME_WAIT );
863 865
 			} else {
@@ -898,7 +900,10 @@ static int tcp_rx ( struct pk_buff *pkb,
898 900
 		break;
899 901
 	case TCP_LAST_ACK:
900 902
 		if ( tcphdr->flags & TCP_ACK ) {
903
+			list_del ( &conn->list );
901 904
 			tcp_trans ( conn, TCP_CLOSED );
905
+			if ( conn->tcp_op->closed )
906
+				conn->tcp_op->closed ( conn, 0 );
902 907
 			rc = 0;
903 908
 			goto done;
904 909
 		}

Loading…
Cancel
Save