return !(xd->port_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC);
}
-/* The funciton check_l3cache helps check if Level 3 cache exists or not on current CPUs
+/* The function check_l3cache helps check if Level 3 cache exists or not on current CPUs
return value 1: exist.
return value 0: not exist.
*/
u8 *p = NULL;
int level_cache = -1;
- p = format (p, "%s/%s/%s", sys_cache_dir, dp->d_name, "level");
+ p = format (p, "%s/%s/%s%c", sys_cache_dir, dp->d_name, "level", 0);
if ((err = clib_sysfs_read ((char *) p, "%d", &level_cache)))
clib_error_free (err);
if (nports < 1)
{
- dpdk_log_notice ("DPDK drivers found no ports...");
+ dpdk_log_notice ("DPDK drivers found no Ethernet devices...");
}
if (CLIB_DEBUG > 0)
if (dev_info.device == 0)
{
- clib_warning ("DPDK bug: missing device info. Skipping %s device",
+ dpdk_log_notice ("DPDK bug: missing device info. Skipping %s device",
dev_info.driver_name);
continue;
}
case VNET_DPDK_PMD_MLX4:
case VNET_DPDK_PMD_MLX5:
case VNET_DPDK_PMD_QEDE:
+ case VNET_DPDK_PMD_BNXT:
xd->port_type = port_type_from_speed_capa (&dev_info);
break;
case VNET_DPDK_PMD_IXGBEVF:
case VNET_DPDK_PMD_I40EVF:
xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
+ 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:
addr[1] = 0xfe;
}
else
- rte_eth_macaddr_get (i, (struct ether_addr *) addr);
+ rte_eth_macaddr_get (i, (void *) addr);
if (xd->tx_q_used < tm->n_vlib_mains)
dpdk_device_lock_init (xd);
if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL)
hi->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD;
+ if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL)
+ {
+ /*tcp_udp checksum must be enabled*/
+ if ((dm->conf->enable_tcp_udp_checksum) &&
+ (hi->flags & VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD))
+ {
+ hi->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO;
+ xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO |
+ DEV_TX_OFFLOAD_UDP_TSO;
+ }
+ else
+ clib_warning ("%s: TCP/UDP checksum offload must be enabled",
+ hi->name);
+ }
+
dpdk_device_setup (xd);
if (vec_len (xd->errors))
hi->max_packet_bytes = xd->port_conf.rxmode.max_rx_pkt_len
- sizeof (ethernet_header_t);
else
- clib_warning ("hi NULL");
+ dpdk_log_warn ("hi NULL");
if (dm->conf->no_multi_seg)
mtu = mtu > ETHER_MAX_LEN ? ETHER_MAX_LEN : mtu;
/* Chelsio T4/T5 */
else if (d->vendor_id == 0x1425 && (d->device_id & 0xe000) == 0x4000)
;
- /* Amazen Elastic Network Adapter */
+ /* Amazon Elastic Network Adapter */
else if (d->vendor_id == 0x1d0f && d->device_id >= 0xec20 && d->device_id <= 0xec21)
;
/* Cavium Network Adapter */
{
continue;
}
+ /* Broadcom NetXtreme S, and E series only */
+ else if (d->vendor_id == 0x14e4 &&
+ ((d->device_id >= 0x16c0 &&
+ d->device_id != 0x16c6 && d->device_id != 0x16c7 &&
+ d->device_id != 0x16dd && d->device_id != 0x16f7 &&
+ d->device_id != 0x16fd && d->device_id != 0x16fe &&
+ d->device_id != 0x170d && d->device_id != 0x170c &&
+ d->device_id != 0x170e && d->device_id != 0x1712 &&
+ d->device_id != 0x1713) ||
+ (d->device_id == 0x1604 || d->device_id == 0x1605 ||
+ d->device_id == 0x1614 || d->device_id == 0x1606 ||
+ d->device_id == 0x1609 || d->device_id == 0x1614)))
+ ;
else
{
dpdk_log_warn ("Unsupported PCI device 0x%04x:0x%04x found "
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
{
devconf->hqos_enabled = 1;
}
+ else if (unformat (input, "tso on"))
+ {
+ devconf->tso = DPDK_DEVICE_TSO_ON;
+ }
+ else if (unformat (input, "tso off"))
+ {
+ devconf->tso = DPDK_DEVICE_TSO_OFF;
+ }
else
{
error = clib_error_return (0, "unknown input `%U'",
vec_insert (conf->eal_init_args, 2, 3);
conf->eal_init_args[3] = (u8 *) "-n";
tmp = format (0, "%d", conf->nchannels);
+ vec_terminate_c_string (tmp);
conf->eal_init_args[4] = tmp;
}
devconf->vlan_strip_offload =
conf->default_devconf.vlan_strip_offload;
+ /* copy tso config from default device */
+ _(tso)
+
/* add DPDK EAL whitelist/blacklist entry */
if (num_whitelisted > 0 && devconf->is_blacklisted == 0)
{
conf->eal_init_args_str = format (conf->eal_init_args_str, "%s ",
conf->eal_init_args[i]);
+ vec_terminate_c_string (conf->eal_init_args_str);
+
dpdk_log_warn ("EAL init args: %s", conf->eal_init_args_str);
ret = rte_eal_init (vec_len (conf->eal_init_args),
(char **) conf->eal_init_args);