#include <vlib/unix/cj.h>
#include <assert.h>
+#define __USE_GNU
+#include <dlfcn.h>
+
#include <vnet/ethernet/ethernet.h>
#include <dpdk/device/dpdk.h>
_ (rx_errors, q_errors)
#define foreach_dpdk_rss_hf \
+ _(ETH_RSS_IPV4, "ipv4") \
_(ETH_RSS_FRAG_IPV4, "ipv4-frag") \
_(ETH_RSS_NONFRAG_IPV4_TCP, "ipv4-tcp") \
_(ETH_RSS_NONFRAG_IPV4_UDP, "ipv4-udp") \
_(ETH_RSS_NONFRAG_IPV4_SCTP, "ipv4-sctp") \
_(ETH_RSS_NONFRAG_IPV4_OTHER, "ipv4-other") \
- _(ETH_RSS_IPV4, "ipv4") \
- _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
- _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
+ _(ETH_RSS_IPV6, "ipv6") \
_(ETH_RSS_FRAG_IPV6, "ipv6-frag") \
_(ETH_RSS_NONFRAG_IPV6_TCP, "ipv6-tcp") \
_(ETH_RSS_NONFRAG_IPV6_UDP, "ipv6-udp") \
_(ETH_RSS_NONFRAG_IPV6_SCTP, "ipv6-sctp") \
_(ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other") \
+ _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
+ _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
_(ETH_RSS_L2_PAYLOAD, "l2-payload") \
_(ETH_RSS_IPV6_EX, "ipv6-ex") \
- _(ETH_RSS_IPV6, "ipv6")
+ _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
+ _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
+ _(ETH_RSS_PORT, "port") \
+ _(ETH_RSS_VXLAN, "vxlan") \
+ _(ETH_RSS_GENEVE, "geneve") \
+ _(ETH_RSS_NVGRE, "nvgre")
#define foreach_dpdk_rx_offload_caps \
char *device_name;
u32 i = va_arg (*args, u32);
struct rte_eth_dev_info dev_info;
+ struct rte_pci_device *pci_dev;
u8 *ret;
if (dm->conf->interface_name_format_decimal)
}
rte_eth_dev_info_get (i, &dev_info);
+ pci_dev = RTE_DEV_TO_PCI (dev_info.device);
- if (dev_info.pci_dev &&
- dm->devices[i].port_type != VNET_DPDK_PORT_TYPE_FAILSAFE)
- ret = format (s, devname_format, device_name, dev_info.pci_dev->addr.bus,
- dev_info.pci_dev->addr.devid,
- dev_info.pci_dev->addr.function);
+ if (pci_dev && dm->devices[i].port_type != VNET_DPDK_PORT_TYPE_FAILSAFE)
+ ret = format (s, devname_format, device_name, pci_dev->addr.bus,
+ pci_dev->addr.devid, pci_dev->addr.function);
else
ret = format (s, "%s%d", device_name, dm->devices[i].port_id);
break;
case VNET_DPDK_PMD_FAILSAFE:
- dev_type = "Failsafe Ethernet";
+ dev_type = "FailsafeEthernet";
break;
case VNET_DPDK_PMD_LIOVF_ETHER:
dev_type = "Cavium Lio VF";
break;
+ case VNET_DPDK_PMD_QEDE:
+ dev_type = "Cavium QLogic FastLinQ QL4xxxx";
+ break;
+
default:
case VNET_DPDK_PMD_UNKNOWN:
dev_type = "### UNKNOWN ###";
s = format(s, "%s ", str); \
}
-static u8 *
+u8 *
format_dpdk_rss_hf_name (u8 * s, va_list * args)
{
u64 bitmap = va_arg (*args, u64);
return s;
}
+static const char *
+ptr2sname (void *p)
+{
+ Dl_info info = { 0 };
+
+ if (dladdr (p, &info) == 0)
+ return 0;
+
+ return info.dli_sname;
+}
+
u8 *
format_dpdk_device (u8 * s, va_list * args)
{
retval = rte_eth_dev_rss_hash_conf_get (xd->port_id, &rss_conf);
if (retval < 0)
clib_warning ("rte_eth_dev_rss_hash_conf_get returned %d", retval);
- pci = di.pci_dev;
+ pci = RTE_DEV_TO_PCI (di.device);
if (pci)
s =
format_dpdk_rss_hf_name, rss_conf.rss_hf,
format_white_space, indent + 2,
format_dpdk_rss_hf_name, di.flow_type_rss_offloads);
+ s = format (s, "%Utx burst function: %s\n",
+ format_white_space, indent + 2,
+ ptr2sname (rte_eth_devices[xd->port_id].tx_pkt_burst));
+ s = format (s, "%Urx burst function: %s\n",
+ format_white_space, indent + 2,
+ ptr2sname (rte_eth_devices[xd->port_id].rx_pkt_burst));
}
s = format (s, "%Urx queues %d, rx desc %d, tx queues %d, tx desc %d\n",
{
#define _(N, V) \
if ((xd->stats.V - xd->last_cleared_stats.V) != 0) { \
- s = format (s, "\n%U%-40U%16Ld", \
+ s = format (s, "\n%U%-40U%16Lu", \
format_white_space, indent + 2, \
format_c_identifier, #N, \
xd->stats.V - xd->last_cleared_stats.V); \
{
/* format_c_identifier doesn't like c strings inside vector */
u8 * name = format(0,"%s", xstat_names[i].name);
- xs = format(xs, "\n%U%-38U%16Ld",
+ xs = format(xs, "\n%U%-38U%16Lu",
format_white_space, indent + 4,
format_c_identifier, name, delta);
vec_free(name);