Fixed showing negative count in stats show CLI
[vpp.git] / src / plugins / dpdk / device / format.c
index f10b00e..70306a8 100644 (file)
@@ -18,6 +18,9 @@
 #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            \
@@ -163,6 +172,7 @@ format_dpdk_device_name (u8 * s, va_list * args)
   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)
@@ -246,12 +256,11 @@ format_dpdk_device_name (u8 * s, va_list * args)
     }
 
   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);
 
@@ -369,13 +378,17 @@ format_dpdk_device_type (u8 * s, va_list * args)
       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 ###";
@@ -419,7 +432,7 @@ if (bitmap & v) {                                            \
   s = format(s, "%s ", str);                                 \
 }
 
-static u8 *
+u8 *
 format_dpdk_rss_hf_name (u8 * s, va_list * args)
 {
   u64 bitmap = va_arg (*args, u64);
@@ -474,6 +487,17 @@ format_dpdk_device_errors (u8 * s, va_list * args)
   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)
 {
@@ -507,7 +531,7 @@ 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 =
@@ -549,6 +573,12 @@ format_dpdk_device (u8 * s, va_list * args)
                  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",
@@ -563,7 +593,7 @@ format_dpdk_device (u8 * s, va_list * args)
   {
 #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);     \
@@ -595,7 +625,7 @@ format_dpdk_device (u8 * s, va_list * args)
         {
           /* 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);