Changeset d9e14fa4 in mainline
- Timestamp:
- 2011-12-09T16:06:28Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 03be171
- Parents:
- 0ac2158
- Location:
- uspace/srv/net/tl/tcp
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/conn.c
r0ac2158 rd9e14fa4 117 117 118 118 conn->cstate = st_listen; 119 conn->reset = false; 120 conn->ap = ap_passive; 119 121 conn->fin_is_acked = false; 120 122 conn->ident.local = *lsock; … … 176 178 conn->snd_nxt = conn->iss; 177 179 conn->snd_una = conn->iss; 180 conn->ap = ap_active; 178 181 179 182 tcp_tqueue_ctrl_seg(conn, CTL_SYN); … … 278 281 log_msg(LVL_DEBUG, "%s: tcp_conn_reset()", conn->name); 279 282 tcp_conn_state_set(conn, st_closed); 283 conn->reset = true; 284 280 285 tcp_conn_tw_timer_clear(conn); 281 286 tcp_tqueue_clear(&conn->retransmit); 287 288 fibril_condvar_broadcast(&conn->rcv_buf_cv); 289 } 290 291 /** Signal to the user that connection has been reset. 292 * 293 * Send an out-of-band signal to the user. 294 */ 295 static void tcp_reset_signal(tcp_conn_t *conn) 296 { 297 /* TODO */ 298 log_msg(LVL_DEBUG, "%s: tcp_reset_signal()", conn->name); 282 299 } 283 300 … … 485 502 static cproc_t tcp_conn_seg_proc_rst(tcp_conn_t *conn, tcp_segment_t *seg) 486 503 { 487 /* TODO */ 488 return cp_continue; 504 switch (conn->cstate) { 505 case st_syn_received: 506 /* XXX In case of passive open, revert to Listen state */ 507 if (conn->ap == ap_passive) { 508 tcp_conn_state_set(conn, st_listen); 509 /* XXX Revert conn->ident */ 510 tcp_conn_tw_timer_clear(conn); 511 tcp_tqueue_clear(&conn->retransmit); 512 } else { 513 tcp_conn_reset(conn); 514 } 515 break; 516 case st_established: 517 case st_fin_wait_1: 518 case st_fin_wait_2: 519 case st_close_wait: 520 /* General "connection reset" signal */ 521 tcp_reset_signal(conn); 522 tcp_conn_reset(conn); 523 break; 524 case st_closing: 525 case st_last_ack: 526 case st_time_wait: 527 tcp_conn_reset(conn); 528 break; 529 case st_listen: 530 case st_syn_sent: 531 case st_closed: 532 assert(false); 533 } 534 535 return cp_done; 489 536 } 490 537 -
uspace/srv/net/tl/tcp/sock.c
r0ac2158 rd9e14fa4 451 451 rc = ENOTCONN; 452 452 break; 453 case TCP_ERESET: 454 rc = ECONNABORTED; 455 break; 453 456 default: 454 457 assert(false); … … 520 523 rc = ENOTCONN; 521 524 break; 525 case TCP_ERESET: 526 rc = ECONNABORTED; 527 break; 522 528 default: 523 529 assert(false); -
uspace/srv/net/tl/tcp/tcp_type.h
r0ac2158 rd9e14fa4 147 147 } tcp_tqueue_t; 148 148 149 typedef enum { 150 ap_active, 151 ap_passive 152 } acpass_t; 153 149 154 typedef struct tcp_conn { 150 155 char *name; … … 154 159 tcp_sockpair_t ident; 155 160 161 /** Active or passive connection */ 162 acpass_t ap; 163 156 164 /** Connection state */ 157 165 tcp_cstate_t cstate; 166 /** True if connection was reset */ 167 bool reset; 158 168 /** Protects @c cstate */ 159 169 fibril_mutex_t cstate_lock; … … 245 255 } tcp_segment_t; 246 256 247 typedef enum {248 ap_active,249 ap_passive250 } acpass_t;251 257 252 258 typedef struct { -
uspace/srv/net/tl/tcp/ucall.c
r0ac2158 rd9e14fa4 126 126 while (size > 0) { 127 127 buf_free = conn->snd_buf_size - conn->snd_buf_used; 128 while (buf_free == 0 )128 while (buf_free == 0 && !conn->reset) 129 129 tcp_tqueue_new_data(conn); 130 131 if (conn->reset) 132 return TCP_ERESET; 130 133 131 134 xfer_size = min(size, buf_free); … … 157 160 158 161 /* Wait for data to become available */ 159 while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin ) {162 while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) { 160 163 log_msg(LVL_DEBUG, "tcp_uc_receive() - wait for data"); 161 164 fibril_condvar_wait(&conn->rcv_buf_cv, &conn->rcv_buf_lock); … … 165 168 fibril_mutex_unlock(&conn->rcv_buf_lock); 166 169 167 /* End of data, peer closed connection. */168 assert(conn->rcv_buf_fin);169 170 *rcvd = 0; 170 171 *xflags = 0; 171 return TCP_ECLOSING; 172 173 if (conn->rcv_buf_fin) { 174 /* End of data, peer closed connection */ 175 return TCP_ECLOSING; 176 } else { 177 /* Connection was reset */ 178 assert(conn->reset); 179 return TCP_ERESET; 180 } 172 181 } 173 182
Note:
See TracChangeset
for help on using the changeset viewer.