[v2] net/iavf: fix adding multicast MAC address
Checks
Commit Message
When the multicast address is added, it will flush
previous addresses first, and then add new ones.
So when adding an address that exceeds the upper limit
causes a failure, you need to add the previous address
list back. This patch fixes the issue.
Fixes: 05e4c3aff35f ("net/iavf: support multicast configuration")
Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
Tested-by: Peng Yuan <yuan.peng@intel.com>
---
v2:
* modify the variable name
---
drivers/net/iavf/iavf_ethdev.c | 30 ++++++++++++++++++++++--------
drivers/net/iavf/iavf_vchnl.c | 3 ---
2 files changed, 22 insertions(+), 11 deletions(-)
@@ -164,7 +164,14 @@ iavf_set_mc_addr_list(struct rte_eth_dev *dev,
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
struct iavf_adapter *adapter =
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
- int err;
+ 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);
+ return -EINVAL;
+ }
/* flush previous addresses */
err = iavf_add_del_mc_addr_list(adapter, vf->mc_addrs, vf->mc_addrs_num,
@@ -172,17 +179,24 @@ iavf_set_mc_addr_list(struct rte_eth_dev *dev,
if (err)
return err;
- vf->mc_addrs_num = 0;
-
/* add new ones */
err = iavf_add_del_mc_addr_list(adapter, mc_addrs, mc_addrs_num, true);
- if (err)
- return err;
- vf->mc_addrs_num = mc_addrs_num;
- memcpy(vf->mc_addrs, mc_addrs, mc_addrs_num * sizeof(*mc_addrs));
+ if (err) {
+ /* When adding new addresses fail, need to add the
+ * previous addresses back.
+ */
+ ret = iavf_add_del_mc_addr_list(adapter, vf->mc_addrs,
+ vf->mc_addrs_num, true);
+ if (ret)
+ return ret;
+ } else {
+ vf->mc_addrs_num = mc_addrs_num;
+ memcpy(vf->mc_addrs,
+ mc_addrs, mc_addrs_num * sizeof(*mc_addrs));
+ }
- return 0;
+ return err;
}
static int
@@ -1107,9 +1107,6 @@ iavf_add_del_mc_addr_list(struct iavf_adapter *adapter,
if (mc_addrs == NULL || mc_addrs_num == 0)
return 0;
- if (mc_addrs_num > IAVF_NUM_MACADDR_MAX)
- return -EINVAL;
-
list = (struct virtchnl_ether_addr_list *)cmd_buffer;
list->vsi_id = vf->vsi_res->vsi_id;
list->num_elements = mc_addrs_num;