Move some code in DPDK callbacks to add/remove MAC addresses to internal function. This modification will be necessary to handle implement the devop set_mc_addr_list.
Signed-off-by: Nelio Laranjeiro <nelio.laranje...@6wind.com> --- drivers/net/mlx5/mlx5_defs.h | 4 +- drivers/net/mlx5/mlx5_ethdev.c | 2 +- drivers/net/mlx5/mlx5_mac.c | 86 +++++++++++++++++++++++++--------- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h index 3fb2f1480..e3aa03bef 100644 --- a/drivers/net/mlx5/mlx5_defs.h +++ b/drivers/net/mlx5/mlx5_defs.h @@ -13,8 +13,10 @@ /* Reported driver name. */ #define MLX5_DRIVER_NAME "net_mlx5" +/* Maximum number of simultaneous unicast MAC addresses. */ +#define MLX5_MAX_UC_MAC_ADDRESSES 128 /* Maximum number of simultaneous MAC addresses. */ -#define MLX5_MAX_MAC_ADDRESSES 128 +#define MLX5_MAX_MAC_ADDRESSES MLX5_MAX_UC_MAC_ADDRESSES /* Maximum number of simultaneous VLAN filters. */ #define MLX5_MAX_VLAN_IDS 128 diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index ef44cc91f..99ac4cc5c 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -446,7 +446,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info) max = 65535; info->max_rx_queues = max; info->max_tx_queues = max; - info->max_mac_addrs = RTE_DIM(priv->mac); + info->max_mac_addrs = MLX5_MAX_UC_MAC_ADDRESSES; info->rx_queue_offload_capa = mlx5_get_rx_queue_offloads(dev); info->rx_offload_capa = (mlx5_get_rx_port_offloads() | info->rx_queue_offload_capa); diff --git a/drivers/net/mlx5/mlx5_mac.c b/drivers/net/mlx5/mlx5_mac.c index f24b5f759..e9334ea4a 100644 --- a/drivers/net/mlx5/mlx5_mac.c +++ b/drivers/net/mlx5/mlx5_mac.c @@ -57,38 +57,30 @@ mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[ETHER_ADDR_LEN]) } /** - * DPDK callback to remove a MAC address. + * Remove a MAC address from the internal array. * * @param dev * Pointer to Ethernet device structure. * @param index * MAC address index. */ -void -mlx5_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) +static void +mlx5_internal_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) { struct priv *priv = dev->data->dev_private; const int vf = priv->config.vf; - int ret; - if (index >= MLX5_MAX_MAC_ADDRESSES) - return; + assert(index < MLX5_MAX_MAC_ADDRESSES); if (is_zero_ether_addr(&dev->data->mac_addrs[index])) return; if (vf) mlx5_nl_mac_addr_remove(dev, &dev->data->mac_addrs[index], index); memset(&dev->data->mac_addrs[index], 0, sizeof(struct ether_addr)); - if (!dev->data->promiscuous) { - ret = mlx5_traffic_restart(dev); - if (ret) - DRV_LOG(ERR, "port %u cannot restart traffic: %s", - dev->data->port_id, strerror(rte_errno)); - } } /** - * DPDK callback to add a MAC address. + * Adds a MAC address to the internal array. * * @param dev * Pointer to Ethernet device structure. @@ -96,24 +88,19 @@ mlx5_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) * MAC address to register. * @param index * MAC address index. - * @param vmdq - * VMDq pool index to associate address with (ignored). * * @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -int -mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac, - uint32_t index, uint32_t vmdq __rte_unused) +static int +mlx5_internal_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac, + uint32_t index) { struct priv *priv = dev->data->dev_private; const int vf = priv->config.vf; unsigned int i; - if (index >= MLX5_MAX_MAC_ADDRESSES) { - rte_errno = EINVAL; - return -rte_errno; - } + assert(index < MLX5_MAX_MAC_ADDRESSES); if (is_zero_ether_addr(mac)) { rte_errno = EINVAL; return -rte_errno; @@ -136,6 +123,61 @@ mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac, return ret; } dev->data->mac_addrs[index] = *mac; + return 0; +} + +/** + * DPDK callback to remove a MAC address. + * + * @param dev + * Pointer to Ethernet device structure. + * @param index + * MAC address index. + */ +void +mlx5_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) +{ + int ret; + + if (index >= MLX5_MAX_UC_MAC_ADDRESSES) + return; + mlx5_internal_mac_addr_remove(dev, index); + if (!dev->data->promiscuous) { + ret = mlx5_traffic_restart(dev); + if (ret) + DRV_LOG(ERR, "port %u cannot restart traffic: %s", + dev->data->port_id, strerror(rte_errno)); + } +} + +/** + * DPDK callback to add a MAC address. + * + * @param dev + * Pointer to Ethernet device structure. + * @param mac_addr + * MAC address to register. + * @param index + * MAC address index. + * @param vmdq + * VMDq pool index to associate address with (ignored). + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac, + uint32_t index, uint32_t vmdq __rte_unused) +{ + int ret; + + if (index >= MLX5_MAX_UC_MAC_ADDRESSES) { + rte_errno = EINVAL; + return -rte_errno; + } + ret = mlx5_internal_mac_addr_add(dev, mac, index); + if (ret < 0) + return ret; if (!dev->data->promiscuous) return mlx5_traffic_restart(dev); return 0; -- 2.17.0