Ignore:
File:
1 edited

Legend:

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

    ra1a101d rc0f3460  
    3636
    3737#include <adt/list.h>
    38 #include <bool.h>
     38#include <stdbool.h>
    3939#include <fibril_synch.h>
    4040#include <io/log.h>
     
    8282        if (lsock != NULL)
    8383                assoc->ident.local = *lsock;
     84       
    8485        if (fsock != NULL)
    8586                assoc->ident.foreign = *fsock;
     
    200201/** Set local socket in association.
    201202 *
    202  * @param assoc         Association
    203  * @param fsock         Foreign socket (deeply copied)
     203 * @param assoc Association
     204 * @param lsock Local socket (deeply copied)
     205 *
    204206 */
    205207void udp_assoc_set_local(udp_assoc_t *assoc, udp_sock_t *lsock)
     
    208210        fibril_mutex_lock(&assoc->lock);
    209211        assoc->ident.local = *lsock;
     212        fibril_mutex_unlock(&assoc->lock);
     213}
     214
     215/** Set local port in association.
     216 *
     217 * @param assoc Association
     218 * @param lport Local port
     219 *
     220 */
     221void udp_assoc_set_local_port(udp_assoc_t *assoc, uint16_t lport)
     222{
     223        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %" PRIu16 ")", assoc, lport);
     224        fibril_mutex_lock(&assoc->lock);
     225        assoc->ident.local.port = lport;
    210226        fibril_mutex_unlock(&assoc->lock);
    211227}
     
    236252                sp.foreign = *fsock;
    237253
    238         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))
    239256                return EINVAL;
    240257
     
    264281
    265282        fibril_mutex_lock(&assoc->lock);
    266         while (list_empty(&assoc->rcv_queue)) {
     283        while (list_empty(&assoc->rcv_queue) && !assoc->reset) {
    267284                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - waiting");
    268285                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;
    269292        }
    270293
     
    308331}
    309332
     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
    310346static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp,
    311347    udp_msg_t *msg)
     
    336372static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt)
    337373{
    338         log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_socket_match(sock=(%x,%u), pat=(%x,%u))",
    339             sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port);
    340 
    341         if (patt->addr.ipv4 != UDP_IPV4_ANY &&
    342             patt->addr.ipv4 != sock->addr.ipv4)
     374        log_msg(LOG_DEFAULT, LVL_DEBUG,
     375            "udp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port);
     376       
     377        if ((!inet_addr_is_any(&patt->addr)) &&
     378            (!inet_addr_compare(&patt->addr, &sock->addr)))
    343379                return false;
    344 
    345         if (patt->port != UDP_PORT_ANY &&
    346             patt->port != sock->port)
     380       
     381        if ((patt->port != UDP_PORT_ANY) &&
     382            (patt->port != sock->port))
    347383                return false;
    348 
     384       
    349385        log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match");
    350 
     386       
    351387        return true;
    352388}
     
    380416{
    381417        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp);
    382 
     418       
    383419        fibril_mutex_lock(&assoc_list_lock);
    384 
     420       
    385421        list_foreach(assoc_list, link) {
    386422                udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link);
    387423                udp_sockpair_t *asp = &assoc->ident;
    388                 log_msg(LOG_DEFAULT, LVL_DEBUG, "compare with assoc (f:(%x,%u), l:(%x,%u))",
    389                     asp->foreign.addr.ipv4, asp->foreign.port,
    390                     asp->local.addr.ipv4, asp->local.port);
    391 
     424               
    392425                /* Skip unbound associations */
    393426                if (asp->local.port == UDP_PORT_ANY)
    394427                        continue;
    395 
     428               
    396429                if (udp_sockpair_match(sp, asp)) {
    397430                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc);
     
    401434                }
    402435        }
    403 
     436       
    404437        fibril_mutex_unlock(&assoc_list_lock);
    405438        return NULL;
    406439}
    407440
    408 
    409441/**
    410442 * @}
Note: See TracChangeset for help on using the changeset viewer.