Changeset eb083ad in mainline for uspace/srv


Ignore:
Timestamp:
2012-05-17T21:09:06Z (14 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8fde078
Parents:
a8b8086 (diff), 3e67ab1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge mainline changes

Location:
uspace/srv
Files:
11 edited
28 moved

Legend:

Unmodified
Added
Removed
  • uspace/srv/locsrv/Makefile

    ra8b8086 reb083ad  
    2929
    3030USPACE_PREFIX = ../..
    31 BINARY = loc
     31BINARY = locsrv
    3232STATIC_NEEDED = y
    3333
    3434SOURCES = \
    3535        category.c \
    36         loc.c
     36        locsrv.c
    3737
    3838include $(USPACE_PREFIX)/Makefile.common
  • uspace/srv/locsrv/category.c

    ra8b8086 reb083ad  
    4040
    4141#include "category.h"
    42 #include "loc.h"
     42#include "locsrv.h"
    4343
    4444/** Initialize category directory. */
  • uspace/srv/locsrv/category.h

    ra8b8086 reb083ad  
    3737
    3838#include <adt/list.h>
    39 #include "loc.h"
     39#include "locsrv.h"
    4040
    4141typedef sysarg_t catid_t;
  • uspace/srv/locsrv/locsrv.c

    ra8b8086 reb083ad  
    5151
    5252#include "category.h"
    53 #include "loc.h"
     53#include "locsrv.h"
    5454
    5555#define NAME          "loc"
  • uspace/srv/locsrv/locsrv.h

    ra8b8086 reb083ad  
    3333 */
    3434
    35 #ifndef LOC_H_
    36 #define LOC_H_
     35#ifndef LOCSRV_H_
     36#define LOCSRV_H_
    3737
    3838#include <ipc/loc.h>
  • uspace/srv/net/inetsrv/Makefile

    ra8b8086 reb083ad  
    2828
    2929USPACE_PREFIX = ../../..
    30 BINARY = inet
     30BINARY = inetsrv
    3131
    3232SOURCES = \
    3333        addrobj.c \
    3434        icmp.c \
    35         inet.c \
     35        inetsrv.c \
    3636        inet_link.c \
    3737        inet_util.c \
  • uspace/srv/net/inetsrv/addrobj.c

    ra8b8086 reb083ad  
    4444
    4545#include "addrobj.h"
    46 #include "inet.h"
     46#include "inetsrv.h"
    4747#include "inet_link.h"
    4848#include "inet_util.h"
     49
     50static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
    4951
    5052static FIBRIL_MUTEX_INITIALIZE(addr_list_lock);
     
    7779}
    7880
    79 void inet_addrobj_add(inet_addrobj_t *addr)
    80 {
    81         fibril_mutex_lock(&addr_list_lock);
     81int inet_addrobj_add(inet_addrobj_t *addr)
     82{
     83        inet_addrobj_t *aobj;
     84
     85        fibril_mutex_lock(&addr_list_lock);
     86        aobj = inet_addrobj_find_by_name_locked(addr->name, addr->ilink);
     87        if (aobj != NULL) {
     88                /* Duplicate address name */
     89                fibril_mutex_unlock(&addr_list_lock);
     90                return EEXISTS;
     91        }
     92
    8293        list_append(&addr->addr_list, &addr_list);
    8394        fibril_mutex_unlock(&addr_list_lock);
     95
     96        return EOK;
    8497}
    8598
     
    130143 * @return      Address object
    131144 */
    132 inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
    133 {
    134         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
     145static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *name, inet_link_t *ilink)
     146{
     147        assert(fibril_mutex_is_locked(&addr_list_lock));
     148
     149        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked('%s', '%s')",
    135150            name, ilink->svc_name);
    136151
    137         fibril_mutex_lock(&addr_list_lock);
    138 
    139152        list_foreach(addr_list, link) {
    140153                inet_addrobj_t *naddr = list_get_instance(link,
     
    142155
    143156                if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
    144                         fibril_mutex_unlock(&addr_list_lock);
    145                         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: found %p",
     157                        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p",
    146158                            naddr);
    147159                        return naddr;
     
    149161        }
    150162
    151         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: Not found");
    152         fibril_mutex_unlock(&addr_list_lock);
     163        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked: Not found");
    153164
    154165        return NULL;
     166}
     167
     168
     169/** Find address object on a link, with a specific name.
     170 *
     171 * @param name  Address object name
     172 * @param ilink Inet link
     173 * @return      Address object
     174 */
     175inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
     176{
     177        inet_addrobj_t *aobj;
     178
     179        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
     180            name, ilink->svc_name);
     181
     182        fibril_mutex_lock(&addr_list_lock);
     183        aobj = inet_addrobj_find_by_name_locked(name, ilink);
     184        fibril_mutex_unlock(&addr_list_lock);
     185
     186        return aobj;
    155187}
    156188
  • uspace/srv/net/inetsrv/addrobj.h

    ra8b8086 reb083ad  
    3939
    4040#include <sys/types.h>
    41 #include "inet.h"
     41#include "inetsrv.h"
    4242
    4343typedef enum {
     
    5050extern inet_addrobj_t *inet_addrobj_new(void);
    5151extern void inet_addrobj_delete(inet_addrobj_t *);
    52 extern void inet_addrobj_add(inet_addrobj_t *);
     52extern int inet_addrobj_add(inet_addrobj_t *);
    5353extern void inet_addrobj_remove(inet_addrobj_t *);
    5454extern inet_addrobj_t *inet_addrobj_find(inet_addr_t *, inet_addrobj_find_t);
  • uspace/srv/net/inetsrv/icmp.c

    ra8b8086 reb083ad  
    4343#include "icmp.h"
    4444#include "icmp_std.h"
    45 #include "inet.h"
     45#include "inetsrv.h"
    4646#include "inetping.h"
    4747#include "pdu.h"
  • uspace/srv/net/inetsrv/icmp.h

    ra8b8086 reb083ad  
    3838#define ICMP_H_
    3939
    40 #include "inet.h"
     40#include "inetsrv.h"
    4141
    4242extern int icmp_recv(inet_dgram_t *);
  • uspace/srv/net/inetsrv/inet_link.c

    ra8b8086 reb083ad  
    4545
    4646#include "addrobj.h"
    47 #include "inet.h"
     47#include "inetsrv.h"
    4848#include "inet_link.h"
    4949#include "pdu.h"
     
    207207        addr->ilink = ilink;
    208208        addr->name = str_dup("v4a");
    209         inet_addrobj_add(addr);
     209        rc = inet_addrobj_add(addr);
     210        if (rc != EOK) {
     211                log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
     212                inet_addrobj_delete(addr);
     213                /* XXX Roll back */
     214                return rc;
     215        }
    210216
    211217        iaddr.ipv4 = addr->naddr.ipv4;
     
    213219        if (rc != EOK) {
    214220                log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
     221                inet_addrobj_remove(addr);
     222                inet_addrobj_delete(addr);
    215223                /* XXX Roll back */
    216224                return rc;
  • uspace/srv/net/inetsrv/inet_link.h

    ra8b8086 reb083ad  
    3939
    4040#include <sys/types.h>
    41 #include "inet.h"
     41#include "inetsrv.h"
    4242
    4343extern int inet_link_discovery_start(void);
  • uspace/srv/net/inetsrv/inetcfg.c

    ra8b8086 reb083ad  
    4646
    4747#include "addrobj.h"
    48 #include "inet.h"
     48#include "inetsrv.h"
    4949#include "inet_link.h"
    5050#include "inetcfg.h"
     
    7575        addr->ilink = ilink;
    7676        addr->name = str_dup(name);
    77         inet_addrobj_add(addr);
     77        rc = inet_addrobj_add(addr);
     78        if (rc != EOK) {
     79                log_msg(LVL_DEBUG, "Duplicate address name '%s'.", addr->name);
     80                inet_addrobj_delete(addr);
     81                return rc;
     82        }
    7883
    7984        iaddr.ipv4 = addr->naddr.ipv4;
  • uspace/srv/net/inetsrv/inetping.c

    ra8b8086 reb083ad  
    4646#include "icmp.h"
    4747#include "icmp_std.h"
    48 #include "inet.h"
     48#include "inetsrv.h"
    4949#include "inetping.h"
    5050
  • uspace/srv/net/inetsrv/inetsrv.c

    ra8b8086 reb083ad  
    5050#include "icmp.h"
    5151#include "icmp_std.h"
    52 #include "inet.h"
     52#include "inetsrv.h"
    5353#include "inetcfg.h"
    5454#include "inetping.h"
     
    5757#include "sroute.h"
    5858
    59 #define NAME "inet"
     59#define NAME "inetsrv"
    6060
    6161static void inet_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
  • uspace/srv/net/inetsrv/inetsrv.h

    ra8b8086 reb083ad  
    2727 */
    2828
    29 /** @addtogroup inet
     29/** @addtogroup inetsrv
    3030 * @{
    3131 */
     
    3535 */
    3636
    37 #ifndef INET_H_
    38 #define INET_H_
     37#ifndef INETSRV_H_
     38#define INETSRV_H_
    3939
    4040#include <adt/list.h>
  • uspace/srv/net/inetsrv/pdu.c

    ra8b8086 reb083ad  
    4545#include <stdlib.h>
    4646
    47 #include "inet.h"
     47#include "inetsrv.h"
    4848#include "inet_std.h"
    4949#include "pdu.h"
  • uspace/srv/net/inetsrv/pdu.h

    ra8b8086 reb083ad  
    3939
    4040#include <sys/types.h>
    41 #include "inet.h"
     41#include "inetsrv.h"
    4242
    4343#define INET_CHECKSUM_INIT 0xffff
  • uspace/srv/net/inetsrv/reass.c

    ra8b8086 reb083ad  
    4242#include <stdlib.h>
    4343
    44 #include "inet.h"
     44#include "inetsrv.h"
    4545#include "inet_std.h"
    4646#include "reass.h"
  • uspace/srv/net/inetsrv/reass.h

    ra8b8086 reb083ad  
    3939
    4040#include <sys/types.h>
    41 #include "inet.h"
     41#include "inetsrv.h"
    4242
    4343extern int inet_reass_queue_packet(inet_packet_t *);
  • uspace/srv/net/inetsrv/sroute.c

    ra8b8086 reb083ad  
    4444
    4545#include "sroute.h"
    46 #include "inet.h"
     46#include "inetsrv.h"
    4747#include "inet_link.h"
    4848#include "inet_util.h"
  • uspace/srv/net/inetsrv/sroute.h

    ra8b8086 reb083ad  
    3939
    4040#include <sys/types.h>
    41 #include "inet.h"
     41#include "inetsrv.h"
    4242
    4343extern inet_sroute_t *inet_sroute_new(void);
  • uspace/srv/net/tcp/conn.c

    ra8b8086 reb083ad  
    184184void tcp_conn_addref(tcp_conn_t *conn)
    185185{
    186         log_msg(LVL_DEBUG, "%s: tcp_conn_addref(%p)", conn->name, conn);
     186        log_msg(LVL_DEBUG2, "%s: tcp_conn_addref(%p)", conn->name, conn);
    187187        atomic_inc(&conn->refcnt);
    188188}
     
    196196void tcp_conn_delref(tcp_conn_t *conn)
    197197{
    198         log_msg(LVL_DEBUG, "%s: tcp_conn_delref(%p)", conn->name, conn);
     198        log_msg(LVL_DEBUG2, "%s: tcp_conn_delref(%p)", conn->name, conn);
    199199
    200200        if (atomic_predec(&conn->refcnt) == 0)
     
    312312static bool tcp_socket_match(tcp_sock_t *sock, tcp_sock_t *patt)
    313313{
    314         log_msg(LVL_DEBUG, "tcp_socket_match(sock=(%x,%u), pat=(%x,%u))",
     314        log_msg(LVL_DEBUG2, "tcp_socket_match(sock=(%x,%u), pat=(%x,%u))",
    315315            sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port);
    316316
     
    323323                return false;
    324324
    325         log_msg(LVL_DEBUG, " -> match");
     325        log_msg(LVL_DEBUG2, " -> match");
    326326
    327327        return true;
     
    331331static bool tcp_sockpair_match(tcp_sockpair_t *sp, tcp_sockpair_t *pattern)
    332332{
    333         log_msg(LVL_DEBUG, "tcp_sockpair_match(%p, %p)", sp, pattern);
     333        log_msg(LVL_DEBUG2, "tcp_sockpair_match(%p, %p)", sp, pattern);
    334334
    335335        if (!tcp_socket_match(&sp->local, &pattern->local))
     
    360360                tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
    361361                tcp_sockpair_t *csp = &conn->ident;
    362                 log_msg(LVL_DEBUG, "compare with conn (f:(%x,%u), l:(%x,%u))",
     362                log_msg(LVL_DEBUG2, "compare with conn (f:(%x,%u), l:(%x,%u))",
    363363                    csp->foreign.addr.ipv4, csp->foreign.port,
    364364                    csp->local.addr.ipv4, csp->local.port);
  • uspace/srv/net/tcp/ncsim.c

    ra8b8086 reb083ad  
    4444#include <io/log.h>
    4545#include <stdlib.h>
    46 #include <thread.h>
     46#include <fibril.h>
    4747#include "conn.h"
    4848#include "ncsim.h"
     
    119119}
    120120
    121 /** Network condition simulator handler thread. */
    122 static void tcp_ncsim_thread(void *arg)
     121/** Network condition simulator handler fibril. */
     122static int tcp_ncsim_fibril(void *arg)
    123123{
    124124        link_t *link;
     
    126126        int rc;
    127127
    128         log_msg(LVL_DEBUG, "tcp_ncsim_thread()");
     128        log_msg(LVL_DEBUG, "tcp_ncsim_fibril()");
    129129
    130130
     
    151151                free(sqe);
    152152        }
     153
     154        /* Not reached */
     155        return 0;
    153156}
    154157
    155 /** Start simulator handler thread. */
    156 void tcp_ncsim_thread_start(void)
     158/** Start simulator handler fibril. */
     159void tcp_ncsim_fibril_start(void)
    157160{
    158         thread_id_t tid;
    159         int rc;
     161        fid_t fid;
    160162
    161         log_msg(LVL_DEBUG, "tcp_ncsim_thread_start()");
     163        log_msg(LVL_DEBUG, "tcp_ncsim_fibril_start()");
    162164
    163         rc = thread_create(tcp_ncsim_thread, NULL, "ncsim", &tid);
    164         if (rc != EOK) {
    165                 log_msg(LVL_ERROR, "Failed creating ncsim thread.");
     165        fid = fibril_create(tcp_ncsim_fibril, NULL);
     166        if (fid == 0) {
     167                log_msg(LVL_ERROR, "Failed creating ncsim fibril.");
    166168                return;
    167169        }
     170
     171        fibril_add_ready(fid);
    168172}
    169173
  • uspace/srv/net/tcp/ncsim.h

    ra8b8086 reb083ad  
    4040extern void tcp_ncsim_init(void);
    4141extern void tcp_ncsim_bounce_seg(tcp_sockpair_t *, tcp_segment_t *);
    42 extern void tcp_ncsim_thread_start(void);
    43 
     42extern void tcp_ncsim_fibril_start(void);
    4443
    4544#endif
  • uspace/srv/net/tcp/rqueue.c

    ra8b8086 reb083ad  
    3939#include <io/log.h>
    4040#include <stdlib.h>
    41 #include <thread.h>
     41#include <fibril.h>
    4242#include "conn.h"
    4343#include "pdu.h"
     
    128128}
    129129
    130 /** Receive queue handler thread. */
    131 static void tcp_rqueue_thread(void *arg)
     130/** Receive queue handler fibril. */
     131static int tcp_rqueue_fibril(void *arg)
    132132{
    133133        link_t *link;
    134134        tcp_rqueue_entry_t *rqe;
    135135
    136         log_msg(LVL_DEBUG, "tcp_rqueue_thread()");
     136        log_msg(LVL_DEBUG, "tcp_rqueue_fibril()");
    137137
    138138        while (true) {
     
    142142                tcp_as_segment_arrived(&rqe->sp, rqe->seg);
    143143        }
     144
     145        /* Not reached */
     146        return 0;
    144147}
    145148
    146 /** Start receive queue handler thread. */
    147 void tcp_rqueue_thread_start(void)
     149/** Start receive queue handler fibril. */
     150void tcp_rqueue_fibril_start(void)
    148151{
    149         thread_id_t tid;
    150         int rc;
     152        fid_t fid;
    151153
    152         log_msg(LVL_DEBUG, "tcp_rqueue_thread_start()");
     154        log_msg(LVL_DEBUG, "tcp_rqueue_fibril_start()");
    153155
    154         rc = thread_create(tcp_rqueue_thread, NULL, "rqueue", &tid);
    155         if (rc != EOK) {
    156                 log_msg(LVL_ERROR, "Failed creating rqueue thread.");
     156        fid = fibril_create(tcp_rqueue_fibril, NULL);
     157        if (fid == 0) {
     158                log_msg(LVL_ERROR, "Failed creating rqueue fibril.");
    157159                return;
    158160        }
     161
     162        fibril_add_ready(fid);
    159163}
    160164
  • uspace/srv/net/tcp/rqueue.h

    ra8b8086 reb083ad  
    4242extern void tcp_rqueue_insert_seg(tcp_sockpair_t *, tcp_segment_t *);
    4343extern void tcp_rqueue_handler(void *);
    44 extern void tcp_rqueue_thread_start(void);
     44extern void tcp_rqueue_fibril_start(void);
    4545
    4646
  • uspace/srv/net/tcp/segment.c

    ra8b8086 reb083ad  
    248248void tcp_segment_dump(tcp_segment_t *seg)
    249249{
    250         log_msg(LVL_DEBUG, "Segment dump:");
    251         log_msg(LVL_DEBUG, " - ctrl = %u", (unsigned)seg->ctrl);
    252         log_msg(LVL_DEBUG, " - seq = % " PRIu32, seg->seq);
    253         log_msg(LVL_DEBUG, " - ack = % " PRIu32, seg->ack);
    254         log_msg(LVL_DEBUG, " - len = % " PRIu32, seg->len);
    255         log_msg(LVL_DEBUG, " - wnd = % " PRIu32, seg->wnd);
    256         log_msg(LVL_DEBUG, " - up = % " PRIu32, seg->up);
     250        log_msg(LVL_DEBUG2, "Segment dump:");
     251        log_msg(LVL_DEBUG2, " - ctrl = %u", (unsigned)seg->ctrl);
     252        log_msg(LVL_DEBUG2, " - seq = % " PRIu32, seg->seq);
     253        log_msg(LVL_DEBUG2, " - ack = % " PRIu32, seg->ack);
     254        log_msg(LVL_DEBUG2, " - len = % " PRIu32, seg->len);
     255        log_msg(LVL_DEBUG2, " - wnd = % " PRIu32, seg->wnd);
     256        log_msg(LVL_DEBUG2, " - up = % " PRIu32, seg->up);
    257257}
    258258
  • uspace/srv/net/tcp/sock.c

    ra8b8086 reb083ad  
    4242#include <ipc/services.h>
    4343#include <ipc/socket.h>
    44 #include <net/modules.h>
    4544#include <net/socket.h>
    4645#include <ns.h>
     
    5251#include "ucall.h"
    5352
    54 #define FRAGMENT_SIZE 1024
    55 
    5653#define MAX_BACKLOG 128
    5754
     
    6764static void tcp_sock_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg);
    6865static void tcp_sock_cstate_cb(tcp_conn_t *conn, void *arg);
     66static int tcp_sock_recv_fibril(void *arg);
    6967
    7068int tcp_sock_init(void)
     
    9896        async_exch_t *exch = async_exchange_begin(sock_core->sess);
    9997        async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id,
    100             FRAGMENT_SIZE, 0, 0, 1);
     98            TCP_SOCK_FRAGMENT_SIZE, 0, 0, 1);
    10199        async_exchange_end(exch);
    102100}
     
    107105        async_exch_t *exch = async_exchange_begin(lsock_core->sess);
    108106        async_msg_5(exch, NET_SOCKET_ACCEPTED, (sysarg_t)lsock_core->socket_id,
    109             FRAGMENT_SIZE, 0, 0, 0);
     107            TCP_SOCK_FRAGMENT_SIZE, 0, 0, 0);
    110108        async_exchange_end(exch);
    111109}
    112110
     111static int tcp_sock_create(tcp_client_t *client, tcp_sockdata_t **rsock)
     112{
     113        tcp_sockdata_t *sock;
     114
     115        log_msg(LVL_DEBUG, "tcp_sock_create()");
     116        *rsock = NULL;
     117
     118        sock = calloc(sizeof(tcp_sockdata_t), 1);
     119        if (sock == NULL)
     120                return ENOMEM;
     121
     122        fibril_mutex_initialize(&sock->lock);
     123        sock->client = client;
     124
     125        sock->recv_buffer_used = 0;
     126        sock->recv_error = TCP_EOK;
     127        fibril_mutex_initialize(&sock->recv_buffer_lock);
     128        fibril_condvar_initialize(&sock->recv_buffer_cv);
     129        list_initialize(&sock->ready);
     130
     131        *rsock = sock;
     132        return EOK;
     133}
     134
     135static void tcp_sock_uncreate(tcp_sockdata_t *sock)
     136{
     137        log_msg(LVL_DEBUG, "tcp_sock_uncreate()");
     138        free(sock);
     139}
     140
     141static int tcp_sock_finish_setup(tcp_sockdata_t *sock, int *sock_id)
     142{
     143        socket_core_t *sock_core;
     144        int rc;
     145
     146        log_msg(LVL_DEBUG, "tcp_sock_finish_setup()");
     147
     148        sock->recv_fibril = fibril_create(tcp_sock_recv_fibril, sock);
     149        if (sock->recv_fibril == 0)
     150                return ENOMEM;
     151
     152        rc = socket_create(&sock->client->sockets, sock->client->sess,
     153            sock, sock_id);
     154
     155        if (rc != EOK)
     156                return rc;
     157
     158        sock_core = socket_cores_find(&sock->client->sockets, *sock_id);
     159        assert(sock_core != NULL);
     160        sock->sock_core = sock_core;
     161
     162        return EOK;
     163}
     164
    113165static void tcp_sock_socket(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    114166{
    115167        tcp_sockdata_t *sock;
    116         socket_core_t *sock_core;
    117168        int sock_id;
    118169        int rc;
     
    120171
    121172        log_msg(LVL_DEBUG, "tcp_sock_socket()");
    122         sock = calloc(sizeof(tcp_sockdata_t), 1);
    123         if (sock == NULL) {
    124                 async_answer_0(callid, ENOMEM);
    125                 return;
    126         }
    127 
    128         fibril_mutex_initialize(&sock->lock);
    129         sock->client = client;
     173
     174        rc = tcp_sock_create(client, &sock);
     175        if (rc != EOK) {
     176                async_answer_0(callid, rc);
     177                return;
     178        }
     179
    130180        sock->laddr.ipv4 = TCP_IPV4_ANY;
    131181        sock->lconn = NULL;
    132182        sock->backlog = 0;
    133         list_initialize(&sock->ready);
    134183
    135184        sock_id = SOCKET_GET_SOCKET_ID(call);
    136         rc = socket_create(&client->sockets, client->sess, sock, &sock_id);
     185        rc = tcp_sock_finish_setup(sock, &sock_id);
    137186        if (rc != EOK) {
     187                tcp_sock_uncreate(sock);
    138188                async_answer_0(callid, rc);
    139189                return;
    140190        }
    141191
    142         sock_core = socket_cores_find(&client->sockets, sock_id);
    143         assert(sock_core != NULL);
    144         sock->sock_core = sock_core;
    145 
    146         refresh_answer(&answer, NULL);
    147192        SOCKET_SET_SOCKET_ID(answer, sock_id);
    148193
    149         SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);
     194        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE);
    150195        SOCKET_SET_HEADER_SIZE(answer, sizeof(tcp_header_t));
    151         answer_call(callid, EOK, &answer, 3);
     196       
     197        async_answer_3(callid, EOK, IPC_GET_ARG1(answer),
     198            IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
    152199}
    153200
     
    361408        }
    362409
     410        if (rc == EOK)
     411                fibril_add_ready(socket->recv_fibril);
     412
    363413        async_answer_0(callid, rc);
    364 
    365         /* Push one fragment notification to client's queue */
    366         tcp_sock_notify_data(sock_core);
    367         log_msg(LVL_DEBUG, "tcp_sock_connect(): notify conn\n");
    368414}
    369415
     
    374420        int asock_id;
    375421        socket_core_t *sock_core;
    376         socket_core_t *asock_core;
    377422        tcp_sockdata_t *socket;
    378423        tcp_sockdata_t *asocket;
     
    444489        /* Allocate socket for accepted connection */
    445490
    446         log_msg(LVL_DEBUG, "tcp_sock_accept(): allocate asocket\n");
    447         asocket = calloc(sizeof(tcp_sockdata_t), 1);
    448         if (asocket == NULL) {
    449                 fibril_mutex_unlock(&socket->lock);
    450                 async_answer_0(callid, ENOMEM);
    451                 return;
    452         }
    453 
    454         fibril_mutex_initialize(&asocket->lock);
    455         asocket->client = client;
     491        rc = tcp_sock_create(client, &asocket);
     492        if (rc != EOK) {
     493                fibril_mutex_unlock(&socket->lock);
     494                async_answer_0(callid, rc);
     495                return;
     496        }
     497
    456498        asocket->conn = conn;
    457499        log_msg(LVL_DEBUG, "tcp_sock_accept():create asocket\n");
    458500
    459         rc = socket_create(&client->sockets, client->sess, asocket, &asock_id);
     501        rc = tcp_sock_finish_setup(asocket, &asock_id);
    460502        if (rc != EOK) {
     503                tcp_sock_uncreate(asocket);
    461504                fibril_mutex_unlock(&socket->lock);
    462505                async_answer_0(callid, rc);
    463506                return;
    464507        }
     508
     509        fibril_add_ready(asocket->recv_fibril);
     510
    465511        log_msg(LVL_DEBUG, "tcp_sock_accept(): find acore\n");
    466512
    467         asock_core = socket_cores_find(&client->sockets, asock_id);
    468         assert(asock_core != NULL);
    469 
    470         refresh_answer(&answer, NULL);
    471 
    472         SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);
     513        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE);
    473514        SOCKET_SET_SOCKET_ID(answer, asock_id);
    474515        SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(struct sockaddr_in));
    475 
    476         answer_call(callid, asock_core->socket_id, &answer, 3);
    477 
     516       
     517        async_answer_3(callid, asocket->sock_core->socket_id,
     518            IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),
     519            IPC_GET_ARG3(answer));
     520       
    478521        /* Push one fragment notification to client's queue */
    479522        log_msg(LVL_DEBUG, "tcp_sock_accept(): notify data\n");
    480         tcp_sock_notify_data(asock_core);
    481523        fibril_mutex_unlock(&socket->lock);
    482524}
     
    492534        ipc_callid_t wcallid;
    493535        size_t length;
    494         uint8_t buffer[FRAGMENT_SIZE];
     536        uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE];
    495537        tcp_error_t trc;
    496538        int rc;
     
    523565                }
    524566
    525                 if (length > FRAGMENT_SIZE)
    526                         length = FRAGMENT_SIZE;
     567                if (length > TCP_SOCK_FRAGMENT_SIZE)
     568                        length = TCP_SOCK_FRAGMENT_SIZE;
    527569
    528570                rc = async_data_write_finalize(wcallid, buffer, length);
     
    559601        }
    560602
    561         refresh_answer(&answer, NULL);
    562         SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);
    563         answer_call(callid, EOK, &answer, 2);
     603        IPC_SET_ARG1(answer, 0);
     604        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE);
     605        async_answer_2(callid, EOK, IPC_GET_ARG1(answer),
     606            IPC_GET_ARG2(answer));
    564607        fibril_mutex_unlock(&socket->lock);
    565608}
     
    580623        ipc_call_t answer;
    581624        ipc_callid_t rcallid;
    582         uint8_t buffer[FRAGMENT_SIZE];
    583625        size_t data_len;
    584         xflags_t xflags;
    585         tcp_error_t trc;
    586626        struct sockaddr_in addr;
    587627        tcp_sock_t *rsock;
     
    610650        (void)flags;
    611651
    612         trc = tcp_uc_receive(socket->conn, buffer, FRAGMENT_SIZE, &data_len,
    613             &xflags);
    614         log_msg(LVL_DEBUG, "**** tcp_uc_receive done");
    615 
    616         switch (trc) {
     652        log_msg(LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock");
     653        fibril_mutex_lock(&socket->recv_buffer_lock);
     654        while (socket->recv_buffer_used == 0 && socket->recv_error == TCP_EOK) {
     655                log_msg(LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0");
     656                fibril_condvar_wait(&socket->recv_buffer_cv,
     657                    &socket->recv_buffer_lock);
     658        }
     659
     660        log_msg(LVL_DEBUG, "Got data in sock recv_buffer");
     661
     662        data_len = socket->recv_buffer_used;
     663        rc = socket->recv_error;
     664
     665        switch (socket->recv_error) {
    617666        case TCP_EOK:
    618667                rc = EOK;
     
    629678        }
    630679
    631         log_msg(LVL_DEBUG, "**** tcp_uc_receive -> %d", rc);
     680        log_msg(LVL_DEBUG, "**** recv result -> %d", rc);
    632681        if (rc != EOK) {
     682                fibril_mutex_unlock(&socket->recv_buffer_lock);
    633683                fibril_mutex_unlock(&socket->lock);
    634684                async_answer_0(callid, rc);
     
    645695                log_msg(LVL_DEBUG, "addr read receive");
    646696                if (!async_data_read_receive(&rcallid, &addr_length)) {
     697                        fibril_mutex_unlock(&socket->recv_buffer_lock);
    647698                        fibril_mutex_unlock(&socket->lock);
    648699                        async_answer_0(callid, EINVAL);
     
    656707                rc = async_data_read_finalize(rcallid, &addr, addr_length);
    657708                if (rc != EOK) {
     709                        fibril_mutex_unlock(&socket->recv_buffer_lock);
    658710                        fibril_mutex_unlock(&socket->lock);
    659711                        async_answer_0(callid, EINVAL);
     
    664716        log_msg(LVL_DEBUG, "data read receive");
    665717        if (!async_data_read_receive(&rcallid, &length)) {
     718                fibril_mutex_unlock(&socket->recv_buffer_lock);
    666719                fibril_mutex_unlock(&socket->lock);
    667720                async_answer_0(callid, EINVAL);
     
    673726
    674727        log_msg(LVL_DEBUG, "data read finalize");
    675         rc = async_data_read_finalize(rcallid, buffer, length);
     728        rc = async_data_read_finalize(rcallid, socket->recv_buffer, length);
     729
     730        socket->recv_buffer_used -= length;
     731        log_msg(LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer",
     732            socket->recv_buffer_used);
     733        if (socket->recv_buffer_used > 0) {
     734                memmove(socket->recv_buffer, socket->recv_buffer + length,
     735                    socket->recv_buffer_used);
     736                tcp_sock_notify_data(socket->sock_core);
     737        }
     738
     739        fibril_condvar_broadcast(&socket->recv_buffer_cv);
    676740
    677741        if (length < data_len && rc == EOK)
     
    679743
    680744        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    681         answer_call(callid, EOK, &answer, 1);
    682 
    683         /* Push one fragment notification to client's queue */
    684         tcp_sock_notify_data(sock_core);
     745        async_answer_1(callid, EOK, IPC_GET_ARG1(answer));
     746
     747        fibril_mutex_unlock(&socket->recv_buffer_lock);
    685748        fibril_mutex_unlock(&socket->lock);
    686749}
     
    693756        tcp_error_t trc;
    694757        int rc;
    695         uint8_t buffer[FRAGMENT_SIZE];
    696         size_t data_len;
    697         xflags_t xflags;
    698758
    699759        log_msg(LVL_DEBUG, "tcp_sock_close()");
     
    716776                        return;
    717777                }
    718 
    719                 /* Drain incoming data. This should really be done in the background. */
    720                 do {
    721                         trc = tcp_uc_receive(socket->conn, buffer,
    722                             FRAGMENT_SIZE, &data_len, &xflags);
    723                 } while (trc == TCP_EOK);
    724 
    725                 tcp_uc_delete(socket->conn);
    726778        }
    727779
     
    775827        tcp_sock_notify_aconn(socket->sock_core);
    776828        fibril_mutex_unlock(&socket->lock);
     829}
     830
     831static int tcp_sock_recv_fibril(void *arg)
     832{
     833        tcp_sockdata_t *sock = (tcp_sockdata_t *)arg;
     834        size_t data_len;
     835        xflags_t xflags;
     836        tcp_error_t trc;
     837
     838        log_msg(LVL_DEBUG, "tcp_sock_recv_fibril()");
     839
     840        while (true) {
     841                log_msg(LVL_DEBUG, "call tcp_uc_receive()");
     842                fibril_mutex_lock(&sock->recv_buffer_lock);
     843                while (sock->recv_buffer_used != 0)
     844                        fibril_condvar_wait(&sock->recv_buffer_cv,
     845                            &sock->recv_buffer_lock);
     846
     847                trc = tcp_uc_receive(sock->conn, sock->recv_buffer,
     848                    TCP_SOCK_FRAGMENT_SIZE, &data_len, &xflags);
     849
     850                if (trc != TCP_EOK) {
     851                        sock->recv_error = trc;
     852                        fibril_condvar_broadcast(&sock->recv_buffer_cv);
     853                        fibril_mutex_unlock(&sock->recv_buffer_lock);
     854                        tcp_sock_notify_data(sock->sock_core);
     855                        break;
     856                }
     857
     858                log_msg(LVL_DEBUG, "got data - broadcast recv_buffer_cv");
     859
     860                sock->recv_buffer_used = data_len;
     861                fibril_condvar_broadcast(&sock->recv_buffer_cv);
     862                fibril_mutex_unlock(&sock->recv_buffer_lock);
     863                tcp_sock_notify_data(sock->sock_core);
     864        }
     865
     866        tcp_uc_delete(sock->conn);
     867
     868        return 0;
    777869}
    778870
  • uspace/srv/net/tcp/tcp.c

    ra8b8086 reb083ad  
    180180
    181181        tcp_rqueue_init();
    182         tcp_rqueue_thread_start();
     182        tcp_rqueue_fibril_start();
    183183
    184184        tcp_ncsim_init();
    185         tcp_ncsim_thread_start();
     185        tcp_ncsim_fibril_start();
    186186
    187187        if (0) tcp_test();
  • uspace/srv/net/tcp/tcp_type.h

    ra8b8086 reb083ad  
    3939#include <async.h>
    4040#include <bool.h>
     41#include <fibril.h>
    4142#include <fibril_synch.h>
    4243#include <socket_core.h>
     
    331332} tcp_client_t;
    332333
     334#define TCP_SOCK_FRAGMENT_SIZE 1024
     335
    333336typedef struct tcp_sockdata {
    334337        /** Lock */
     
    348351        /** List of connections (from lconn) that are ready to be accepted */
    349352        list_t ready;
     353        /** Receiving fibril */
     354        fid_t recv_fibril;
     355        uint8_t recv_buffer[TCP_SOCK_FRAGMENT_SIZE];
     356        size_t recv_buffer_used;
     357        fibril_mutex_t recv_buffer_lock;
     358        fibril_condvar_t recv_buffer_cv;
     359        tcp_error_t recv_error;
    350360} tcp_sockdata_t;
    351361
  • uspace/srv/net/tcp/test.c

    ra8b8086 reb083ad  
    3838#include <errno.h>
    3939#include <stdio.h>
    40 #include <thread.h>
     40#include <fibril.h>
    4141#include <str.h>
    4242#include "tcp_type.h"
     
    4747#define RCV_BUF_SIZE 64
    4848
    49 static void test_srv(void *arg)
     49static int test_srv(void *arg)
    5050{
    5151        tcp_conn_t *conn;
     
    8484
    8585        printf("test_srv() terminating\n");
     86        return 0;
    8687}
    8788
    88 static void test_cli(void *arg)
     89static int test_cli(void *arg)
    8990{
    9091        tcp_conn_t *conn;
     
    112113        printf("C: User close...\n");
    113114        tcp_uc_close(conn);
     115
     116        return 0;
    114117}
    115118
    116119void tcp_test(void)
    117120{
    118         thread_id_t srv_tid;
    119         thread_id_t cli_tid;
    120         int rc;
     121        fid_t srv_fid;
     122        fid_t cli_fid;
    121123
    122124        printf("tcp_test()\n");
     
    125127
    126128        if (0) {
    127                 rc = thread_create(test_srv, NULL, "test_srv", &srv_tid);
    128                 if (rc != EOK) {
    129                         printf("Failed to create server thread.\n");
     129                srv_fid = fibril_create(test_srv, NULL);
     130                if (srv_fid == 0) {
     131                        printf("Failed to create server fibril.\n");
    130132                        return;
    131133                }
     134
     135                fibril_add_ready(srv_fid);
    132136        }
    133137
    134138        if (0) {
    135                 rc = thread_create(test_cli, NULL, "test_cli", &cli_tid);
    136                 if (rc != EOK) {
    137                         printf("Failed to create client thread.\n");
     139                cli_fid = fibril_create(test_cli, NULL);
     140                if (cli_fid == 0) {
     141                        printf("Failed to create client fibril.\n");
    138142                        return;
    139143                }
     144
     145                fibril_add_ready(cli_fid);
    140146        }
    141147}
  • uspace/srv/net/udp/sock.c

    ra8b8086 reb083ad  
    4343#include <ipc/services.h>
    4444#include <ipc/socket.h>
    45 #include <net/modules.h>
    4645#include <net/socket.h>
    4746#include <ns.h>
     
    134133        assert(sock_core != NULL);
    135134        sock->sock_core = sock_core;
    136 
    137 
    138         refresh_answer(&answer, NULL);
     135       
    139136        SOCKET_SET_SOCKET_ID(answer, sock_id);
    140137
    141138        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);
    142139        SOCKET_SET_HEADER_SIZE(answer, sizeof(udp_header_t));
    143         answer_call(callid, EOK, &answer, 3);
     140        async_answer_3(callid, EOK, IPC_GET_ARG1(answer),
     141            IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
    144142}
    145143
     
    369367                }
    370368        }
    371 
    372         refresh_answer(&answer, NULL);
     369       
     370        IPC_SET_ARG1(answer, 0);
    373371        SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);
    374         answer_call(callid, EOK, &answer, 2);
     372        async_answer_2(callid, EOK, IPC_GET_ARG1(answer),
     373            IPC_GET_ARG2(answer));
    375374        fibril_mutex_unlock(&socket->lock);
     375       
    376376out:
    377377        if (addr != NULL)
     
    486486
    487487        log_msg(LVL_DEBUG, "read_data_length <- %zu", length);
     488        IPC_SET_ARG2(answer, 0);
    488489        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    489490        SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr));
    490         answer_call(callid, EOK, &answer, 3);
    491 
     491        async_answer_3(callid, EOK, IPC_GET_ARG1(answer),
     492            IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
     493       
    492494        /* Push one fragment notification to client's queue */
    493495        udp_sock_notify_data(sock_core);
Note: See TracChangeset for help on using the changeset viewer.