Show 802.1q/802.1ah details in the trace output, fixes VPP-111
[vpp.git] / vnet / vnet / devices / dpdk / format.c
index 447dfff..a8b0363 100644 (file)
@@ -24,7 +24,6 @@
 #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")    \
@@ -86,8 +62,8 @@
   _(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")            \
@@ -207,7 +164,7 @@ u8 * format_dpdk_device_name (u8 * s, va_list * args)
   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";
@@ -241,12 +198,6 @@ u8 * format_dpdk_device_name (u8 * s, va_list * args)
       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);
@@ -331,7 +282,6 @@ static u8 * format_dpdk_device_type (u8 * s, va_list * args)
        dev_type = "Intel 82599";
        break;
 
-    case VNET_DPDK_PMD_VICE:
     case VNET_DPDK_PMD_ENIC:
        dev_type = "Cisco VIC";
        break;
@@ -344,12 +294,6 @@ static u8 * format_dpdk_device_type (u8 * s, va_list * args)
        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;
@@ -358,6 +302,10 @@ static u8 * format_dpdk_device_type (u8 * s, va_list * args)
        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 ###";
@@ -452,6 +400,7 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
   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);
@@ -461,15 +410,15 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
              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;
 
@@ -485,6 +434,8 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
                    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",
@@ -495,10 +446,6 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
                  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);
@@ -520,36 +467,50 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
                  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 (verbose == 2 || (verbose && 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);
         }
     }
@@ -643,12 +604,20 @@ u8 * format_dpdk_rx_dma_trace (u8 * s, va_list * va)
 #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;
@@ -707,17 +676,36 @@ static inline u8 * format_dpdk_pkt_offload_flags (u8 * s, va_list * va)
   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);
 
@@ -725,9 +713,15 @@ u8 * format_dpdk_rte_mbuf (u8 * s, va_list * va)
     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;
 }
 
@@ -760,6 +754,7 @@ static inline u8 * format_dpdk_pkt_rx_offload_flags (u8 * s, va_list * va)
 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;
 
   /*
@@ -779,9 +774,15 @@ u8 * format_dpdk_rx_rte_mbuf (u8 * s, va_list * va)
     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 */
@@ -812,3 +813,27 @@ unformat_socket_mem (unformat_input_t * input, va_list * va)
 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;
+}