Changeset d14840d in mainline for uspace/srv/net/tcp/rqueue.c


Ignore:
Timestamp:
2017-09-06T17:08:23Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fc3d4fd5
Parents:
42f61f01
Message:

Add test for TCP rqueue.

File:
1 edited

Legend:

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

    r42f61f01 rd14840d  
    3838#include <errno.h>
    3939#include <io/log.h>
     40#include <stdbool.h>
    4041#include <stdlib.h>
    4142#include <fibril.h>
     43#include <fibril_synch.h>
    4244#include "conn.h"
    4345#include "pdu.h"
     
    5658
    5759static prodcons_t rqueue;
     60static bool fibril_active;
     61static fibril_mutex_t lock;
     62static fibril_condvar_t cv;
     63static tcp_rqueue_cb_t *rqueue_cb;
    5864
    5965/** Initialize segment receive queue. */
    60 void tcp_rqueue_init(void)
     66void tcp_rqueue_init(tcp_rqueue_cb_t *rcb)
    6167{
    6268        prodcons_initialize(&rqueue);
     69        fibril_mutex_initialize(&lock);
     70        fibril_condvar_initialize(&cv);
     71        fibril_active = false;
     72        rqueue_cb = rcb;
     73}
     74
     75/** Finalize segment receive queue. */
     76void tcp_rqueue_fini(void)
     77{
     78        inet_ep2_t epp;
     79
     80        inet_ep2_init(&epp);
     81        tcp_rqueue_insert_seg(&epp, NULL);
     82
     83        fibril_mutex_lock(&lock);
     84        while (fibril_active)
     85                fibril_condvar_wait(&cv, &lock);
     86        fibril_mutex_unlock(&lock);
    6387}
    6488
     
    112136{
    113137        tcp_rqueue_entry_t *rqe;
    114         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_rqueue_insert_seg()");
    115 
    116         tcp_segment_dump(seg);
     138
     139        log_msg(LOG_DEFAULT, LVL_DEBUG2, "tcp_rqueue_insert_seg()");
     140
     141        if (seg != NULL)
     142                tcp_segment_dump(seg);
    117143
    118144        rqe = calloc(1, sizeof(tcp_rqueue_entry_t));
     
    140166                rqe = list_get_instance(link, tcp_rqueue_entry_t, link);
    141167
    142                 tcp_as_segment_arrived(&rqe->epp, rqe->seg);
     168                if (rqe->seg == NULL) {
     169                        free(rqe);
     170                        break;
     171                }
     172
     173                rqueue_cb->seg_received(&rqe->epp, rqe->seg);
    143174                free(rqe);
    144175        }
    145176
    146         /* Not reached */
     177        log_msg(LOG_DEFAULT, LVL_DEBUG2, "tcp_rqueue_fibril() exiting");
     178
     179        /* Finished */
     180        fibril_mutex_lock(&lock);
     181        fibril_active = false;
     182        fibril_mutex_unlock(&lock);
     183        fibril_condvar_broadcast(&cv);
     184
    147185        return 0;
    148186}
     
    162200
    163201        fibril_add_ready(fid);
     202        fibril_active = true;
    164203}
    165204
Note: See TracChangeset for help on using the changeset viewer.