Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
Show First 20 Lines • Show All 611 Lines • ▼ Show 20 Lines | static void mlx4_en_clear_uclist(struct net_device *dev) | ||||
struct mlx4_en_addr_list *tmp, *uc_to_del; | struct mlx4_en_addr_list *tmp, *uc_to_del; | ||||
list_for_each_entry_safe(uc_to_del, tmp, &priv->uc_list, list) { | list_for_each_entry_safe(uc_to_del, tmp, &priv->uc_list, list) { | ||||
list_del(&uc_to_del->list); | list_del(&uc_to_del->list); | ||||
kfree(uc_to_del); | kfree(uc_to_del); | ||||
} | } | ||||
} | } | ||||
static void mlx4_en_cache_uclist(struct net_device *dev) | static u_int mlx4_copy_addr(void *arg, struct sockaddr_dl *sdl, u_int cnt) | ||||
{ | { | ||||
struct mlx4_en_priv *priv = netdev_priv(dev); | struct mlx4_en_priv *priv = arg; | ||||
struct mlx4_en_addr_list *tmp; | struct mlx4_en_addr_list *tmp; | ||||
struct ifaddr *ifa; | |||||
mlx4_en_clear_uclist(dev); | if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */ | ||||
hselasky: Maybe for infiniband, ibX, devices. | |||||
return (0); | |||||
if_addr_rlock(dev); | |||||
CK_STAILQ_FOREACH(ifa, &dev->if_addrhead, ifa_link) { | |||||
if (ifa->ifa_addr->sa_family != AF_LINK) | |||||
continue; | |||||
if (((struct sockaddr_dl *)ifa->ifa_addr)->sdl_alen != | |||||
ETHER_ADDR_LEN) | |||||
continue; | |||||
tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); | tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); | ||||
if (tmp == NULL) { | if (tmp == NULL) { | ||||
en_err(priv, "Failed to allocate address list\n"); | en_err(priv, "Failed to allocate address list\n"); | ||||
break; | return (0); | ||||
} | } | ||||
memcpy(tmp->addr, | memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN); | ||||
LLADDR((struct sockaddr_dl *)ifa->ifa_addr), ETH_ALEN); | |||||
list_add_tail(&tmp->list, &priv->uc_list); | list_add_tail(&tmp->list, &priv->uc_list); | ||||
return (1); | |||||
} | } | ||||
if_addr_runlock(dev); | |||||
static void mlx4_en_cache_uclist(struct net_device *dev) | |||||
{ | |||||
struct mlx4_en_priv *priv = netdev_priv(dev); | |||||
mlx4_en_clear_uclist(dev); | |||||
if_foreach_lladdr(dev, mlx4_copy_addr, priv); | |||||
} | } | ||||
static void mlx4_en_clear_mclist(struct net_device *dev) | static void mlx4_en_clear_mclist(struct net_device *dev) | ||||
{ | { | ||||
struct mlx4_en_priv *priv = netdev_priv(dev); | struct mlx4_en_priv *priv = netdev_priv(dev); | ||||
struct mlx4_en_addr_list *tmp, *mc_to_del; | struct mlx4_en_addr_list *tmp, *mc_to_del; | ||||
list_for_each_entry_safe(mc_to_del, tmp, &priv->mc_list, list) { | list_for_each_entry_safe(mc_to_del, tmp, &priv->mc_list, list) { | ||||
list_del(&mc_to_del->list); | list_del(&mc_to_del->list); | ||||
kfree(mc_to_del); | kfree(mc_to_del); | ||||
} | } | ||||
} | } | ||||
static void mlx4_en_cache_mclist(struct net_device *dev) | static u_int mlx4_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int count) | ||||
{ | { | ||||
struct mlx4_en_priv *priv = netdev_priv(dev); | struct mlx4_en_priv *priv = arg; | ||||
struct mlx4_en_addr_list *tmp; | struct mlx4_en_addr_list *tmp; | ||||
struct ifmultiaddr *ifma; | |||||
mlx4_en_clear_mclist(dev); | if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */ | ||||
return (0); | |||||
if_maddr_rlock(dev); | |||||
CK_STAILQ_FOREACH(ifma, &dev->if_multiaddrs, ifma_link) { | |||||
if (ifma->ifma_addr->sa_family != AF_LINK) | |||||
continue; | |||||
if (((struct sockaddr_dl *)ifma->ifma_addr)->sdl_alen != | |||||
ETHER_ADDR_LEN) | |||||
continue; | |||||
tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); | tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); | ||||
if (tmp == NULL) { | if (tmp == NULL) { | ||||
en_err(priv, "Failed to allocate address list\n"); | en_err(priv, "Failed to allocate address list\n"); | ||||
break; | return (0); | ||||
} | } | ||||
memcpy(tmp->addr, | memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN); | ||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr), ETH_ALEN); | |||||
list_add_tail(&tmp->list, &priv->mc_list); | list_add_tail(&tmp->list, &priv->mc_list); | ||||
return (1); | |||||
} | } | ||||
if_maddr_runlock(dev); | |||||
static void mlx4_en_cache_mclist(struct net_device *dev) | |||||
{ | |||||
struct mlx4_en_priv *priv = netdev_priv(dev); | |||||
mlx4_en_clear_mclist(dev); | |||||
if_foreach_llmaddr(dev, mlx4_copy_maddr, priv); | |||||
} | } | ||||
static void update_addr_list_flags(struct mlx4_en_priv *priv, | static void update_addr_list_flags(struct mlx4_en_priv *priv, | ||||
struct list_head *dst, | struct list_head *dst, | ||||
struct list_head *src) | struct list_head *src) | ||||
{ | { | ||||
struct mlx4_en_addr_list *dst_tmp, *src_tmp, *new_mc; | struct mlx4_en_addr_list *dst_tmp, *src_tmp, *new_mc; | ||||
bool found; | bool found; | ||||
▲ Show 20 Lines • Show All 2,253 Lines • Show Last 20 Lines |
Maybe for infiniband, ibX, devices.