aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mlx4
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2019-10-14 20:23:16 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2019-10-14 20:23:16 +0000
commit20b26072b8a286e0c1a12f35fab3d9abf2d25806 (patch)
tree98101806c773a085942e5c6ea2e52991fb61a487 /sys/dev/mlx4
parentf95dbf26d36b64a34e9babf613710b27e7ff2d83 (diff)
Notes
Diffstat (limited to 'sys/dev/mlx4')
-rw-r--r--sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c77
1 files changed, 37 insertions, 40 deletions
diff --git a/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c b/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
index dd77da1af2ae..4159cc6274bd 100644
--- a/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
+++ b/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
@@ -617,31 +617,30 @@ static void mlx4_en_clear_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 = arg;
+ struct mlx4_en_addr_list *tmp;
+
+ if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */
+ return (0);
+ tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC);
+ if (tmp == NULL) {
+ en_err(priv, "Failed to allocate address list\n");
+ return (0);
+ }
+ memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN);
+ list_add_tail(&tmp->list, &priv->uc_list);
+
+ return (1);
+}
+
static void mlx4_en_cache_uclist(struct net_device *dev)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_en_addr_list *tmp;
- struct ifaddr *ifa;
mlx4_en_clear_uclist(dev);
-
- 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);
- if (tmp == NULL) {
- en_err(priv, "Failed to allocate address list\n");
- break;
- }
- memcpy(tmp->addr,
- LLADDR((struct sockaddr_dl *)ifa->ifa_addr), ETH_ALEN);
- list_add_tail(&tmp->list, &priv->uc_list);
- }
- if_addr_runlock(dev);
+ if_foreach_lladdr(dev, mlx4_copy_addr, priv);
}
static void mlx4_en_clear_mclist(struct net_device *dev)
@@ -655,31 +654,29 @@ static void mlx4_en_clear_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 = arg;
+ struct mlx4_en_addr_list *tmp;
+
+ if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */
+ return (0);
+ tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC);
+ if (tmp == NULL) {
+ en_err(priv, "Failed to allocate address list\n");
+ return (0);
+ }
+ memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN);
+ list_add_tail(&tmp->list, &priv->mc_list);
+ return (1);
+}
+
static void mlx4_en_cache_mclist(struct net_device *dev)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_en_addr_list *tmp;
- struct ifmultiaddr *ifma;
mlx4_en_clear_mclist(dev);
-
- 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);
- if (tmp == NULL) {
- en_err(priv, "Failed to allocate address list\n");
- break;
- }
- memcpy(tmp->addr,
- LLADDR((struct sockaddr_dl *)ifma->ifma_addr), ETH_ALEN);
- list_add_tail(&tmp->list, &priv->mc_list);
- }
- if_maddr_runlock(dev);
+ if_foreach_llmaddr(dev, mlx4_copy_maddr, priv);
}
static void update_addr_list_flags(struct mlx4_en_priv *priv,