Ignore:
File:
1 edited

Legend:

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

    r417a2ba1 r1f97352  
    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, ilink_link) {
     143                        inet_link_t *ilink = list_get_instance(ilink_link,
     144                            inet_link_t, link_list);
     145                        if (ilink->svc_id == svcs[i]) {
     146                                already_known = true;
     147                                break;
     148                        }
     149                }
     150
     151                if (!already_known) {
     152                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Found IP link '%lu'",
     153                            (unsigned long) svcs[i]);
     154                        rc = inet_link_open(svcs[i]);
     155                        if (rc != EOK)
     156                                log_msg(LOG_DEFAULT, LVL_ERROR, "Could not open IP link.");
     157                }
     158        }
     159
     160        fibril_mutex_unlock(&inet_discovery_lock);
     161        return EOK;
     162}
     163
    114164static inet_link_t *inet_link_new(void)
    115165{
     
    135185}
    136186
    137 int inet_link_open(service_id_t sid)
     187static int inet_link_open(service_id_t sid)
    138188{
    139189        inet_link_t *ilink;
     
    183233
    184234        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);
     235        list_append(&ilink->link_list, &inet_link_list);
    198236
    199237        inet_addrobj_t *addr = NULL;
    200238       
    201         /* XXX FIXME Cannot rely on loopback being the first IP link service!! */
    202239        if (first_link) {
    203240                addr = inet_addrobj_new();
     
    205242                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
    206243                first_link = false;
     244        } else {
     245                /*
     246                 * FIXME
     247                 * Setting static IPv4 address for testing purposes:
     248                 * 10.0.2.15/24
     249                 */
     250                addr = inet_addrobj_new();
     251               
     252                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
    207253        }
    208254       
     
    263309        }
    264310       
    265         log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name);
    266311        return EOK;
    267312       
     
    272317        inet_link_delete(ilink);
    273318        return rc;
     319}
     320
     321static void inet_link_cat_change_cb(void)
     322{
     323        (void) inet_link_check_new();
     324}
     325
     326int inet_link_discovery_start(void)
     327{
     328        int rc;
     329
     330        rc = loc_register_cat_change_cb(inet_link_cat_change_cb);
     331        if (rc != EOK) {
     332                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering callback for IP link "
     333                    "discovery (%d).", rc);
     334                return rc;
     335        }
     336
     337        return inet_link_check_new();
    274338}
    275339
     
    293357{
    294358        addr32_t src_v4;
    295         ip_ver_t src_ver = inet_addr_get(&dgram->src, &src_v4, NULL);
    296         if (src_ver != ip_v4)
     359        uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL);
     360        if (src_af != AF_INET)
    297361                return EINVAL;
    298362       
    299363        addr32_t dest_v4;
    300         ip_ver_t dest_ver = inet_addr_get(&dgram->dest, &dest_v4, NULL);
    301         if (dest_ver != ip_v4)
     364        uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL);
     365        if (dest_af != AF_INET)
    302366                return EINVAL;
    303367       
     
    368432{
    369433        addr128_t src_v6;
    370         ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6);
    371         if (src_ver != ip_v6)
     434        uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6);
     435        if (src_af != AF_INET6)
    372436                return EINVAL;
    373437       
    374438        addr128_t dest_v6;
    375         ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6);
    376         if (dest_ver != ip_v6)
     439        uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6);
     440        if (dest_af != AF_INET6)
    377441                return EINVAL;
    378442       
     
    424488}
    425489
    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)
     490inet_link_t *inet_link_get_by_id(sysarg_t link_id)
     491{
     492        fibril_mutex_lock(&inet_discovery_lock);
     493
     494        list_foreach(inet_link_list, elem) {
     495                inet_link_t *ilink = list_get_instance(elem, inet_link_t,
     496                    link_list);
     497
     498                if (ilink->svc_id == link_id) {
     499                        fibril_mutex_unlock(&inet_discovery_lock);
    432500                        return ilink;
    433         }
    434 
     501                }
     502        }
     503
     504        fibril_mutex_unlock(&inet_discovery_lock);
    435505        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;
    447 }
    448 
    449 /** Get IDs of all links. */
    450 int inet_link_get_id_list(sysarg_t **rid_list, size_t *rcount)
    451 {
    452         sysarg_t *id_list;
    453         size_t count, i;
    454 
    455         fibril_mutex_lock(&inet_links_lock);
    456         count = list_count(&inet_links);
    457 
    458         id_list = calloc(count, sizeof(sysarg_t));
    459         if (id_list == NULL) {
    460                 fibril_mutex_unlock(&inet_links_lock);
    461                 return ENOMEM;
    462         }
    463 
    464         i = 0;
    465         list_foreach(inet_links, link_list, inet_link_t, ilink) {
    466                 id_list[i++] = ilink->svc_id;
    467                 log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list");
    468         }
    469 
    470         fibril_mutex_unlock(&inet_links_lock);
    471 
    472         log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count);
    473         *rid_list = id_list;
    474         *rcount = count;
    475 
    476         return EOK;
    477506}
    478507
Note: See TracChangeset for help on using the changeset viewer.