Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/ethip/ethip_nic.c

    r83781a22 r02a09ed  
    4545#include <device/nic.h>
    4646#include <stdlib.h>
    47 #include <net/socket_codes.h>
    48 #include <mem.h>
     47
    4948#include "ethip.h"
    5049#include "ethip_nic.h"
     
    8483                already_known = false;
    8584
    86                 list_foreach(ethip_nic_list, link) {
    87                         ethip_nic_t *nic = list_get_instance(link,
    88                             ethip_nic_t, link);
     85                list_foreach(ethip_nic_list, nic_link) {
     86                        ethip_nic_t *nic = list_get_instance(nic_link,
     87                            ethip_nic_t, nic_list);
    8988                        if (nic->svc_id == svcs[i]) {
    9089                                already_known = true;
     
    109108{
    110109        ethip_nic_t *nic = calloc(1, sizeof(ethip_nic_t));
     110
    111111        if (nic == NULL) {
    112112                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed allocating NIC structure. "
     
    114114                return NULL;
    115115        }
    116        
    117         link_initialize(&nic->link);
     116
     117        link_initialize(&nic->nic_list);
    118118        list_initialize(&nic->addr_list);
    119        
     119
    120120        return nic;
    121121}
     
    130130        }
    131131       
    132         link_initialize(&laddr->link);
     132        link_initialize(&laddr->addr_list);
    133133        laddr->addr = *addr;
    134134       
     
    140140        if (nic->svc_name != NULL)
    141141                free(nic->svc_name);
    142        
    143142        free(nic);
    144143}
     
    181180
    182181        log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened NIC '%s'", nic->svc_name);
    183         list_append(&nic->link, &ethip_nic_list);
     182        list_append(&nic->nic_list, &ethip_nic_list);
    184183        in_list = true;
    185184
     
    210209error:
    211210        if (in_list)
    212                 list_remove(&nic->link);
    213        
     211                list_remove(&nic->nic_list);
    214212        if (nic->sess != NULL)
    215213                async_hangup(nic->sess);
    216        
    217214        ethip_nic_delete(nic);
    218215        return rc;
     
    315312        list_foreach(ethip_nic_list, link) {
    316313                log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_find_by_iplink_sid - element");
    317                 ethip_nic_t *nic = list_get_instance(link, ethip_nic_t, link);
     314                ethip_nic_t *nic = list_get_instance(link, ethip_nic_t,
     315                    nic_list);
    318316
    319317                if (nic->iplink_sid == iplink_sid) {
     
    336334}
    337335
    338 /** Setup accepted multicast addresses
    339  *
    340  * Currently the set of accepted multicast addresses is
    341  * determined only based on IPv6 addresses.
    342  *
    343  */
    344 static int ethip_nic_setup_multicast(ethip_nic_t *nic)
    345 {
    346         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_setup_multicast()");
    347        
    348         /* Count the number of multicast addresses */
    349        
    350         size_t count = 0;
    351        
    352         list_foreach(nic->addr_list, link) {
    353                 ethip_link_addr_t *laddr = list_get_instance(link,
    354                     ethip_link_addr_t, link);
    355                
    356                 uint16_t af = inet_addr_get(&laddr->addr, NULL, NULL);
    357                 if (af == AF_INET6)
    358                         count++;
    359         }
    360        
    361         if (count == 0)
    362                 return nic_multicast_set_mode(nic->sess, NIC_MULTICAST_BLOCKED,
    363                     NULL, 0);
    364        
    365         nic_address_t *mac_list = calloc(count, sizeof(nic_address_t));
    366         if (mac_list == NULL)
    367                 return ENOMEM;
    368        
    369         /* Create the multicast MAC list */
    370        
    371         size_t i = 0;
    372        
    373         list_foreach(nic->addr_list, link) {
    374                 assert(i < count);
    375                
    376                 ethip_link_addr_t *laddr = list_get_instance(link,
    377                     ethip_link_addr_t, link);
    378                
    379                 addr128_t v6;
    380                 uint16_t af = inet_addr_get(&laddr->addr, NULL, &v6);
    381                 if (af != AF_INET6)
    382                         continue;
    383                
    384                 addr48_t mac;
    385                 addr48_solicited_node(v6, mac);
    386                
    387                 /* Avoid duplicate addresses in the list */
    388                
    389                 bool found = false;
    390                
    391                 for (size_t j = 0; j < i; j++) {
    392                         if (addr48_compare(mac_list[j].address, mac)) {
    393                                 found = true;
    394                                 break;
    395                         }
    396                 }
    397                
    398                 if (!found) {
    399                         addr48(mac, mac_list[i].address);
    400                         i++;
    401                 } else
    402                         count--;
    403         }
    404        
    405         /* Setup the multicast MAC list */
    406        
    407         int rc = nic_multicast_set_mode(nic->sess, NIC_MULTICAST_LIST,
    408             mac_list, count);
    409        
    410         free(mac_list);
    411         return rc;
    412 }
    413 
    414336int ethip_nic_addr_add(ethip_nic_t *nic, inet_addr_t *addr)
    415337{
     
    420342                return ENOMEM;
    421343       
    422         list_append(&laddr->link, &nic->addr_list);
    423        
    424         return ethip_nic_setup_multicast(nic);
     344        list_append(&laddr->addr_list, &nic->addr_list);
     345        return EOK;
    425346}
    426347
     
    433354                return ENOENT;
    434355       
    435         list_remove(&laddr->link);
     356        list_remove(&laddr->addr_list);
    436357        ethip_link_addr_delete(laddr);
    437        
    438         return ethip_nic_setup_multicast(nic);
     358        return EOK;
    439359}
    440360
     
    446366        list_foreach(nic->addr_list, link) {
    447367                ethip_link_addr_t *laddr = list_get_instance(link,
    448                     ethip_link_addr_t, link);
     368                    ethip_link_addr_t, addr_list);
    449369               
    450370                if (inet_addr_compare(addr, &laddr->addr))
Note: See TracChangeset for help on using the changeset viewer.