Changeset 89ac5513 in mainline for uspace/srv/net/udp


Ignore:
Timestamp:
2013-06-23T19:54:53Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ddb1922
Parents:
3abf0760 (diff), 96cbd18 (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/net/udp
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/udp/assoc.c

    r3abf0760 r89ac5513  
    8282        if (lsock != NULL)
    8383                assoc->ident.local = *lsock;
     84       
    8485        if (fsock != NULL)
    8586                assoc->ident.foreign = *fsock;
     
    251252                sp.foreign = *fsock;
    252253
    253         if (sp.foreign.addr.ipv4 == 0 || sp.foreign.port == 0)
     254        if ((inet_addr_is_any(&sp.foreign.addr)) ||
     255            (sp.foreign.port == UDP_PORT_ANY))
    254256                return EINVAL;
    255257
     
    279281
    280282        fibril_mutex_lock(&assoc->lock);
    281         while (list_empty(&assoc->rcv_queue)) {
     283        while (list_empty(&assoc->rcv_queue) && !assoc->reset) {
    282284                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - waiting");
    283285                fibril_condvar_wait(&assoc->rcv_queue_cv, &assoc->lock);
     286        }
     287
     288        if (assoc->reset) {
     289                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset");
     290                fibril_mutex_unlock(&assoc->lock);
     291                return ECONNABORTED;
    284292        }
    285293
     
    323331}
    324332
     333/** Reset association.
     334 *
     335 * This causes any pendingreceive operations to return immediately with
     336 * UDP_ERESET.
     337 */
     338void udp_assoc_reset(udp_assoc_t *assoc)
     339{
     340        fibril_mutex_lock(&assoc->lock);
     341        assoc->reset = true;
     342        fibril_condvar_broadcast(&assoc->rcv_queue_cv);
     343        fibril_mutex_unlock(&assoc->lock);
     344}
     345
    325346static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp,
    326347    udp_msg_t *msg)
     
    351372static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt)
    352373{
    353         log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_socket_match(sock=(%x,%u), pat=(%x,%u))",
    354             sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port);
    355 
    356         if (patt->addr.ipv4 != UDP_IPV4_ANY &&
    357             patt->addr.ipv4 != sock->addr.ipv4)
     374        if ((!inet_addr_is_any(&patt->addr)) &&
     375            (!inet_addr_compare(&patt->addr, &sock->addr)))
    358376                return false;
    359 
    360         if (patt->port != UDP_PORT_ANY &&
    361             patt->port != sock->port)
     377       
     378        if ((patt->port != UDP_PORT_ANY) &&
     379            (patt->port != sock->port))
    362380                return false;
    363 
     381       
    364382        log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match");
    365 
     383       
    366384        return true;
    367385}
     
    395413{
    396414        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp);
    397 
     415       
    398416        fibril_mutex_lock(&assoc_list_lock);
    399 
     417       
    400418        list_foreach(assoc_list, link) {
    401419                udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link);
    402420                udp_sockpair_t *asp = &assoc->ident;
    403                 log_msg(LOG_DEFAULT, LVL_DEBUG, "compare with assoc (f:(%x,%u), l:(%x,%u))",
    404                     asp->foreign.addr.ipv4, asp->foreign.port,
    405                     asp->local.addr.ipv4, asp->local.port);
    406 
     421               
    407422                /* Skip unbound associations */
    408423                if (asp->local.port == UDP_PORT_ANY)
    409424                        continue;
    410 
     425               
    411426                if (udp_sockpair_match(sp, asp)) {
    412427                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc);
     
    416431                }
    417432        }
    418 
     433       
    419434        fibril_mutex_unlock(&assoc_list_lock);
    420435        return NULL;
  • uspace/srv/net/udp/assoc.h

    r3abf0760 r89ac5513  
    5151extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *);
    5252extern void udp_assoc_received(udp_sockpair_t *, udp_msg_t *);
    53 
     53extern void udp_assoc_reset(udp_assoc_t *);
    5454
    5555#endif
  • uspace/srv/net/udp/pdu.c

    r3abf0760 r89ac5513  
    8686static void udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr)
    8787{
    88         phdr->src_addr = host2uint32_t_be(pdu->src.ipv4);
    89         phdr->dest_addr = host2uint32_t_be(pdu->dest.ipv4);
     88        // FIXME: Check for correctness
     89       
     90        uint32_t src;
     91        inet_addr_pack(&pdu->src, &src);
     92       
     93        uint32_t dest;
     94        inet_addr_pack(&pdu->dest, &dest);
     95       
     96        phdr->src_addr = host2uint32_t_be(src);
     97        phdr->dest_addr = host2uint32_t_be(dest);
    9098        phdr->zero = 0;
    9199        phdr->protocol = IP_PROTO_UDP;
  • uspace/srv/net/udp/sock.c

    r3abf0760 r89ac5513  
    199199        }
    200200
    201         socket = (udp_sockdata_t *)sock_core->specific_data;
    202 
    203         fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
     201        socket = (udp_sockdata_t *) sock_core->specific_data;
     202       
     203        inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
     204            &fsock.addr);
    204205        fsock.port = sock_core->port;
    205206        urc = udp_uc_set_local(socket->assoc, &fsock);
     
    269270                }
    270271               
    271                 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
     272                inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
     273                    &fsock.addr);
    272274                fsock.port = uint16_t_be2host(addr->sin_port);
    273275                fsock_ptr = &fsock;
     
    314316        fibril_mutex_lock(&socket->lock);
    315317       
    316         if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {
     318        if (inet_addr_is_any(&socket->assoc->ident.local.addr)) {
    317319                /* Determine local IP address */
    318                 inet_addr_t loc_addr, rem_addr;
    319                
    320                 rem_addr.ipv4 = fsock_ptr ? fsock.addr.ipv4 :
    321                     socket->assoc->ident.foreign.addr.ipv4;
     320                inet_addr_t loc_addr;
     321                inet_addr_t rem_addr;
     322               
     323                rem_addr = fsock_ptr ? fsock.addr :
     324                    socket->assoc->ident.foreign.addr;
    322325               
    323326                int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
     
    330333                }
    331334               
    332                 socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4;
    333                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Local IP address is %x",
    334                     socket->assoc->ident.local.addr.ipv4);
     335                socket->assoc->ident.local.addr = loc_addr;
    335336        }
    336337       
     
    410411        size_t data_len;
    411412        udp_error_t urc;
    412         udp_sock_t rsock;
     413        udp_sock_t *rsock;
    413414        struct sockaddr_in addr;
    414415        int rc;
     
    446447        log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer");
    447448
    448         rsock = socket->recv_fsock;
     449        rsock = &socket->recv_fsock;
    449450        data_len = socket->recv_buffer_used;
    450451        urc = socket->recv_error;
     
    476477
    477478        if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) {
    478                 /* Fill addr */
     479                /* Fill address */
     480                uint32_t rsock_addr;
     481                int rc = inet_addr_pack(&rsock->addr, &rsock_addr);
     482                if (rc != EOK) {
     483                        fibril_mutex_unlock(&socket->recv_buffer_lock);
     484                        fibril_mutex_unlock(&socket->lock);
     485                        async_answer_0(callid, rc);
     486                        return;
     487                }
     488               
    479489                addr.sin_family = AF_INET;
    480                 addr.sin_addr.s_addr = host2uint32_t_be(rsock.addr.ipv4);
    481                 addr.sin_port = host2uint16_t_be(rsock.port);
     490                addr.sin_addr.s_addr = host2uint32_t_be(rsock_addr);
     491                addr.sin_port = host2uint16_t_be(rsock->port);
    482492
    483493                log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
     
    537547        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()");
    538548        int socket_id = SOCKET_GET_SOCKET_ID(call);
    539        
     549
     550        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - find core");
    540551        socket_core_t *sock_core =
    541552            socket_cores_find(&client->sockets, socket_id);
    542553        if (sock_core == NULL) {
     554        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - core not found");
    543555                async_answer_0(callid, ENOTSOCK);
    544556                return;
    545557        }
    546        
     558
     559        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - spec data");
    547560        udp_sockdata_t *socket =
    548561            (udp_sockdata_t *) sock_core->specific_data;
     562        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket");
    549563        fibril_mutex_lock(&socket->lock);
    550        
     564
     565        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket buffer");
     566        fibril_mutex_lock(&socket->recv_buffer_lock);
     567        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - set socket->sock_core = NULL");
     568        socket->sock_core = NULL;
     569        fibril_mutex_unlock(&socket->recv_buffer_lock);
     570
     571        udp_uc_reset(socket->assoc);
     572
    551573        int rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock,
    552574            udp_free_sock_data);
    553575        if (rc != EOK) {
     576                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - socket_destroy failed");
    554577                fibril_mutex_unlock(&socket->lock);
    555578                async_answer_0(callid, rc);
    556579                return;
    557580        }
    558        
     581
     582        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - broadcast recv_buffer_cv");
     583        fibril_condvar_broadcast(&socket->recv_buffer_cv);
     584
    559585        fibril_mutex_unlock(&socket->lock);
    560586        async_answer_0(callid, EOK);
     
    582608        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril()");
    583609
     610        fibril_mutex_lock(&sock->recv_buffer_lock);
     611
    584612        while (true) {
    585613                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()");
    586                 fibril_mutex_lock(&sock->recv_buffer_lock);
    587                 while (sock->recv_buffer_used != 0) {
     614                while (sock->recv_buffer_used != 0 && sock->sock_core != NULL) {
    588615                        fibril_condvar_wait(&sock->recv_buffer_cv,
    589616                            &sock->recv_buffer_lock);
    590617                }
    591                
     618
     619                fibril_mutex_unlock(&sock->recv_buffer_lock);
     620
    592621                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()");
    593622                urc = udp_uc_receive(sock->assoc, sock->recv_buffer,
    594623                    UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock);
     624                fibril_mutex_lock(&sock->recv_buffer_lock);
    595625                sock->recv_error = urc;
    596                
    597                 udp_sock_notify_data(sock->sock_core);
    598                
     626
     627                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] udp_uc_receive -> %d", urc);
     628
     629                if (sock->sock_core != NULL)
     630                        udp_sock_notify_data(sock->sock_core);
     631
    599632                if (urc != UDP_EOK) {
     633                        log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break");
    600634                        fibril_condvar_broadcast(&sock->recv_buffer_cv);
    601                         fibril_mutex_unlock(&sock->recv_buffer_lock);
    602                         break;
    603                 }
    604                
     635                        break;
     636                }
     637
    605638                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv");
    606                
     639
    607640                sock->recv_buffer_used = rcvd;
    608                 fibril_mutex_unlock(&sock->recv_buffer_lock);
    609641                fibril_condvar_broadcast(&sock->recv_buffer_cv);
    610642        }
    611643
     644        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() exited loop");
     645        fibril_mutex_unlock(&sock->recv_buffer_lock);
    612646        udp_uc_destroy(sock->assoc);
     647
     648        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() terminated");
    613649
    614650        return 0;
  • uspace/srv/net/udp/ucall.c

    r3abf0760 r89ac5513  
    113113        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: udp_uc_receive()", assoc->name);
    114114        rc = udp_assoc_recv(assoc, &msg, fsock);
     115        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv -> %d", rc);
    115116        switch (rc) {
     117        case EOK:
     118                break;
     119        case ECONNABORTED:
     120                return UDP_ERESET;
     121        default:
     122                assert(false);
    116123        }
    117124
     
    133140{
    134141        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_uc_destroy()");
     142        udp_assoc_reset(assoc);
    135143        udp_assoc_remove(assoc);
    136144        udp_assoc_delete(assoc);
     145}
     146
     147void udp_uc_reset(udp_assoc_t *assoc)
     148{
     149        udp_assoc_reset(assoc);
    137150}
    138151
  • uspace/srv/net/udp/ucall.h

    r3abf0760 r89ac5513  
    4949extern void udp_uc_status(udp_assoc_t *, udp_assoc_status_t *);
    5050extern void udp_uc_destroy(udp_assoc_t *);
     51extern void udp_uc_reset(udp_assoc_t *);
    5152
    5253#endif
  • uspace/srv/net/udp/udp_inet.c

    r3abf0760 r89ac5513  
    6767        pdu->data_size = dgram->size;
    6868
    69         pdu->src.ipv4 = dgram->src.ipv4;
    70         pdu->dest.ipv4 = dgram->dest.ipv4;
    71         log_msg(LOG_DEFAULT, LVL_DEBUG, "src: 0x%08x, dest: 0x%08x",
    72             pdu->src.ipv4, pdu->dest.ipv4);
     69        pdu->src = dgram->src;
     70        pdu->dest = dgram->dest;
    7371
    7472        udp_received_pdu(pdu);
     
    8684        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_transmit_pdu()");
    8785
    88         dgram.src.ipv4 = pdu->src.ipv4;
    89         dgram.dest.ipv4 = pdu->dest.ipv4;
     86        dgram.src = pdu->src;
     87        dgram.dest = pdu->dest;
    9088        dgram.tos = 0;
    9189        dgram.data = pdu->data;
  • uspace/srv/net/udp/udp_type.h

    r3abf0760 r89ac5513  
    4040#include <socket_core.h>
    4141#include <sys/types.h>
     42#include <inet/addr.h>
    4243
    4344#define UDP_FRAGMENT_SIZE 4096
     
    5152        UDP_EUNSPEC,
    5253        /* No route to destination */
    53         UDP_ENOROUTE
     54        UDP_ENOROUTE,
     55        /** Association reset by user */
     56        UDP_ERESET
    5457} udp_error_t;
    5558
    5659typedef enum {
    57         XF_DUMMY        = 0x1
     60        XF_DUMMY = 0x1
    5861} xflags_t;
    59 
    60 typedef struct {
    61         uint32_t ipv4;
    62 } netaddr_t;
    63 
    64 enum netaddr {
    65         UDP_IPV4_ANY = 0
    66 };
    6762
    6863enum udp_port {
     
    7166
    7267typedef struct {
    73         netaddr_t addr;
     68        inet_addr_t addr;
    7469        uint16_t port;
    7570} udp_sock_t;
     
    9186typedef struct {
    9287        /** Source address */
    93         netaddr_t src;
     88        inet_addr_t src;
    9489        /** Destination address */
    95         netaddr_t dest;
    96 
     90        inet_addr_t dest;
     91       
    9792        /** Encoded PDU data including header */
    9893        void *data;
     
    118113        /** Association identification (local and foreign socket) */
    119114        udp_sockpair_t ident;
     115
     116        /** True if association was reset by user */
     117        bool reset;
    120118
    121119        /** True if association was deleted by user */
Note: See TracChangeset for help on using the changeset viewer.