Changeset 948911d in mainline for uspace/srv/net/net/net.c
- Timestamp:
- 2012-01-24T02:27:43Z (12 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/net/net.c
r8afeb04 r948911d 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 3 * Copyright (c) 2011 Radim Vansa 4 * Copyright (c) 2011 Jiri Svoboda 4 5 * All rights reserved. 5 6 * … … 41 42 #include <stdio.h> 42 43 #include <str.h> 43 #include <devman.h>44 44 #include <str_error.h> 45 45 #include <ns.h> … … 56 56 #include <adt/measured_strings.h> 57 57 #include <adt/module_map.h> 58 #include <fibril_synch.h> 59 #include <loc.h> 60 #include <nic.h> 58 61 #include <nil_remote.h> 59 62 #include <net_interface.h> … … 73 76 GENERIC_CHAR_MAP_IMPLEMENT(measured_strings, measured_string_t); 74 77 DEVICE_MAP_IMPLEMENT(netifs, netif_t); 78 LIST_INITIALIZE(netif_list); 79 80 static FIBRIL_MUTEX_INITIALIZE(discovery_lock); 75 81 76 82 /** Add the configured setting to the configuration map. … … 287 293 * 288 294 */ 289 static int init_device(netif_t *netif, devman_handle_t handle)295 static int init_device(netif_t *netif, service_id_t sid) 290 296 { 291 297 printf("%s: Initializing device '%s'\n", NAME, netif->name); 292 298 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, 295 301 IPC_FLAG_BLOCKING); 296 302 if (netif->sess == NULL) { … … 337 343 strtol((const char *) setting->value, NULL, 10) : 0; 338 344 rc = nil_device_req(netif->nil->sess, netif->id, 339 netif-> handle, mtu);345 netif->sid, mtu); 340 346 if (rc != EOK) { 341 347 printf("%s: Unable to start network interface layer\n", … … 359 365 break; 360 366 default: 367 printf("%s: Unknown service\n", NAME); 361 368 return ENOENT; 362 369 } 363 370 364 371 printf("%s: Activating device '%s'\n", NAME, netif->name); 372 list_append(&netif->netif_list, &netif_list); 365 373 return nic_set_state(netif->sess, NIC_STATE_ACTIVE); 366 374 } 367 375 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) 376 static 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); 373 385 return EINVAL; 386 } 374 387 375 388 int index = char_map_find(&net_globals.netif_hwpaths, 376 389 (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); 378 394 return ENOENT; 395 } 396 397 free(hwpath); 379 398 380 399 netif_t *netif = netifs_get_index(&net_globals.netifs, index); … … 382 401 return ENOENT; 383 402 384 rc = init_device(netif, handle);403 rc = init_device(netif, sid); 385 404 if (rc != EOK) 386 405 return rc; … … 391 410 392 411 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 }410 412 411 413 return EOK; … … 479 481 net_free_devices(strings, count); 480 482 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;485 483 default: 486 484 return ENOTSUP; … … 528 526 answer_call(callid, res, &answer, count); 529 527 } 528 } 529 530 static 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 578 static void cat_change_cb(void) 579 { 580 (void) nic_check_new(); 581 } 582 583 static 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(); 530 595 } 531 596 … … 573 638 continue; 574 639 575 netif-> handle= -1;640 netif->sid = -1; 576 641 netif->sess = NULL; 577 642 … … 697 762 } 698 763 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 699 771 task_retval(0); 700 772 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.