ethdev: change allmulticast callbacks to return status
Enabling/disabling of allmulticast mode is not always successful and it should be taken into account to be able to handle it properly. When correct return status is unclear from driver code, -EAGAIN is used. Signed-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com> Acked-by: Hyong Youb Kim <hyonkim@cisco.com>
This commit is contained in:
parent
73e83bf500
commit
ca041cd44f
@ -26,8 +26,8 @@ static void atl_dev_close(struct rte_eth_dev *dev);
|
||||
static int atl_dev_reset(struct rte_eth_dev *dev);
|
||||
static int atl_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int atl_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void atl_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void atl_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int atl_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int atl_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int atl_dev_link_update(struct rte_eth_dev *dev, int wait);
|
||||
|
||||
static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
|
||||
@ -1229,23 +1229,27 @@ atl_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
atl_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
|
||||
hw_atl_rpfl2_accept_all_mc_packets_set(hw, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
atl_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
|
||||
hw_atl_rpfl2_accept_all_mc_packets_set(hw, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -17,8 +17,8 @@ static void axgbe_dev_interrupt_handler(void *param);
|
||||
static void axgbe_dev_close(struct rte_eth_dev *dev);
|
||||
static int axgbe_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int axgbe_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void axgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void axgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int axgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int axgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int axgbe_dev_link_update(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
static int axgbe_dev_stats_get(struct rte_eth_dev *dev,
|
||||
@ -260,7 +260,7 @@ axgbe_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
axgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct axgbe_port *pdata = dev->data->dev_private;
|
||||
@ -268,11 +268,13 @@ axgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if (AXGMAC_IOREAD_BITS(pdata, MAC_PFR, PM))
|
||||
return;
|
||||
return 0;
|
||||
AXGMAC_IOWRITE_BITS(pdata, MAC_PFR, PM, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
axgbe_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct axgbe_port *pdata = dev->data->dev_private;
|
||||
@ -280,8 +282,10 @@ axgbe_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if (!AXGMAC_IOREAD_BITS(pdata, MAC_PFR, PM))
|
||||
return;
|
||||
return 0;
|
||||
AXGMAC_IOWRITE_BITS(pdata, MAC_PFR, PM, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* return 0 means link status changed, -1 means not changed */
|
||||
|
@ -320,7 +320,7 @@ bnx2x_promisc_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
bnx2x_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct bnx2x_softc *sc = dev->data->dev_private;
|
||||
@ -330,9 +330,11 @@ bnx2x_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
if (rte_eth_promiscuous_get(dev->data->port_id) == 1)
|
||||
sc->rx_mode = BNX2X_RX_MODE_ALLMULTI_PROMISC;
|
||||
bnx2x_set_rx_mode(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
bnx2x_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct bnx2x_softc *sc = dev->data->dev_private;
|
||||
@ -342,6 +344,8 @@ bnx2x_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
if (rte_eth_promiscuous_get(dev->data->port_id) == 1)
|
||||
sc->rx_mode = BNX2X_RX_MODE_PROMISC;
|
||||
bnx2x_set_rx_mode(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1048,32 +1048,46 @@ static int bnxt_promiscuous_disable_op(struct rte_eth_dev *eth_dev)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void bnxt_allmulticast_enable_op(struct rte_eth_dev *eth_dev)
|
||||
static int bnxt_allmulticast_enable_op(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bnxt *bp = eth_dev->data->dev_private;
|
||||
struct bnxt_vnic_info *vnic;
|
||||
uint32_t old_flags;
|
||||
int rc;
|
||||
|
||||
if (bp->vnic_info == NULL)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
vnic = &bp->vnic_info[0];
|
||||
|
||||
old_flags = vnic->flags;
|
||||
vnic->flags |= BNXT_VNIC_INFO_ALLMULTI;
|
||||
bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic, 0, NULL);
|
||||
rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic, 0, NULL);
|
||||
if (rc != 0)
|
||||
vnic->flags = old_flags;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void bnxt_allmulticast_disable_op(struct rte_eth_dev *eth_dev)
|
||||
static int bnxt_allmulticast_disable_op(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bnxt *bp = eth_dev->data->dev_private;
|
||||
struct bnxt_vnic_info *vnic;
|
||||
uint32_t old_flags;
|
||||
int rc;
|
||||
|
||||
if (bp->vnic_info == NULL)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
vnic = &bp->vnic_info[0];
|
||||
|
||||
old_flags = vnic->flags;
|
||||
vnic->flags &= ~BNXT_VNIC_INFO_ALLMULTI;
|
||||
bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic, 0, NULL);
|
||||
rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic, 0, NULL);
|
||||
if (rc != 0)
|
||||
vnic->flags = old_flags;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Return bnxt_rx_queue pointer corresponding to a given rxq. */
|
||||
|
@ -2642,12 +2642,12 @@ bond_ethdev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bond_dev_private *internals = eth_dev->data->dev_private;
|
||||
int i;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
uint16_t port_id;
|
||||
|
||||
switch (internals->mode) {
|
||||
@ -2655,7 +2655,9 @@ bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
case BONDING_MODE_ROUND_ROBIN:
|
||||
case BONDING_MODE_BALANCE:
|
||||
case BONDING_MODE_BROADCAST:
|
||||
case BONDING_MODE_8023AD:
|
||||
case BONDING_MODE_8023AD: {
|
||||
unsigned int slave_ok = 0;
|
||||
|
||||
for (i = 0; i < internals->slave_count; i++) {
|
||||
port_id = internals->slaves[i].port_id;
|
||||
|
||||
@ -2664,8 +2666,17 @@ bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
RTE_BOND_LOG(ERR,
|
||||
"Failed to enable allmulti mode for port %u: %s",
|
||||
port_id, rte_strerror(-ret));
|
||||
else
|
||||
slave_ok++;
|
||||
}
|
||||
/*
|
||||
* Report success if operation is successful on at least
|
||||
* on one slave. Otherwise return last error code.
|
||||
*/
|
||||
if (slave_ok > 0)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
/* allmulti mode is propagated only to primary slave */
|
||||
case BONDING_MODE_ACTIVE_BACKUP:
|
||||
case BONDING_MODE_TLB:
|
||||
@ -2681,14 +2692,16 @@ bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
"Failed to enable allmulti mode for port %u: %s",
|
||||
port_id, rte_strerror(-ret));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bond_dev_private *internals = eth_dev->data->dev_private;
|
||||
int i;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
uint16_t port_id;
|
||||
|
||||
switch (internals->mode) {
|
||||
@ -2696,7 +2709,9 @@ bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
case BONDING_MODE_ROUND_ROBIN:
|
||||
case BONDING_MODE_BALANCE:
|
||||
case BONDING_MODE_BROADCAST:
|
||||
case BONDING_MODE_8023AD:
|
||||
case BONDING_MODE_8023AD: {
|
||||
unsigned int slave_ok = 0;
|
||||
|
||||
for (i = 0; i < internals->slave_count; i++) {
|
||||
uint16_t port_id = internals->slaves[i].port_id;
|
||||
|
||||
@ -2710,8 +2725,17 @@ bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
RTE_BOND_LOG(ERR,
|
||||
"Failed to disable allmulti mode for port %u: %s",
|
||||
port_id, rte_strerror(-ret));
|
||||
else
|
||||
slave_ok++;
|
||||
}
|
||||
/*
|
||||
* Report success if operation is successful on at least
|
||||
* on one slave. Otherwise return last error code.
|
||||
*/
|
||||
if (slave_ok > 0)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
/* allmulti mode is propagated only to primary slave */
|
||||
case BONDING_MODE_ACTIVE_BACKUP:
|
||||
case BONDING_MODE_TLB:
|
||||
@ -2727,6 +2751,8 @@ bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
"Failed to disable allmulti mode for port %u: %s",
|
||||
port_id, rte_strerror(-ret));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -168,26 +168,26 @@ int cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
0, -1, 1, -1, false);
|
||||
}
|
||||
|
||||
void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
int cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = eth_dev->data->dev_private;
|
||||
struct adapter *adapter = pi->adapter;
|
||||
|
||||
/* TODO: address filters ?? */
|
||||
|
||||
t4_set_rxmode(adapter, adapter->mbox, pi->viid, -1,
|
||||
-1, 1, 1, -1, false);
|
||||
return t4_set_rxmode(adapter, adapter->mbox, pi->viid, -1,
|
||||
-1, 1, 1, -1, false);
|
||||
}
|
||||
|
||||
void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
int cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = eth_dev->data->dev_private;
|
||||
struct adapter *adapter = pi->adapter;
|
||||
|
||||
/* TODO: address filters ?? */
|
||||
|
||||
t4_set_rxmode(adapter, adapter->mbox, pi->viid, -1,
|
||||
-1, 0, 1, -1, false);
|
||||
return t4_set_rxmode(adapter, adapter->mbox, pi->viid, -1,
|
||||
-1, 0, 1, -1, false);
|
||||
}
|
||||
|
||||
int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
|
||||
|
@ -14,8 +14,8 @@ int cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
struct rte_eth_dev_info *device_info);
|
||||
int cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr);
|
||||
int cxgbe_dev_configure(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t queue_idx,
|
||||
|
@ -538,22 +538,26 @@ static int dpaa_eth_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dpaa_eth_multicast_enable(struct rte_eth_dev *dev)
|
||||
static int dpaa_eth_multicast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct dpaa_if *dpaa_intf = dev->data->dev_private;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
fman_if_set_mcast_filter_table(dpaa_intf->fif);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dpaa_eth_multicast_disable(struct rte_eth_dev *dev)
|
||||
static int dpaa_eth_multicast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct dpaa_if *dpaa_intf = dev->data->dev_private;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
fman_if_reset_mcast_filter_table(dpaa_intf->fif);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
|
@ -1043,7 +1043,7 @@ dpaa2_dev_promiscuous_disable(
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
dpaa2_dev_allmulticast_enable(
|
||||
struct rte_eth_dev *dev)
|
||||
{
|
||||
@ -1055,15 +1055,17 @@ dpaa2_dev_allmulticast_enable(
|
||||
|
||||
if (dpni == NULL) {
|
||||
DPAA2_PMD_ERR("dpni is NULL");
|
||||
return;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
|
||||
if (ret < 0)
|
||||
DPAA2_PMD_ERR("Unable to enable multicast mode %d", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
@ -1074,16 +1076,18 @@ dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
|
||||
if (dpni == NULL) {
|
||||
DPAA2_PMD_ERR("dpni is NULL");
|
||||
return;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* must remain on for all promiscuous */
|
||||
if (dev->data->promiscuous == 1)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
|
||||
if (ret < 0)
|
||||
DPAA2_PMD_ERR("Unable to disable multicast mode %d", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -37,8 +37,8 @@ static void eth_em_stop(struct rte_eth_dev *dev);
|
||||
static void eth_em_close(struct rte_eth_dev *dev);
|
||||
static int eth_em_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int eth_em_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void eth_em_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void eth_em_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int eth_em_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int eth_em_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int eth_em_link_update(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
static int eth_em_stats_get(struct rte_eth_dev *dev,
|
||||
@ -1297,7 +1297,7 @@ eth_em_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_em_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw =
|
||||
@ -1307,9 +1307,11 @@ eth_em_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
rctl = E1000_READ_REG(hw, E1000_RCTL);
|
||||
rctl |= E1000_RCTL_MPE;
|
||||
E1000_WRITE_REG(hw, E1000_RCTL, rctl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_em_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw =
|
||||
@ -1317,10 +1319,12 @@ eth_em_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
uint32_t rctl;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
rctl = E1000_READ_REG(hw, E1000_RCTL);
|
||||
rctl &= (~E1000_RCTL_MPE);
|
||||
E1000_WRITE_REG(hw, E1000_RCTL, rctl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -81,8 +81,8 @@ static void eth_igb_close(struct rte_eth_dev *dev);
|
||||
static int eth_igb_reset(struct rte_eth_dev *dev);
|
||||
static int eth_igb_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int eth_igb_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void eth_igb_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void eth_igb_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int eth_igb_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int eth_igb_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int eth_igb_link_update(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
static int eth_igb_stats_get(struct rte_eth_dev *dev,
|
||||
@ -158,8 +158,8 @@ static void igbvf_dev_stop(struct rte_eth_dev *dev);
|
||||
static void igbvf_dev_close(struct rte_eth_dev *dev);
|
||||
static int igbvf_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int igbvf_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void igbvf_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void igbvf_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int igbvf_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int igbvf_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int eth_igbvf_link_update(struct e1000_hw *hw);
|
||||
static int eth_igbvf_stats_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_stats *rte_stats);
|
||||
@ -2557,7 +2557,7 @@ eth_igb_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_igb_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw =
|
||||
@ -2567,9 +2567,11 @@ eth_igb_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
rctl = E1000_READ_REG(hw, E1000_RCTL);
|
||||
rctl |= E1000_RCTL_MPE;
|
||||
E1000_WRITE_REG(hw, E1000_RCTL, rctl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_igb_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw =
|
||||
@ -2577,10 +2579,12 @@ eth_igb_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
uint32_t rctl;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
rctl = E1000_READ_REG(hw, E1000_RCTL);
|
||||
rctl &= (~E1000_RCTL_MPE);
|
||||
E1000_WRITE_REG(hw, E1000_RCTL, rctl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -3425,7 +3429,7 @@ igbvf_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
igbvf_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
@ -3433,9 +3437,11 @@ igbvf_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
/* In promiscuous mode multicast promisc already set */
|
||||
if (dev->data->promiscuous == 0)
|
||||
e1000_promisc_set_vf(hw, e1000_promisc_multicast);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
igbvf_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
@ -3443,6 +3449,8 @@ igbvf_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
/* In promiscuous mode leave multicast promisc enabled */
|
||||
if (dev->data->promiscuous == 0)
|
||||
e1000_promisc_set_vf(hw, e1000_promisc_disabled);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int igbvf_set_vfta(struct e1000_hw *hw, uint16_t vid, bool on)
|
||||
|
@ -563,7 +563,7 @@ enetc_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
enetc_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct enetc_eth_hw *hw =
|
||||
@ -577,9 +577,11 @@ enetc_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
psipmr |= ENETC_PSIPMR_SET_MP(0);
|
||||
|
||||
enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
enetc_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct enetc_eth_hw *hw =
|
||||
@ -588,13 +590,15 @@ enetc_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
uint32_t psipmr = 0;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
|
||||
/* Setting to disable all multicast mode for SI0*/
|
||||
psipmr = enetc_port_rd(enetc_hw, ENETC_PSIPMR) &
|
||||
~(ENETC_PSIPMR_SET_MP(0));
|
||||
|
||||
enetc_port_wr(enetc_hw, ENETC_PSIPMR, psipmr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -638,28 +638,38 @@ static int enicpmd_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void enicpmd_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
static int enicpmd_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
int ret;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic->allmulti = 1;
|
||||
enic_add_packet_filter(enic);
|
||||
ret = enic_add_packet_filter(enic);
|
||||
if (ret != 0)
|
||||
enic->allmulti = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
static int enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
int ret;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic->allmulti = 0;
|
||||
enic_add_packet_filter(enic);
|
||||
ret = enic_add_packet_filter(enic);
|
||||
if (ret != 0)
|
||||
enic->allmulti = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,
|
||||
|
@ -718,7 +718,7 @@ fs_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
fs_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct sub_device *sdev;
|
||||
@ -746,9 +746,11 @@ fs_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
}
|
||||
}
|
||||
fs_unlock(dev, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
fs_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct sub_device *sdev;
|
||||
@ -776,6 +778,8 @@ fs_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
}
|
||||
}
|
||||
fs_unlock(dev, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -46,8 +46,8 @@ int fm10k_logtype_driver;
|
||||
static void fm10k_close_mbx_service(struct fm10k_hw *hw);
|
||||
static int fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static inline int fm10k_glort_valid(struct fm10k_hw *hw);
|
||||
static int
|
||||
fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);
|
||||
@ -964,7 +964,7 @@ fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
@ -974,7 +974,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
|
||||
/* Return if it didn't acquire valid glort range */
|
||||
if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
/* If promiscuous mode is enabled, it doesn't make sense to enable
|
||||
* allmulticast and disable promiscuous since fm10k only can select
|
||||
@ -983,7 +983,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
if (dev->data->promiscuous) {
|
||||
PMD_INIT_LOG(INFO, "Promiscuous mode is enabled, "\
|
||||
"needn't enable allmulticast");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm10k_mbx_lock(hw);
|
||||
@ -991,11 +991,15 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
FM10K_XCAST_MODE_ALLMULTI);
|
||||
fm10k_mbx_unlock(hw);
|
||||
|
||||
if (status != FM10K_SUCCESS)
|
||||
if (status != FM10K_SUCCESS) {
|
||||
PMD_INIT_LOG(ERR, "Failed to enable allmulticast mode");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
@ -1005,12 +1009,12 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
|
||||
/* Return if it didn't acquire valid glort range */
|
||||
if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (dev->data->promiscuous) {
|
||||
PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode "\
|
||||
"since promisc mode is enabled");
|
||||
return;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fm10k_mbx_lock(hw);
|
||||
@ -1019,8 +1023,12 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
FM10K_XCAST_MODE_NONE);
|
||||
fm10k_mbx_unlock(hw);
|
||||
|
||||
if (status != FM10K_SUCCESS)
|
||||
if (status != FM10K_SUCCESS) {
|
||||
PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -225,8 +225,8 @@ static void i40e_dev_close(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_reset(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_set_link_up(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_set_link_down(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_stats_get(struct rte_eth_dev *dev,
|
||||
@ -2624,7 +2624,7 @@ i40e_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40e_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
@ -2633,11 +2633,15 @@ i40e_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
ret = i40e_aq_set_vsi_multicast_promiscuous(hw, vsi->seid, TRUE, NULL);
|
||||
if (ret != I40E_SUCCESS)
|
||||
if (ret != I40E_SUCCESS) {
|
||||
PMD_DRV_LOG(ERR, "Failed to enable multicast promiscuous");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40e_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
@ -2646,12 +2650,16 @@ i40e_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
|
||||
ret = i40e_aq_set_vsi_multicast_promiscuous(hw,
|
||||
vsi->seid, FALSE, NULL);
|
||||
if (ret != I40E_SUCCESS)
|
||||
if (ret != I40E_SUCCESS) {
|
||||
PMD_DRV_LOG(ERR, "Failed to disable multicast promiscuous");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -94,8 +94,8 @@ static void i40evf_dev_close(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_reset(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int i40evf_init_vlan(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_rx_queue_start(struct rte_eth_dev *dev,
|
||||
uint16_t rx_queue_id);
|
||||
@ -2196,7 +2196,7 @@ i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
|
||||
@ -2204,14 +2204,18 @@ i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
|
||||
/* If enabled, just return */
|
||||
if (vf->promisc_multicast_enabled)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1);
|
||||
if (ret == 0)
|
||||
vf->promisc_multicast_enabled = TRUE;
|
||||
else
|
||||
ret = -EAGAIN;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
|
||||
@ -2219,11 +2223,15 @@ i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
|
||||
/* If enabled, just return */
|
||||
if (!vf->promisc_multicast_enabled)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0);
|
||||
if (ret == 0)
|
||||
vf->promisc_multicast_enabled = FALSE;
|
||||
else
|
||||
ret = -EAGAIN;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -294,22 +294,22 @@ i40e_vf_representor_promiscuous_disable(struct rte_eth_dev *ethdev)
|
||||
representor->vf_id, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40e_vf_representor_allmulticast_enable(struct rte_eth_dev *ethdev)
|
||||
{
|
||||
struct i40e_vf_representor *representor = ethdev->data->dev_private;
|
||||
|
||||
rte_pmd_i40e_set_vf_multicast_promisc(
|
||||
return rte_pmd_i40e_set_vf_multicast_promisc(
|
||||
representor->adapter->eth_dev->data->port_id,
|
||||
representor->vf_id, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
i40e_vf_representor_allmulticast_disable(struct rte_eth_dev *ethdev)
|
||||
{
|
||||
struct i40e_vf_representor *representor = ethdev->data->dev_private;
|
||||
|
||||
rte_pmd_i40e_set_vf_multicast_promisc(
|
||||
return rte_pmd_i40e_set_vf_multicast_promisc(
|
||||
representor->adapter->eth_dev->data->port_id,
|
||||
representor->vf_id, 0);
|
||||
}
|
||||
|
@ -45,8 +45,8 @@ static int iavf_dev_stats_get(struct rte_eth_dev *dev,
|
||||
static int iavf_dev_stats_reset(struct rte_eth_dev *dev);
|
||||
static int iavf_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int iavf_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void iavf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void iavf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int iavf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int iavf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int iavf_dev_add_mac_addr(struct rte_eth_dev *dev,
|
||||
struct rte_ether_addr *addr,
|
||||
uint32_t index,
|
||||
@ -674,7 +674,7 @@ iavf_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
iavf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct iavf_adapter *adapter =
|
||||
@ -683,14 +683,18 @@ iavf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
if (vf->promisc_multicast_enabled)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = iavf_config_promisc(adapter, vf->promisc_unicast_enabled, TRUE);
|
||||
if (!ret)
|
||||
vf->promisc_multicast_enabled = TRUE;
|
||||
else
|
||||
ret = -EAGAIN;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
iavf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct iavf_adapter *adapter =
|
||||
@ -699,11 +703,15 @@ iavf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
if (!vf->promisc_multicast_enabled)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = iavf_config_promisc(adapter, vf->promisc_unicast_enabled, FALSE);
|
||||
if (!ret)
|
||||
vf->promisc_multicast_enabled = FALSE;
|
||||
else
|
||||
ret = -EAGAIN;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -69,8 +69,8 @@ static int ice_rss_hash_conf_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_rss_conf *rss_conf);
|
||||
static int ice_promisc_enable(struct rte_eth_dev *dev);
|
||||
static int ice_promisc_disable(struct rte_eth_dev *dev);
|
||||
static void ice_allmulti_enable(struct rte_eth_dev *dev);
|
||||
static void ice_allmulti_disable(struct rte_eth_dev *dev);
|
||||
static int ice_allmulti_enable(struct rte_eth_dev *dev);
|
||||
static int ice_allmulti_disable(struct rte_eth_dev *dev);
|
||||
static int ice_vlan_filter_set(struct rte_eth_dev *dev,
|
||||
uint16_t vlan_id,
|
||||
int on);
|
||||
@ -3152,7 +3152,7 @@ ice_promisc_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ice_allmulti_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
@ -3160,15 +3160,26 @@ ice_allmulti_enable(struct rte_eth_dev *dev)
|
||||
struct ice_vsi *vsi = pf->main_vsi;
|
||||
enum ice_status status;
|
||||
uint8_t pmask;
|
||||
int ret = 0;
|
||||
|
||||
pmask = ICE_PROMISC_MCAST_RX | ICE_PROMISC_MCAST_TX;
|
||||
|
||||
status = ice_set_vsi_promisc(hw, vsi->idx, pmask, 0);
|
||||
if (status != ICE_SUCCESS)
|
||||
|
||||
switch (status) {
|
||||
case ICE_ERR_ALREADY_EXISTS:
|
||||
PMD_DRV_LOG(DEBUG, "Allmulti has already been enabled");
|
||||
case ICE_SUCCESS:
|
||||
break;
|
||||
default:
|
||||
PMD_DRV_LOG(ERR, "Failed to enable allmulti, err=%d", status);
|
||||
ret = -EAGAIN;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ice_allmulti_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
@ -3176,15 +3187,20 @@ ice_allmulti_disable(struct rte_eth_dev *dev)
|
||||
struct ice_vsi *vsi = pf->main_vsi;
|
||||
enum ice_status status;
|
||||
uint8_t pmask;
|
||||
int ret = 0;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
|
||||
pmask = ICE_PROMISC_MCAST_RX | ICE_PROMISC_MCAST_TX;
|
||||
|
||||
status = ice_clear_vsi_promisc(hw, vsi->idx, pmask, 0);
|
||||
if (status != ICE_SUCCESS)
|
||||
if (status != ICE_SUCCESS) {
|
||||
PMD_DRV_LOG(ERR, "Failed to clear allmulti, err=%d", status);
|
||||
ret = -EAGAIN;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ice_rx_queue_intr_enable(struct rte_eth_dev *dev,
|
||||
|
@ -543,9 +543,9 @@ int
|
||||
ipn3ke_rpst_promiscuous_enable(struct rte_eth_dev *ethdev);
|
||||
int
|
||||
ipn3ke_rpst_promiscuous_disable(struct rte_eth_dev *ethdev);
|
||||
void
|
||||
int
|
||||
ipn3ke_rpst_allmulticast_enable(struct rte_eth_dev *ethdev);
|
||||
void
|
||||
int
|
||||
ipn3ke_rpst_allmulticast_disable(struct rte_eth_dev *ethdev);
|
||||
int
|
||||
ipn3ke_rpst_mac_addr_set(struct rte_eth_dev *ethdev,
|
||||
|
@ -2674,7 +2674,7 @@ ipn3ke_rpst_promiscuous_disable(struct rte_eth_dev *ethdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
ipn3ke_rpst_allmulticast_enable(struct rte_eth_dev *ethdev)
|
||||
{
|
||||
struct ipn3ke_hw *hw = IPN3KE_DEV_PRIVATE_TO_HW(ethdev);
|
||||
@ -2698,9 +2698,11 @@ ipn3ke_rpst_allmulticast_enable(struct rte_eth_dev *ethdev)
|
||||
rpst->port_id,
|
||||
0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
ipn3ke_rpst_allmulticast_disable(struct rte_eth_dev *ethdev)
|
||||
{
|
||||
struct ipn3ke_hw *hw = IPN3KE_DEV_PRIVATE_TO_HW(ethdev);
|
||||
@ -2724,6 +2726,8 @@ ipn3ke_rpst_allmulticast_disable(struct rte_eth_dev *ethdev)
|
||||
rpst->port_id,
|
||||
0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -151,8 +151,8 @@ static void ixgbe_dev_close(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_reset(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int ixgbe_dev_link_update(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
static int ixgbe_dev_stats_get(struct rte_eth_dev *dev,
|
||||
@ -272,8 +272,8 @@ static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
|
||||
static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
|
||||
static int ixgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
|
||||
/* For Eth VMDQ APIs support */
|
||||
static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct
|
||||
@ -4220,7 +4220,7 @@ ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
@ -4229,20 +4229,24 @@ ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
|
||||
fctrl |= IXGBE_FCTRL_MPE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
uint32_t fctrl;
|
||||
|
||||
if (dev->data->promiscuous == 1)
|
||||
return; /* must remain in all_multicast mode */
|
||||
return 0; /* must remain in all_multicast mode */
|
||||
|
||||
fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
|
||||
fctrl &= (~IXGBE_FCTRL_MPE);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -8457,20 +8461,47 @@ ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
int ret;
|
||||
int mode = IXGBEVF_XCAST_MODE_ALLMULTI;
|
||||
|
||||
hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
|
||||
switch (hw->mac.ops.update_xcast_mode(hw, mode)) {
|
||||
case IXGBE_SUCCESS:
|
||||
ret = 0;
|
||||
break;
|
||||
case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
int ret;
|
||||
|
||||
hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
|
||||
switch (hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI)) {
|
||||
case IXGBE_SUCCESS:
|
||||
ret = 0;
|
||||
break;
|
||||
case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
|
||||
|
@ -1049,7 +1049,7 @@ lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
return lio_change_dev_flag(eth_dev);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct lio_device *lio_dev = LIO_DEV(eth_dev);
|
||||
@ -1057,14 +1057,14 @@ lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
if (!lio_dev->intf_open) {
|
||||
lio_dev_err(lio_dev, "Port %d down, can't enable multicast\n",
|
||||
lio_dev->port_id);
|
||||
return;
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
lio_dev->ifflags |= LIO_IFFLAG_ALLMULTI;
|
||||
lio_change_dev_flag(eth_dev);
|
||||
return lio_change_dev_flag(eth_dev);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct lio_device *lio_dev = LIO_DEV(eth_dev);
|
||||
@ -1072,11 +1072,11 @@ lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
if (!lio_dev->intf_open) {
|
||||
lio_dev_err(lio_dev, "Port %d down, can't disable multicast\n",
|
||||
lio_dev->port_id);
|
||||
return;
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
lio_dev->ifflags &= ~LIO_IFFLAG_ALLMULTI;
|
||||
lio_change_dev_flag(eth_dev);
|
||||
return lio_change_dev_flag(eth_dev);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -207,8 +207,8 @@ int mlx4_dev_set_link_down(struct rte_eth_dev *dev);
|
||||
int mlx4_dev_set_link_up(struct rte_eth_dev *dev);
|
||||
int mlx4_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
int mlx4_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
void mlx4_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
void mlx4_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
int mlx4_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
int mlx4_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
void mlx4_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
|
||||
int mlx4_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
|
||||
uint32_t index, uint32_t vmdq);
|
||||
|
@ -414,11 +414,14 @@ mlx4_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
||||
*/
|
||||
void
|
||||
int
|
||||
mlx4_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
mlx4_rxmode_toggle(dev, RXMODE_TOGGLE_ALLMULTI_ON);
|
||||
return mlx4_rxmode_toggle(dev, RXMODE_TOGGLE_ALLMULTI_ON);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -426,11 +429,14 @@ mlx4_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
||||
*/
|
||||
void
|
||||
int
|
||||
mlx4_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
mlx4_rxmode_toggle(dev, RXMODE_TOGGLE_ALLMULTI_OFF);
|
||||
return mlx4_rxmode_toggle(dev, RXMODE_TOGGLE_ALLMULTI_OFF);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -762,8 +762,8 @@ int mlx5_dev_rss_reta_update(struct rte_eth_dev *dev,
|
||||
|
||||
int mlx5_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
int mlx5_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
void mlx5_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
void mlx5_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
int mlx5_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
int mlx5_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
|
||||
/* mlx5_stats.c */
|
||||
|
||||
|
@ -101,8 +101,11 @@ mlx5_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
||||
*/
|
||||
void
|
||||
int
|
||||
mlx5_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct mlx5_priv *priv = dev->data->dev_private;
|
||||
@ -114,14 +117,23 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
"port %u cannot enable allmulticast mode"
|
||||
" in flow isolation mode",
|
||||
dev->data->port_id);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
if (priv->config.vf) {
|
||||
ret = mlx5_nl_allmulti(dev, 1);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
if (priv->config.vf)
|
||||
mlx5_nl_allmulti(dev, 1);
|
||||
ret = mlx5_traffic_restart(dev);
|
||||
if (ret)
|
||||
DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s",
|
||||
dev->data->port_id, strerror(rte_errno));
|
||||
error:
|
||||
/*
|
||||
* rte_eth_allmulticast_enable() rollback
|
||||
* dev->data->all_multicast in the case of failure.
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,18 +141,30 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
||||
*/
|
||||
void
|
||||
int
|
||||
mlx5_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct mlx5_priv *priv = dev->data->dev_private;
|
||||
int ret;
|
||||
|
||||
dev->data->all_multicast = 0;
|
||||
if (priv->config.vf)
|
||||
mlx5_nl_allmulti(dev, 0);
|
||||
if (priv->config.vf) {
|
||||
ret = mlx5_nl_allmulti(dev, 0);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
ret = mlx5_traffic_restart(dev);
|
||||
if (ret)
|
||||
DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",
|
||||
dev->data->port_id, strerror(rte_errno));
|
||||
error:
|
||||
/*
|
||||
* rte_eth_allmulticast_disable() rollback
|
||||
* dev->data->all_multicast in the case of failure.
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
|
@ -1024,22 +1024,29 @@ mrvl_promiscuous_enable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, negative error value otherwise.
|
||||
*/
|
||||
static void
|
||||
static int
|
||||
mrvl_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct mrvl_priv *priv = dev->data->dev_private;
|
||||
int ret;
|
||||
|
||||
if (!priv->ppio)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (priv->isolated)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = pp2_ppio_set_mc_promisc(priv->ppio, 1);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
MRVL_LOG(ERR, "Failed enable all-multicast mode");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1074,19 +1081,26 @@ mrvl_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, negative error value otherwise.
|
||||
*/
|
||||
static void
|
||||
static int
|
||||
mrvl_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct mrvl_priv *priv = dev->data->dev_private;
|
||||
int ret;
|
||||
|
||||
if (!priv->ppio)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ret = pp2_ppio_set_mc_promisc(priv->ppio, 0);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
MRVL_LOG(ERR, "Failed to disable all-multicast mode");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -438,7 +438,7 @@ hn_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return hn_vf_promiscuous_disable(dev);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
hn_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct hn_data *hv = dev->data->dev_private;
|
||||
@ -446,17 +446,17 @@ hn_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
hn_rndis_set_rxfilter(hv, NDIS_PACKET_TYPE_DIRECTED |
|
||||
NDIS_PACKET_TYPE_ALL_MULTICAST |
|
||||
NDIS_PACKET_TYPE_BROADCAST);
|
||||
hn_vf_allmulticast_enable(dev);
|
||||
return hn_vf_allmulticast_enable(dev);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
hn_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct hn_data *hv = dev->data->dev_private;
|
||||
|
||||
hn_rndis_set_rxfilter(hv, NDIS_PACKET_TYPE_DIRECTED |
|
||||
NDIS_PACKET_TYPE_BROADCAST);
|
||||
hn_vf_allmulticast_disable(dev);
|
||||
return hn_vf_allmulticast_disable(dev);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -212,8 +212,8 @@ void hn_vf_reset(struct rte_eth_dev *dev);
|
||||
void hn_vf_stop(struct rte_eth_dev *dev);
|
||||
void hn_vf_close(struct rte_eth_dev *dev);
|
||||
|
||||
void hn_vf_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
void hn_vf_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
int hn_vf_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
int hn_vf_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
int hn_vf_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
int hn_vf_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
int hn_vf_mc_addr_list(struct rte_eth_dev *dev,
|
||||
|
@ -400,14 +400,14 @@ int hn_vf_stats_reset(struct rte_eth_dev *dev)
|
||||
VF_ETHDEV_FUNC_RET_STATUS(dev, rte_eth_stats_reset);
|
||||
}
|
||||
|
||||
void hn_vf_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
int hn_vf_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
VF_ETHDEV_FUNC(dev, rte_eth_allmulticast_enable);
|
||||
VF_ETHDEV_FUNC_RET_STATUS(dev, rte_eth_allmulticast_enable);
|
||||
}
|
||||
|
||||
void hn_vf_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
int hn_vf_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
VF_ETHDEV_FUNC(dev, rte_eth_allmulticast_disable);
|
||||
VF_ETHDEV_FUNC_RET_STATUS(dev, rte_eth_allmulticast_disable);
|
||||
}
|
||||
|
||||
int hn_vf_promiscuous_enable(struct rte_eth_dev *dev)
|
||||
|
@ -59,7 +59,7 @@ nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
|
||||
return (status.mac_filter == RXMAC_MAC_FILTER_PROMISCUOUS);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct pmd_internals *internals = (struct pmd_internals *)
|
||||
@ -70,9 +70,11 @@ nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
nc_rxmac_mac_filter_enable(internals->rxmac[i],
|
||||
RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct pmd_internals *internals = (struct pmd_internals *)
|
||||
@ -82,12 +84,14 @@ nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
|
||||
/* if multicast is not enabled do nothing */
|
||||
if (!nfb_eth_allmulticast_get(dev))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < internals->max_rxmac; ++i) {
|
||||
nc_rxmac_mac_filter_enable(internals->rxmac[i],
|
||||
internals->rx_filter_original);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -57,8 +57,10 @@ nfb_eth_allmulticast_get(struct rte_eth_dev *dev);
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return always 0
|
||||
*/
|
||||
void
|
||||
int
|
||||
nfb_eth_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
|
||||
/**
|
||||
@ -66,8 +68,10 @@ nfb_eth_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
*
|
||||
* @param dev
|
||||
* Pointer to Ethernet device structure.
|
||||
*
|
||||
* @return always 0
|
||||
*/
|
||||
void
|
||||
int
|
||||
nfb_eth_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
|
||||
#endif /* _NFB_RXMODE_H_ */
|
||||
|
@ -381,8 +381,8 @@ int otx2_nix_rx_descriptor_status(void *rx_queue, uint16_t offset);
|
||||
void otx2_nix_promisc_config(struct rte_eth_dev *eth_dev, int en);
|
||||
int otx2_nix_promisc_enable(struct rte_eth_dev *eth_dev);
|
||||
int otx2_nix_promisc_disable(struct rte_eth_dev *eth_dev);
|
||||
void otx2_nix_allmulticast_enable(struct rte_eth_dev *eth_dev);
|
||||
void otx2_nix_allmulticast_disable(struct rte_eth_dev *eth_dev);
|
||||
int otx2_nix_allmulticast_enable(struct rte_eth_dev *eth_dev);
|
||||
int otx2_nix_allmulticast_disable(struct rte_eth_dev *eth_dev);
|
||||
int otx2_nix_tx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx);
|
||||
int otx2_nix_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx);
|
||||
uint64_t otx2_nix_rxq_mbuf_setup(struct otx2_eth_dev *dev, uint16_t port_id);
|
||||
|
@ -167,16 +167,20 @@ nix_allmulticast_config(struct rte_eth_dev *eth_dev, int en)
|
||||
otx2_mbox_process(mbox);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
otx2_nix_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
nix_allmulticast_config(eth_dev, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
otx2_nix_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
nix_allmulticast_config(eth_dev, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1760,25 +1760,32 @@ static int qede_reset_stats(struct rte_eth_dev *eth_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qede_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
static int qede_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
enum qed_filter_rx_mode_type type =
|
||||
QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC;
|
||||
enum _ecore_status_t ecore_status;
|
||||
|
||||
if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1)
|
||||
type |= QED_FILTER_RX_MODE_TYPE_PROMISC;
|
||||
|
||||
qed_configure_filter_rx_mode(eth_dev, type);
|
||||
ecore_status = qed_configure_filter_rx_mode(eth_dev, type);
|
||||
|
||||
return ecore_status >= ECORE_SUCCESS ? 0 : -EAGAIN;
|
||||
}
|
||||
|
||||
static void qede_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
static int qede_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
enum _ecore_status_t ecore_status;
|
||||
|
||||
if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1)
|
||||
qed_configure_filter_rx_mode(eth_dev,
|
||||
ecore_status = qed_configure_filter_rx_mode(eth_dev,
|
||||
QED_FILTER_RX_MODE_TYPE_PROMISC);
|
||||
else
|
||||
qed_configure_filter_rx_mode(eth_dev,
|
||||
ecore_status = qed_configure_filter_rx_mode(eth_dev,
|
||||
QED_FILTER_RX_MODE_TYPE_REGULAR);
|
||||
|
||||
return ecore_status >= ECORE_SUCCESS ? 0 : -EAGAIN;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -414,16 +414,16 @@ sfc_dev_promisc_disable(struct rte_eth_dev *dev)
|
||||
return sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_PROMISC, B_FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
sfc_dev_allmulti_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_TRUE);
|
||||
return sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
sfc_dev_allmulti_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_FALSE);
|
||||
return sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1362,16 +1362,18 @@ eth_promiscuous_disable(struct rte_eth_dev *dev __rte_unused)
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_allmulticast_enable(struct rte_eth_dev *dev __rte_unused)
|
||||
{
|
||||
PMD_DRV_LOG(WARNING, "Enabling allmulticast mode is not supported.");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
eth_allmulticast_disable(struct rte_eth_dev *dev __rte_unused)
|
||||
{
|
||||
PMD_DRV_LOG(WARNING, "Disabling allmulticast mode is not supported.");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
static const struct eth_dev_ops ops = {
|
||||
|
@ -1158,28 +1158,60 @@ tap_promisc_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
tap_allmulti_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct pmd_internals *pmd = dev->data->dev_private;
|
||||
struct ifreq ifr = { .ifr_flags = IFF_ALLMULTI };
|
||||
int ret;
|
||||
|
||||
dev->data->all_multicast = 1;
|
||||
tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 1, LOCAL_AND_REMOTE);
|
||||
if (pmd->remote_if_index && !pmd->flow_isolate)
|
||||
tap_flow_implicit_create(pmd, TAP_REMOTE_ALLMULTI);
|
||||
ret = tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 1, LOCAL_AND_REMOTE);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (pmd->remote_if_index && !pmd->flow_isolate) {
|
||||
dev->data->all_multicast = 1;
|
||||
ret = tap_flow_implicit_create(pmd, TAP_REMOTE_ALLMULTI);
|
||||
if (ret != 0) {
|
||||
/* Rollback allmulti flag */
|
||||
tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 0, LOCAL_AND_REMOTE);
|
||||
/*
|
||||
* rte_eth_dev_allmulticast_enable() rollback
|
||||
* dev->data->all_multicast in the case of failure.
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
tap_allmulti_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct pmd_internals *pmd = dev->data->dev_private;
|
||||
struct ifreq ifr = { .ifr_flags = IFF_ALLMULTI };
|
||||
int ret;
|
||||
|
||||
dev->data->all_multicast = 0;
|
||||
tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 0, LOCAL_AND_REMOTE);
|
||||
if (pmd->remote_if_index && !pmd->flow_isolate)
|
||||
tap_flow_implicit_destroy(pmd, TAP_REMOTE_ALLMULTI);
|
||||
ret = tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 0, LOCAL_AND_REMOTE);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (pmd->remote_if_index && !pmd->flow_isolate) {
|
||||
dev->data->all_multicast = 0;
|
||||
ret = tap_flow_implicit_destroy(pmd, TAP_REMOTE_ALLMULTI);
|
||||
if (ret != 0) {
|
||||
/* Rollback allmulti flag */
|
||||
tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 1, LOCAL_AND_REMOTE);
|
||||
/*
|
||||
* rte_eth_dev_allmulticast_disable() rollback
|
||||
* dev->data->all_multicast in the case of failure.
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -43,8 +43,8 @@ static int virtio_dev_start(struct rte_eth_dev *dev);
|
||||
static void virtio_dev_stop(struct rte_eth_dev *dev);
|
||||
static int virtio_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int virtio_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void virtio_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void virtio_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int virtio_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int virtio_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int virtio_dev_info_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_dev_info *dev_info);
|
||||
static int virtio_dev_link_update(struct rte_eth_dev *dev,
|
||||
@ -800,7 +800,7 @@ virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
virtio_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct virtio_hw *hw = dev->data->dev_private;
|
||||
@ -810,7 +810,7 @@ virtio_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
|
||||
if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
|
||||
PMD_INIT_LOG(INFO, "host does not support rx control");
|
||||
return;
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
|
||||
@ -819,11 +819,15 @@ virtio_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
dlen[0] = 1;
|
||||
|
||||
ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
PMD_INIT_LOG(ERR, "Failed to enable allmulticast");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct virtio_hw *hw = dev->data->dev_private;
|
||||
@ -833,7 +837,7 @@ virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
|
||||
if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
|
||||
PMD_INIT_LOG(INFO, "host does not support rx control");
|
||||
return;
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
|
||||
@ -842,8 +846,12 @@ virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
dlen[0] = 1;
|
||||
|
||||
ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
PMD_INIT_LOG(ERR, "Failed to disable allmulticast");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define VLAN_TAG_LEN 4 /* 802.3ac tag (not DMA'd) */
|
||||
|
@ -67,8 +67,8 @@ static void vmxnet3_dev_close(struct rte_eth_dev *dev);
|
||||
static void vmxnet3_dev_set_rxmode(struct vmxnet3_hw *hw, uint32_t feature, int set);
|
||||
static int vmxnet3_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void vmxnet3_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static void vmxnet3_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int vmxnet3_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
static int vmxnet3_dev_allmulticast_disable(struct rte_eth_dev *dev);
|
||||
static int __vmxnet3_dev_link_update(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
static int vmxnet3_dev_link_update(struct rte_eth_dev *dev,
|
||||
@ -1299,21 +1299,25 @@ vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
}
|
||||
|
||||
/* Allmulticast supported only if Vmxnet3_DriverShared is initialized in adapter */
|
||||
static void
|
||||
static int
|
||||
vmxnet3_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct vmxnet3_hw *hw = dev->data->dev_private;
|
||||
|
||||
vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_ALL_MULTI, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Allmulticast supported only if Vmxnet3_DriverShared is initialized in adapter */
|
||||
static void
|
||||
static int
|
||||
vmxnet3_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct vmxnet3_hw *hw = dev->data->dev_private;
|
||||
|
||||
vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_ALL_MULTI, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Enable/disable filter on vlan */
|
||||
|
@ -1968,30 +1968,38 @@ int
|
||||
rte_eth_allmulticast_enable(uint16_t port_id)
|
||||
{
|
||||
struct rte_eth_dev *dev;
|
||||
uint8_t old_allmulticast;
|
||||
int diag;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
||||
dev = &rte_eth_devices[port_id];
|
||||
|
||||
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_enable, -ENOTSUP);
|
||||
(*dev->dev_ops->allmulticast_enable)(dev);
|
||||
dev->data->all_multicast = 1;
|
||||
old_allmulticast = dev->data->all_multicast;
|
||||
diag = (*dev->dev_ops->allmulticast_enable)(dev);
|
||||
dev->data->all_multicast = (diag == 0) ? 1 : old_allmulticast;
|
||||
|
||||
return 0;
|
||||
return eth_err(port_id, diag);
|
||||
}
|
||||
|
||||
int
|
||||
rte_eth_allmulticast_disable(uint16_t port_id)
|
||||
{
|
||||
struct rte_eth_dev *dev;
|
||||
uint8_t old_allmulticast;
|
||||
int diag;
|
||||
|
||||
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
||||
dev = &rte_eth_devices[port_id];
|
||||
|
||||
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_disable, -ENOTSUP);
|
||||
old_allmulticast = dev->data->all_multicast;
|
||||
dev->data->all_multicast = 0;
|
||||
(*dev->dev_ops->allmulticast_disable)(dev);
|
||||
diag = (*dev->dev_ops->allmulticast_disable)(dev);
|
||||
if (diag != 0)
|
||||
dev->data->all_multicast = old_allmulticast;
|
||||
|
||||
return 0;
|
||||
return eth_err(port_id, diag);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -102,11 +102,55 @@ typedef int (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
|
||||
*/
|
||||
typedef int (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
|
||||
|
||||
typedef void (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev);
|
||||
/**< @internal Enable the receipt of all multicast packets by an Ethernet device. */
|
||||
/**
|
||||
* @internal
|
||||
* Enable the receipt of all multicast packets by an Ethernet device.
|
||||
*
|
||||
* @param dev
|
||||
* ethdev handle of port.
|
||||
*
|
||||
* @return
|
||||
* Negative errno value on error, 0 on success.
|
||||
*
|
||||
* @retval 0
|
||||
* Success, all-multicast mode is enabled.
|
||||
* @retval -ENOTSUP
|
||||
* All-multicast mode is not supported.
|
||||
* @retval -ENODEV
|
||||
* Device is gone.
|
||||
* @retval -E_RTE_SECONDARY
|
||||
* Function was called from a secondary process instance and not supported.
|
||||
* @retval -ETIMEDOUT
|
||||
* Attempt to enable all-multicast mode failed because of timeout.
|
||||
* @retval -EAGAIN
|
||||
* Failed to enable all-multicast mode.
|
||||
*/
|
||||
typedef int (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev);
|
||||
|
||||
typedef void (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev);
|
||||
/**< @internal Disable the receipt of all multicast packets by an Ethernet device. */
|
||||
/**
|
||||
* @internal
|
||||
* Disable the receipt of all multicast packets by an Ethernet device.
|
||||
*
|
||||
* @param dev
|
||||
* ethdev handle of port.
|
||||
*
|
||||
* @return
|
||||
* Negative errno value on error, 0 on success.
|
||||
*
|
||||
* @retval 0
|
||||
* Success, all-multicast mode is disabled.
|
||||
* @retval -ENOTSUP
|
||||
* All-multicast mode disabling is not supported.
|
||||
* @retval -ENODEV
|
||||
* Device is gone.
|
||||
* @retval -E_RTE_SECONDARY
|
||||
* Function was called from a secondary process instance and not supported.
|
||||
* @retval -ETIMEDOUT
|
||||
* Attempt to disable all-multicast mode failed because of timeout.
|
||||
* @retval -EAGAIN
|
||||
* Failed to disable all-multicast mode.
|
||||
*/
|
||||
typedef int (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev);
|
||||
|
||||
typedef int (*eth_link_update_t)(struct rte_eth_dev *dev,
|
||||
int wait_to_complete);
|
||||
|
Loading…
Reference in New Issue
Block a user