Changeset a35b458 in mainline for uspace/srv/net/ethip/ethip_nic.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/ethip_nic.c
r3061bc1 ra35b458 112 112 return NULL; 113 113 } 114 114 115 115 link_initialize(&nic->link); 116 116 list_initialize(&nic->addr_list); 117 117 118 118 return nic; 119 119 } … … 127 127 return NULL; 128 128 } 129 129 130 130 link_initialize(&laddr->link); 131 131 laddr->addr = *addr; 132 132 133 133 return laddr; 134 134 } … … 138 138 if (nic->svc_name != NULL) 139 139 free(nic->svc_name); 140 140 141 141 free(nic); 142 142 } … … 151 151 bool in_list = false; 152 152 nic_address_t nic_address; 153 153 154 154 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_open()"); 155 155 ethip_nic_t *nic = ethip_nic_new(); 156 156 if (nic == NULL) 157 157 return ENOMEM; 158 158 159 159 errno_t rc = loc_service_get_name(sid, &nic->svc_name); 160 160 if (rc != EOK) { … … 162 162 goto error; 163 163 } 164 164 165 165 nic->sess = loc_service_connect(sid, INTERFACE_DDF, 0); 166 166 if (nic->sess == NULL) { … … 168 168 goto error; 169 169 } 170 170 171 171 nic->svc_id = sid; 172 172 173 173 rc = nic_callback_create(nic->sess, ethip_nic_cb_conn, nic); 174 174 if (rc != EOK) { … … 192 192 goto error; 193 193 } 194 194 195 195 addr48(nic_address.address, nic->mac_addr); 196 196 … … 216 216 if (in_list) 217 217 list_remove(&nic->link); 218 218 219 219 if (nic->sess != NULL) 220 220 async_hangup(nic->sess); 221 221 222 222 ethip_nic_delete(nic); 223 223 return rc; … … 332 332 return rc; 333 333 } 334 334 335 335 return ethip_nic_check_new(); 336 336 } … … 371 371 { 372 372 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_setup_multicast()"); 373 373 374 374 /* Count the number of multicast addresses */ 375 375 376 376 size_t count = 0; 377 377 378 378 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 379 379 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, NULL); … … 381 381 count++; 382 382 } 383 383 384 384 if (count == 0) 385 385 return nic_multicast_set_mode(nic->sess, NIC_MULTICAST_BLOCKED, 386 386 NULL, 0); 387 387 388 388 nic_address_t *mac_list = calloc(count, sizeof(nic_address_t)); 389 389 if (mac_list == NULL) 390 390 return ENOMEM; 391 391 392 392 /* Create the multicast MAC list */ 393 393 394 394 size_t i = 0; 395 395 396 396 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 397 397 addr128_t v6; … … 399 399 if (ver != ip_v6) 400 400 continue; 401 401 402 402 assert(i < count); 403 403 404 404 addr48_t mac; 405 405 addr48_solicited_node(v6, mac); 406 406 407 407 /* Avoid duplicate addresses in the list */ 408 408 409 409 bool found = false; 410 410 411 411 for (size_t j = 0; j < i; j++) { 412 412 if (addr48_compare(mac_list[j].address, mac)) { … … 415 415 } 416 416 } 417 417 418 418 if (!found) { 419 419 addr48(mac, mac_list[i].address); … … 422 422 count--; 423 423 } 424 424 425 425 /* Setup the multicast MAC list */ 426 426 427 427 errno_t rc = nic_multicast_set_mode(nic->sess, NIC_MULTICAST_LIST, 428 428 mac_list, count); 429 429 430 430 free(mac_list); 431 431 return rc; … … 435 435 { 436 436 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_add()"); 437 437 438 438 ethip_link_addr_t *laddr = ethip_nic_addr_new(addr); 439 439 if (laddr == NULL) 440 440 return ENOMEM; 441 441 442 442 list_append(&laddr->link, &nic->addr_list); 443 443 444 444 return ethip_nic_setup_multicast(nic); 445 445 } … … 448 448 { 449 449 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_remove()"); 450 450 451 451 ethip_link_addr_t *laddr = ethip_nic_addr_find(nic, addr); 452 452 if (laddr == NULL) 453 453 return ENOENT; 454 454 455 455 list_remove(&laddr->link); 456 456 ethip_link_addr_delete(laddr); 457 457 458 458 return ethip_nic_setup_multicast(nic); 459 459 } … … 463 463 { 464 464 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_find()"); 465 465 466 466 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 467 467 if (inet_addr_compare(addr, &laddr->addr)) 468 468 return laddr; 469 469 } 470 470 471 471 return NULL; 472 472 }
Note:
See TracChangeset
for help on using the changeset viewer.