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);
 
                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;
 
        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");
 
        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",
                            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",
 
                                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],
 
 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);
        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));
 
 
                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;