Changeset 7cf7ded in mainline for uspace/srv/net/tl/tcp/conn.c


Ignore:
Timestamp:
2011-11-15T23:50:57Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4f3f6285
Parents:
8218b6b
Message:

TCP retransmission (WIP). Allow setting timer in timer handler.
Simulate packet drop. Fixes.

File:
1 edited

Legend:

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

    r8218b6b r7cf7ded  
    6969{
    7070        tcp_conn_t *conn = NULL;
     71        bool tqueue_inited = false;
    7172
    7273        /* Allocate connection structure */
     
    105106
    106107        /* 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;
    108112
    109113        conn->cstate = st_listen;
     
    116120
    117121error:
     122        if (tqueue_inited)
     123                tcp_tqueue_fini(&conn->retransmit);
    118124        if (conn != NULL && conn->rcv_buf != NULL)
    119125                free(conn->rcv_buf);
     
    180186                break;
    181187        default:
     188                log_msg(LVL_ERROR, "Connection state %d", conn->cstate);
    182189                assert(false);
    183190        }
     
    264271                return true;
    265272        case st_closed:
     273                log_msg(LVL_WARN, "state=%d", (int) conn->cstate);
    266274                assert(false);
    267275        }
     
    347355
    348356        if ((seg->ctrl & CTL_RST) != 0) {
    349                 log_msg(LVL_DEBUG, "Connection reset.");
     357                log_msg(LVL_DEBUG, "Connection reset. -> Closed");
    350358                /* XXX Signal user error */
    351359                conn->cstate = st_closed;
     
    413421        log_msg(LVL_DEBUG, "tcp_conn_sa_seq(%p, %p)", conn, seg);
    414422
    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        }
    416430
    417431        /* Queue for processing */
     
    463477static cproc_t tcp_conn_seg_proc_syn(tcp_conn_t *conn, tcp_segment_t *seg)
    464478{
    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;
    467498}
    468499
     
    790821{
    791822        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);
    792825
    793826        /* Only process FIN if no text is left in segment. */
     
    896929         * incoming segments queue.
    897930         */
    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);
    899934                tcp_iqueue_insert_seg(&conn->incoming, seg);
    900         else
     935        } else {
    901936                tcp_segment_delete(seg);
     937        }
    902938}
    903939
     
    927963                tcp_conn_sa_queue(conn, seg); break;
    928964        case st_closed:
     965                log_msg(LVL_DEBUG, "state=%d", (int) conn->cstate);
    929966                assert(false);
    930967        }
Note: See TracChangeset for help on using the changeset viewer.