flow: add esp spi rss type 00/33500/2
authorPiotr Bronowski <piotrx.bronowski@intel.com>
Fri, 2 Jul 2021 09:20:03 +0000 (09:20 +0000)
committerDamjan Marion <dmarion@me.com>
Tue, 31 Aug 2021 15:24:33 +0000 (15:24 +0000)
Type: feature

This patch adds IPsec ESP SPI as RSS key for better IPsec
inbound processing scaling. With this feature enabled,
The NIC will use the packets' SPI index as the RSS key
to distribute them to different queues.

The dpdk-input is also updated to support this feature.

Sample CLI command to enable Ipsec ESP SPI as RSS key:

test flow add src-ip any dst-ip any rss types esp
test flow enable eth0 index 0

Signed-off-by: Piotr Bronowski <piotrx.bronowski@intel.com>
Signed-off-by: Gabriel Oginski <gabrielx.oginski@intel.com>
Change-Id: I8b7d01cfc065e9099fad33042ce76898e16ddbf0

src/plugins/dpdk/device/dpdk.h
src/plugins/dpdk/device/flow.c
src/vnet/flow/flow.h

index 66794a4..9df7f39 100644 (file)
@@ -443,32 +443,33 @@ typedef enum
 
 void dpdk_update_link_state (dpdk_device_t * xd, f64 now);
 
-#define foreach_dpdk_rss_hf                    \
-  _(0, ETH_RSS_FRAG_IPV4,           "ipv4-frag")    \
-  _(1, ETH_RSS_NONFRAG_IPV4_TCP,    "ipv4-tcp")     \
-  _(2, ETH_RSS_NONFRAG_IPV4_UDP,    "ipv4-udp")     \
-  _(3, ETH_RSS_NONFRAG_IPV4_SCTP,   "ipv4-sctp")    \
-  _(4, ETH_RSS_NONFRAG_IPV4_OTHER,  "ipv4-other")   \
-  _(5, ETH_RSS_IPV4,                "ipv4")         \
-  _(6, ETH_RSS_IPV6_TCP_EX,         "ipv6-tcp-ex")  \
-  _(7, ETH_RSS_IPV6_UDP_EX,         "ipv6-udp-ex")  \
-  _(8, ETH_RSS_FRAG_IPV6,           "ipv6-frag")    \
-  _(9, ETH_RSS_NONFRAG_IPV6_TCP,    "ipv6-tcp")     \
-  _(10, ETH_RSS_NONFRAG_IPV6_UDP,   "ipv6-udp")     \
-  _(11, ETH_RSS_NONFRAG_IPV6_SCTP,  "ipv6-sctp")    \
-  _(12, ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other")   \
-  _(13, ETH_RSS_IPV6_EX,            "ipv6-ex")      \
-  _(14, ETH_RSS_IPV6,               "ipv6")         \
-  _(15, ETH_RSS_L2_PAYLOAD,         "l2-payload")   \
-  _(16, ETH_RSS_PORT,               "port")         \
-  _(17, ETH_RSS_VXLAN,              "vxlan")        \
-  _(18, ETH_RSS_GENEVE,             "geneve")       \
-  _(19, ETH_RSS_NVGRE,              "nvgre")        \
-  _(20, ETH_RSS_GTPU,               "gtpu")         \
-  _(60, ETH_RSS_L4_DST_ONLY,        "l4-dst-only")  \
-  _(61, ETH_RSS_L4_SRC_ONLY,        "l4-src-only")  \
-  _(62, ETH_RSS_L3_DST_ONLY,        "l3-dst-only")  \
-  _(63, ETH_RSS_L3_SRC_ONLY,        "l3-src-only")
+#define foreach_dpdk_rss_hf                                                   \
+  _ (0, ETH_RSS_FRAG_IPV4, "ipv4-frag")                                       \
+  _ (1, ETH_RSS_NONFRAG_IPV4_TCP, "ipv4-tcp")                                 \
+  _ (2, ETH_RSS_NONFRAG_IPV4_UDP, "ipv4-udp")                                 \
+  _ (3, ETH_RSS_NONFRAG_IPV4_SCTP, "ipv4-sctp")                               \
+  _ (4, ETH_RSS_NONFRAG_IPV4_OTHER, "ipv4-other")                             \
+  _ (5, ETH_RSS_IPV4, "ipv4")                                                 \
+  _ (6, ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex")                                   \
+  _ (7, ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex")                                   \
+  _ (8, ETH_RSS_FRAG_IPV6, "ipv6-frag")                                       \
+  _ (9, ETH_RSS_NONFRAG_IPV6_TCP, "ipv6-tcp")                                 \
+  _ (10, ETH_RSS_NONFRAG_IPV6_UDP, "ipv6-udp")                                \
+  _ (11, ETH_RSS_NONFRAG_IPV6_SCTP, "ipv6-sctp")                              \
+  _ (12, ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other")                            \
+  _ (13, ETH_RSS_IPV6_EX, "ipv6-ex")                                          \
+  _ (14, ETH_RSS_IPV6, "ipv6")                                                \
+  _ (15, ETH_RSS_L2_PAYLOAD, "l2-payload")                                    \
+  _ (16, ETH_RSS_PORT, "port")                                                \
+  _ (17, ETH_RSS_VXLAN, "vxlan")                                              \
+  _ (18, ETH_RSS_GENEVE, "geneve")                                            \
+  _ (19, ETH_RSS_NVGRE, "nvgre")                                              \
+  _ (20, ETH_RSS_GTPU, "gtpu")                                                \
+  _ (21, ETH_RSS_ESP, "esp")                                                  \
+  _ (60, ETH_RSS_L4_DST_ONLY, "l4-dst-only")                                  \
+  _ (61, ETH_RSS_L4_SRC_ONLY, "l4-src-only")                                  \
+  _ (62, ETH_RSS_L3_DST_ONLY, "l3-dst-only")                                  \
+  _ (63, ETH_RSS_L3_SRC_ONLY, "l3-src-only")
 
 format_function_t format_dpdk_device_name;
 format_function_t format_dpdk_device;
index a090ec0..850476b 100644 (file)
@@ -444,6 +444,14 @@ dpdk_flow_add (dpdk_device_t * xd, vnet_flow_t * f, dpdk_flow_entry_t * fe)
     }
 
 pattern_end:
+  if ((f->actions & VNET_FLOW_ACTION_RSS) &&
+      (f->rss_types & (1ULL << VNET_FLOW_RSS_TYPES_ESP)))
+    {
+
+      vec_add2 (items, item, 1);
+      item->type = RTE_FLOW_ITEM_TYPE_ESP;
+    }
+
   vec_add2 (items, item, 1);
   item->type = RTE_FLOW_ITEM_TYPE_END;
 
index ad61677..76c1df8 100644 (file)
@@ -127,32 +127,40 @@ typedef enum
   _( -5, NO_SUCH_INTERFACE, "no such interface")               \
   _( -6, INTERNAL, "internal error")
 
-#define foreach_flow_rss_types                    \
-  _(0, FRAG_IPV4,          "ipv4-frag")   \
-  _(1, IPV4_TCP,           "ipv4-tcp")    \
-  _(2, IPV4_UDP,           "ipv4-udp")    \
-  _(3, IPV4_SCTP,          "ipv4-sctp")   \
-  _(4, IPV4_OTHER,         "ipv4-other")  \
-  _(5, IPV4,               "ipv4")        \
-  _(6, IPV6_TCP_EX,        "ipv6-tcp-ex") \
-  _(7, IPV6_UDP_EX,        "ipv6-udp-ex") \
-  _(8, FRAG_IPV6,          "ipv6-frag")   \
-  _(9, IPV6_TCP,           "ipv6-tcp")    \
-  _(10, IPV6_UDP,          "ipv6-udp")    \
-  _(11, IPV6_SCTP,         "ipv6-sctp")   \
-  _(12, IPV6_OTHER,        "ipv6-other")  \
-  _(13, IPV6_EX,           "ipv6-ex")     \
-  _(14, IPV6,              "ipv6")        \
-  _(15, L2_PAYLOAD,        "l2-payload")  \
-  _(16, PORT,              "port")        \
-  _(17, VXLAN,             "vxlan")       \
-  _(18, GENEVE,            "geneve")      \
-  _(19, NVGRE,             "nvgre")       \
-  _(20, GTPU,              "gtpu")        \
-  _(60, L4_DST_ONLY,       "l4-dst-only") \
-  _(61, L4_SRC_ONLY,       "l4-src-only") \
-  _(62, L3_DST_ONLY,       "l3-dst-only") \
-  _(63, L3_SRC_ONLY,       "l3-src-only")
+#define foreach_flow_rss_types                                                \
+  _ (0, FRAG_IPV4, "ipv4-frag")                                               \
+  _ (1, IPV4_TCP, "ipv4-tcp")                                                 \
+  _ (2, IPV4_UDP, "ipv4-udp")                                                 \
+  _ (3, IPV4_SCTP, "ipv4-sctp")                                               \
+  _ (4, IPV4_OTHER, "ipv4-other")                                             \
+  _ (5, IPV4, "ipv4")                                                         \
+  _ (6, IPV6_TCP_EX, "ipv6-tcp-ex")                                           \
+  _ (7, IPV6_UDP_EX, "ipv6-udp-ex")                                           \
+  _ (8, FRAG_IPV6, "ipv6-frag")                                               \
+  _ (9, IPV6_TCP, "ipv6-tcp")                                                 \
+  _ (10, IPV6_UDP, "ipv6-udp")                                                \
+  _ (11, IPV6_SCTP, "ipv6-sctp")                                              \
+  _ (12, IPV6_OTHER, "ipv6-other")                                            \
+  _ (13, IPV6_EX, "ipv6-ex")                                                  \
+  _ (14, IPV6, "ipv6")                                                        \
+  _ (15, L2_PAYLOAD, "l2-payload")                                            \
+  _ (16, PORT, "port")                                                        \
+  _ (17, VXLAN, "vxlan")                                                      \
+  _ (18, GENEVE, "geneve")                                                    \
+  _ (19, NVGRE, "nvgre")                                                      \
+  _ (20, GTPU, "gtpu")                                                        \
+  _ (21, ESP, "esp")                                                          \
+  _ (60, L4_DST_ONLY, "l4-dst-only")                                          \
+  _ (61, L4_SRC_ONLY, "l4-src-only")                                          \
+  _ (62, L3_DST_ONLY, "l3-dst-only")                                          \
+  _ (63, L3_SRC_ONLY, "l3-src-only")
+
+typedef enum
+{
+#define _(v, n, s) VNET_FLOW_RSS_TYPES_##n = v,
+  foreach_flow_rss_types
+#undef _
+} vnet_flow_rss_types_t;
 
 #define foreach_rss_function           \
   _(DEFAULT, "default")                \