Changeset 948911d in mainline for uspace/srv/net/net/net.c


Ignore:
Timestamp:
2012-01-24T02:27:43Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
230385c
Parents:
8afeb04 (diff), 2df6f6fe (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/net/net.c

    r8afeb04 r948911d  
    22 * Copyright (c) 2009 Lukas Mejdrech
    33 * Copyright (c) 2011 Radim Vansa
     4 * Copyright (c) 2011 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    4142#include <stdio.h>
    4243#include <str.h>
    43 #include <devman.h>
    4444#include <str_error.h>
    4545#include <ns.h>
     
    5656#include <adt/measured_strings.h>
    5757#include <adt/module_map.h>
     58#include <fibril_synch.h>
     59#include <loc.h>
     60#include <nic.h>
    5861#include <nil_remote.h>
    5962#include <net_interface.h>
     
    7376GENERIC_CHAR_MAP_IMPLEMENT(measured_strings, measured_string_t);
    7477DEVICE_MAP_IMPLEMENT(netifs, netif_t);
     78LIST_INITIALIZE(netif_list);
     79
     80static FIBRIL_MUTEX_INITIALIZE(discovery_lock);
    7581
    7682/** Add the configured setting to the configuration map.
     
    287293 *
    288294 */
    289 static int init_device(netif_t *netif, devman_handle_t handle)
     295static int init_device(netif_t *netif, service_id_t sid)
    290296{
    291297        printf("%s: Initializing device '%s'\n", NAME, netif->name);
    292298       
    293         netif->handle = handle;
    294         netif->sess = devman_device_connect(EXCHANGE_SERIALIZE, netif->handle,
     299        netif->sid = sid;
     300        netif->sess = loc_service_connect(EXCHANGE_SERIALIZE, netif->sid,
    295301            IPC_FLAG_BLOCKING);
    296302        if (netif->sess == NULL) {
     
    337343                    strtol((const char *) setting->value, NULL, 10) : 0;
    338344                rc = nil_device_req(netif->nil->sess, netif->id,
    339                     netif->handle, mtu);
     345                    netif->sid, mtu);
    340346                if (rc != EOK) {
    341347                        printf("%s: Unable to start network interface layer\n",
     
    359365                break;
    360366        default:
     367                printf("%s: Unknown service\n", NAME);
    361368                return ENOENT;
    362369        }
    363370       
    364371        printf("%s: Activating device '%s'\n", NAME, netif->name);
     372        list_append(&netif->netif_list, &netif_list);
    365373        return nic_set_state(netif->sess, NIC_STATE_ACTIVE);
    366374}
    367375
    368 static int net_port_ready(devman_handle_t handle)
    369 {
    370         char hwpath[MAX_PATH_LENGTH];
    371         int rc = devman_fun_get_path(handle, hwpath, MAX_PATH_LENGTH);
    372         if (rc != EOK)
     376static int net_nic_ready(service_id_t sid)
     377{
     378        int rc;
     379        char *hwpath;
     380       
     381        rc = loc_service_get_name(sid, &hwpath);
     382        if (rc != EOK) {
     383                printf("%s: Failed getting name of service '%u'\n",
     384                    NAME, (unsigned) sid);
    373385                return EINVAL;
     386        }
    374387       
    375388        int index = char_map_find(&net_globals.netif_hwpaths,
    376389            (uint8_t *) hwpath, 0);
    377         if (index == CHAR_MAP_NULL)
     390       
     391        if (index == CHAR_MAP_NULL) {
     392                printf("%s: Service '%s' not found in map.\n", NAME, hwpath);
     393                free(hwpath);
    378394                return ENOENT;
     395        }
     396       
     397        free(hwpath);
    379398       
    380399        netif_t *netif = netifs_get_index(&net_globals.netifs, index);
     
    382401                return ENOENT;
    383402       
    384         rc = init_device(netif, handle);
     403        rc = init_device(netif, sid);
    385404        if (rc != EOK)
    386405                return rc;
     
    391410       
    392411        netif->il->usage++;
    393        
    394         return EOK;
    395 }
    396 
    397 static int net_driver_ready_local(devman_handle_t handle)
    398 {
    399         devman_handle_t *funs;
    400         size_t count;
    401         int rc = devman_dev_get_functions(handle, &funs, &count);
    402         if (rc != EOK)
    403                 return rc;
    404        
    405         for (size_t i = 0; i < count; i++) {
    406                 rc = net_port_ready(funs[i]);
    407                 if (rc != EOK)
    408                         return rc;
    409         }
    410412       
    411413        return EOK;
     
    479481                net_free_devices(strings, count);
    480482                return rc;
    481         case NET_NET_DRIVER_READY:
    482                 rc = net_driver_ready_local(IPC_GET_ARG1(*call));
    483                 *answer_count = 0;
    484                 return rc;
    485483        default:
    486484                return ENOTSUP;
     
    528526                answer_call(callid, res, &answer, count);
    529527        }
     528}
     529
     530static int nic_check_new(void)
     531{
     532        category_id_t nic_cat;
     533        service_id_t *svcs;
     534        size_t count, i;
     535        bool already_known;
     536        int rc;
     537
     538        fibril_mutex_lock(&discovery_lock);
     539
     540        rc = loc_category_get_id(DEVICE_CATEGORY_NIC, &nic_cat, IPC_FLAG_BLOCKING);
     541        if (rc != EOK) {
     542                printf("%s: Failed resolving category '%s'.\n", NAME,
     543                    DEVICE_CATEGORY_NIC);
     544                return ENOENT;
     545        }
     546
     547        rc = loc_category_get_svcs(nic_cat, &svcs, &count);
     548        if (rc != EOK) {
     549                printf("%s: Failed getting list of NIC devices.\n", NAME);
     550                return EIO;
     551        }
     552
     553        for (i = 0; i < count; i++) {
     554                already_known = false;
     555
     556                list_foreach(netif_list, link) {
     557                        netif_t *netif = list_get_instance(link, netif_t, netif_list);
     558                        if (netif->sid == svcs[i]) {
     559                                already_known = true;
     560                                break;
     561                        }
     562                }
     563
     564                if (!already_known) {
     565                        rc = net_nic_ready(svcs[i]);
     566                        if (rc != EOK) {
     567                                printf("%s: Failed adding NIC device #%u.\n",
     568                                    NAME, (unsigned) svcs[i]);
     569                        }
     570                }
     571        }
     572
     573        free(svcs);
     574        fibril_mutex_unlock(&discovery_lock);
     575        return EOK;
     576}
     577
     578static void cat_change_cb(void)
     579{
     580        (void) nic_check_new();
     581}
     582
     583static int net_start_nic_discovery(void)
     584{
     585        int rc;
     586
     587        rc = loc_register_cat_change_cb(cat_change_cb);
     588        if (rc != EOK) {
     589                printf("%s: Failed registering callback for device discovery (%d).\n",
     590                    NAME, rc);
     591                return rc;
     592        }
     593
     594        return nic_check_new();
    530595}
    531596
     
    573638                                continue;
    574639                       
    575                         netif->handle = -1;
     640                        netif->sid = -1;
    576641                        netif->sess = NULL;
    577642                       
     
    697762        }
    698763       
     764        rc = net_start_nic_discovery();
     765        if (rc != EOK) {
     766                printf("%s: Error starting NIC discovery\n", NAME);
     767                pm_destroy();
     768                return rc;
     769        }
     770       
    699771        task_retval(0);
    700772        async_manager();
Note: See TracChangeset for help on using the changeset viewer.