Ignore:
File:
1 edited

Legend:

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

    r7c15d6f r9520af7  
    4343#include <mem.h>
    4444#include <stdlib.h>
     45
    4546#include "conn.h"
     47#include "inet.h"
    4648#include "ncsim.h"
    47 #include "pdu.h"
    4849#include "rqueue.h"
    4950#include "segment.h"
    5051#include "seq_no.h"
    5152#include "tqueue.h"
    52 #include "tcp.h"
    5353#include "tcp_type.h"
    5454
    5555#define RETRANSMIT_TIMEOUT      (2*1000*1000)
    5656
    57 static void retransmit_timeout_func(void *arg);
    58 static void tcp_tqueue_timer_set(tcp_conn_t *conn);
    59 static void tcp_tqueue_timer_clear(tcp_conn_t *conn);
    60 
    61 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)
    6267{
    6368        tqueue->conn = conn;
    6469        tqueue->timer = fibril_timer_create(&conn->lock);
     70        tqueue->cb = cb;
    6571        if (tqueue->timer == NULL)
    6672                return ENOMEM;
     
    7884void tcp_tqueue_fini(tcp_tqueue_t *tqueue)
    7985{
     86        link_t *link;
     87        tcp_tqueue_entry_t *tqe;
     88
    8089        if (tqueue->timer != NULL) {
    8190                fibril_timer_destroy(tqueue->timer);
    8291                tqueue->timer = NULL;
    8392        }
     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        }
    84102}
    85103
     
    87105{
    88106        tcp_segment_t *seg;
     107
     108        assert(fibril_mutex_is_locked(&conn->lock));
    89109
    90110        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_tqueue_ctrl_seg(%p, %u)", conn, ctrl);
     
    95115}
    96116
    97 void tcp_tqueue_seg(tcp_conn_t *conn, tcp_segment_t *seg)
     117static void tcp_tqueue_seg(tcp_conn_t *conn, tcp_segment_t *seg)
    98118{
    99119        tcp_segment_t *rt_seg;
    100120        tcp_tqueue_entry_t *tqe;
     121
     122        assert(fibril_mutex_is_locked(&conn->lock));
    101123
    102124        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_tqueue_seg(%p, %p)", conn->name, conn,
     
    135157}
    136158
    137 void tcp_prepare_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
     159static void tcp_prepare_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
    138160{
    139161        /*
     
    267289}
    268290
    269 void tcp_conn_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
     291static void tcp_conn_transmit_segment(tcp_conn_t *conn, tcp_segment_t *seg)
    270292{
    271293        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_transmit_segment(%p, %p)",
     
    279301                seg->ack = 0;
    280302
    281         tcp_transmit_segment(&conn->ident, seg);
    282 }
    283 
    284 void tcp_transmit_segment(inet_ep2_t *epp, tcp_segment_t *seg)
     303        tcp_tqueue_send_immed(conn, seg);
     304}
     305
     306void tcp_tqueue_send_immed(tcp_conn_t *conn, tcp_segment_t *seg)
    285307{
    286308        log_msg(LOG_DEFAULT, LVL_DEBUG,
    287             "tcp_transmit_segment(l:(%u),f:(%u), %p)",
    288             epp->local.port, epp->remote.port, seg);
     309            "tcp_tqueue_send_immed(l:(%u),f:(%u), %p)",
     310            conn->ident.local.port, conn->ident.remote.port, seg);
    289311
    290312        log_msg(LOG_DEFAULT, LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32,
     
    292314
    293315        tcp_segment_dump(seg);
    294 /*
    295         tcp_pdu_prepare(conn, seg, &data, &len);
    296         tcp_pdu_transmit(data, len);
    297 */
    298 //      tcp_rqueue_bounce_seg(sp, seg);
    299 //      tcp_ncsim_bounce_seg(sp, seg);
    300 
    301         tcp_pdu_t *pdu;
    302 
    303         if (tcp_pdu_encode(epp, seg, &pdu) != EOK) {
    304                 log_msg(LOG_DEFAULT, LVL_WARN, "Not enough memory. Segment dropped.");
    305                 return;
    306         }
    307 
    308         tcp_transmit_pdu(pdu);
    309         tcp_pdu_delete(pdu);
     316
     317        conn->retransmit.cb->transmit_seg(&conn->ident, seg);
    310318}
    311319
     
    362370static void tcp_tqueue_timer_set(tcp_conn_t *conn)
    363371{
     372        assert(fibril_mutex_is_locked(&conn->lock));
     373
    364374        log_msg(LOG_DEFAULT, LVL_DEBUG, "### %s: tcp_tqueue_timer_set() begin", conn->name);
    365375
     
    377387static void tcp_tqueue_timer_clear(tcp_conn_t *conn)
    378388{
     389        assert(fibril_mutex_is_locked(&conn->lock));
     390
    379391        log_msg(LOG_DEFAULT, LVL_DEBUG, "### %s: tcp_tqueue_timer_clear() begin", conn->name);
    380392
Note: See TracChangeset for help on using the changeset viewer.