VPP-189 Fix coverity warnings
[vpp.git] / vnet / vnet / devices / dpdk / format.c
index aaafc90..2d41221 100644 (file)
 #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")            \
@@ -218,9 +169,11 @@ u8 * format_dpdk_device_name (u8 * s, va_list * args)
        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:
@@ -242,12 +195,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);
@@ -263,22 +210,8 @@ u8 * format_dpdk_device_name (u8 * s, va_list * args)
                 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;
 }
 
@@ -332,7 +265,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;
@@ -345,12 +277,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;
@@ -474,9 +400,12 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
       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)
@@ -534,7 +463,6 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
                 format_white_space, indent + 2, xd->cpu_socket);
 
   /* $$$ MIB counters  */
-
   {
 #define _(N, V)                                                        \
     if ((xd->stats.V - xd->last_cleared_stats.V) != 0) {       \
@@ -550,21 +478,33 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
 
   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);
@@ -572,6 +512,11 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
         }
     }
 
+#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++) {
@@ -599,6 +544,7 @@ u8 * format_dpdk_device (u8 * s, va_list * args)
             }
         }
     }
+#endif
 
   if (xs)
     {
@@ -661,11 +607,11 @@ 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)
     {
@@ -733,9 +679,28 @@ 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 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"
@@ -751,9 +716,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;
 }
 
@@ -786,6 +757,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;
 
   /*
@@ -805,9 +777,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 */