#include <vnet/ethernet/ethernet.h>
#include <dpdk/buffer.h>
#include <dpdk/device/dpdk.h>
+#include <dpdk/cryptodev/cryptodev.h>
#include <vlib/pci/pci.h>
#include <vlib/vmbus/vmbus.h>
return 0;
}
+static void
+dpdk_enable_l4_csum_offload (dpdk_device_t * xd)
+{
+ xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
+ DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
+}
+
static clib_error_t *
dpdk_lib_init (dpdk_main_t * dm)
{
dpdk_device_t *xd;
vlib_pci_addr_t last_pci_addr;
u32 last_pci_addr_port = 0;
- vlib_thread_registration_t *tr_hqos;
- uword *p_hqos;
-
- u32 next_hqos_cpu = 0;
u8 af_packet_instance_num = 0;
last_pci_addr.as_u32 = ~0;
- dm->hqos_cpu_first_index = 0;
- dm->hqos_cpu_count = 0;
-
- /* find out which cpus will be used for I/O TX */
- p_hqos = hash_get_mem (tm->thread_registrations_by_name, "hqos-threads");
- tr_hqos = p_hqos ? (vlib_thread_registration_t *) p_hqos[0] : 0;
-
- if (tr_hqos && tr_hqos->count > 0)
- {
- dm->hqos_cpu_first_index = tr_hqos->first_index;
- dm->hqos_cpu_count = tr_hqos->count;
- }
-
- vec_validate_aligned (dm->devices_by_hqos_cpu, tm->n_vlib_mains - 1,
- CLIB_CACHE_LINE_BYTES);
-
nports = rte_eth_dev_count_avail ();
if (nports < 1)
int vlan_off;
struct rte_eth_dev_info dev_info;
struct rte_pci_device *pci_dev;
- struct rte_eth_link l;
dpdk_portid_t next_port_id;
dpdk_device_config_t *devconf = 0;
vlib_pci_addr_t pci_addr;
if (!rte_eth_dev_is_valid_port(i))
continue;
- rte_eth_link_get_nowait (i, &l);
rte_eth_dev_info_get (i, &dev_info);
if (dev_info.device == 0)
else
devconf = &dm->conf->default_devconf;
+ /* Handle representor devices that share the same PCI ID */
+ if (dev_info.switch_info.domain_id != RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID)
+ {
+ if (dev_info.switch_info.port_id != (uint16_t)-1)
+ xd->interface_name_suffix = format (0, "%d", dev_info.switch_info.port_id);
+ }
/* Handle interface naming for devices with multiple ports sharing same PCI ID */
- if (pci_dev &&
+ else if (pci_dev &&
((next_port_id = rte_eth_find_next (i + 1)) != RTE_MAX_ETHPORTS))
{
struct rte_eth_dev_info di = { 0 };
xd->flags |= DPDK_DEVICE_FLAG_RX_IP4_CKSUM;
}
+ if (dm->conf->enable_tcp_udp_checksum)
+ {
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM)
+ xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_UDP_CKSUM;
+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM)
+ xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_TCP_CKSUM;
+ }
+
if (dm->conf->no_multi_seg)
{
xd->port_conf.txmode.offloads &= ~DEV_TX_OFFLOAD_MULTI_SEGS;
VNET_FLOW_ACTION_REDIRECT_TO_NODE |
VNET_FLOW_ACTION_REDIRECT_TO_QUEUE |
VNET_FLOW_ACTION_BUFFER_ADVANCE |
- VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP;
+ VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP |
+ VNET_FLOW_ACTION_RSS;
if (dm->conf->no_tx_checksum_offload == 0)
{
}
break;
+ /* iAVF */
+ case VNET_DPDK_PMD_IAVF:
+ xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
+ xd->supported_flow_actions = VNET_FLOW_ACTION_MARK |
+ VNET_FLOW_ACTION_REDIRECT_TO_NODE |
+ VNET_FLOW_ACTION_REDIRECT_TO_QUEUE |
+ VNET_FLOW_ACTION_BUFFER_ADVANCE |
+ VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP;
+
+ if (dm->conf->no_tx_checksum_offload == 0)
+ {
+ xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+ xd->flags |=
+ DPDK_DEVICE_FLAG_TX_OFFLOAD |
+ DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
+ }
+ break;
+
case VNET_DPDK_PMD_THUNDERX:
xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
/* Cisco VIC */
case VNET_DPDK_PMD_ENIC:
- xd->port_type = port_type_from_link_speed (l.link_speed);
+ {
+ struct rte_eth_link l;
+ rte_eth_link_get_nowait (i, &l);
+ xd->port_type = port_type_from_link_speed (l.link_speed);
+ if (dm->conf->enable_tcp_udp_checksum)
+ dpdk_enable_l4_csum_offload (xd);
+ }
break;
/* Intel Red Rock Canyon */
/* virtio */
case VNET_DPDK_PMD_VIRTIO:
+ xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
xd->port_type = VNET_DPDK_PORT_TYPE_ETH_1G;
xd->nb_rx_desc = DPDK_NB_RX_DESC_VIRTIO;
xd->nb_tx_desc = DPDK_NB_TX_DESC_VIRTIO;
break;
case VNET_DPDK_PMD_NETVSC:
- xd->port_type = port_type_from_link_speed (l.link_speed);
+ {
+ struct rte_eth_link l;
+ rte_eth_link_get_nowait (i, &l);
+ xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
+ }
break;
default:
/* assign interface to input thread */
int q;
- if (devconf->hqos_enabled)
- {
- xd->flags |= DPDK_DEVICE_FLAG_HQOS;
-
- int cpu;
- if (devconf->hqos.hqos_thread_valid)
- {
- if (devconf->hqos.hqos_thread >= dm->hqos_cpu_count)
- return clib_error_return (0, "invalid HQoS thread index");
-
- cpu = dm->hqos_cpu_first_index + devconf->hqos.hqos_thread;
- }
- else
- {
- if (dm->hqos_cpu_count == 0)
- return clib_error_return (0, "no HQoS threads available");
-
- cpu = dm->hqos_cpu_first_index + next_hqos_cpu;
-
- next_hqos_cpu++;
- if (next_hqos_cpu == dm->hqos_cpu_count)
- next_hqos_cpu = 0;
-
- devconf->hqos.hqos_thread_valid = 1;
- devconf->hqos.hqos_thread = cpu;
- }
-
- dpdk_device_and_queue_t *dq;
- vec_add2 (dm->devices_by_hqos_cpu[cpu], dq, 1);
- dq->device = xd->device_index;
- dq->queue_id = 0;
- }
error = ethernet_register_interface
(dm->vnet_main, dpdk_device_class.index, xd->device_index,
format_dpdk_device_name, i,
format_dpdk_device_errors, xd);
- if (devconf->hqos_enabled)
- {
- clib_error_t *rv;
- rv = dpdk_port_setup_hqos (xd, &devconf->hqos);
- if (rv)
- return rv;
- }
-
/*
* A note on Cisco VIC (PMD_ENIC) and VLAN:
*
/* Cavium FastlinQ QL41000 Series */
else if (d->vendor_id == 0x1077 && d->device_id >= 0x8070 && d->device_id <= 0x8090)
;
- /* Mellanox mlx4 */
+ /* Mellanox CX3, CX3VF */
else if (d->vendor_id == 0x15b3 && d->device_id >= 0x1003 && d->device_id <= 0x1004)
{
continue;
}
- /* Mellanox mlx5 */
+ /* Mellanox CX4, CX4VF, CX4LX, CX4LXVF, CX5, CX5VF, CX5EX, CX5EXVF */
else if (d->vendor_id == 0x15b3 && d->device_id >= 0x1013 && d->device_id <= 0x101a)
{
continue;
}
+ /* Mellanox CX6, CX6VF, CX6DX, CX6DXVF */
+ else if (d->vendor_id == 0x15b3 && d->device_id >= 0x101b && d->device_id <= 0x101e)
+ {
+ continue;
+ }
/* Broadcom NetXtreme S, and E series only */
else if (d->vendor_id == 0x14e4 &&
((d->device_id >= 0x16c0 &&
}
devconf->pci_addr.as_u32 = pci_addr.as_u32;
- devconf->hqos_enabled = 0;
devconf->tso = DPDK_DEVICE_TSO_DEFAULT;
-#if 0
- dpdk_device_config_hqos_default (&devconf->hqos);
-#endif
if (!input)
return 0;
devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_OFF;
else if (unformat (input, "vlan-strip-offload on"))
devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_ON;
- else
- if (unformat
- (input, "hqos %U", unformat_vlib_cli_sub_input, &sub_input))
- {
- devconf->hqos_enabled = 1;
- error = unformat_hqos (&sub_input, &devconf->hqos);
- if (error)
- break;
- }
- else if (unformat (input, "hqos"))
- {
- devconf->hqos_enabled = 1;
- }
else if (unformat (input, "tso on"))
{
devconf->tso = DPDK_DEVICE_TSO_ON;
error = dpdk_lib_init (dm);
+ if (error)
+ clib_error_report (error);
+
+ error = dpdk_cryptodev_init (vm);
if (error)
clib_error_report (error);