ethdev: fix adding invalid MAC address
Some customers find adding MAC addr to VF sometimes can fail, but it is still stored in dev->data->mac_addrs[ ]. So this can lead to some errors that assumes the non-zero entry in dev->data->mac_addrs[ ] is valid. Following acknowledgements are from specific NIC PMD maintainer for their managing part. This patch changes the ethdev internal API, it should not be backported to a stable/LTS release so far. Fixes: af75078fece3 ("first public release") Signed-off-by: Wei Dai <wei.dai@intel.com> Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com> Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com> Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
This commit is contained in:
parent
47aa48b969
commit
6d01e580ac
@ -71,10 +71,10 @@ static void eth_ark_dev_stats_get(struct rte_eth_dev *dev,
|
|||||||
static void eth_ark_dev_stats_reset(struct rte_eth_dev *dev);
|
static void eth_ark_dev_stats_reset(struct rte_eth_dev *dev);
|
||||||
static void eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,
|
static void eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr);
|
struct ether_addr *mac_addr);
|
||||||
static void eth_ark_macaddr_add(struct rte_eth_dev *dev,
|
static int eth_ark_macaddr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
uint32_t pool);
|
uint32_t pool);
|
||||||
static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
|
static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
|
||||||
uint32_t index);
|
uint32_t index);
|
||||||
|
|
||||||
@ -831,7 +831,7 @@ eth_ark_dev_stats_reset(struct rte_eth_dev *dev)
|
|||||||
ark->user_ext.stats_reset(dev, ark->user_data);
|
ark->user_ext.stats_reset(dev, ark->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
eth_ark_macaddr_add(struct rte_eth_dev *dev,
|
eth_ark_macaddr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
@ -840,12 +840,15 @@ eth_ark_macaddr_add(struct rte_eth_dev *dev,
|
|||||||
struct ark_adapter *ark =
|
struct ark_adapter *ark =
|
||||||
(struct ark_adapter *)dev->data->dev_private;
|
(struct ark_adapter *)dev->data->dev_private;
|
||||||
|
|
||||||
if (ark->user_ext.mac_addr_add)
|
if (ark->user_ext.mac_addr_add) {
|
||||||
ark->user_ext.mac_addr_add(dev,
|
ark->user_ext.mac_addr_add(dev,
|
||||||
mac_addr,
|
mac_addr,
|
||||||
index,
|
index,
|
||||||
pool,
|
pool,
|
||||||
ark->user_data);
|
ark->user_data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -451,14 +451,17 @@ bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_inf
|
|||||||
dev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_20G;
|
dev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_20G;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
bnx2x_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
bnx2x_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool)
|
uint32_t index, uint32_t pool)
|
||||||
{
|
{
|
||||||
struct bnx2x_softc *sc = dev->data->dev_private;
|
struct bnx2x_softc *sc = dev->data->dev_private;
|
||||||
|
|
||||||
if (sc->mac_ops.mac_addr_add)
|
if (sc->mac_ops.mac_addr_add) {
|
||||||
sc->mac_ops.mac_addr_add(dev, mac_addr, index, pool);
|
sc->mac_ops.mac_addr_add(dev, mac_addr, index, pool);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -618,9 +618,9 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
|
static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool)
|
uint32_t index, uint32_t pool)
|
||||||
{
|
{
|
||||||
struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
|
struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
|
||||||
struct bnxt_vnic_info *vnic = STAILQ_FIRST(&bp->ff_pool[pool]);
|
struct bnxt_vnic_info *vnic = STAILQ_FIRST(&bp->ff_pool[pool]);
|
||||||
@ -628,30 +628,30 @@ static void bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
|
|||||||
|
|
||||||
if (BNXT_VF(bp)) {
|
if (BNXT_VF(bp)) {
|
||||||
RTE_LOG(ERR, PMD, "Cannot add MAC address to a VF interface\n");
|
RTE_LOG(ERR, PMD, "Cannot add MAC address to a VF interface\n");
|
||||||
return;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vnic) {
|
if (!vnic) {
|
||||||
RTE_LOG(ERR, PMD, "VNIC not found for pool %d!\n", pool);
|
RTE_LOG(ERR, PMD, "VNIC not found for pool %d!\n", pool);
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
/* Attach requested MAC address to the new l2_filter */
|
/* Attach requested MAC address to the new l2_filter */
|
||||||
STAILQ_FOREACH(filter, &vnic->filter, next) {
|
STAILQ_FOREACH(filter, &vnic->filter, next) {
|
||||||
if (filter->mac_index == index) {
|
if (filter->mac_index == index) {
|
||||||
RTE_LOG(ERR, PMD,
|
RTE_LOG(ERR, PMD,
|
||||||
"MAC addr already existed for pool %d\n", pool);
|
"MAC addr already existed for pool %d\n", pool);
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
filter = bnxt_alloc_filter(bp);
|
filter = bnxt_alloc_filter(bp);
|
||||||
if (!filter) {
|
if (!filter) {
|
||||||
RTE_LOG(ERR, PMD, "L2 filter alloc failed\n");
|
RTE_LOG(ERR, PMD, "L2 filter alloc failed\n");
|
||||||
return;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
|
STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
|
||||||
filter->mac_index = index;
|
filter->mac_index = index;
|
||||||
memcpy(filter->l2_addr, mac_addr, ETHER_ADDR_LEN);
|
memcpy(filter->l2_addr, mac_addr, ETHER_ADDR_LEN);
|
||||||
bnxt_hwrm_set_filter(bp, vnic, filter);
|
return bnxt_hwrm_set_filter(bp, vnic, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
|
int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
|
||||||
|
@ -120,8 +120,8 @@ static int eth_em_led_on(struct rte_eth_dev *dev);
|
|||||||
static int eth_em_led_off(struct rte_eth_dev *dev);
|
static int eth_em_led_off(struct rte_eth_dev *dev);
|
||||||
|
|
||||||
static int em_get_rx_buffer_size(struct e1000_hw *hw);
|
static int em_get_rx_buffer_size(struct e1000_hw *hw);
|
||||||
static void eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
static int eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool);
|
uint32_t index, uint32_t pool);
|
||||||
static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index);
|
static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index);
|
||||||
|
|
||||||
static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev,
|
static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev,
|
||||||
@ -1794,13 +1794,13 @@ eth_em_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, __rte_unused uint32_t pool)
|
uint32_t index, __rte_unused uint32_t pool)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
|
|
||||||
e1000_rar_set(hw, mac_addr->addr_bytes, index);
|
return e1000_rar_set(hw, mac_addr->addr_bytes, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -171,9 +171,9 @@ static int eth_igb_led_off(struct rte_eth_dev *dev);
|
|||||||
|
|
||||||
static void igb_intr_disable(struct e1000_hw *hw);
|
static void igb_intr_disable(struct e1000_hw *hw);
|
||||||
static int igb_get_rx_buffer_size(struct e1000_hw *hw);
|
static int igb_get_rx_buffer_size(struct e1000_hw *hw);
|
||||||
static void eth_igb_rar_set(struct rte_eth_dev *dev,
|
static int eth_igb_rar_set(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool);
|
uint32_t index, uint32_t pool);
|
||||||
static void eth_igb_rar_clear(struct rte_eth_dev *dev, uint32_t index);
|
static void eth_igb_rar_clear(struct rte_eth_dev *dev, uint32_t index);
|
||||||
static void eth_igb_default_mac_addr_set(struct rte_eth_dev *dev,
|
static void eth_igb_default_mac_addr_set(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *addr);
|
struct ether_addr *addr);
|
||||||
@ -3079,7 +3079,7 @@ eth_igb_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define E1000_RAH_POOLSEL_SHIFT (18)
|
#define E1000_RAH_POOLSEL_SHIFT (18)
|
||||||
static void
|
static int
|
||||||
eth_igb_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
eth_igb_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, __rte_unused uint32_t pool)
|
uint32_t index, __rte_unused uint32_t pool)
|
||||||
{
|
{
|
||||||
@ -3090,6 +3090,7 @@ eth_igb_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
|||||||
rah = E1000_READ_REG(hw, E1000_RAH(index));
|
rah = E1000_READ_REG(hw, E1000_RAH(index));
|
||||||
rah |= (0x1 << (E1000_RAH_POOLSEL_SHIFT + pool));
|
rah |= (0x1 << (E1000_RAH_POOLSEL_SHIFT + pool));
|
||||||
E1000_WRITE_REG(hw, E1000_RAH(index), rah);
|
E1000_WRITE_REG(hw, E1000_RAH(index), rah);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -279,7 +279,7 @@ extern void enic_dev_stats_get(struct enic *enic,
|
|||||||
struct rte_eth_stats *r_stats);
|
struct rte_eth_stats *r_stats);
|
||||||
extern void enic_dev_stats_clear(struct enic *enic);
|
extern void enic_dev_stats_clear(struct enic *enic);
|
||||||
extern void enic_add_packet_filter(struct enic *enic);
|
extern void enic_add_packet_filter(struct enic *enic);
|
||||||
void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);
|
int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);
|
||||||
void enic_del_mac_address(struct enic *enic, int mac_index);
|
void enic_del_mac_address(struct enic *enic, int mac_index);
|
||||||
extern unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq);
|
extern unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq);
|
||||||
extern void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,
|
extern void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,
|
||||||
|
@ -533,14 +533,14 @@ static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
|||||||
enic_add_packet_filter(enic);
|
enic_add_packet_filter(enic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,
|
static int enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
__rte_unused uint32_t index, __rte_unused uint32_t pool)
|
__rte_unused uint32_t index, __rte_unused uint32_t pool)
|
||||||
{
|
{
|
||||||
struct enic *enic = pmd_priv(eth_dev);
|
struct enic *enic = pmd_priv(eth_dev);
|
||||||
|
|
||||||
ENICPMD_FUNC_TRACE();
|
ENICPMD_FUNC_TRACE();
|
||||||
enic_set_mac_address(enic, mac_addr->addr_bytes);
|
return enic_set_mac_address(enic, mac_addr->addr_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)
|
static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)
|
||||||
|
@ -202,20 +202,19 @@ void enic_del_mac_address(struct enic *enic, int mac_index)
|
|||||||
dev_err(enic, "del mac addr failed\n");
|
dev_err(enic, "del mac addr failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)
|
int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!is_eth_addr_valid(mac_addr)) {
|
if (!is_eth_addr_valid(mac_addr)) {
|
||||||
dev_err(enic, "invalid mac address\n");
|
dev_err(enic, "invalid mac address\n");
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vnic_dev_add_addr(enic->vdev, mac_addr);
|
err = vnic_dev_add_addr(enic->vdev, mac_addr);
|
||||||
if (err) {
|
if (err)
|
||||||
dev_err(enic, "add mac addr failed\n");
|
dev_err(enic, "add mac addr failed\n");
|
||||||
return;
|
return err;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1690,7 +1690,7 @@ static void fm10k_MAC_filter_set(struct rte_eth_dev *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Add a MAC address, and update filters */
|
/* Add a MAC address, and update filters */
|
||||||
static void
|
static int
|
||||||
fm10k_macaddr_add(struct rte_eth_dev *dev,
|
fm10k_macaddr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
@ -1701,6 +1701,7 @@ fm10k_macaddr_add(struct rte_eth_dev *dev,
|
|||||||
macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
|
macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
|
||||||
fm10k_MAC_filter_set(dev, mac_addr->addr_bytes, TRUE, pool);
|
fm10k_MAC_filter_set(dev, mac_addr->addr_bytes, TRUE, pool);
|
||||||
macvlan->mac_vmdq_id[index] = pool;
|
macvlan->mac_vmdq_id[index] = pool;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a MAC address, and update filters */
|
/* Remove a MAC address, and update filters */
|
||||||
|
@ -291,10 +291,10 @@ static int i40e_flow_ctrl_set(struct rte_eth_dev *dev,
|
|||||||
struct rte_eth_fc_conf *fc_conf);
|
struct rte_eth_fc_conf *fc_conf);
|
||||||
static int i40e_priority_flow_ctrl_set(struct rte_eth_dev *dev,
|
static int i40e_priority_flow_ctrl_set(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_pfc_conf *pfc_conf);
|
struct rte_eth_pfc_conf *pfc_conf);
|
||||||
static void i40e_macaddr_add(struct rte_eth_dev *dev,
|
static int i40e_macaddr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
uint32_t pool);
|
uint32_t pool);
|
||||||
static void i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index);
|
static void i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index);
|
||||||
static int i40e_dev_rss_reta_update(struct rte_eth_dev *dev,
|
static int i40e_dev_rss_reta_update(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_rss_reta_entry64 *reta_conf,
|
struct rte_eth_rss_reta_entry64 *reta_conf,
|
||||||
@ -3267,7 +3267,7 @@ i40e_priority_flow_ctrl_set(__rte_unused struct rte_eth_dev *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Add a MAC address, and update filters */
|
/* Add a MAC address, and update filters */
|
||||||
static void
|
static int
|
||||||
i40e_macaddr_add(struct rte_eth_dev *dev,
|
i40e_macaddr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
__rte_unused uint32_t index,
|
__rte_unused uint32_t index,
|
||||||
@ -3284,13 +3284,13 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
|
|||||||
PMD_DRV_LOG(ERR, "VMDQ not %s, can't set mac to pool %u",
|
PMD_DRV_LOG(ERR, "VMDQ not %s, can't set mac to pool %u",
|
||||||
pf->flags & I40E_FLAG_VMDQ ? "configured" : "enabled",
|
pf->flags & I40E_FLAG_VMDQ ? "configured" : "enabled",
|
||||||
pool);
|
pool);
|
||||||
return;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pool > pf->nb_cfg_vmdq_vsi) {
|
if (pool > pf->nb_cfg_vmdq_vsi) {
|
||||||
PMD_DRV_LOG(ERR, "Pool number %u invalid. Max pool is %u",
|
PMD_DRV_LOG(ERR, "Pool number %u invalid. Max pool is %u",
|
||||||
pool, pf->nb_cfg_vmdq_vsi);
|
pool, pf->nb_cfg_vmdq_vsi);
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
|
(void)rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
|
||||||
@ -3307,8 +3307,9 @@ i40e_macaddr_add(struct rte_eth_dev *dev,
|
|||||||
ret = i40e_vsi_add_mac(vsi, &mac_filter);
|
ret = i40e_vsi_add_mac(vsi, &mac_filter);
|
||||||
if (ret != I40E_SUCCESS) {
|
if (ret != I40E_SUCCESS) {
|
||||||
PMD_DRV_LOG(ERR, "Failed to add MACVLAN filter");
|
PMD_DRV_LOG(ERR, "Failed to add MACVLAN filter");
|
||||||
return;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a MAC address, and update filters */
|
/* Remove a MAC address, and update filters */
|
||||||
|
@ -136,10 +136,10 @@ static int i40evf_dev_tx_queue_start(struct rte_eth_dev *dev,
|
|||||||
uint16_t tx_queue_id);
|
uint16_t tx_queue_id);
|
||||||
static int i40evf_dev_tx_queue_stop(struct rte_eth_dev *dev,
|
static int i40evf_dev_tx_queue_stop(struct rte_eth_dev *dev,
|
||||||
uint16_t tx_queue_id);
|
uint16_t tx_queue_id);
|
||||||
static void i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
static int i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *addr,
|
struct ether_addr *addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
uint32_t pool);
|
uint32_t pool);
|
||||||
static void i40evf_del_mac_addr(struct rte_eth_dev *dev, uint32_t index);
|
static void i40evf_del_mac_addr(struct rte_eth_dev *dev, uint32_t index);
|
||||||
static int i40evf_dev_rss_reta_update(struct rte_eth_dev *dev,
|
static int i40evf_dev_rss_reta_update(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_rss_reta_entry64 *reta_conf,
|
struct rte_eth_rss_reta_entry64 *reta_conf,
|
||||||
@ -855,7 +855,7 @@ i40evf_stop_queues(struct rte_eth_dev *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *addr,
|
struct ether_addr *addr,
|
||||||
__rte_unused uint32_t index,
|
__rte_unused uint32_t index,
|
||||||
@ -873,7 +873,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
|||||||
addr->addr_bytes[0], addr->addr_bytes[1],
|
addr->addr_bytes[0], addr->addr_bytes[1],
|
||||||
addr->addr_bytes[2], addr->addr_bytes[3],
|
addr->addr_bytes[2], addr->addr_bytes[3],
|
||||||
addr->addr_bytes[4], addr->addr_bytes[5]);
|
addr->addr_bytes[4], addr->addr_bytes[5]);
|
||||||
return;
|
return I40E_ERR_INVALID_MAC_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
list = (struct i40e_virtchnl_ether_addr_list *)cmd_buffer;
|
list = (struct i40e_virtchnl_ether_addr_list *)cmd_buffer;
|
||||||
@ -892,7 +892,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,
|
|||||||
PMD_DRV_LOG(ERR, "fail to execute command "
|
PMD_DRV_LOG(ERR, "fail to execute command "
|
||||||
"OP_ADD_ETHER_ADDRESS");
|
"OP_ADD_ETHER_ADDRESS");
|
||||||
|
|
||||||
return;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -248,8 +248,8 @@ static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
|
|||||||
struct rte_intr_handle *handle);
|
struct rte_intr_handle *handle);
|
||||||
static void ixgbe_dev_interrupt_handler(void *param);
|
static void ixgbe_dev_interrupt_handler(void *param);
|
||||||
static void ixgbe_dev_interrupt_delayed_handler(void *param);
|
static void ixgbe_dev_interrupt_delayed_handler(void *param);
|
||||||
static void ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
static int ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool);
|
uint32_t index, uint32_t pool);
|
||||||
static void ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index);
|
static void ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index);
|
||||||
static void ixgbe_set_default_mac_addr(struct rte_eth_dev *dev,
|
static void ixgbe_set_default_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr);
|
struct ether_addr *mac_addr);
|
||||||
@ -305,9 +305,9 @@ static void ixgbe_configure_msix(struct rte_eth_dev *dev);
|
|||||||
static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
|
static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
|
||||||
uint16_t queue_idx, uint16_t tx_rate);
|
uint16_t queue_idx, uint16_t tx_rate);
|
||||||
|
|
||||||
static void ixgbevf_add_mac_addr(struct rte_eth_dev *dev,
|
static int ixgbevf_add_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool);
|
uint32_t index, uint32_t pool);
|
||||||
static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);
|
static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);
|
||||||
static void ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
|
static void ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr);
|
struct ether_addr *mac_addr);
|
||||||
@ -4637,14 +4637,15 @@ ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t pool)
|
uint32_t index, uint32_t pool)
|
||||||
{
|
{
|
||||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||||
uint32_t enable_addr = 1;
|
uint32_t enable_addr = 1;
|
||||||
|
|
||||||
ixgbe_set_rar(hw, index, mac_addr->addr_bytes, pool, enable_addr);
|
return ixgbe_set_rar(hw, index, mac_addr->addr_bytes,
|
||||||
|
pool, enable_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -5640,7 +5641,7 @@ static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
__attribute__((unused)) uint32_t index,
|
__attribute__((unused)) uint32_t index,
|
||||||
__attribute__((unused)) uint32_t pool)
|
__attribute__((unused)) uint32_t pool)
|
||||||
@ -5654,11 +5655,19 @@ ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
|||||||
* set of PF resources used to store VF MAC addresses.
|
* set of PF resources used to store VF MAC addresses.
|
||||||
*/
|
*/
|
||||||
if (memcmp(hw->mac.perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)
|
if (memcmp(hw->mac.perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)
|
||||||
return;
|
return -1;
|
||||||
diag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);
|
diag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);
|
||||||
if (diag == 0)
|
if (diag != 0)
|
||||||
return;
|
PMD_DRV_LOG(ERR, "Unable to add MAC address "
|
||||||
PMD_DRV_LOG(ERR, "Unable to add MAC address - diag=%d", diag);
|
"%02x:%02x:%02x:%02x:%02x:%02x - diag=%d",
|
||||||
|
mac_addr->addr_bytes[0],
|
||||||
|
mac_addr->addr_bytes[1],
|
||||||
|
mac_addr->addr_bytes[2],
|
||||||
|
mac_addr->addr_bytes[3],
|
||||||
|
mac_addr->addr_bytes[4],
|
||||||
|
mac_addr->addr_bytes[5],
|
||||||
|
diag);
|
||||||
|
return diag;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -4503,26 +4503,30 @@ end:
|
|||||||
* @param vmdq
|
* @param vmdq
|
||||||
* VMDq pool index to associate address with (ignored).
|
* VMDq pool index to associate address with (ignored).
|
||||||
*/
|
*/
|
||||||
static void
|
static int
|
||||||
mlx4_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
mlx4_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t vmdq)
|
uint32_t index, uint32_t vmdq)
|
||||||
{
|
{
|
||||||
struct priv *priv = dev->data->dev_private;
|
struct priv *priv = dev->data->dev_private;
|
||||||
|
int re;
|
||||||
|
|
||||||
if (mlx4_is_secondary())
|
if (mlx4_is_secondary())
|
||||||
return;
|
return -ENOTSUP;
|
||||||
(void)vmdq;
|
(void)vmdq;
|
||||||
priv_lock(priv);
|
priv_lock(priv);
|
||||||
DEBUG("%p: adding MAC address at index %" PRIu32,
|
DEBUG("%p: adding MAC address at index %" PRIu32,
|
||||||
(void *)dev, index);
|
(void *)dev, index);
|
||||||
/* Last array entry is reserved for broadcast. */
|
/* Last array entry is reserved for broadcast. */
|
||||||
if (index >= (elemof(priv->mac) - 1))
|
if (index >= (elemof(priv->mac) - 1)) {
|
||||||
|
re = EINVAL;
|
||||||
goto end;
|
goto end;
|
||||||
priv_mac_addr_add(priv, index,
|
}
|
||||||
(const uint8_t (*)[ETHER_ADDR_LEN])
|
re = priv_mac_addr_add(priv, index,
|
||||||
mac_addr->addr_bytes);
|
(const uint8_t (*)[ETHER_ADDR_LEN])
|
||||||
|
mac_addr->addr_bytes);
|
||||||
end:
|
end:
|
||||||
priv_unlock(priv);
|
priv_unlock(priv);
|
||||||
|
return -re;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -238,8 +238,8 @@ int hash_rxq_mac_addrs_add(struct hash_rxq *);
|
|||||||
int priv_mac_addr_add(struct priv *, unsigned int,
|
int priv_mac_addr_add(struct priv *, unsigned int,
|
||||||
const uint8_t (*)[ETHER_ADDR_LEN]);
|
const uint8_t (*)[ETHER_ADDR_LEN]);
|
||||||
int priv_mac_addrs_enable(struct priv *);
|
int priv_mac_addrs_enable(struct priv *);
|
||||||
void mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,
|
int mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,
|
||||||
uint32_t);
|
uint32_t);
|
||||||
void mlx5_mac_addr_set(struct rte_eth_dev *, struct ether_addr *);
|
void mlx5_mac_addr_set(struct rte_eth_dev *, struct ether_addr *);
|
||||||
|
|
||||||
/* mlx5_rss.c */
|
/* mlx5_rss.c */
|
||||||
|
@ -470,26 +470,30 @@ priv_mac_addrs_enable(struct priv *priv)
|
|||||||
* @param vmdq
|
* @param vmdq
|
||||||
* VMDq pool index to associate address with (ignored).
|
* VMDq pool index to associate address with (ignored).
|
||||||
*/
|
*/
|
||||||
void
|
int
|
||||||
mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t vmdq)
|
uint32_t index, uint32_t vmdq)
|
||||||
{
|
{
|
||||||
struct priv *priv = dev->data->dev_private;
|
struct priv *priv = dev->data->dev_private;
|
||||||
|
int re;
|
||||||
|
|
||||||
if (mlx5_is_secondary())
|
if (mlx5_is_secondary())
|
||||||
return;
|
return -ENOTSUP;
|
||||||
|
|
||||||
(void)vmdq;
|
(void)vmdq;
|
||||||
priv_lock(priv);
|
priv_lock(priv);
|
||||||
DEBUG("%p: adding MAC address at index %" PRIu32,
|
DEBUG("%p: adding MAC address at index %" PRIu32,
|
||||||
(void *)dev, index);
|
(void *)dev, index);
|
||||||
if (index >= RTE_DIM(priv->mac))
|
if (index >= RTE_DIM(priv->mac)) {
|
||||||
|
re = EINVAL;
|
||||||
goto end;
|
goto end;
|
||||||
priv_mac_addr_add(priv, index,
|
}
|
||||||
(const uint8_t (*)[ETHER_ADDR_LEN])
|
re = priv_mac_addr_add(priv, index,
|
||||||
mac_addr->addr_bytes);
|
(const uint8_t (*)[ETHER_ADDR_LEN])
|
||||||
|
mac_addr->addr_bytes);
|
||||||
end:
|
end:
|
||||||
priv_unlock(priv);
|
priv_unlock(priv);
|
||||||
|
return -re;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -508,16 +508,18 @@ qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,
|
qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,
|
||||||
__rte_unused uint32_t index, __rte_unused uint32_t pool)
|
__rte_unused uint32_t index, __rte_unused uint32_t pool)
|
||||||
{
|
{
|
||||||
struct ecore_filter_ucast ucast;
|
struct ecore_filter_ucast ucast;
|
||||||
|
int re;
|
||||||
|
|
||||||
qede_set_ucast_cmn_params(&ucast);
|
qede_set_ucast_cmn_params(&ucast);
|
||||||
ucast.type = ECORE_FILTER_MAC;
|
ucast.type = ECORE_FILTER_MAC;
|
||||||
ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
|
ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
|
||||||
(void)qede_mac_int_ops(eth_dev, &ucast, 1);
|
re = (int)qede_mac_int_ops(eth_dev, &ucast, 1);
|
||||||
|
return re;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -224,12 +224,13 @@ eth_mac_addr_remove(struct rte_eth_dev *dev __rte_unused,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
eth_mac_addr_add(struct rte_eth_dev *dev __rte_unused,
|
eth_mac_addr_add(struct rte_eth_dev *dev __rte_unused,
|
||||||
struct ether_addr *mac_addr __rte_unused,
|
struct ether_addr *mac_addr __rte_unused,
|
||||||
uint32_t index __rte_unused,
|
uint32_t index __rte_unused,
|
||||||
uint32_t vmdq __rte_unused)
|
uint32_t vmdq __rte_unused)
|
||||||
{
|
{
|
||||||
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -87,7 +87,7 @@ static void virtio_dev_stats_reset(struct rte_eth_dev *dev);
|
|||||||
static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
|
static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
|
||||||
static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
|
static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
|
||||||
uint16_t vlan_id, int on);
|
uint16_t vlan_id, int on);
|
||||||
static void virtio_mac_addr_add(struct rte_eth_dev *dev,
|
static int virtio_mac_addr_add(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t vmdq __rte_unused);
|
uint32_t index, uint32_t vmdq __rte_unused);
|
||||||
static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
|
static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
|
||||||
@ -1025,7 +1025,7 @@ virtio_get_hwaddr(struct virtio_hw *hw)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
virtio_mac_table_set(struct virtio_hw *hw,
|
virtio_mac_table_set(struct virtio_hw *hw,
|
||||||
const struct virtio_net_ctrl_mac *uc,
|
const struct virtio_net_ctrl_mac *uc,
|
||||||
const struct virtio_net_ctrl_mac *mc)
|
const struct virtio_net_ctrl_mac *mc)
|
||||||
@ -1035,7 +1035,7 @@ virtio_mac_table_set(struct virtio_hw *hw,
|
|||||||
|
|
||||||
if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
|
if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
|
||||||
PMD_DRV_LOG(INFO, "host does not support mac table");
|
PMD_DRV_LOG(INFO, "host does not support mac table");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
|
ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
|
||||||
@ -1050,9 +1050,10 @@ virtio_mac_table_set(struct virtio_hw *hw,
|
|||||||
err = virtio_send_command(hw->cvq, &ctrl, len, 2);
|
err = virtio_send_command(hw->cvq, &ctrl, len, 2);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
PMD_DRV_LOG(NOTICE, "mac table set failed: %d", err);
|
PMD_DRV_LOG(NOTICE, "mac table set failed: %d", err);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
||||||
uint32_t index, uint32_t vmdq __rte_unused)
|
uint32_t index, uint32_t vmdq __rte_unused)
|
||||||
{
|
{
|
||||||
@ -1063,7 +1064,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
|||||||
|
|
||||||
if (index >= VIRTIO_MAX_MAC_ADDRS) {
|
if (index >= VIRTIO_MAX_MAC_ADDRS) {
|
||||||
PMD_DRV_LOG(ERR, "mac address index %u out of range", index);
|
PMD_DRV_LOG(ERR, "mac address index %u out of range", index);
|
||||||
return;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
|
uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
|
||||||
@ -1080,7 +1081,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
|
|||||||
memcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);
|
memcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_mac_table_set(hw, uc, mc);
|
return virtio_mac_table_set(hw, uc, mc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2369,6 +2369,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
|
|||||||
struct rte_eth_dev *dev;
|
struct rte_eth_dev *dev;
|
||||||
int index;
|
int index;
|
||||||
uint64_t pool_mask;
|
uint64_t pool_mask;
|
||||||
|
int ret;
|
||||||
|
|
||||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
||||||
dev = &rte_eth_devices[port_id];
|
dev = &rte_eth_devices[port_id];
|
||||||
@ -2401,15 +2402,17 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Update NIC */
|
/* Update NIC */
|
||||||
(*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
|
ret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
|
||||||
|
|
||||||
/* Update address in NIC data structure */
|
if (ret == 0) {
|
||||||
ether_addr_copy(addr, &dev->data->mac_addrs[index]);
|
/* Update address in NIC data structure */
|
||||||
|
ether_addr_copy(addr, &dev->data->mac_addrs[index]);
|
||||||
|
|
||||||
/* Update pool bitmap in NIC data structure */
|
/* Update pool bitmap in NIC data structure */
|
||||||
dev->data->mac_pool_sel[index] |= (1ULL << pool);
|
dev->data->mac_pool_sel[index] |= (1ULL << pool);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1282,7 +1282,7 @@ typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev);
|
|||||||
typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);
|
typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);
|
||||||
/**< @internal Remove MAC address from receive address register */
|
/**< @internal Remove MAC address from receive address register */
|
||||||
|
|
||||||
typedef void (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
|
typedef int (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
|
||||||
struct ether_addr *mac_addr,
|
struct ether_addr *mac_addr,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
uint32_t vmdq);
|
uint32_t vmdq);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user