#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) \
_ (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
#define foreach_dpdk_q_counter \
_ (rx_frames_ok, q_ipackets) \
_ (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_IPV6, "ipv6") \
+ _(ETH_RSS_IPV4, "ipv4") \
+ _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
+ _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
_(ETH_RSS_FRAG_IPV6, "ipv6-frag") \
_(ETH_RSS_NONFRAG_IPV6_TCP, "ipv6-tcp") \
_(ETH_RSS_NONFRAG_IPV6_UDP, "ipv6-udp") \
_(ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other") \
_(ETH_RSS_L2_PAYLOAD, "l2-payload") \
_(ETH_RSS_IPV6_EX, "ipv6-ex") \
- _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
- _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex")
+ _(ETH_RSS_IPV6, "ipv6")
+
#define foreach_dpdk_rx_offload_caps \
_(DEV_RX_OFFLOAD_VLAN_STRIP, "vlan-strip") \
_(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") \
struct rte_eth_dev_info dev_info;
u8 * ret;
- if (dm->interface_name_format_decimal)
+ if (dm->conf->interface_name_format_decimal)
devname_format = "%s%d/%d/%d";
else
devname_format = "%s%x/%x/%x";
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_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;
dev_type = "Ethernet Bonding";
break;
+ case VNET_DPDK_PMD_DPAA2:
+ dev_type = "NXP DPAA2 Mac";
+ break;
+
default:
case VNET_DPDK_PMD_UNKNOWN:
dev_type = "### UNKNOWN ###";
dpdk_device_t * xd = vec_elt_at_index (dm->devices, dev_instance);
uword indent = format_get_indent (s);
f64 now = vlib_time_now (dm->vlib_main);
+ struct rte_eth_dev_info di;
dpdk_update_counters (xd, now);
dpdk_update_link_state (xd, now);
format_white_space, indent + 2,
format_dpdk_link_status, xd);
+ rte_eth_dev_info_get(xd->device_index, &di);
+
if (verbose > 1 && xd->dev_type == VNET_DPDK_DEV_ETH)
{
- struct rte_eth_dev_info di;
struct rte_pci_device * pci;
struct rte_eth_rss_conf rss_conf;
int vlan_off;
rss_conf.rss_key = 0;
- rte_eth_dev_info_get(xd->device_index, &di);
rte_eth_dev_rss_hash_conf_get(xd->device_index, &rss_conf);
pci = di.pci_dev;
pci->addr.devid, pci->addr.function);
s = format(s, "%Umax rx packet len: %d\n",
format_white_space, indent + 2, di.max_rx_pktlen);
+ s = format(s, "%Umax num of queues: rx %d tx %d\n",
+ format_white_space, indent + 2, di.max_rx_queues, di.max_tx_queues);
s = format(s, "%Upromiscuous: unicast %s all-multicast %s\n",
format_white_space, indent + 2,
rte_eth_promiscuous_get(xd->device_index) ? "on" : "off",
vlan_off & ETH_VLAN_STRIP_OFFLOAD ? "on" : "off",
vlan_off & ETH_VLAN_FILTER_OFFLOAD ? "on" : "off",
vlan_off & ETH_VLAN_EXTEND_OFFLOAD ? "on" : "off");
- s = format(s, "%Uqueue size (max): rx %d (%d) tx %d (%d)\n",
- format_white_space, indent + 2,
- xd->rx_q_used, di.max_rx_queues,
- xd->tx_q_used, di.max_tx_queues);
s = format(s, "%Urx offload caps: %U\n",
format_white_space, indent + 2,
format_dpdk_rx_offload_caps, di.rx_offload_capa);
format_dpdk_rss_hf_name, di.flow_type_rss_offloads);
}
+ if (verbose && xd->dev_type == VNET_DPDK_DEV_VHOST_USER) {
+ s = format(s, "%Uqueue size (max): rx %d (%d) tx %d (%d)\n",
+ format_white_space, indent + 2,
+ xd->rx_q_used, xd->rx_q_used,
+ xd->tx_q_used, xd->tx_q_used);
+ }
+
+ s = format (s, "%Urx queues %d, rx desc %d, tx queues %d, tx desc %d\n",
+ format_white_space, indent + 2,
+ xd->rx_q_used, xd->nb_rx_desc,
+ xd->tx_q_used, xd->nb_tx_desc);
+
if (xd->cpu_socket > -1)
- s = format (s, "%Ucpu socket %d",
- format_white_space, indent + 2,
- xd->cpu_socket);
+ s = format (s, "%Ucpu socket %d\n",
+ format_white_space, indent + 2, xd->cpu_socket);
/* $$$ MIB counters */
{
#define _(N, V) \
- if (xd->stats.V != 0) \
- s = format (s, "\n%U%-40U%16Ld", \
- format_white_space, indent + 2, \
- format_c_identifier, #N, xd->stats.V);
+ if ((xd->stats.V - xd->last_cleared_stats.V) != 0) { \
+ s = format (s, "\n%U%-40U%16Ld", \
+ format_white_space, indent + 2, \
+ format_c_identifier, #N, \
+ xd->stats.V - xd->last_cleared_stats.V); \
+ } \
foreach_dpdk_counter
#undef _
}
u8 * xs = 0;
- struct rte_eth_xstats * xstat;
+ u32 i = 0;
- vec_foreach(xstat, xd->xstats)
+ ASSERT(vec_len(xd->xstats) == vec_len(xd->last_cleared_xstats));
+
+ vec_foreach_index(i, xd->xstats)
{
- if (xstat->value)
+ 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);
+
+ delta = xstat->value - last_xstat->value;
+ if (verbose == 2 || (verbose && delta))
{
- /* format_c_identifier don't like c strings inside vector */
+ /* format_c_identifier doesn't like c strings inside vector */
u8 * name = format(0,"%s", xstat->name);
xs = format(xs, "\n%U%-38U%16Ld",
format_white_space, indent + 4,
- format_c_identifier, name, xstat->value);
+ format_c_identifier, name, delta);
vec_free(name);
}
}
+ if (verbose && xd->dev_type == VNET_DPDK_DEV_VHOST_USER) {
+ int i;
+ for (i = 0; i < xd->rx_q_used * VIRTIO_QNUM; i++) {
+ u8 * name;
+ if (verbose == 2 || xd->vu_intf->vrings[i].packets) {
+ if (i & 1) {
+ name = format(NULL, "tx q%d packets", i >> 1);
+ } else {
+ name = format(NULL, "rx q%d packets", i >> 1);
+ }
+ xs = format(xs, "\n%U%-38U%16Ld",
+ format_white_space, indent + 4,
+ format_c_identifier, name, xd->vu_intf->vrings[i].packets);
+ vec_free(name);
+
+ if (i & 1) {
+ name = format(NULL, "tx q%d bytes", i >> 1);
+ } else {
+ name = format(NULL, "rx q%d bytes", i >> 1);
+ }
+ xs = format(xs, "\n%U%-38U%16Ld",
+ format_white_space, indent + 4,
+ format_c_identifier, name, xd->vu_intf->vrings[i].bytes);
+ vec_free(name);
+ }
+ }
+ }
+
if (xs)
{
s = format(s, "\n%Uextended stats:%v",
#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)
+ {
+ s = format (s, "\n%UPacket Dump%s", format_white_space, indent + 2,
+ t->mb.data_len > sizeof(t->data) ? " (truncated)": "");
+ s = format (s, "\n%U%U", format_white_space, indent + 4,
+ format_hexdump, &t->data,
+ t->mb.data_len > sizeof(t->data) ? sizeof(t->data) : t->mb.data_len);
+ }
f = node->format_buffer;
if (!f)
f = format_hex_bytes;
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 vlan 802.1q ",
+ 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,"
+ "\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->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 */
done:
return 1;
}
+
+clib_error_t *
+unformat_rss_fn (unformat_input_t * input, uword * rss_fn)
+{
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (0)
+ ;
+#undef _
+#define _(f, s) \
+ else if (unformat (input, s)) \
+ *rss_fn |= f;
+
+ foreach_dpdk_rss_hf
+#undef _
+
+ else
+ {
+ return clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, input);
+ }
+ }
+ return 0;
+}