Changes in uspace/srv/net/ethip/ethip_nic.c [f9b2cb4c:02a09ed] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/ethip_nic.c
rf9b2cb4c r02a09ed 43 43 #include <io/log.h> 44 44 #include <loc.h> 45 #include < nic_iface.h>45 #include <device/nic.h> 46 46 #include <stdlib.h> 47 #include <mem.h> 47 48 48 #include "ethip.h" 49 49 #include "ethip_nic.h" … … 83 83 already_known = false; 84 84 85 list_foreach(ethip_nic_list, link, ethip_nic_t, nic) { 85 list_foreach(ethip_nic_list, nic_link) { 86 ethip_nic_t *nic = list_get_instance(nic_link, 87 ethip_nic_t, nic_list); 86 88 if (nic->svc_id == svcs[i]) { 87 89 already_known = true; … … 106 108 { 107 109 ethip_nic_t *nic = calloc(1, sizeof(ethip_nic_t)); 110 108 111 if (nic == NULL) { 109 112 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed allocating NIC structure. " … … 111 114 return NULL; 112 115 } 113 114 link_initialize(&nic-> link);116 117 link_initialize(&nic->nic_list); 115 118 list_initialize(&nic->addr_list); 116 119 117 120 return nic; 118 121 } … … 127 130 } 128 131 129 link_initialize(&laddr-> link);132 link_initialize(&laddr->addr_list); 130 133 laddr->addr = *addr; 131 134 … … 137 140 if (nic->svc_name != NULL) 138 141 free(nic->svc_name); 139 140 142 free(nic); 141 143 } … … 162 164 } 163 165 164 nic->sess = loc_service_connect( sid, INTERFACE_DDF, 0);166 nic->sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 0); 165 167 if (nic->sess == NULL) { 166 168 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed connecting '%s'", nic->svc_name); … … 178 180 179 181 log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened NIC '%s'", nic->svc_name); 180 list_append(&nic-> link, ðip_nic_list);182 list_append(&nic->nic_list, ðip_nic_list); 181 183 in_list = true; 182 184 … … 201 203 } 202 204 203 rc = nic_broadcast_set_mode(nic->sess, NIC_BROADCAST_ACCEPTED);204 if (rc != EOK) {205 log_msg(LOG_DEFAULT, LVL_ERROR, "Error enabling "206 "reception of broadcast frames on '%s'.", nic->svc_name);207 goto error;208 }209 210 205 log_msg(LOG_DEFAULT, LVL_DEBUG, "Initialized IP link service,"); 211 206 … … 214 209 error: 215 210 if (in_list) 216 list_remove(&nic->link); 217 211 list_remove(&nic->nic_list); 218 212 if (nic->sess != NULL) 219 213 async_hangup(nic->sess); 220 221 214 ethip_nic_delete(nic); 222 215 return rc; … … 231 224 ipc_call_t *call) 232 225 { 233 uint8_t *addr; 234 size_t size; 235 int rc; 236 237 rc = async_data_write_accept((void **)&addr, false, 0, 0, 0, &size); 238 if (rc != EOK) { 239 log_msg(LOG_DEFAULT, LVL_DEBUG, "data_write_accept() failed"); 240 return; 241 } 242 243 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_changed(): " 244 "new addr=%02x:%02x:%02x:%02x:%02x:%02x", 245 addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 246 247 memcpy(&nic->mac_addr, addr, sizeof(nic->mac_addr)); 248 249 rc = iplink_ev_change_addr(&nic->iplink, &nic->mac_addr); 250 if (rc != EOK) { 251 log_msg(LOG_DEFAULT, LVL_DEBUG, "iplink_ev_change_addr() failed"); 252 return; 253 } 254 255 free(addr); 256 async_answer_0(callid, EOK); 226 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_changed()"); 227 async_answer_0(callid, ENOTSUP); 257 228 } 258 229 … … 317 288 break; 318 289 default: 319 log_msg(LOG_DEFAULT, LVL_DEBUG, "unknown IPC method: %" PRIun, IPC_GET_IMETHOD(call));320 290 async_answer_0(callid, ENOTSUP); 321 291 } … … 340 310 (unsigned) iplink_sid); 341 311 342 list_foreach(ethip_nic_list, link , ethip_nic_t, nic) {312 list_foreach(ethip_nic_list, link) { 343 313 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_find_by_iplink_sid - element"); 314 ethip_nic_t *nic = list_get_instance(link, ethip_nic_t, 315 nic_list); 316 344 317 if (nic->iplink_sid == iplink_sid) { 345 318 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_find_by_iplink_sid - found %p", nic); … … 361 334 } 362 335 363 /** Setup accepted multicast addresses364 *365 * Currently the set of accepted multicast addresses is366 * determined only based on IPv6 addresses.367 *368 */369 static int ethip_nic_setup_multicast(ethip_nic_t *nic)370 {371 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_setup_multicast()");372 373 /* Count the number of multicast addresses */374 375 size_t count = 0;376 377 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) {378 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, NULL);379 if (ver == ip_v6)380 count++;381 }382 383 if (count == 0)384 return nic_multicast_set_mode(nic->sess, NIC_MULTICAST_BLOCKED,385 NULL, 0);386 387 nic_address_t *mac_list = calloc(count, sizeof(nic_address_t));388 if (mac_list == NULL)389 return ENOMEM;390 391 /* Create the multicast MAC list */392 393 size_t i = 0;394 395 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) {396 addr128_t v6;397 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, &v6);398 if (ver != ip_v6)399 continue;400 401 assert(i < count);402 403 addr48_t mac;404 addr48_solicited_node(v6, mac);405 406 /* Avoid duplicate addresses in the list */407 408 bool found = false;409 410 for (size_t j = 0; j < i; j++) {411 if (addr48_compare(mac_list[j].address, mac)) {412 found = true;413 break;414 }415 }416 417 if (!found) {418 addr48(mac, mac_list[i].address);419 i++;420 } else421 count--;422 }423 424 /* Setup the multicast MAC list */425 426 int rc = nic_multicast_set_mode(nic->sess, NIC_MULTICAST_LIST,427 mac_list, count);428 429 free(mac_list);430 return rc;431 }432 433 336 int ethip_nic_addr_add(ethip_nic_t *nic, inet_addr_t *addr) 434 337 { … … 439 342 return ENOMEM; 440 343 441 list_append(&laddr->link, &nic->addr_list); 442 443 return ethip_nic_setup_multicast(nic); 344 list_append(&laddr->addr_list, &nic->addr_list); 345 return EOK; 444 346 } 445 347 … … 452 354 return ENOENT; 453 355 454 list_remove(&laddr-> link);356 list_remove(&laddr->addr_list); 455 357 ethip_link_addr_delete(laddr); 456 457 return ethip_nic_setup_multicast(nic); 358 return EOK; 458 359 } 459 360 … … 463 364 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_find()"); 464 365 465 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 366 list_foreach(nic->addr_list, link) { 367 ethip_link_addr_t *laddr = list_get_instance(link, 368 ethip_link_addr_t, addr_list); 369 466 370 if (inet_addr_compare(addr, &laddr->addr)) 467 371 return laddr;
Note:
See TracChangeset
for help on using the changeset viewer.