Ignore:
File:
1 edited

Legend:

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

    r417a2ba1 rb8b1adb1  
    4343#include <stdlib.h>
    4444#include <str.h>
     45#include <net/socket_codes.h>
    4546#include "addrobj.h"
    4647#include "inetsrv.h"
     
    5455static uint16_t ip_ident = 0;
    5556
    56 static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, ip_ver_t);
    57 static inet_link_t *inet_link_get_by_id_locked(sysarg_t);
     57static int inet_link_open(service_id_t);
     58static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
    5859
    5960static iplink_ev_ops_t inet_iplink_ev_ops = {
     
    6162};
    6263
    63 static LIST_INITIALIZE(inet_links);
    64 static FIBRIL_MUTEX_INITIALIZE(inet_links_lock);
     64static LIST_INITIALIZE(inet_link_list);
     65static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
    6566
    6667static addr128_t link_local_node_ip =
     
    8081}
    8182
    82 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, ip_ver_t ver)
     83static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
    8384{
    8485        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
     
    8788        inet_packet_t packet;
    8889       
    89         switch (ver) {
    90         case ip_v4:
     90        switch (af) {
     91        case AF_INET:
    9192                rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
    9293                break;
    93         case ip_v6:
     94        case AF_INET6:
    9495                rc = inet_pdu_decode6(sdu->data, sdu->size, &packet);
    9596                break;
    9697        default:
    97                 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid IP version");
     98                log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");
    9899                return EINVAL;
    99100        }
     
    112113}
    113114
     115static 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
    114162static inet_link_t *inet_link_new(void)
    115163{
     
    135183}
    136184
    137 int inet_link_open(service_id_t sid)
     185static int inet_link_open(service_id_t sid)
    138186{
    139187        inet_link_t *ilink;
     
    183231
    184232        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name);
    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);
     233        list_append(&ilink->link_list, &inet_link_list);
    198234
    199235        inet_addrobj_t *addr = NULL;
     
    263299        }
    264300       
    265         log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name);
    266301        return EOK;
    267302       
     
    272307        inet_link_delete(ilink);
    273308        return rc;
     309}
     310
     311static void inet_link_cat_change_cb(void)
     312{
     313        (void) inet_link_check_new();
     314}
     315
     316int 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();
    274328}
    275329
     
    293347{
    294348        addr32_t src_v4;
    295         ip_ver_t src_ver = inet_addr_get(&dgram->src, &src_v4, NULL);
    296         if (src_ver != ip_v4)
     349        uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL);
     350        if (src_af != AF_INET)
    297351                return EINVAL;
    298352       
    299353        addr32_t dest_v4;
    300         ip_ver_t dest_ver = inet_addr_get(&dgram->dest, &dest_v4, NULL);
    301         if (dest_ver != ip_v4)
     354        uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL);
     355        if (dest_af != AF_INET)
    302356                return EINVAL;
    303357       
     
    368422{
    369423        addr128_t src_v6;
    370         ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6);
    371         if (src_ver != ip_v6)
     424        uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6);
     425        if (src_af != AF_INET6)
    372426                return EINVAL;
    373427       
    374428        addr128_t dest_v6;
    375         ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6);
    376         if (dest_ver != ip_v6)
     429        uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6);
     430        if (dest_af != AF_INET6)
    377431                return EINVAL;
    378432       
     
    424478}
    425479
    426 static 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)
     480inet_link_t *inet_link_get_by_id(sysarg_t link_id)
     481{
     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);
    432487                        return ilink;
    433         }
    434 
     488                }
     489        }
     490
     491        fibril_mutex_unlock(&inet_discovery_lock);
    435492        return NULL;
    436 }
    437 
    438 inet_link_t *inet_link_get_by_id(sysarg_t link_id)
    439 {
    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;
    447493}
    448494
     
    453499        size_t count, i;
    454500
    455         fibril_mutex_lock(&inet_links_lock);
    456         count = list_count(&inet_links);
     501        fibril_mutex_lock(&inet_discovery_lock);
     502        count = list_count(&inet_link_list);
    457503
    458504        id_list = calloc(count, sizeof(sysarg_t));
    459505        if (id_list == NULL) {
    460                 fibril_mutex_unlock(&inet_links_lock);
     506                fibril_mutex_unlock(&inet_discovery_lock);
    461507                return ENOMEM;
    462508        }
    463509
    464510        i = 0;
    465         list_foreach(inet_links, link_list, inet_link_t, ilink) {
     511        list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
    466512                id_list[i++] = ilink->svc_id;
    467513                log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list");
    468514        }
    469515
    470         fibril_mutex_unlock(&inet_links_lock);
     516        fibril_mutex_unlock(&inet_discovery_lock);
    471517
    472518        log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count);
Note: See TracChangeset for help on using the changeset viewer.