Changeset 975d528 in mainline for uspace/srv/net/tcp/tqueue.c


Ignore:
Timestamp:
2017-09-10T17:48:58Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e1b4ae0
Parents:
12dcd5f
Message:

Add unit tests for TCP tqueue. Fix tqueue possibly being finalized without freeing pending segments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tcp/tqueue.c

    r12dcd5f r975d528  
    4747#include "inet.h"
    4848#include "ncsim.h"
    49 #include "pdu.h"
    5049#include "rqueue.h"
    5150#include "segment.h"
     
    5655#define RETRANSMIT_TIMEOUT      (2*1000*1000)
    5756
    58 static void retransmit_timeout_func(void *arg);
    59 static void tcp_tqueue_timer_set(tcp_conn_t *conn);
    60 static void tcp_tqueue_timer_clear(tcp_conn_t *conn);
    61 
    62 int tcp_tqueue_init(tcp_tqueue_t *tqueue, tcp_conn_t *conn)
     57static void retransmit_timeout_func(void *);
     58static void tcp_tqueue_timer_set(tcp_conn_t *);
     59static void tcp_tqueue_timer_clear(tcp_conn_t *);
     60static void tcp_tqueue_seg(tcp_conn_t *, tcp_segment_t *);
     61static void tcp_conn_transmit_segment(tcp_conn_t *, tcp_segment_t *);
     62static void tcp_prepare_transmit_segment(tcp_conn_t *, tcp_segment_t *);
     63static void tcp_tqueue_send_immed(tcp_conn_t *, tcp_segment_t *);
     64
     65int tcp_tqueue_init(tcp_tqueue_t *tqueue, tcp_conn_t *conn,
     66    tcp_tqueue_cb_t *cb)
    6367{
    6468        tqueue->conn = conn;
    6569        tqueue->timer = fibril_timer_create(&conn->lock);
     70        tqueue->cb = cb;
    6671        if (tqueue->timer == NULL)
    6772                return ENOMEM;
     
    7984void tcp_tqueue_fini(tcp_tqueue_t *tqueue)
    8085{
     86        link_t *link;
     87        tcp_tqueue_entry_t *tqe;
     88
    8189        if (tqueue->timer != NULL) {
    8290                fibril_timer_destroy(tqueue->timer);
    8391                tqueue->timer = NULL;
    8492        }
     93
     94        while (!list_empty(&tqueue->list)) {
     95                link = list_first(&tqueue->list);
     96                tqe = list_get_instance(link, tcp_tqueue_entry_t, link);
     97                list_remove(link);
     98
     99                tcp_segment_delete(tqe->seg);
     100                free(tqe);
     101        }
    85102}
    86103
     
    96113}
    97114
    98 void tcp_tqueue_seg(tcp_conn_t *conn, tcp_segment_t *seg)
     115static void tcp_tqueue_seg(tcp_conn_t *conn, tcp_segment_t *seg)
    99116{
    100117        tcp_segment_t *rt_seg;
     
    136153}
    137154
    138 void tcp_prepare_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
     155static void tcp_prepare_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
    139156{
    140157        /*
     
    268285}
    269286
    270 void tcp_conn_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
     287static void tcp_conn_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
    271288{
    272289        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_transmit_segment(%p, %p)",
     
    280297                seg->ack = 0;
    281298
    282         tcp_transmit_segment(&conn->ident, seg);
    283 }
    284 
    285 void tcp_transmit_segment(inet_ep2_t *epp, tcp_segment_t *seg)
     299        tcp_tqueue_send_immed(conn, seg);
     300}
     301
     302void tcp_tqueue_send_immed(tcp_conn_t *conn, tcp_segment_t *seg)
    286303{
    287304        log_msg(LOG_DEFAULT, LVL_DEBUG,
    288             "tcp_transmit_segment(l:(%u),f:(%u), %p)",
    289             epp->local.port, epp->remote.port, seg);
     305            "tcp_tqueue_send_immed(l:(%u),f:(%u), %p)",
     306            conn->ident.local.port, conn->ident.remote.port, seg);
    290307
    291308        log_msg(LOG_DEFAULT, LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32,
     
    293310
    294311        tcp_segment_dump(seg);
    295 /*
    296         tcp_pdu_prepare(conn, seg, &data, &len);
    297         tcp_pdu_transmit(data, len);
    298 */
    299 //      tcp_rqueue_bounce_seg(sp, seg);
    300 //      tcp_ncsim_bounce_seg(sp, seg);
    301 
    302         tcp_pdu_t *pdu;
    303 
    304         if (tcp_pdu_encode(epp, seg, &pdu) != EOK) {
    305                 log_msg(LOG_DEFAULT, LVL_WARN, "Not enough memory. Segment dropped.");
    306                 return;
    307         }
    308 
    309         tcp_transmit_pdu(pdu);
    310         tcp_pdu_delete(pdu);
     312
     313        conn->retransmit.cb->transmit_seg(&conn->ident, seg);
    311314}
    312315
Note: See TracChangeset for help on using the changeset viewer.