Changeset 7cf7ded in mainline for uspace/srv/net/tl/tcp/conn.c
- Timestamp:
- 2011-11-15T23:50:57Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4f3f6285
- Parents:
- 8218b6b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/conn.c
r8218b6b r7cf7ded 69 69 { 70 70 tcp_conn_t *conn = NULL; 71 bool tqueue_inited = false; 71 72 72 73 /* Allocate connection structure */ … … 105 106 106 107 /* Initialize retransmission queue */ 107 tcp_tqueue_init(&conn->retransmit, conn); 108 if (tcp_tqueue_init(&conn->retransmit, conn) != EOK) 109 goto error; 110 111 tqueue_inited = true; 108 112 109 113 conn->cstate = st_listen; … … 116 120 117 121 error: 122 if (tqueue_inited) 123 tcp_tqueue_fini(&conn->retransmit); 118 124 if (conn != NULL && conn->rcv_buf != NULL) 119 125 free(conn->rcv_buf); … … 180 186 break; 181 187 default: 188 log_msg(LVL_ERROR, "Connection state %d", conn->cstate); 182 189 assert(false); 183 190 } … … 264 271 return true; 265 272 case st_closed: 273 log_msg(LVL_WARN, "state=%d", (int) conn->cstate); 266 274 assert(false); 267 275 } … … 347 355 348 356 if ((seg->ctrl & CTL_RST) != 0) { 349 log_msg(LVL_DEBUG, "Connection reset. ");357 log_msg(LVL_DEBUG, "Connection reset. -> Closed"); 350 358 /* XXX Signal user error */ 351 359 conn->cstate = st_closed; … … 413 421 log_msg(LVL_DEBUG, "tcp_conn_sa_seq(%p, %p)", conn, seg); 414 422 415 /* XXX Discard old duplicates */ 423 /* Discard unacceptable segments ("old duplicates") */ 424 if (!seq_no_segment_acceptable(conn, seg)) { 425 log_msg(LVL_DEBUG, "Replying ACK to unacceptable segment."); 426 tcp_tqueue_ctrl_seg(conn, CTL_ACK); 427 tcp_segment_delete(seg); 428 return; 429 } 416 430 417 431 /* Queue for processing */ … … 463 477 static cproc_t tcp_conn_seg_proc_syn(tcp_conn_t *conn, tcp_segment_t *seg) 464 478 { 465 /* TODO */ 466 return cp_continue; 479 if ((seg->ctrl & CTL_SYN) == 0) 480 return cp_continue; 481 482 /* 483 * Assert SYN is in receive window, otherwise this step should not 484 * be reached. 485 */ 486 assert(seq_no_in_rcv_wnd(conn, seg->seq)); 487 488 log_msg(LVL_WARN, "SYN is in receive window, should send reset. XXX"); 489 490 /* 491 * TODO 492 * 493 * Send a reset, resond "reset" to all outstanding RECEIVEs and SEND, 494 * flush segment queues. Send unsolicited "connection reset" signal 495 * to user, connection -> closed state, delete TCB, return. 496 */ 497 return cp_done; 467 498 } 468 499 … … 790 821 { 791 822 log_msg(LVL_DEBUG, "tcp_conn_seg_proc_fin(%p, %p)", conn, seg); 823 log_msg(LVL_DEBUG, " seg->len=%zu, seg->ctl=%u", (size_t) seg->len, 824 (unsigned) seg->ctrl); 792 825 793 826 /* Only process FIN if no text is left in segment. */ … … 896 929 * incoming segments queue. 897 930 */ 898 if (seg->len > 0) 931 if (seg->len > 0) { 932 log_msg(LVL_DEBUG, "Re-insert segment %p. seg->len=%zu", 933 seg, (size_t) seg->len); 899 934 tcp_iqueue_insert_seg(&conn->incoming, seg); 900 else935 } else { 901 936 tcp_segment_delete(seg); 937 } 902 938 } 903 939 … … 927 963 tcp_conn_sa_queue(conn, seg); break; 928 964 case st_closed: 965 log_msg(LVL_DEBUG, "state=%d", (int) conn->cstate); 929 966 assert(false); 930 967 }
Note:
See TracChangeset
for help on using the changeset viewer.