vppinfra: Improve code portability
[vpp.git] / src / plugins / dpdk / device / dpdk_priv.h
index 4e4438a..e5b5a35 100644 (file)
@@ -36,6 +36,7 @@ _(proc-type)                                    \
 _(file-prefix)                                  \
 _(vdev)                                         \
 _(log-level)                                    \
+_(block)                                        \
 _(iova-mode)                                    \
 _(base-virtaddr)
 /* clang-format on */
@@ -46,14 +47,18 @@ dpdk_device_flag_set (dpdk_device_t *xd, __typeof__ (xd->flags) flag, int val)
   xd->flags = val ? xd->flags | flag : xd->flags & ~flag;
 }
 
+void dpdk_counters_xstats_init (dpdk_device_t *xd);
+
 static inline void
-dpdk_get_xstats (dpdk_device_t * xd)
+dpdk_get_xstats (dpdk_device_t *xd, u32 thread_index)
 {
-  int len, ret;
-
+  int ret;
+  int i;
+  int len;
   if (!(xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP))
     return;
-
+  if (xd->driver == 0)
+    return;
   len = rte_eth_xstats_get (xd->port_id, NULL, 0);
   if (len < 0)
     return;
@@ -63,11 +68,26 @@ dpdk_get_xstats (dpdk_device_t * xd)
   ret = rte_eth_xstats_get (xd->port_id, xd->xstats, len);
   if (ret < 0 || ret > len)
     {
-      _vec_len (xd->xstats) = 0;
+      /* Failed, expand vector and try again on next time around the track. */
+      vec_validate (xd->xstats, ret - 1);
+      vec_set_len (xd->xstats, 0);
+      dpdk_log_warn ("rte_eth_xstats_get(%d) failed: %d", xd->port_id, ret);
       return;
     }
-
-  _vec_len (xd->xstats) = len;
+  if (len == vec_len (xd->driver->xstats_counters))
+    {
+      vec_foreach_index (i, xd->xstats)
+       {
+         vlib_set_simple_counter (&xd->driver->xstats_counters[i],
+                                  thread_index, xd->sw_if_index,
+                                  xd->xstats[i].value);
+       }
+    }
+  else
+    {
+      dpdk_log_warn ("rte_eth_xstats_get vector size mismatch (%d/%d", len,
+                    vec_len (xd->driver->xstats_counters));
+    }
 }
 
 #define DPDK_UPDATE_COUNTER(vnm, tidx, xd, stat, cnt)                         \
@@ -106,7 +126,7 @@ dpdk_update_counters (dpdk_device_t * xd, f64 now)
   DPDK_UPDATE_COUNTER (vnm, thread_index, xd, ierrors,
                       VNET_INTERFACE_COUNTER_RX_ERROR);
 
-  dpdk_get_xstats (xd);
+  dpdk_get_xstats (xd, thread_index);
 }
 
 #if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0)
@@ -159,6 +179,67 @@ dpdk_update_counters (dpdk_device_t * xd, f64 now)
 #define RTE_MBUF_F_TX_UDP_CKSUM                  PKT_TX_UDP_CKSUM
 #define RTE_MBUF_F_TX_UDP_SEG            PKT_TX_UDP_SEG
 #define RTE_MBUF_F_TX_VLAN               PKT_TX_VLAN
+#define RTE_ETH_RSS_FRAG_IPV4              ETH_RSS_FRAG_IPV4
+#define RTE_ETH_RSS_NONFRAG_IPV4_TCP       ETH_RSS_NONFRAG_IPV4_TCP
+#define RTE_ETH_RSS_NONFRAG_IPV4_UDP       ETH_RSS_NONFRAG_IPV4_UDP
+#define RTE_ETH_RSS_NONFRAG_IPV4_SCTP      ETH_RSS_NONFRAG_IPV4_SCTP
+#define RTE_ETH_RSS_NONFRAG_IPV4_OTHER     ETH_RSS_NONFRAG_IPV4_OTHER
+#define RTE_ETH_RSS_IPV4                   ETH_RSS_IPV4
+#define RTE_ETH_RSS_IPV6_TCP_EX                    ETH_RSS_IPV6_TCP_EX
+#define RTE_ETH_RSS_IPV6_UDP_EX                    ETH_RSS_IPV6_UDP_EX
+#define RTE_ETH_RSS_FRAG_IPV6              ETH_RSS_FRAG_IPV6
+#define RTE_ETH_RSS_NONFRAG_IPV6_TCP       ETH_RSS_NONFRAG_IPV6_TCP
+#define RTE_ETH_RSS_NONFRAG_IPV6_UDP       ETH_RSS_NONFRAG_IPV6_UDP
+#define RTE_ETH_RSS_NONFRAG_IPV6_SCTP      ETH_RSS_NONFRAG_IPV6_SCTP
+#define RTE_ETH_RSS_NONFRAG_IPV6_OTHER     ETH_RSS_NONFRAG_IPV6_OTHER
+#define RTE_ETH_RSS_IPV6_EX                ETH_RSS_IPV6_EX
+#define RTE_ETH_RSS_IPV6                   ETH_RSS_IPV6
+#define RTE_ETH_RSS_L2_PAYLOAD             ETH_RSS_L2_PAYLOAD
+#define RTE_ETH_RSS_PORT                   ETH_RSS_PORT
+#define RTE_ETH_RSS_VXLAN                  ETH_RSS_VXLAN
+#define RTE_ETH_RSS_GENEVE                 ETH_RSS_GENEVE
+#define RTE_ETH_RSS_NVGRE                  ETH_RSS_NVGRE
+#define RTE_ETH_RSS_GTPU                   ETH_RSS_GTPU
+#define RTE_ETH_RSS_ESP                            ETH_RSS_ESP
+#define RTE_ETH_RSS_L4_DST_ONLY                    ETH_RSS_L4_DST_ONLY
+#define RTE_ETH_RSS_L4_SRC_ONLY                    ETH_RSS_L4_SRC_ONLY
+#define RTE_ETH_RSS_L3_DST_ONLY                    ETH_RSS_L3_DST_ONLY
+#define RTE_ETH_RSS_L3_SRC_ONLY                    ETH_RSS_L3_SRC_ONLY
+#define RTE_ETH_RETA_GROUP_SIZE                    RTE_RETA_GROUP_SIZE
+#define RTE_ETH_TX_OFFLOAD_IPV4_CKSUM      DEV_TX_OFFLOAD_IPV4_CKSUM
+#define RTE_ETH_TX_OFFLOAD_TCP_CKSUM       DEV_TX_OFFLOAD_TCP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_UDP_CKSUM       DEV_TX_OFFLOAD_UDP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM
+#define RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM  DEV_TX_OFFLOAD_OUTER_UDP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_TCP_TSO         DEV_TX_OFFLOAD_TCP_TSO
+#define RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO    DEV_TX_OFFLOAD_VXLAN_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_MULTI_SEGS      DEV_TX_OFFLOAD_MULTI_SEGS
+#define RTE_ETH_RX_OFFLOAD_IPV4_CKSUM      DEV_RX_OFFLOAD_IPV4_CKSUM
+#define RTE_ETH_RX_OFFLOAD_SCATTER         DEV_RX_OFFLOAD_SCATTER
+#define RTE_ETH_RX_OFFLOAD_TCP_LRO         DEV_RX_OFFLOAD_TCP_LRO
+#define RTE_ETH_MQ_RX_RSS                  ETH_MQ_RX_RSS
+#define RTE_ETH_RX_OFFLOAD_TCP_CKSUM       DEV_RX_OFFLOAD_TCP_CKSUM
+#define RTE_ETH_RX_OFFLOAD_UDP_CKSUM       DEV_RX_OFFLOAD_UDP_CKSUM
+#define RTE_ETH_MQ_RX_NONE                 ETH_MQ_RX_NONE
+#define RTE_ETH_LINK_FULL_DUPLEX           ETH_LINK_FULL_DUPLEX
+#define RTE_ETH_LINK_HALF_DUPLEX           ETH_LINK_HALF_DUPLEX
+#define RTE_ETH_VLAN_STRIP_OFFLOAD         ETH_VLAN_STRIP_OFFLOAD
+#define RTE_ETH_VLAN_FILTER_OFFLOAD        ETH_VLAN_FILTER_OFFLOAD
+#define RTE_ETH_VLAN_EXTEND_OFFLOAD        ETH_VLAN_EXTEND_OFFLOAD
+#define RTE_ETH_LINK_SPEED_200G                    ETH_LINK_SPEED_200G
+#define RTE_ETH_LINK_SPEED_100G                    ETH_LINK_SPEED_100G
+#define RTE_ETH_LINK_SPEED_56G             ETH_LINK_SPEED_56G
+#define RTE_ETH_LINK_SPEED_50G             ETH_LINK_SPEED_50G
+#define RTE_ETH_LINK_SPEED_40G             ETH_LINK_SPEED_40G
+#define RTE_ETH_LINK_SPEED_25G             ETH_LINK_SPEED_25G
+#define RTE_ETH_LINK_SPEED_20G             ETH_LINK_SPEED_20G
+#define RTE_ETH_LINK_SPEED_10G             ETH_LINK_SPEED_10G
+#define RTE_ETH_LINK_SPEED_5G              ETH_LINK_SPEED_5G
+#define RTE_ETH_LINK_SPEED_2_5G                    ETH_LINK_SPEED_2_5G
+#define RTE_ETH_LINK_SPEED_1G              ETH_LINK_SPEED_1G
+#define RTE_ETH_RSS_IP                     ETH_RSS_IP
+#define RTE_ETH_RSS_UDP                            ETH_RSS_UDP
+#define RTE_ETH_RSS_TCP                            ETH_RSS_TCP
 #endif
 
 /*