Changeset 4c14b88 in mainline for uspace/srv/net/inetsrv/inet_link.c


Ignore:
Timestamp:
2013-12-31T07:57:14Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1b973dc
Parents:
6297465 (diff), 208b5f5 (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:

mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/inet_link.c

    r6297465 r4c14b88  
    4343#include <stdlib.h>
    4444#include <str.h>
    45 #include <net/socket_codes.h>
    4645#include "addrobj.h"
    4746#include "inetsrv.h"
     
    5554static uint16_t ip_ident = 0;
    5655
    57 static int inet_link_open(service_id_t);
    58 static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
     56static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, ip_ver_t);
     57static inet_link_t *inet_link_get_by_id_locked(sysarg_t);
    5958
    6059static iplink_ev_ops_t inet_iplink_ev_ops = {
     
    6261};
    6362
    64 static LIST_INITIALIZE(inet_link_list);
    65 static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
     63static LIST_INITIALIZE(inet_links);
     64static FIBRIL_MUTEX_INITIALIZE(inet_links_lock);
    6665
    6766static addr128_t link_local_node_ip =
     
    8180}
    8281
    83 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
     82static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, ip_ver_t ver)
    8483{
    8584        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
     
    8887        inet_packet_t packet;
    8988       
    90         switch (af) {
    91         case AF_INET:
     89        switch (ver) {
     90        case ip_v4:
    9291                rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
    9392                break;
    94         case AF_INET6:
     93        case ip_v6:
    9594                rc = inet_pdu_decode6(sdu->data, sdu->size, &packet);
    9695                break;
    9796        default:
    98                 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");
     97                log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid IP version");
    9998                return EINVAL;
    10099        }
     
    113112}
    114113
    115 static int inet_link_check_new(void)
    116 {
    117         bool already_known;
    118         category_id_t iplink_cat;
    119         service_id_t *svcs;
    120         size_t count, i;
    121         int rc;
    122 
    123         fibril_mutex_lock(&inet_discovery_lock);
    124 
    125         rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    126         if (rc != EOK) {
    127                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'iplink'.");
    128                 fibril_mutex_unlock(&inet_discovery_lock);
    129                 return ENOENT;
    130         }
    131 
    132         rc = loc_category_get_svcs(iplink_cat, &svcs, &count);
    133         if (rc != EOK) {
    134                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting list of IP links.");
    135                 fibril_mutex_unlock(&inet_discovery_lock);
    136                 return EIO;
    137         }
    138 
    139         for (i = 0; i < count; i++) {
    140                 already_known = false;
    141 
    142                 list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
    143                         if (ilink->svc_id == svcs[i]) {
    144                                 already_known = true;
    145                                 break;
    146                         }
    147                 }
    148 
    149                 if (!already_known) {
    150                         log_msg(LOG_DEFAULT, LVL_DEBUG, "Found IP link '%lu'",
    151                             (unsigned long) svcs[i]);
    152                         rc = inet_link_open(svcs[i]);
    153                         if (rc != EOK)
    154                                 log_msg(LOG_DEFAULT, LVL_ERROR, "Could not open IP link.");
    155                 }
    156         }
    157 
    158         fibril_mutex_unlock(&inet_discovery_lock);
    159         return EOK;
    160 }
    161 
    162114static inet_link_t *inet_link_new(void)
    163115{
     
    183135}
    184136
    185 static int inet_link_open(service_id_t sid)
     137int inet_link_open(service_id_t sid)
    186138{
    187139        inet_link_t *ilink;
     
    231183
    232184        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name);
    233         list_append(&ilink->link_list, &inet_link_list);
     185
     186        fibril_mutex_lock(&inet_links_lock);
     187
     188        if (inet_link_get_by_id_locked(sid) != NULL) {
     189                fibril_mutex_unlock(&inet_links_lock);
     190                log_msg(LOG_DEFAULT, LVL_DEBUG, "Link %zu already open",
     191                    sid);
     192                rc = EEXIST;
     193                goto error;
     194        }
     195
     196        list_append(&ilink->link_list, &inet_links);
     197        fibril_mutex_unlock(&inet_links_lock);
    234198
    235199        inet_addrobj_t *addr = NULL;
     
    299263        }
    300264       
     265        log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name);
    301266        return EOK;
    302267       
     
    307272        inet_link_delete(ilink);
    308273        return rc;
    309 }
    310 
    311 static void inet_link_cat_change_cb(void)
    312 {
    313         (void) inet_link_check_new();
    314 }
    315 
    316 int inet_link_discovery_start(void)
    317 {
    318         int rc;
    319 
    320         rc = loc_register_cat_change_cb(inet_link_cat_change_cb);
    321         if (rc != EOK) {
    322                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering callback for IP link "
    323                     "discovery (%d).", rc);
    324                 return rc;
    325         }
    326 
    327         return inet_link_check_new();
    328274}
    329275
     
    347293{
    348294        addr32_t src_v4;
    349         uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL);
    350         if (src_af != AF_INET)
     295        ip_ver_t src_ver = inet_addr_get(&dgram->src, &src_v4, NULL);
     296        if (src_ver != ip_v4)
    351297                return EINVAL;
    352298       
    353299        addr32_t dest_v4;
    354         uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL);
    355         if (dest_af != AF_INET)
     300        ip_ver_t dest_ver = inet_addr_get(&dgram->dest, &dest_v4, NULL);
     301        if (dest_ver != ip_v4)
    356302                return EINVAL;
    357303       
     
    422368{
    423369        addr128_t src_v6;
    424         uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6);
    425         if (src_af != AF_INET6)
     370        ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6);
     371        if (src_ver != ip_v6)
    426372                return EINVAL;
    427373       
    428374        addr128_t dest_v6;
    429         uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6);
    430         if (dest_af != AF_INET6)
     375        ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6);
     376        if (dest_ver != ip_v6)
    431377                return EINVAL;
    432378       
     
    478424}
    479425
     426static inet_link_t *inet_link_get_by_id_locked(sysarg_t link_id)
     427{
     428        assert(fibril_mutex_is_locked(&inet_links_lock));
     429
     430        list_foreach(inet_links, link_list, inet_link_t, ilink) {
     431                if (ilink->svc_id == link_id)
     432                        return ilink;
     433        }
     434
     435        return NULL;
     436}
     437
    480438inet_link_t *inet_link_get_by_id(sysarg_t link_id)
    481439{
    482         fibril_mutex_lock(&inet_discovery_lock);
    483 
    484         list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
    485                 if (ilink->svc_id == link_id) {
    486                         fibril_mutex_unlock(&inet_discovery_lock);
    487                         return ilink;
    488                 }
    489         }
    490 
    491         fibril_mutex_unlock(&inet_discovery_lock);
    492         return NULL;
     440        inet_link_t *ilink;
     441
     442        fibril_mutex_lock(&inet_links_lock);
     443        ilink = inet_link_get_by_id_locked(link_id);
     444        fibril_mutex_unlock(&inet_links_lock);
     445
     446        return ilink;
    493447}
    494448
     
    499453        size_t count, i;
    500454
    501         fibril_mutex_lock(&inet_discovery_lock);
    502         count = list_count(&inet_link_list);
     455        fibril_mutex_lock(&inet_links_lock);
     456        count = list_count(&inet_links);
    503457
    504458        id_list = calloc(count, sizeof(sysarg_t));
    505459        if (id_list == NULL) {
    506                 fibril_mutex_unlock(&inet_discovery_lock);
     460                fibril_mutex_unlock(&inet_links_lock);
    507461                return ENOMEM;
    508462        }
    509463
    510464        i = 0;
    511         list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
     465        list_foreach(inet_links, link_list, inet_link_t, ilink) {
    512466                id_list[i++] = ilink->svc_id;
    513467                log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list");
    514468        }
    515469
    516         fibril_mutex_unlock(&inet_discovery_lock);
     470        fibril_mutex_unlock(&inet_links_lock);
    517471
    518472        log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count);
Note: See TracChangeset for help on using the changeset viewer.