summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Bronowski <piotrx.bronowski@intel.com>2021-07-02 09:20:03 +0000
committerDamjan Marion <dmarion@me.com>2021-08-31 15:24:33 +0000
commitda6520b4ed7ddd35a7c52403a2df1c9fac3c24ca (patch)
treea12d6c7f589a453711ecb272168db93d1a0fa81c
parent8990f095a58748f82a1ef6388d3b4ea833365af9 (diff)
flow: add esp spi rss type
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
-rw-r--r--src/plugins/dpdk/device/dpdk.h53
-rw-r--r--src/plugins/dpdk/device/flow.c8
-rw-r--r--src/vnet/flow/flow.h60
3 files changed, 69 insertions, 52 deletions
diff --git a/src/plugins/dpdk/device/dpdk.h b/src/plugins/dpdk/device/dpdk.h
index 66794a4e67c..9df7f398ee6 100644
--- a/src/plugins/dpdk/device/dpdk.h
+++ b/src/plugins/dpdk/device/dpdk.h
@@ -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;
diff --git a/src/plugins/dpdk/device/flow.c b/src/plugins/dpdk/device/flow.c
index a090ec0e930..850476b87c1 100644
--- a/src/plugins/dpdk/device/flow.c
+++ b/src/plugins/dpdk/device/flow.c
@@ -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;
diff --git a/src/vnet/flow/flow.h b/src/vnet/flow/flow.h
index ad61677a44b..76c1df8a22f 100644
--- a/src/vnet/flow/flow.h
+++ b/src/vnet/flow/flow.h
@@ -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") \