net/bonding: fix bonding in 8023ad mode

This patch blocks possibility to set master bonding by
rte_eth_bond_mode_set() in 802.3ad mode, as the API
doesn't prevent this.

Fixes: 6d72657ce379 ("net/bonding: add other aggregator modes")
Cc: stable@dpdk.org

Signed-off-by: Jacek Piasecki <jacekx.piasecki@intel.com>
Reviewed-by: Radu Nicolau <radu.nicolau@intel.com>
This commit is contained in:
Jacek Piasecki 2017-08-08 14:56:43 +02:00 committed by Ferruh Yigit
parent 0c62250ba6
commit 1184582b5f
2 changed files with 31 additions and 1 deletions

View File

@ -33,6 +33,25 @@ valid_bonded_port_id(uint16_t port_id)
return check_for_bonded_ethdev(&rte_eth_devices[port_id]);
}
int
check_for_master_bonded_ethdev(const struct rte_eth_dev *eth_dev)
{
int i;
struct bond_dev_private *internals;
if (check_for_bonded_ethdev(eth_dev) != 0)
return 0;
internals = eth_dev->data->dev_private;
/* Check if any of slave devices is a bonded device */
for (i = 0; i < internals->slave_count; i++)
if (valid_bonded_port_id(internals->slaves[i].port_id) == 0)
return 1;
return 0;
}
int
valid_slave_port_id(uint16_t port_id, uint8_t mode)
{
@ -467,10 +486,18 @@ rte_eth_bond_slave_remove(uint16_t bonded_port_id, uint16_t slave_port_id)
int
rte_eth_bond_mode_set(uint16_t bonded_port_id, uint8_t mode)
{
struct rte_eth_dev *bonded_eth_dev;
if (valid_bonded_port_id(bonded_port_id) != 0)
return -1;
return bond_ethdev_mode_set(&rte_eth_devices[bonded_port_id], mode);
bonded_eth_dev = &rte_eth_devices[bonded_port_id];
if (check_for_master_bonded_ethdev(bonded_eth_dev) != 0 &&
mode == BONDING_MODE_8023AD)
return -1;
return bond_ethdev_mode_set(bonded_eth_dev, mode);
}
int

View File

@ -153,6 +153,9 @@ struct bond_dev_private {
extern const struct eth_dev_ops default_dev_ops;
int
check_for_master_bonded_ethdev(const struct rte_eth_dev *eth_dev);
int
check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev);