Skip to content

Commit

Permalink
net/iavf: fix lack of MAC type when set MAC address
Browse files Browse the repository at this point in the history
[ upstream commit b335e72 ]

When set default MAC address, use type VIRTCHNL_ETHER_ADDR_PRIMARY as this
case is changing device/primary unicast MAC. For other cases, such as
adding or deleting extra unicast addresses and multicast addresses, use
type VIRTCHNL_ETHER_ADDR_EXTRA.

Fixes: cb25d43 ("net/avf: enable MAC VLAN and promisc ops")

Signed-off-by: Robin Zhang <robinx.zhang@intel.com>
Tested-by: Yan Xia <yanx.xia@intel.com>
  • Loading branch information
RobinXZhang authored and steevenlee committed May 8, 2021
1 parent 674d4cb commit 86ec5ae
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 11 deletions.
2 changes: 1 addition & 1 deletion drivers/net/iavf/iavf.h
Expand Up @@ -314,7 +314,7 @@ int iavf_query_stats(struct iavf_adapter *adapter,
int iavf_config_promisc(struct iavf_adapter *adapter, bool enable_unicast,
bool enable_multicast);
int iavf_add_del_eth_addr(struct iavf_adapter *adapter,
struct rte_ether_addr *addr, bool add);
struct rte_ether_addr *addr, bool add, uint8_t type);
int iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add);
int iavf_fdir_add(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter);
int iavf_fdir_del(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter);
Expand Down
16 changes: 7 additions & 9 deletions drivers/net/iavf/iavf_ethdev.c
Expand Up @@ -954,7 +954,7 @@ iavf_dev_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *addr,
return -EINVAL;
}

err = iavf_add_del_eth_addr(adapter, addr, true);
err = iavf_add_del_eth_addr(adapter, addr, true, VIRTCHNL_ETHER_ADDR_EXTRA);
if (err) {
PMD_DRV_LOG(ERR, "fail to add MAC address");
return -EIO;
Expand All @@ -976,7 +976,7 @@ iavf_dev_del_mac_addr(struct rte_eth_dev *dev, uint32_t index)

addr = &dev->data->mac_addrs[index];

err = iavf_add_del_eth_addr(adapter, addr, false);
err = iavf_add_del_eth_addr(adapter, addr, false, VIRTCHNL_ETHER_ADDR_EXTRA);
if (err)
PMD_DRV_LOG(ERR, "fail to delete MAC address");

Expand Down Expand Up @@ -1188,17 +1188,15 @@ iavf_dev_set_default_mac_addr(struct rte_eth_dev *dev,
struct iavf_adapter *adapter =
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(adapter);
struct rte_ether_addr *perm_addr, *old_addr;
struct rte_ether_addr *old_addr;
int ret;

old_addr = (struct rte_ether_addr *)hw->mac.addr;
perm_addr = (struct rte_ether_addr *)hw->mac.perm_addr;

/* If the MAC address is configured by host, skip the setting */
if (rte_is_valid_assigned_ether_addr(perm_addr))
return -EPERM;
if (rte_is_same_ether_addr(old_addr, mac_addr))
return 0;

ret = iavf_add_del_eth_addr(adapter, old_addr, false);
ret = iavf_add_del_eth_addr(adapter, old_addr, false, VIRTCHNL_ETHER_ADDR_PRIMARY);
if (ret)
PMD_DRV_LOG(ERR, "Fail to delete old MAC:"
" %02X:%02X:%02X:%02X:%02X:%02X",
Expand All @@ -1209,7 +1207,7 @@ iavf_dev_set_default_mac_addr(struct rte_eth_dev *dev,
old_addr->addr_bytes[4],
old_addr->addr_bytes[5]);

ret = iavf_add_del_eth_addr(adapter, mac_addr, true);
ret = iavf_add_del_eth_addr(adapter, mac_addr, true, VIRTCHNL_ETHER_ADDR_PRIMARY);
if (ret)
PMD_DRV_LOG(ERR, "Fail to add new MAC:"
" %02X:%02X:%02X:%02X:%02X:%02X",
Expand Down
5 changes: 4 additions & 1 deletion drivers/net/iavf/iavf_vchnl.c
Expand Up @@ -1016,6 +1016,7 @@ iavf_add_del_all_mac_addr(struct iavf_adapter *adapter, bool add)
continue;
rte_memcpy(list->list[j].addr, addr->addr_bytes,
sizeof(addr->addr_bytes));
list->list[j].type = VIRTCHNL_ETHER_ADDR_EXTRA;
PMD_DRV_LOG(DEBUG, "add/rm mac:%x:%x:%x:%x:%x:%x",
addr->addr_bytes[0], addr->addr_bytes[1],
addr->addr_bytes[2], addr->addr_bytes[3],
Expand Down Expand Up @@ -1111,7 +1112,7 @@ iavf_config_promisc(struct iavf_adapter *adapter,

int
iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,
bool add)
bool add, uint8_t type)
{
struct virtchnl_ether_addr_list *list;
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
Expand All @@ -1123,6 +1124,7 @@ iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,
list = (struct virtchnl_ether_addr_list *)cmd_buffer;
list->vsi_id = vf->vsi_res->vsi_id;
list->num_elements = 1;
list->list[0].type = type;
rte_memcpy(list->list[0].addr, addr->addr_bytes,
sizeof(addr->addr_bytes));

Expand Down Expand Up @@ -1377,6 +1379,7 @@ iavf_add_del_mc_addr_list(struct iavf_adapter *adapter,

memcpy(list->list[i].addr, mc_addrs[i].addr_bytes,
sizeof(list->list[i].addr));
list->list[i].type = VIRTCHNL_ETHER_ADDR_EXTRA;
}

args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;
Expand Down

0 comments on commit 86ec5ae

Please sign in to comment.