E810 hardware provides 32k switch lookups. Thanks to this, it is possible to allow a lot more secondary mac addresses than what is possible today.
In practice, the maximum number of macs available per port may be lower and depends on usage by other (trusted?) VFs on the same PF. There is no way to figure out this limit but to try adding a mac address and get an error from the PF driver. Mailbox exchanges are limited to IAVF_AQ_BUF_SZ, segment messages accordingly. Since unicast and multicast addresses arrays are sized with two different constants, prefer RTE_DIM() whenever possible. Signed-off-by: David Marchand <[email protected]> --- Changes since v6: - reused helper added in previous commit, - used RTE_DIM() instead of macro constants, Changes since v5: - separated from series that went in next-net, - rebased, Changes since v4: - rebased, Changes since v2: - added an entry in release notes, - removed unneeded temp variable, Changes since v1: - fixed buffer overflow on mailbox messages during port restart/VF reset, --- doc/guides/rel_notes/release_26_11.rst | 4 ++++ drivers/net/intel/iavf/iavf.h | 7 ++++--- drivers/net/intel/iavf/iavf_ethdev.c | 7 +++---- drivers/net/intel/iavf/iavf_vchnl.c | 10 ++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst index 6c29513041..5a4c7d815d 100644 --- a/doc/guides/rel_notes/release_26_11.rst +++ b/doc/guides/rel_notes/release_26_11.rst @@ -64,6 +64,10 @@ New Features * Renamed the ``enable_ptype_lldp`` devarg to ``enable_lldp``. The old name is no longer accepted. + * Increased the maximum number of secondary unicast MAC addresses + from 64 to 32k. + This increases a VF port memory footprint by ~192kB. + * **Updated Intel ixgbe driver.** Added ``fdir_buffer_size`` devarg to select the Flow Director table size diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h index 34b9b4ad94..f3f2b4ae51 100644 --- a/drivers/net/intel/iavf/iavf.h +++ b/drivers/net/intel/iavf/iavf.h @@ -32,7 +32,8 @@ #define IAVF_IRQ_MAP_NUM_PER_BUF 128 #define IAVF_RXTX_QUEUE_CHUNKS_NUM 2 -#define IAVF_NUM_MACADDR_MAX 64 +#define IAVF_UC_MACADDR_MAX 32768 +#define IAVF_MC_MACADDR_MAX 64 #define IAVF_DEV_WATCHDOG_PERIOD 2000 /* microseconds, set 0 to disable*/ @@ -256,10 +257,10 @@ struct iavf_info { uint32_t link_speed; /* Unicast addrs */ - struct rte_ether_addr mac_addrs[IAVF_NUM_MACADDR_MAX]; + struct rte_ether_addr mac_addrs[IAVF_UC_MACADDR_MAX]; /* Multicast addrs */ - struct rte_ether_addr mc_addrs[IAVF_NUM_MACADDR_MAX]; + struct rte_ether_addr mc_addrs[IAVF_MC_MACADDR_MAX]; uint16_t mc_addrs_num; /* Multicast mac addresses number */ struct iavf_vsi vsi; diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c index f7aeac8c83..2d055e6f5b 100644 --- a/drivers/net/intel/iavf/iavf_ethdev.c +++ b/drivers/net/intel/iavf/iavf_ethdev.c @@ -411,10 +411,9 @@ iavf_set_mc_addr_list(struct rte_eth_dev *dev, IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); int err, ret; - if (mc_addrs_num > IAVF_NUM_MACADDR_MAX) { - PMD_DRV_LOG(ERR, - "can't add more than a limited number (%u) of addresses.", - (uint32_t)IAVF_NUM_MACADDR_MAX); + if (mc_addrs_num > RTE_DIM(vf->mc_addrs)) { + PMD_DRV_LOG(ERR, "can't add more than a limited number (%u) of addresses.", + (unsigned int)RTE_DIM(vf->mc_addrs)); return -EINVAL; } diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c index decfae3182..418a7e897e 100644 --- a/drivers/net/intel/iavf/iavf_vchnl.c +++ b/drivers/net/intel/iavf/iavf_vchnl.c @@ -1712,8 +1712,8 @@ iavf_send_eth_addr_list(struct iavf_adapter *adapter, const char *caller, void iavf_add_del_secondary_mac_addr(struct iavf_adapter *adapter, bool add) { + uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(IAVF_ETH_ADDR_PER_REQ)] = {0}; struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); - uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(RTE_DIM(vf->mac_addrs))] = {0}; struct virtchnl_ether_addr_list *list; list = (struct virtchnl_ether_addr_list *)cmd_buffer; @@ -1730,6 +1730,12 @@ iavf_add_del_secondary_mac_addr(struct iavf_adapter *adapter, bool add) memcpy(vc_addr->addr, addr->addr_bytes, sizeof(addr->addr_bytes)); vc_addr->type = VIRTCHNL_ETHER_ADDR_EXTRA; } + + if (list->num_elements == IAVF_ETH_ADDR_PER_REQ) { + if (iavf_send_eth_addr_list(adapter, __func__, list, add)) + return; + list->num_elements = 0; + } } if (list->num_elements != 0) @@ -2308,8 +2314,8 @@ iavf_add_del_mc_addr_list(struct iavf_adapter *adapter, struct rte_ether_addr *mc_addrs, uint32_t mc_addrs_num, bool add) { - uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(IAVF_NUM_MACADDR_MAX)] = {0}; struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(RTE_DIM(vf->mc_addrs))] = {0}; struct virtchnl_ether_addr_list *list; uint32_t i; -- 2.54.0

