Changeset 4c55a64 in mainline for uspace/srv/net/tl/tcp/conn.c
- Timestamp:
- 2011-09-19T21:01:16Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0093ab6
- Parents:
- c5808b41
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/conn.c
rc5808b41 r4c55a64 152 152 conn->irs = seg->seq; 153 153 154 154 155 log_msg(LVL_DEBUG, "rcv_nxt=%u", conn->rcv_nxt); 155 156 … … 161 162 conn->snd_nxt = conn->iss; 162 163 conn->snd_una = conn->iss; 164 165 /* 166 * Surprisingly the spec does not deal with initial window setting. 167 * Set SND.WND = SEG.WND and set SND.WL1 so that next segment 168 * will always be accepted as new window setting. 169 */ 170 conn->snd_wnd = seg->wnd; 171 conn->snd_wl1 = seg->seq; 172 conn->snd_wl2 = seg->seq; 163 173 164 174 conn->cstate = st_syn_received; … … 201 211 if ((seg->ctrl & CTL_ACK) != 0) { 202 212 conn->snd_una = seg->ack; 203 /* XXX process retransmission queue */213 tcp_tqueue_remove_acked(conn); 204 214 } 205 215 … … 240 250 static cproc_t tcp_conn_seg_proc_rst(tcp_conn_t *conn, tcp_segment_t *seg) 241 251 { 252 /* TODO */ 242 253 return cp_continue; 243 254 } … … 245 256 static cproc_t tcp_conn_seg_proc_sp(tcp_conn_t *conn, tcp_segment_t *seg) 246 257 { 258 /* TODO */ 247 259 return cp_continue; 248 260 } … … 250 262 static cproc_t tcp_conn_seg_proc_syn(tcp_conn_t *conn, tcp_segment_t *seg) 251 263 { 264 /* TODO */ 252 265 return cp_continue; 253 266 } … … 259 272 log_msg(LVL_WARN, "Segment ACK not acceptable, sending RST."); 260 273 tcp_reply_rst(&conn->ident, seg); 274 tcp_segment_delete(seg); 275 return cp_done; 261 276 } 262 277 … … 273 288 static cproc_t tcp_conn_seg_proc_ack_est(tcp_conn_t *conn, tcp_segment_t *seg) 274 289 { 290 if (!seq_no_ack_acceptable(conn, seg->ack)) { 291 if (!seq_no_ack_duplicate(conn, seg->ack)) { 292 /* Not acceptable, not duplicate. Send ACK and drop. */ 293 tcp_tqueue_ctrl_seg(conn, CTL_ACK); 294 tcp_segment_delete(seg); 295 return cp_done; 296 } 297 } else { 298 /* Update SND.UNA */ 299 conn->snd_una = seg->ack; 300 301 /* Prune acked segments from retransmission queue */ 302 tcp_tqueue_remove_acked(conn); 303 } 304 305 if (seq_no_new_wnd_update(conn, seg)) { 306 conn->snd_wnd = seg->wnd; 307 conn->snd_wl1 = seg->seq; 308 conn->snd_wl2 = seg->ack; 309 } 310 275 311 return cp_continue; 276 312 } … … 278 314 static cproc_t tcp_conn_seg_proc_ack_fw1(tcp_conn_t *conn, tcp_segment_t *seg) 279 315 { 316 if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done) 317 return cp_done; 318 319 /* TODO */ 280 320 return cp_continue; 281 321 } … … 283 323 static cproc_t tcp_conn_seg_proc_ack_fw2(tcp_conn_t *conn, tcp_segment_t *seg) 284 324 { 325 if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done) 326 return cp_done; 327 328 /* TODO */ 285 329 return cp_continue; 286 330 } … … 288 332 static cproc_t tcp_conn_seg_proc_ack_cw(tcp_conn_t *conn, tcp_segment_t *seg) 289 333 { 290 return cp_continue; 334 /* The same processing as in Established state */ 335 return tcp_conn_seg_proc_ack_est(conn, seg); 291 336 } 292 337 293 338 static cproc_t tcp_conn_seg_proc_ack_cls(tcp_conn_t *conn, tcp_segment_t *seg) 294 339 { 340 if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done) 341 return cp_done; 342 343 /* TODO */ 295 344 return cp_continue; 296 345 } … … 298 347 static cproc_t tcp_conn_seg_proc_ack_la(tcp_conn_t *conn, tcp_segment_t *seg) 299 348 { 349 if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done) 350 return cp_done; 351 352 /* TODO */ 300 353 return cp_continue; 301 354 } … … 303 356 static cproc_t tcp_conn_seg_proc_ack_tw(tcp_conn_t *conn, tcp_segment_t *seg) 304 357 { 358 /* Nothing to do */ 305 359 return cp_continue; 306 360 } … … 312 366 if ((seg->ctrl & CTL_ACK) == 0) { 313 367 log_msg(LVL_WARN, "Segment has no ACK. Dropping."); 314 /* XXX Free segment */368 tcp_segment_delete(seg); 315 369 return cp_done; 316 370 } … … 349 403 static cproc_t tcp_conn_seg_proc_text(tcp_conn_t *conn, tcp_segment_t *seg) 350 404 { 405 switch (conn->cstate) { 406 case st_established: 407 case st_fin_wait_1: 408 case st_fin_wait_2: 409 /* OK */ 410 break; 411 case st_close_wait: 412 case st_closing: 413 case st_last_ack: 414 case st_time_wait: 415 /* Invalid since FIN has been received. Ignore text. */ 416 return cp_continue; 417 case st_listen: 418 case st_syn_sent: 419 case st_syn_received: 420 case st_closed: 421 assert(false); 422 } 423 424 /* TODO Process segment text */ 351 425 return cp_continue; 352 426 }
Note:
See TracChangeset
for help on using the changeset viewer.