#include "dpdk_priv.h"
#include <vppinfra/error.h>
-#if RTE_VERSION >= RTE_VERSION_NUM(2, 2, 0, 0)
#define foreach_dpdk_counter \
_ (tx_frames_ok, opackets) \
_ (tx_bytes_ok, obytes) \
_ (tx_errors, oerrors) \
- _ (tx_loopback_frames_ok, olbpackets) \
- _ (tx_loopback_bytes_ok, olbbytes) \
_ (rx_frames_ok, ipackets) \
_ (rx_bytes_ok, ibytes) \
_ (rx_errors, ierrors) \
_ (rx_missed, imissed) \
- _ (rx_multicast_frames_ok, imcasts) \
- _ (rx_no_bufs, rx_nombuf) \
- _ (rx_loopback_frames_ok, ilbpackets) \
- _ (rx_loopback_bytes_ok, ilbbytes)
-#else
-#define foreach_dpdk_counter \
- _ (tx_frames_ok, opackets) \
- _ (tx_bytes_ok, obytes) \
- _ (tx_errors, oerrors) \
- _ (tx_loopback_frames_ok, olbpackets) \
- _ (tx_loopback_bytes_ok, olbbytes) \
- _ (rx_frames_ok, ipackets) \
- _ (rx_bytes_ok, ibytes) \
- _ (rx_errors, ierrors) \
- _ (rx_missed, imissed) \
- _ (rx_bad_crc, ibadcrc) \
- _ (rx_bad_length, ibadlen) \
- _ (rx_multicast_frames_ok, imcasts) \
- _ (rx_no_bufs, rx_nombuf) \
- _ (rx_filter_match, fdirmatch) \
- _ (rx_filter_miss, fdirmiss) \
- _ (tx_pause_xon, tx_pause_xon) \
- _ (rx_pause_xon, rx_pause_xon) \
- _ (tx_pause_xoff, tx_pause_xoff) \
- _ (rx_pause_xoff, rx_pause_xoff) \
- _ (rx_loopback_frames_ok, ilbpackets) \
- _ (rx_loopback_bytes_ok, ilbbytes)
-#endif
+ _ (rx_no_bufs, rx_nombuf)
#define foreach_dpdk_q_counter \
_ (rx_frames_ok, q_ipackets) \
_(DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM, "outer-ipv4-cksum") \
_(DEV_TX_OFFLOAD_QINQ_INSERT, "qinq-insert")
-#if RTE_VERSION >= RTE_VERSION_NUM(2, 1, 0, 0)
-
#define foreach_dpdk_pkt_rx_offload_flag \
_ (PKT_RX_VLAN_PKT, "RX packet is a 802.1q VLAN packet") \
_ (PKT_RX_RSS_HASH, "RX packet with RSS hash result") \
_ (INNER_L4, ICMP, "Inner ICMP packet") \
_ (INNER_L4, NONFRAG, "Inner non-fragmented IP packet")
-#else
-#define foreach_dpdk_pkt_rx_offload_flag \
- _ (PKT_RX_VLAN_PKT, "RX packet is a 802.1q VLAN packet") \
- _ (PKT_RX_RSS_HASH, "RX packet with RSS hash result") \
- _ (PKT_RX_FDIR, "RX packet with FDIR infos") \
- _ (PKT_RX_L4_CKSUM_BAD, "L4 cksum of RX pkt. is not OK") \
- _ (PKT_RX_IP_CKSUM_BAD, "IP cksum of RX pkt. is not OK") \
- _ (PKT_RX_IPV4_HDR, "RX packet with IPv4 header") \
- _ (PKT_RX_IPV4_HDR_EXT, "RX packet with extended IPv4 header") \
- _ (PKT_RX_IPV6_HDR, "RX packet with IPv6 header") \
- _ (PKT_RX_IPV6_HDR_EXT, "RX packet with extended IPv6 header") \
- _ (PKT_RX_IEEE1588_PTP, "RX IEEE1588 L2 Ethernet PT Packet") \
- _ (PKT_RX_IEEE1588_TMST, "RX IEEE1588 L2/L4 timestamped packet")
-
-#define foreach_dpdk_pkt_type /* Dummy */
-#endif /* RTE_VERSION */
-
#define foreach_dpdk_pkt_tx_offload_flag \
_ (PKT_TX_VLAN_PKT, "TX packet is a 802.1q VLAN packet") \
_ (PKT_TX_IP_CKSUM, "IP cksum of TX pkt. computed by NIC") \
return format(s, "kni%d", dm->devices[i].kni_port_id);
} else
#endif
+#if DPDK_VHOST_USER
if (dm->devices[i].dev_type == VNET_DPDK_DEV_VHOST_USER) {
return format(s, "VirtualEthernet0/0/%d", dm->devices[i].vu_if_id);
}
+#endif
switch (dm->devices[i].port_type)
{
case VNET_DPDK_PORT_TYPE_ETH_1G:
device_name = "EthernetSwitch";
break;
- #ifdef NETMAP
- case VNET_DPDK_PORT_TYPE_NETMAP:
- rte_eth_dev_info_get(i, &dev_info);
- return format(s, "netmap:%s", dev_info.driver_name);
- #endif
-
case VNET_DPDK_PORT_TYPE_AF_PACKET:
rte_eth_dev_info_get(i, &dev_info);
return format(s, "af_packet%d", dm->devices[i].af_packet_port_id);
dev_info.pci_dev->addr.devid,
dev_info.pci_dev->addr.function);
- /* address Chelsio cards which share PCI address */
- if (dm->devices[i].pmd == VNET_DPDK_PMD_CXGBE) {
- struct rte_eth_dev_info di;
-
- di.pci_dev = 0;
- rte_eth_dev_info_get(i+1, &di);
- if (di.pci_dev && memcmp(&dev_info.pci_dev->addr, &di.pci_dev->addr,
- sizeof(struct rte_pci_addr)) == 0)
- return format(ret, "/0");
-
- di.pci_dev = 0;
- rte_eth_dev_info_get(i-1, &di);
- if (di.pci_dev && memcmp(&dev_info.pci_dev->addr, &di.pci_dev->addr,
- sizeof(struct rte_pci_addr)) == 0)
- return format(ret, "/1");
- }
+ if (dm->devices[i].interface_name_suffix)
+ return format (ret, "/%s", dm->devices[i].interface_name_suffix);
return ret;
}
dev_type = "Intel 82599";
break;
- case VNET_DPDK_PMD_VICE:
case VNET_DPDK_PMD_ENIC:
dev_type = "Cisco VIC";
break;
dev_type = "VMware VMXNET3";
break;
-#ifdef NETMAP
- case VNET_DPDK_PMD_NETMAP:
- dev_type = "Netmap/Vale";
- break;
-#endif
-
case VNET_DPDK_PMD_AF_PACKET:
dev_type = "af_packet";
break;
struct rte_pci_device * pci;
struct rte_eth_rss_conf rss_conf;
int vlan_off;
+ int retval;
rss_conf.rss_key = 0;
- rte_eth_dev_rss_hash_conf_get(xd->device_index, &rss_conf);
+ retval = rte_eth_dev_rss_hash_conf_get(xd->device_index, &rss_conf);
+ if (retval < 0)
+ clib_warning ("rte_eth_dev_rss_hash_conf_get returned %d", retval);
pci = di.pci_dev;
if (pci)
format_white_space, indent + 2, xd->cpu_socket);
/* $$$ MIB counters */
-
{
#define _(N, V) \
if ((xd->stats.V - xd->last_cleared_stats.V) != 0) { \
u8 * xs = 0;
u32 i = 0;
+#if RTE_VERSION < RTE_VERSION_NUM(16, 7, 0, 0)
+ struct rte_eth_xstats * xstat, * last_xstat;
+#else
+ struct rte_eth_xstat * xstat, * last_xstat;
+ struct rte_eth_xstat_name * xstat_names = 0;
+ int len = rte_eth_xstats_get_names (xd->device_index, NULL, 0);
+ vec_validate (xstat_names, len - 1);
+ rte_eth_xstats_get_names (xd->device_index, xstat_names, len);
+#endif
ASSERT(vec_len(xd->xstats) == vec_len(xd->last_cleared_xstats));
vec_foreach_index(i, xd->xstats)
{
u64 delta = 0;
- struct rte_eth_xstats* xstat = vec_elt_at_index(xd->xstats, i);
- struct rte_eth_xstats* last_xstat =
- vec_elt_at_index(xd->last_cleared_xstats, i);
+ xstat = vec_elt_at_index(xd->xstats, i);
+ last_xstat = vec_elt_at_index(xd->last_cleared_xstats, i);
delta = xstat->value - last_xstat->value;
if (verbose == 2 || (verbose && delta))
{
/* format_c_identifier doesn't like c strings inside vector */
+#if RTE_VERSION < RTE_VERSION_NUM(16, 7, 0, 0)
u8 * name = format(0,"%s", xstat->name);
+#else
+ u8 * name = format(0,"%s", xstat_names[i].name);
+#endif
xs = format(xs, "\n%U%-38U%16Ld",
format_white_space, indent + 4,
format_c_identifier, name, delta);
}
}
+#if RTE_VERSION >= RTE_VERSION_NUM(16, 7, 0, 0)
+ vec_free (xstat_names);
+#endif
+
+#if DPDK_VHOST_USER
if (verbose && xd->dev_type == VNET_DPDK_DEV_VHOST_USER) {
int i;
for (i = 0; i < xd->rx_q_used * VIRTIO_QNUM; i++) {
}
}
}
+#endif
if (xs)
{
#ifdef RTE_LIBRTE_MBUF_EXT_RX_OLFLAGS
s = format (s, "\n%U%U",
format_white_space, indent,
- format_dpdk_rx_rte_mbuf, &t->mb);
+ format_dpdk_rx_rte_mbuf, &t->mb, &t->data);
#else
s = format (s, "\n%U%U",
format_white_space, indent,
- format_dpdk_rte_mbuf, &t->mb);
+ format_dpdk_rte_mbuf, &t->mb, &t->data);
#endif /* RTE_LIBRTE_MBUF_EXT_RX_OLFLAGS */
if (vm->trace_main.verbose)
{
return s;
}
+u8 * format_dpdk_rte_mbuf_vlan (u8 * s, va_list * va)
+{
+ ethernet_vlan_header_tv_t * vlan_hdr = va_arg (*va, ethernet_vlan_header_tv_t *);
+
+ if (clib_net_to_host_u16(vlan_hdr->type) == ETHERNET_TYPE_DOT1AD) {
+ s = format (s, "%U 802.1q vlan ",
+ format_ethernet_vlan_tci,
+ clib_net_to_host_u16(vlan_hdr->priority_cfi_and_id));
+ vlan_hdr++;
+ }
+
+ s = format (s, "%U",
+ format_ethernet_vlan_tci,
+ clib_net_to_host_u16(vlan_hdr->priority_cfi_and_id));
+
+ return s;
+}
+
u8 * format_dpdk_rte_mbuf (u8 * s, va_list * va)
{
struct rte_mbuf * mb = va_arg (*va, struct rte_mbuf *);
+ ethernet_header_t *eth_hdr = va_arg (*va, ethernet_header_t *);
uword indent = format_get_indent (s) + 2;
s = format (s, "PKT MBUF: port %d, nb_segs %d, pkt_len %d"
- "\n%Ubuf_len %d, data_len %d, ol_flags 0x%x, data_off %d"
+ "\n%Ubuf_len %d, data_len %d, ol_flags 0x%x, data_off %d, phys_addr 0x%x"
"\n%Upacket_type 0x%x",
mb->port, mb->nb_segs, mb->pkt_len,
format_white_space, indent,
- mb->buf_len, mb->data_len, mb->ol_flags, mb->data_off,
+ mb->buf_len, mb->data_len, mb->ol_flags, mb->data_off, mb->buf_physaddr,
format_white_space, indent,
mb->packet_type);
s = format (s, "\n%U%U", format_white_space, indent,
format_dpdk_pkt_offload_flags, &mb->ol_flags);
+ if (mb->ol_flags & PKT_RX_VLAN_PKT) {
+ ethernet_vlan_header_tv_t * vlan_hdr = ((ethernet_vlan_header_tv_t *)&(eth_hdr->type));
+ s = format (s, " %U", format_dpdk_rte_mbuf_vlan, vlan_hdr);
+ }
+
if (mb->packet_type)
s = format (s, "\n%U%U", format_white_space, indent,
format_dpdk_pkt_types, &mb->packet_type);
+
return s;
}
u8 * format_dpdk_rx_rte_mbuf (u8 * s, va_list * va)
{
struct rte_mbuf * mb = va_arg (*va, struct rte_mbuf *);
+ ethernet_header_t *eth_hdr = va_arg (*args, ethernet_header_t *);
uword indent = format_get_indent (s) + 2;
/*
s = format (s, "\n%U%U", format_white_space, indent,
format_dpdk_pkt_rx_offload_flags, &mb->ol_flags);
+ if (mb->ol_flags & PKT_RX_VLAN_PKT) {
+ ethernet_vlan_header_tv_t * vlan_hdr = ((ethernet_vlan_header_tv_t *)&(eth_hdr->type));
+ s = format (s, " %U", format_dpdk_rte_mbuf_vlan, vlan_hdr);
+ }
+
if (mb->packet_type)
s = format (s, "\n%U%U", format_white_space, indent,
format_dpdk_pkt_types, &mb->packet_type);
+
return s;
}
#endif /* RTE_LIBRTE_MBUF_EXT_RX_OLFLAGS */