activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id)
{
struct bond_dev_private *internals = eth_dev->data->dev_private;
+ uint8_t active_count = internals->active_slave_count;
if (internals->mode == BONDING_MODE_8023AD)
bond_mode_8023ad_activate_slave(eth_dev, port_id);
+ if (internals->mode == BONDING_MODE_TLB
+ || internals->mode == BONDING_MODE_ALB) {
+
+ internals->tlb_slaves_order[active_count] = port_id;
+ }
+
+ RTE_VERIFY(internals->active_slave_count <
+ (RTE_DIM(internals->active_slaves) - 1));
+
internals->active_slaves[internals->active_slave_count] = port_id;
internals->active_slave_count++;
+
+ if (internals->mode == BONDING_MODE_TLB)
+ bond_tlb_activate_slave(internals);
+ if (internals->mode == BONDING_MODE_ALB)
+ bond_mode_alb_client_list_upd(eth_dev);
}
void
if (internals->mode == BONDING_MODE_8023AD) {
bond_mode_8023ad_stop(eth_dev);
bond_mode_8023ad_deactivate_slave(eth_dev, port_id);
- }
+ } else if (internals->mode == BONDING_MODE_TLB
+ || internals->mode == BONDING_MODE_ALB)
+ bond_tlb_disable(internals);
slave_pos = find_slave_by_id(internals->active_slaves, active_count,
port_id);
sizeof(internals->active_slaves[0]));
}
+ RTE_VERIFY(active_count < RTE_DIM(internals->active_slaves));
internals->active_slave_count = active_count;
- if (eth_dev->data->dev_started && internals->mode == BONDING_MODE_8023AD)
- bond_mode_8023ad_start(eth_dev);
+ if (eth_dev->data->dev_started) {
+ if (internals->mode == BONDING_MODE_8023AD) {
+ bond_mode_8023ad_start(eth_dev);
+ } else if (internals->mode == BONDING_MODE_TLB) {
+ bond_tlb_enable(internals);
+ } else if (internals->mode == BONDING_MODE_ALB) {
+ bond_tlb_enable(internals);
+ bond_mode_alb_client_list_upd(eth_dev);
+ }
+ }
}
uint8_t
goto err;
}
- pci_drv = rte_zmalloc_socket(name, sizeof(*pci_drv), 0, socket_id);
- if (pci_drv == NULL) {
- RTE_BOND_LOG(ERR, "Unable to malloc pci_drv on socket");
- goto err;
- }
+ pci_drv = ð_drv->pci_drv;
+
pci_id_table = rte_zmalloc_socket(name, sizeof(*pci_id_table), 0, socket_id);
- if (pci_drv == NULL) {
+ if (pci_id_table == NULL) {
RTE_BOND_LOG(ERR, "Unable to malloc pci_id_table on socket");
goto err;
}
+ pci_id_table->device_id = PCI_ANY_ID;
+ pci_id_table->subsystem_device_id = PCI_ANY_ID;
+ pci_id_table->vendor_id = PCI_ANY_ID;
+ pci_id_table->subsystem_vendor_id = PCI_ANY_ID;
pci_drv->id_table = pci_id_table;
-
- pci_drv->id_table->device_id = PCI_ANY_ID;
- pci_drv->id_table->subsystem_device_id = PCI_ANY_ID;
- pci_drv->id_table->vendor_id = PCI_ANY_ID;
- pci_drv->id_table->subsystem_vendor_id = PCI_ANY_ID;
-
pci_drv->drv_flags = RTE_PCI_DRV_INTR_LSC;
internals = rte_zmalloc_socket(name, sizeof(*internals), 0, socket_id);
}
/* reserve an ethdev entry */
- eth_dev = rte_eth_dev_allocate(name);
+ eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
if (eth_dev == NULL) {
RTE_BOND_LOG(ERR, "Unable to allocate rte_eth_dev");
goto err;
pci_dev->numa_node = socket_id;
pci_drv->name = driver_name;
- eth_drv->pci_drv = (struct rte_pci_driver)(*pci_drv);
eth_dev->driver = eth_drv;
-
eth_dev->data->dev_private = internals;
eth_dev->data->nb_rx_queues = (uint16_t)1;
eth_dev->data->nb_tx_queues = (uint16_t)1;
- TAILQ_INIT(&(eth_dev->callbacks));
+ TAILQ_INIT(&(eth_dev->link_intr_cbs));
eth_dev->data->dev_link.link_status = 0;
internals->mode = BONDING_MODE_INVALID;
internals->current_primary_port = 0;
internals->balance_xmit_policy = BALANCE_XMIT_POLICY_LAYER2;
+ internals->xmit_hash = xmit_l2_hash;
internals->user_defined_mac = 0;
internals->link_props_set = 0;
internals->slave_count = 0;
internals->active_slave_count = 0;
+ internals->rx_offload_capa = 0;
+ internals->tx_offload_capa = 0;
memset(internals->active_slaves, 0, sizeof(internals->active_slaves));
memset(internals->slaves, 0, sizeof(internals->slaves));
return eth_dev->data->port_id;
err:
- if (pci_dev)
- rte_free(pci_dev);
- if (pci_drv)
- rte_free(pci_drv);
- if (pci_id_table)
- rte_free(pci_id_table);
- if (eth_drv)
- rte_free(eth_drv);
- if (internals)
- rte_free(internals);
+ rte_free(pci_dev);
+ rte_free(pci_id_table);
+ rte_free(eth_drv);
+ rte_free(internals);
+
return -1;
}
struct bond_dev_private *internals;
struct bond_dev_private *temp_internals;
struct rte_eth_link link_props;
+ struct rte_eth_dev_info dev_info;
int i, j;
/* Add slave details to bonded device */
slave_add(internals, slave_eth_dev);
+ memset(&dev_info, 0, sizeof(dev_info));
+ rte_eth_dev_info_get(slave_port_id, &dev_info);
+
if (internals->slave_count < 1) {
/* if MAC is not user defined then use MAC of first slave add to
* bonded device */
/* Make primary slave */
internals->primary_port = slave_port_id;
+
+ /* Take the first dev's offload capabilities */
+ internals->rx_offload_capa = dev_info.rx_offload_capa;
+ internals->tx_offload_capa = dev_info.tx_offload_capa;
+
} else {
/* Check slave link properties are supported if props are set,
* all slaves must be the same */
link_properties_set(bonded_eth_dev,
&(slave_eth_dev->data->dev_link));
}
+ internals->rx_offload_capa &= dev_info.rx_offload_capa;
+ internals->tx_offload_capa &= dev_info.tx_offload_capa;
}
internals->slave_count++;
memset(rte_eth_devices[bonded_port_id].data->mac_addrs, 0,
sizeof(*(rte_eth_devices[bonded_port_id].data->mac_addrs)));
}
-
+ if (internals->slave_count == 0) {
+ internals->rx_offload_capa = 0;
+ internals->tx_offload_capa = 0;
+ }
return 0;
}
switch (policy) {
case BALANCE_XMIT_POLICY_LAYER2:
+ internals->balance_xmit_policy = policy;
+ internals->xmit_hash = xmit_l2_hash;
+ break;
case BALANCE_XMIT_POLICY_LAYER23:
+ internals->balance_xmit_policy = policy;
+ internals->xmit_hash = xmit_l23_hash;
+ break;
case BALANCE_XMIT_POLICY_LAYER34:
internals->balance_xmit_policy = policy;
+ internals->xmit_hash = xmit_l34_hash;
break;
default: