Changeset 4c55a64 in mainline for uspace/srv/net/tl/tcp/conn.c


Ignore:
Timestamp:
2011-09-19T21:01:16Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0093ab6
Parents:
c5808b41
Message:

Implement some ACK processing and window-size update handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/conn.c

    rc5808b41 r4c55a64  
    152152        conn->irs = seg->seq;
    153153
     154
    154155        log_msg(LVL_DEBUG, "rcv_nxt=%u", conn->rcv_nxt);
    155156
     
    161162        conn->snd_nxt = conn->iss;
    162163        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;
    163173
    164174        conn->cstate = st_syn_received;
     
    201211        if ((seg->ctrl & CTL_ACK) != 0) {
    202212                conn->snd_una = seg->ack;
    203                 /* XXX process retransmission queue */
     213                tcp_tqueue_remove_acked(conn);
    204214        }
    205215
     
    240250static cproc_t tcp_conn_seg_proc_rst(tcp_conn_t *conn, tcp_segment_t *seg)
    241251{
     252        /* TODO */
    242253        return cp_continue;
    243254}
     
    245256static cproc_t tcp_conn_seg_proc_sp(tcp_conn_t *conn, tcp_segment_t *seg)
    246257{
     258        /* TODO */
    247259        return cp_continue;
    248260}
     
    250262static cproc_t tcp_conn_seg_proc_syn(tcp_conn_t *conn, tcp_segment_t *seg)
    251263{
     264        /* TODO */
    252265        return cp_continue;
    253266}
     
    259272                log_msg(LVL_WARN, "Segment ACK not acceptable, sending RST.");
    260273                tcp_reply_rst(&conn->ident, seg);
     274                tcp_segment_delete(seg);
     275                return cp_done;
    261276        }
    262277
     
    273288static cproc_t tcp_conn_seg_proc_ack_est(tcp_conn_t *conn, tcp_segment_t *seg)
    274289{
     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
    275311        return cp_continue;
    276312}
     
    278314static cproc_t tcp_conn_seg_proc_ack_fw1(tcp_conn_t *conn, tcp_segment_t *seg)
    279315{
     316        if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done)
     317                return cp_done;
     318
     319        /* TODO */
    280320        return cp_continue;
    281321}
     
    283323static cproc_t tcp_conn_seg_proc_ack_fw2(tcp_conn_t *conn, tcp_segment_t *seg)
    284324{
     325        if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done)
     326                return cp_done;
     327
     328        /* TODO */
    285329        return cp_continue;
    286330}
     
    288332static cproc_t tcp_conn_seg_proc_ack_cw(tcp_conn_t *conn, tcp_segment_t *seg)
    289333{
    290         return cp_continue;
     334        /* The same processing as in Established state */
     335        return tcp_conn_seg_proc_ack_est(conn, seg);
    291336}
    292337
    293338static cproc_t tcp_conn_seg_proc_ack_cls(tcp_conn_t *conn, tcp_segment_t *seg)
    294339{
     340        if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done)
     341                return cp_done;
     342
     343        /* TODO */
    295344        return cp_continue;
    296345}
     
    298347static cproc_t tcp_conn_seg_proc_ack_la(tcp_conn_t *conn, tcp_segment_t *seg)
    299348{
     349        if (tcp_conn_seg_proc_ack_est(conn, seg) == cp_done)
     350                return cp_done;
     351
     352        /* TODO */
    300353        return cp_continue;
    301354}
     
    303356static cproc_t tcp_conn_seg_proc_ack_tw(tcp_conn_t *conn, tcp_segment_t *seg)
    304357{
     358        /* Nothing to do */
    305359        return cp_continue;
    306360}
     
    312366        if ((seg->ctrl & CTL_ACK) == 0) {
    313367                log_msg(LVL_WARN, "Segment has no ACK. Dropping.");
    314                 /* XXX Free segment */
     368                tcp_segment_delete(seg);
    315369                return cp_done;
    316370        }
     
    349403static cproc_t tcp_conn_seg_proc_text(tcp_conn_t *conn, tcp_segment_t *seg)
    350404{
     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 */
    351425        return cp_continue;
    352426}
Note: See TracChangeset for help on using the changeset viewer.