Add ipsec policy test suites with flow director or rss accelerated 19/36119/8
authorYulong Pei <yulong.pei@intel.com>
Wed, 11 May 2022 04:29:50 +0000 (04:29 +0000)
committerPeter Mikus <peter.mikus@protonmail.ch>
Fri, 17 Jun 2022 09:15:30 +0000 (09:15 +0000)
The test scenario is about two private networks which communication was
protected by ipsec.

The test suites are to show performance impovement about ipsec esp flow
lookup that offloaded by NIC flow director and rss.

Verified on 3n-clx and Intel E810 NIC environment, with 64B ipsec packet
flow, performance improved ~31% with 1C2T, ~110% with 2C4T, ~250% with 4C8T.

Signed-off-by: xinfeng zhao <xinfengx.zhao@intel.com>
Signed-off-by: Yulong Pei <yulong.pei@intel.com>
Change-Id: I30aec8c5115e5a6fbef88c11d1bef2624029d1b9

docs/tag_documentation.rst
resources/libraries/python/FlowUtil.py
resources/libraries/python/IPsecUtil.py
tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr.robot [new file with mode: 0644]

index d9861a2..4a869d6 100644 (file)
@@ -571,6 +571,14 @@ Encapsulation Tags
 
     All test cases with FLOW.
 
+.. topic:: FLOW_DIR
+
+    All test cases with FLOW_DIR.
+
+.. topic:: FLOW_RSS
+
+    All test cases with FLOW_RSS.
+
 .. topic:: NTUPLE
 
     All test cases with NTUPLE.
index 3eb3b99..23293b6 100644 (file)
@@ -1,4 +1,4 @@
-# copyright (c) 2021 Intel and/or its affiliates.
+# copyright (c) 2022 Intel and/or its affiliates.
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
 
 """Flow Utilities Library."""
 
+from enum import IntEnum
 from ipaddress import ip_address
 
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.ssh import exec_cmd_no_error
 from resources.libraries.python.PapiExecutor import PapiSocketExecutor
 
+class FlowType(IntEnum):
+    """Flow types."""
+    FLOW_TYPE_ETHERNET = 1
+    FLOW_TYPE_IP4 = 2
+    FLOW_TYPE_IP6 = 3
+    FLOW_TYPE_IP4_L2TPV3OIP = 4
+    FLOW_TYPE_IP4_IPSEC_ESP = 5
+    FLOW_TYPE_IP4_IPSEC_AH = 6
+    FLOW_TYPE_IP4_N_TUPLE = 7
+    FLOW_TYPE_IP6_N_TUPLE = 8
+    FLOW_TYPE_IP4_VXLAN = 11
+    FLOW_TYPE_IP6_VXLAN = 12
+    FLOW_TYPE_IP4_GTPU = 14
+
+class FlowProto(IntEnum):
+    """Flow protocols."""
+    IP_API_PROTO_TCP = 6
+    IP_API_PROTO_UDP = 17
+    IP_API_PROTO_ESP = 50
+    IP_API_PROTO_AH = 51
+    IP_API_PROTO_L2TP = 115
+
+class FlowAction(IntEnum):
+    """Flow actions."""
+    FLOW_ACTION_MARK = 2
+    FLOW_ACTION_REDIRECT_TO_QUEUE = 16
+    FLOW_ACTION_DROP = 64
+
 class FlowUtil:
     """Utilities for flow configuration."""
 
@@ -48,15 +77,13 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip4_n_tuple"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_N_TUPLE
+        flow_type = FlowType.FLOW_TYPE_IP4_N_TUPLE
 
         if proto == u"TCP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_TCP
+            flow_proto = FlowProto.IP_API_PROTO_TCP
         elif proto == u"UDP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+            flow_proto = FlowProto.IP_API_PROTO_UDP
         else:
             raise ValueError(f"proto error: {proto}")
 
@@ -99,15 +126,13 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip6_n_tuple"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP6_N_TUPLE
+        flow_type = FlowType.FLOW_TYPE_IP6_N_TUPLE
 
         if proto == u"TCP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_TCP
+            flow_proto = FlowProto.IP_API_PROTO_TCP
         elif proto == u"UDP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+            flow_proto = FlowProto.IP_API_PROTO_UDP
         else:
             raise ValueError(f"proto error: {proto}")
 
@@ -147,15 +172,13 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip4"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4
+        flow_type = FlowType.FLOW_TYPE_IP4
 
         if proto == u"TCP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_TCP
+            flow_proto = FlowProto.IP_API_PROTO_TCP
         elif proto == u"UDP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+            flow_proto = FlowProto.IP_API_PROTO_UDP
         else:
             raise ValueError(f"proto error: {proto}")
 
@@ -191,15 +214,13 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip6"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP6
+        flow_type = FlowType.FLOW_TYPE_IP6
 
         if proto == u"TCP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_TCP
+            flow_proto = FlowProto.IP_API_PROTO_TCP
         elif proto == u"UDP":
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+            flow_proto = FlowProto.IP_API_PROTO_UDP
         else:
             raise ValueError(f"proto error: {proto}")
 
@@ -237,11 +258,9 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip4_gtpu"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_GTPU
-        flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+        flow_type = FlowType.FLOW_TYPE_IP4_GTPU
+        flow_proto = FlowProto.IP_API_PROTO_UDP
 
         pattern = {
             u'src_addr': {u'addr': src_ip, u'mask': u"255.255.255.255"},
@@ -273,16 +292,14 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         if proto == u"ESP":
             flow = u"ip4_ipsec_esp"
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_ESP
-            flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_IPSEC_ESP
+            flow_proto = FlowProto.IP_API_PROTO_ESP
+            flow_type = FlowType.FLOW_TYPE_IP4_IPSEC_ESP
         elif proto == u"AH":
             flow = u"ip4_ipsec_ah"
-            flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_AH
-            flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_IPSEC_AH
+            flow_proto = FlowProto.IP_API_PROTO_AH
+            flow_type = FlowType.FLOW_TYPE_IP4_IPSEC_AH
         else:
             raise ValueError(f"proto error: {proto}")
 
@@ -312,11 +329,9 @@ class FlowUtil:
         :returns: flow_index.
         :rtype: int
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip4_l2tpv3oip"
-        flow_proto = 115    # IP_API_PROTO_L2TP
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_L2TPV3OIP
+        flow_proto = FlowProto.IP_API_PROTO_L2TP
+        flow_type = FlowType.FLOW_TYPE_IP4_L2TPV3OIP
 
         pattern = {
             u'protocol': {u'prot': flow_proto},
@@ -347,11 +362,9 @@ class FlowUtil:
         :type value: int
         :returns: flow_index.
         """
-        from vpp_papi import VppEnum
-
         flow = u"ip4_vxlan"
-        flow_type = VppEnum.vl_api_flow_type_t.FLOW_TYPE_IP4_VXLAN
-        flow_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+        flow_type = FlowType.FLOW_TYPE_IP4_VXLAN
+        flow_proto = FlowProto.IP_API_PROTO_UDP
 
         pattern = {
             u'src_addr': {u'addr': src_ip, u'mask': u"255.255.255.255"},
@@ -387,29 +400,26 @@ class FlowUtil:
         :rtype: int
         :raises ValueError: If action type is not supported.
         """
-        from vpp_papi import VppEnum
-
         cmd = u"flow_add"
 
         if action == u"redirect-to-queue":
             flow_rule = {
                 u'type': flow_type,
-                u'actions': VppEnum.vl_api_flow_action_t.\
-                            FLOW_ACTION_REDIRECT_TO_QUEUE,
+                u'actions': FlowAction.FLOW_ACTION_REDIRECT_TO_QUEUE,
                 u'redirect_queue': value,
                 u'flow': {flow : pattern}
             }
         elif action == u"mark":
             flow_rule = {
                 u'type': flow_type,
-                u'actions': VppEnum.vl_api_flow_action_t.FLOW_ACTION_MARK,
+                u'actions': FlowAction.FLOW_ACTION_MARK,
                 u'mark_flow_id': value,
                 u'flow': {flow : pattern}
             }
         elif action == u"drop":
             flow_rule = {
                 u'type': flow_type,
-                u'actions': VppEnum.vl_api_flow_action_t.FLOW_ACTION_DROP,
+                u'actions': FlowAction.FLOW_ACTION_DROP,
                 u'flow': {flow : pattern}
             }
         else:
@@ -437,8 +447,6 @@ class FlowUtil:
         :type flow_index: int
         :returns: Nothing.
         """
-        from vpp_papi import VppEnum
-
         cmd = u"flow_enable"
         sw_if_index = Topology.get_interface_sw_index(node, interface)
         args = dict(
@@ -463,8 +471,6 @@ class FlowUtil:
         :type flow_index: int
         :returns: Nothing.
         """
-        from vpp_papi import VppEnum
-
         cmd = u"flow_disable"
         sw_if_index = Topology.get_interface_sw_index(node, interface)
         args = dict(
@@ -487,8 +493,6 @@ class FlowUtil:
         :type flow_index: int
         :returns: Nothing.
         """
-        from vpp_papi import VppEnum
-
         cmd = u"flow_del"
         args = dict(
             flow_index=int(flow_index)
@@ -508,8 +512,6 @@ class FlowUtil:
         :returns: flow entry.
         :rtype: str
         """
-        from vpp_papi import VppEnum
-
         cmd = u"vppctl show flow entry"
 
         err_msg = u"Failed to show flow on host {node[u'host']}"
@@ -545,8 +547,6 @@ class FlowUtil:
         :raises RuntimeError: If the verification of flow action fails.
         :raises ValueError: If action type is not supported.
         """
-        from vpp_papi import VppEnum
-
         err_msg = f"Failed to show trace on host {node[u'host']}"
         cmd = u"vppctl show trace"
         stdout, _ = exec_cmd_no_error(
index e3b3c88..6ed2db1 100644 (file)
@@ -34,6 +34,7 @@ from resources.libraries.python.ssh import scp_node
 from resources.libraries.python.topology import Topology, NodeType
 from resources.libraries.python.VatExecutor import VatExecutor
 from resources.libraries.python.VPPUtil import VPPUtil
+from resources.libraries.python.FlowUtil import FlowUtil
 
 
 IPSEC_UDP_PORT_NONE = 0xffff
@@ -471,7 +472,8 @@ class IPsecUtil:
     @staticmethod
     def vpp_ipsec_add_sad_entries(
             node, n_entries, sad_id, spi, crypto_alg, crypto_key,
-            integ_alg=None, integ_key=u"", tunnel_src=None, tunnel_dst=None):
+            integ_alg=None, integ_key=u"", tunnel_src=None,tunnel_dst=None,
+            tunnel_addr_incr=True):
         """Create multiple Security Association Database entries on VPP node.
 
         :param node: VPP node to add SAD entry on.
@@ -488,6 +490,8 @@ class IPsecUtil:
             specified ESP transport mode is used.
         :param tunnel_dst: Tunnel header destination IPv4 or IPv6 address. If
             not specified ESP transport mode is used.
+        :param tunnel_addr_incr: Enable or disable tunnel IP address
+            incremental step.
         :type node: dict
         :type n_entries: int
         :type sad_id: int
@@ -498,6 +502,7 @@ class IPsecUtil:
         :type integ_key: str
         :type tunnel_src: str
         :type tunnel_dst: str
+        :type tunnel_addr_incr: bool
         """
         if isinstance(crypto_key, str):
             crypto_key = crypto_key.encode(encoding=u"utf-8")
@@ -510,8 +515,11 @@ class IPsecUtil:
             src_addr = u""
             dst_addr = u""
 
-        addr_incr = 1 << (128 - 96) if src_addr.version == 6 \
-            else 1 << (32 - 24)
+        if tunnel_addr_incr:
+            addr_incr = 1 << (128 - 96) if src_addr.version == 6 \
+                else 1 << (32 - 24)
+        else:
+            addr_incr = 0
 
         if int(n_entries) > 10:
             tmp_filename = f"/tmp/ipsec_sad_{sad_id}_add_del_entry.script"
@@ -2114,7 +2122,8 @@ class IPsecUtil:
     @staticmethod
     def vpp_ipsec_add_multiple_tunnels(
             nodes, interface1, interface2, n_tunnels, crypto_alg, integ_alg,
-            tunnel_ip1, tunnel_ip2, raddr_ip1, raddr_ip2, raddr_range):
+            tunnel_ip1, tunnel_ip2, raddr_ip1, raddr_ip2, raddr_range,
+            tunnel_addr_incr=True):
         """Create multiple IPsec tunnels between two VPP nodes.
 
         :param nodes: VPP nodes to create tunnels.
@@ -2131,6 +2140,8 @@ class IPsecUtil:
             first tunnel in direction node2->node1.
         :param raddr_range: Mask specifying range of Policy selector Remote
             IPv4 addresses. Valid values are from 1 to 32.
+        :param tunnel_addr_incr: Enable or disable tunnel IP address
+            incremental step.
         :type nodes: dict
         :type interface1: str or int
         :type interface2: str or int
@@ -2142,6 +2153,7 @@ class IPsecUtil:
         :type raddr_ip1: string
         :type raddr_ip2: string
         :type raddr_range: int
+        :type tunnel_addr_incr: bool
         """
         spd_id = 1
         p_hi = 100
@@ -2184,7 +2196,7 @@ class IPsecUtil:
 
         IPsecUtil.vpp_ipsec_add_sad_entries(
             nodes[u"DUT1"], n_tunnels, sa_id_1, spi_1, crypto_alg, crypto_key,
-            integ_alg, integ_key, tunnel_ip1, tunnel_ip2
+            integ_alg, integ_key, tunnel_ip1, tunnel_ip2, tunnel_addr_incr
         )
 
         IPsecUtil.vpp_ipsec_add_spd_entries(
@@ -2196,7 +2208,7 @@ class IPsecUtil:
 
         IPsecUtil.vpp_ipsec_add_sad_entries(
             nodes[u"DUT1"], n_tunnels, sa_id_2, spi_2, crypto_alg, crypto_key,
-            integ_alg, integ_key, tunnel_ip2, tunnel_ip1
+            integ_alg, integ_key, tunnel_ip2, tunnel_ip1, tunnel_addr_incr
         )
         IPsecUtil.vpp_ipsec_add_spd_entries(
             nodes[u"DUT1"], n_tunnels, spd_id, priority=ObjIncrement(p_lo, 0),
@@ -2226,7 +2238,8 @@ class IPsecUtil:
 
             IPsecUtil.vpp_ipsec_add_sad_entries(
                 nodes[u"DUT2"], n_tunnels, sa_id_1, spi_1, crypto_alg,
-                crypto_key, integ_alg, integ_key, tunnel_ip1, tunnel_ip2
+                crypto_key, integ_alg, integ_key, tunnel_ip1, tunnel_ip2,
+                tunnel_addr_incr
             )
             IPsecUtil.vpp_ipsec_add_spd_entries(
                 nodes[u"DUT2"], n_tunnels, spd_id,
@@ -2238,7 +2251,8 @@ class IPsecUtil:
 
             IPsecUtil.vpp_ipsec_add_sad_entries(
                 nodes[u"DUT2"], n_tunnels, sa_id_2, spi_2, crypto_alg,
-                crypto_key, integ_alg, integ_key, tunnel_ip2, tunnel_ip1
+                crypto_key, integ_alg, integ_key, tunnel_ip2, tunnel_ip1,
+                tunnel_addr_incr
             )
             IPsecUtil.vpp_ipsec_add_spd_entries(
                 nodes[u"DUT2"], n_tunnels, spd_id,
@@ -2268,3 +2282,53 @@ class IPsecUtil:
             u"ipsec_sa_v3_dump"
         ]
         PapiSocketExecutor.dump_and_log(node, cmds)
+
+    @staticmethod
+    def vpp_ipsec_flow_enale_rss(node, proto, type, function="default"):
+        """Ipsec flow enable rss action.
+
+        :param node: DUT node.
+        :param proto: The flow protocol.
+        :param type: RSS type.
+        :param function: RSS function.
+
+        :type node: dict
+        :type proto: str
+        :type type: str
+        :type function: str
+        :returns: flow_index.
+        """
+        # TODO: to be fixed to use full PAPI when it is ready in VPP
+        cmd = f"test flow add src-ip any proto {proto} rss function " \
+            f"{function} rss types {type}"
+        stdout = PapiSocketExecutor.run_cli_cmd(node, cmd)
+        flow_index = stdout.split()[1]
+
+        return flow_index
+
+    @staticmethod
+    def vpp_create_ipsec_flows_on_dut(
+            node, n_flows, rx_queues, spi_start, interface):
+        """Create mutiple ipsec flows and enable flows onto interface.
+
+        :param node: DUT node.
+        :param n_flows: Number of flows to create.
+        :param rx_queues: NUmber of RX queues.
+        :param spi_start: The start spi.
+        :param interface: Name of the interface.
+
+        :type node: dict
+        :type n_flows: int
+        :type rx_queues: int
+        :type spi_start: int
+        :type interface: str
+        :returns: flow_index.
+        """
+
+        for i in range(0, n_flows):
+            rx_queue = i%rx_queues
+
+            spi = spi_start + i
+            flow_index = FlowUtil.vpp_create_ip4_ipsec_flow(
+                    node, "ESP", spi, "redirect-to-queue", value=rx_queue)
+            FlowUtil.vpp_flow_enable(node, interface, flow_index)
diff --git a/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr.robot b/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr.robot
new file mode 100644 (file)
index 0000000..abb0619
--- /dev/null
@@ -0,0 +1,173 @@
+# Copyright (c) 2022 Intel and/or its affiliates.
+# Copyright (c) 2022 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+|
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR | TNL_1000
+| ... | IP4FWD | IPSEC | IPSECSW | IPSECTUN | NIC_Intel-X710 | SCALE
+| ... | AES_256_GCM | AES | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | ipsec_sa
+|
+| Test Template | Local Template
+|
+| Documentation | **IPv4 IPsec tunnel mode performance test suite.**
+| ... |
+| ... | - **[Top] Network Topologies:** TG-DUT1-DUT2-TG 3-node circular \
+| ... | topology with single links between nodes.
+| ... |
+| ... | - **[Enc] Packet Encapsulations:** Eth-IPv4 on TG-DUTn, \
+| ... | Eth-IPv4-IPSec on DUT1-DUT2.
+| ... |
+| ... | - **[Cfg] DUT configuration:** DUT1 and DUT2 are configured with \
+| ... | multiple IPsec tunnels which shared same tunnel src and dst ip \
+| ... | address. DUTs get IPv4 traffic from TG, encrypt it and send to \
+| ... | another DUT, where packets are decrypted and sent back to TG.
+| ... |
+| ... | - **[Ver] TG verification:** TG finds and reports throughput NDR (Non \
+| ... | Drop Rate) with zero packet loss tolerance and throughput PDR \
+| ... | (Partial Drop Rate) with non-zero packet loss tolerance (LT) \
+| ... | expressed in percentage of packets transmitted. NDR and PDR are \
+| ... | discovered for different Ethernet L2 frame sizes using MLRsearch \
+| ... | library.
+| ... | Test packets are generated by TG on \
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups \
+| ... | (flow-group per direction, number of flows per flow-group equals to \
+| ... | number of IPSec tunnels) with all packets \
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and \
+| ... | static payload. MAC addresses are matching MAC addresses of the TG \
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) \
+| ... | is applied to both streams.
+| ... |
+| ... | - **[Ref] Applicable standard specifications:** RFC4303 and RFC2544.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | perfmon_plugin.so
+| ... | crypto_native_plugin.so
+| ... | crypto_ipsecmb_plugin.so | crypto_openssl_plugin.so
+| ${crypto_type}= | ${None}
+| ${nic_name}= | Intel-X710
+| ${nic_driver}= | vfio-pci
+| ${nic_rxq_size}= | 0
+| ${nic_txq_size}= | 0
+| ${nic_pfs}= | 2
+| ${nic_vfs}= | 0
+| ${osi_layer}= | L3
+| ${overhead}= | ${54}
+| ${tg_if1_ip4}= | 192.168.10.254
+| ${dut1_if1_ip4}= | 192.168.10.11
+| ${dut1_if2_ip4}= | 100.0.0.1
+| ${dut2_if1_ip4}= | 200.0.0.102
+| ${dut2_if2_ip4}= | 192.168.20.11
+| ${tg_if2_ip4}= | 192.168.20.254
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${24}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile}= | trex-stl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Keywords ***
+| Local Template
+| | [Documentation]
+| | ... | - **[Cfg]** DUT runs IPSec tunneling AES_256_GCM config. \
+| | ... | Each DUT uses ${phy_cores} physical core(s) for worker threads.
+| | ... | - **[Ver]** Measure NDR and PDR values using MLRsearch algorithm.
+| |
+| | ... | *Arguments:*
+| | ... | - frame_size - Framesize in Bytes in integer or string (IMIX_v4_1).
+| | ... | Type: integer, string
+| | ... | - phy_cores - Number of physical cores. Type: integer
+| | ... | - search_type - NDR or PDR. Type: string
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| | ... | - min_rate - Min rate for binary search, default value: ${50000}.
+| | ... | Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| |
+| | # These are enums (not strings) so they cannot be in Variables table.
+| | ${encr_alg}= | Crypto Alg AES GCM 256
+| | ${auth_alg}= | Set Variable | ${NONE}
+| | ${ipsec_proto}= | IPsec Proto ESP
+| |
+| | Given Set Max Rate And Jumbo
+| | And Add worker threads to all DUTs | ${phy_cores} | ${rxq}
+| | And Pre-initialize layer driver | ${nic_driver}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize layer driver | ${nic_driver}
+| | And Initialize layer interface
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${nodes} | ${DUT1_${int}2}[0] | ${DUT2_${int}1}[0] | ${n_tunnels}
+| | ... | ${encr_alg} | ${auth_alg} | ${dut1_if2_ip4} | ${dut2_if1_ip4}
+| | ... | ${laddr_ip4} | ${raddr_ip4} | ${addr_range} | ${False}
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr.robot b/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr.robot
new file mode 100644 (file)
index 0000000..cb52b13
--- /dev/null
@@ -0,0 +1,182 @@
+# Copyright (c) 2022 Intel and/or its affiliates.
+# Copyright (c) 2022 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+|
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR | TNL_1000
+| ... | IP4FWD | IPSEC | IPSECSW | IPSECTUN | FLOW_DIR | NIC_Intel-X710 | SCALE
+| ... | AES_256_GCM | AES | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | ipsec_sa
+|
+| Test Template | Local Template
+|
+| Documentation | **IPv4 IPsec tunnel mode performance test suite.**
+| ... |
+| ... | - **[Top] Network Topologies:** TG-DUT1-DUT2-TG 3-node circular \
+| ... | topology with single links between nodes.
+| ... |
+| ... | - **[Enc] Packet Encapsulations:** Eth-IPv4 on TG-DUTn, \
+| ... | Eth-IPv4-IPSec on DUT1-DUT2.
+| ... |
+| ... | - **[Cfg] DUT configuration:** DUT1 and DUT2 are configured with \
+| ... | multiple IPsec tunnels which shared same tunnel src and dst ip \
+| ... | address, enabled IPsec_ESP flow director between them.\
+| ... | DUTs get IPv4 traffic from TG, encrypt it and send to another \
+| ... | DUT, where packets are decrypted and sent back to TG.
+| ... |
+| ... | - **[Ver] TG verification:** TG finds and reports throughput NDR (Non \
+| ... | Drop Rate) with zero packet loss tolerance and throughput PDR \
+| ... | (Partial Drop Rate) with non-zero packet loss tolerance (LT) \
+| ... | expressed in percentage of packets transmitted. NDR and PDR are \
+| ... | discovered for different Ethernet L2 frame sizes using MLRsearch \
+| ... | library.
+| ... | Test packets are generated by TG on \
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups \
+| ... | (flow-group per direction, number of flows per flow-group equals to \
+| ... | number of IPSec tunnels) with all packets \
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and \
+| ... | static payload. MAC addresses are matching MAC addresses of the TG \
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) \
+| ... | is applied to both streams.
+| ... |
+| ... | - **[Ref] Applicable standard specifications:** RFC4303 and RFC2544.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | perfmon_plugin.so
+| ... | crypto_native_plugin.so
+| ... | crypto_ipsecmb_plugin.so | crypto_openssl_plugin.so
+| ${crypto_type}= | ${None}
+| ${nic_name}= | Intel-X710
+| ${nic_driver}= | vfio-pci
+| ${nic_rxq_size}= | 0
+| ${nic_txq_size}= | 0
+| ${nic_pfs}= | 2
+| ${nic_vfs}= | 0
+| ${osi_layer}= | L3
+| ${overhead}= | ${54}
+| ${tg_if1_ip4}= | 192.168.10.254
+| ${dut1_if1_ip4}= | 192.168.10.11
+| ${dut1_if2_ip4}= | 100.0.0.1
+| ${dut2_if1_ip4}= | 200.0.0.102
+| ${dut2_if2_ip4}= | 192.168.20.11
+| ${tg_if2_ip4}= | 192.168.20.254
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${24}
+| ${dut1_spi}= | ${400000}
+| ${dut2_spi}= | ${300000}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile}= | trex-stl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Keywords ***
+| Local Template
+| | [Documentation]
+| | ... | - **[Cfg]** DUT runs IPSec tunneling AES_256_GCM config. \
+| | ... | Each DUT uses ${phy_cores} physical core(s) for worker threads.
+| | ... | - **[Ver]** Measure NDR and PDR values using MLRsearch algorithm.
+| |
+| | ... | *Arguments:*
+| | ... | - frame_size - Framesize in Bytes in integer or string (IMIX_v4_1).
+| | ... | Type: integer, string
+| | ... | - phy_cores - Number of physical cores. Type: integer
+| | ... | - search_type - NDR or PDR. Type: string
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| | ... | - min_rate - Min rate for binary search, default value: ${50000}.
+| | ... | Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| |
+| | # These are enums (not strings) so they cannot be in Variables table.
+| | ${encr_alg}= | Crypto Alg AES GCM 256
+| | ${auth_alg}= | Set Variable | ${NONE}
+| | ${ipsec_proto}= | IPsec Proto ESP
+| |
+| | Given Set Max Rate And Jumbo
+| | And Add worker threads to all DUTs | ${phy_cores} | ${rxq}
+| | And Pre-initialize layer driver | ${nic_driver}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize layer driver | ${nic_driver}
+| | And Initialize layer interface
+| | And Initialize IPSec in 3-node circular topology
+| | And VPP Create Ipsec Flows On Dut
+| | ... | ${dut1} | ${n_tunnels} | ${rxq_count_int} | ${dut1_spi}
+| | ... | ${DUT1_${int}2}[0]
+| | And VPP Create Ipsec Flows On Dut
+| | ... | ${dut2} | ${n_tunnels} | ${rxq_count_int} | ${dut2_spi}
+| | ... | ${DUT2_${int}1}[0]
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${nodes} | ${DUT1_${int}2}[0] | ${DUT2_${int}1}[0] | ${n_tunnels}
+| | ... | ${encr_alg} | ${auth_alg} | ${dut1_if2_ip4} | ${dut2_if1_ip4}
+| | ... | ${laddr_ip4} | ${raddr_ip4} | ${addr_range} | ${False}
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-dir-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr.robot b/tests/vpp/perf/crypto/10ge2p1x710-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr.robot
new file mode 100644 (file)
index 0000000..17fc6bd
--- /dev/null
@@ -0,0 +1,180 @@
+# Copyright (c) 2022 Intel and/or its affiliates.
+# Copyright (c) 2022 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/crypto/ipsec.robot
+|
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR | TNL_1000
+| ... | IP4FWD | IPSEC | IPSECSW | IPSECTUN | FLOW_RSS | NIC_Intel-X710 | SCALE
+| ... | AES_256_GCM | AES | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | ipsec_sa
+|
+| Test Template | Local Template
+|
+| Documentation | **IPv4 IPsec tunnel mode performance test suite.**
+| ... |
+| ... | - **[Top] Network Topologies:** TG-DUT1-DUT2-TG 3-node circular \
+| ... | topology with single links between nodes.
+| ... |
+| ... | - **[Enc] Packet Encapsulations:** Eth-IPv4 on TG-DUTn, \
+| ... | Eth-IPv4-IPSec on DUT1-DUT2.
+| ... |
+| ... | - **[Cfg] DUT configuration:** DUT1 and DUT2 are configured with \
+| ... | multiple IPsec tunnels which shared same tunnel src and dst ip \
+| ... | address, enabled flow rss action between them.\
+| ... | DUTs get IPv4 traffic from TG, encrypt it and send to another DUT, \
+| ... | where packets are decrypted and sent back to TG.
+| ... |
+| ... | - **[Ver] TG verification:** TG finds and reports throughput NDR (Non \
+| ... | Drop Rate) with zero packet loss tolerance and throughput PDR \
+| ... | (Partial Drop Rate) with non-zero packet loss tolerance (LT) \
+| ... | expressed in percentage of packets transmitted. NDR and PDR are \
+| ... | discovered for different Ethernet L2 frame sizes using MLRsearch \
+| ... | library.
+| ... | Test packets are generated by TG on \
+| ... | links to DUTs. TG traffic profile contains two L3 flow-groups \
+| ... | (flow-group per direction, number of flows per flow-group equals to \
+| ... | number of IPSec tunnels) with all packets \
+| ... | containing Ethernet header, IPv4 header with IP protocol=61 and \
+| ... | static payload. MAC addresses are matching MAC addresses of the TG \
+| ... | node interfaces. Incrementing of IP.dst (IPv4 destination address) \
+| ... | is applied to both streams.
+| ... |
+| ... | - **[Ref] Applicable standard specifications:** RFC4303 and RFC2544.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | perfmon_plugin.so
+| ... | crypto_native_plugin.so
+| ... | crypto_ipsecmb_plugin.so | crypto_openssl_plugin.so
+| ${crypto_type}= | ${None}
+| ${nic_name}= | Intel-X710
+| ${nic_driver}= | vfio-pci
+| ${nic_rxq_size}= | 0
+| ${nic_txq_size}= | 0
+| ${nic_pfs}= | 2
+| ${nic_vfs}= | 0
+| ${osi_layer}= | L3
+| ${overhead}= | ${54}
+| ${tg_if1_ip4}= | 192.168.10.254
+| ${dut1_if1_ip4}= | 192.168.10.11
+| ${dut1_if2_ip4}= | 100.0.0.1
+| ${dut2_if1_ip4}= | 200.0.0.102
+| ${dut2_if2_ip4}= | 192.168.20.11
+| ${tg_if2_ip4}= | 192.168.20.254
+| ${raddr_ip4}= | 20.0.0.0
+| ${laddr_ip4}= | 10.0.0.0
+| ${addr_range}= | ${24}
+| ${n_tunnels}= | ${1000}
+# Traffic profile:
+| ${traffic_profile}= | trex-stl-3n-ethip4-ip4dst${n_tunnels}
+
+*** Keywords ***
+| Local Template
+| | [Documentation]
+| | ... | - **[Cfg]** DUT runs IPSec tunneling AES_256_GCM config. \
+| | ... | Each DUT uses ${phy_cores} physical core(s) for worker threads.
+| | ... | - **[Ver]** Measure NDR and PDR values using MLRsearch algorithm.
+| |
+| | ... | *Arguments:*
+| | ... | - frame_size - Framesize in Bytes in integer or string (IMIX_v4_1).
+| | ... | Type: integer, string
+| | ... | - phy_cores - Number of physical cores. Type: integer
+| | ... | - search_type - NDR or PDR. Type: string
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| | ... | - min_rate - Min rate for binary search, default value: ${50000}.
+| | ... | Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| |
+| | # These are enums (not strings) so they cannot be in Variables table.
+| | ${encr_alg}= | Crypto Alg AES GCM 256
+| | ${auth_alg}= | Set Variable | ${NONE}
+| | ${ipsec_proto}= | IPsec Proto ESP
+| |
+| | Given Set Max Rate And Jumbo
+| | And Add worker threads to all DUTs | ${phy_cores} | ${rxq}
+| | And Pre-initialize layer driver | ${nic_driver}
+| | And Apply startup configuration on all VPP DUTs
+| | When Initialize layer driver | ${nic_driver}
+| | And Initialize layer interface
+| | And Initialize IPSec in 3-node circular topology
+| | ${flow_index} = | And VPP Ipsec Flow Enale Rss
+| | ... | ${dut1} | IPSEC_ESP | esp | default
+| | And VPP Flow Enable | ${dut1} | ${DUT1_${int}2}[0] | ${flow_index}
+| | ${flow_index} = | And VPP Ipsec Flow Enale Rss
+| | ... | ${dut2} | IPSEC_ESP | esp | default
+| | And VPP Flow Enable | ${dut2} | ${DUT2_${int}1}[0] | ${flow_index}
+| | And VPP IPsec Add Multiple Tunnels
+| | ... | ${nodes} | ${DUT1_${int}2}[0] | ${DUT2_${int}1}[0] | ${n_tunnels}
+| | ... | ${encr_alg} | ${auth_alg} | ${dut1_if2_ip4} | ${dut2_if1_ip4}
+| | ... | ${laddr_ip4} | ${raddr_ip4} | ${addr_range} | ${False}
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4ipsec1000tnlsw-fixtnlip-ip4base-policy-flow-rss-aes256gcm-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}