net/iavf: fix adding multicast MAC address

When the multicast address list is added, it will flush
previous addresses first, and then add new ones.
If the number of multicast address in the list exceeds
the upper limit, it will cause failure, then need to
roll back previous addresses. This patch fixes the issue.

Fixes: 05e4c3aff3 ("net/iavf: support multicast configuration")
Cc: stable@dpdk.org

Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
Tested-by: Yuan Peng <yuan.peng@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
Guinan Sun 2020-10-15 08:43:05 +00:00 committed by Ferruh Yigit
parent d5a7d04c79
commit b0cd767a75
2 changed files with 22 additions and 11 deletions

View File

@ -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) {
/* if adding mac address list fails, should 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

View File

@ -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;