@@ -1363,6 +1363,9 @@ netdev_dpdk_get_config(const struct netdev *netdev, struct smap *args)
return 0;
}
+static bool
+netdev_dpdk_bond_is_include(struct netdev_dpdk *dev, dpdk_port_t port_id);
+
static struct netdev_dpdk *
netdev_dpdk_lookup_by_port_id(dpdk_port_t port_id)
OVS_REQUIRES(dpdk_mutex)
@@ -1370,7 +1373,8 @@ netdev_dpdk_lookup_by_port_id(dpdk_port_t port_id)
struct netdev_dpdk *dev;
LIST_FOR_EACH (dev, list_node, &dpdk_list) {
- if (dev->port_id == port_id) {
+ if (dev->port_id == port_id ||
+ netdev_dpdk_bond_is_include(dev, port_id)) {
return dev;
}
}
@@ -1432,6 +1436,19 @@ netdev_dpdk_bond_uninit(struct netdev_dpdk *dev)
free(dev->bond);
}
+static bool
+netdev_dpdk_bond_is_include(struct netdev_dpdk *dev,
+ dpdk_port_t port_id)
+{
+ LIST_EACH_VALID_BOND_SLAVE(dev->bond->slaves) {
+ if (dev->bond->slaves[i] == port_id) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/* Check the PCIs or device names requested whether
* it's valid or not. */
static bool
@@ -1439,6 +1456,7 @@ netdev_dpdk_bond_slave_request(const struct netdev_dpdk *dev OVS_UNUSED,
const char *devargs, dpdk_port_t *rs)
{
dpdk_port_t port_id = DPDK_ETH_PORT_ID_INVALID;
+ struct netdev_dpdk *dpdk_dev = NULL;
char *pci = NULL, *save_ptr = NULL;
char *args = xstrdup(devargs);
int i;
@@ -1449,7 +1467,9 @@ netdev_dpdk_bond_slave_request(const struct netdev_dpdk *dev OVS_UNUSED,
pci != NULL; pci = strtok_r(NULL, ",", &save_ptr), i++) {
if (rte_eth_dev_get_port_by_name(pci, &port_id) ||
- !rte_eth_dev_is_valid_port(port_id)) {
+ !rte_eth_dev_is_valid_port(port_id) ||
+ ((dpdk_dev = netdev_dpdk_lookup_by_port_id(port_id)) &&
+ dpdk_dev != dev)) {
VLOG_INFO("Could not get the port id from pci address "
"or device name: %s, or the device is not attached, "