perf: GENEVE tunnel test, l3 mode 56/30356/21
authorJan Gelety <jgelety@cisco.com>
Thu, 3 Dec 2020 15:22:41 +0000 (16:22 +0100)
committerJan Gelety <jgelety@cisco.com>
Thu, 14 Jan 2021 09:44:31 +0000 (09:44 +0000)
Jira: CSIT-1768

Change-Id: I888ae1a5754fa07297d4cdf65c2be0e3e49d89a5
Signed-off-by: Jan Gelety <jgelety@cisco.com>
17 files changed:
GPL/traffic_profiles/trex/profile_trex_stateless_base_class.py
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1024t.py [new file with mode: 0644]
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-16t.py [new file with mode: 0644]
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1t.py [new file with mode: 0644]
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-256t.py [new file with mode: 0644]
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-4t.py [new file with mode: 0644]
GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-64t.py [new file with mode: 0644]
docs/tag_documentation.rst
resources/libraries/python/VPPUtil.py
resources/libraries/robot/ip/geneve.robot
resources/libraries/robot/performance/performance_vars.robot
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr.robot [new file with mode: 0644]
tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr.robot [new file with mode: 0644]

index 5cae6bf..5b86192 100644 (file)
@@ -24,7 +24,6 @@
 """Base class for stream profiles for T-rex traffic generator.
 """
 
-import sys
 import socket
 import struct
 
@@ -129,35 +128,39 @@ class TrafficStreamsBaseClass:
 
         # Frame size is defined as an integer, e.g. 64, 1518:
         if isinstance(self.framesize, int):
-            # Create a base packet and pad it to size
-            payload_len = max(0, self.framesize - len(base_pkt_a) - 4)  # No FCS
+            # Create a base packet and pad it to size; deduct FCS
+            payload_len_a = max(0, self.framesize - len(base_pkt_a) - 4)
+            payload_len_b = max(0, self.framesize - len(base_pkt_b) - 4)
 
             # Direction 0 --> 1
             pkt_a = STLPktBuilder(
-                pkt=base_pkt_a / self._gen_payload(payload_len), vm=vm1
+                pkt=base_pkt_a / self._gen_payload(payload_len_a), vm=vm1
             )
             # Direction 1 --> 0
             pkt_b = STLPktBuilder(
-                pkt=base_pkt_b / self._gen_payload(payload_len), vm=vm2
+                pkt=base_pkt_b / self._gen_payload(payload_len_b), vm=vm2
             )
 
             # Packets for latency measurement:
             # Direction 0 --> 1
             pkt_lat_a = STLPktBuilder(
-                pkt=base_pkt_a / self._gen_payload(payload_len), vm=vm1
+                pkt=base_pkt_a / self._gen_payload(payload_len_a), vm=vm1
             )
             # Direction 1 --> 0
             pkt_lat_b = STLPktBuilder(
-                pkt=base_pkt_b / self._gen_payload(payload_len), vm=vm2
+                pkt=base_pkt_b / self._gen_payload(payload_len_b), vm=vm2
             )
 
             # Create the streams:
             # Direction 0 --> 1
-            stream1 = STLStream(packet=pkt_a, mode=STLTXCont(pps=9000))
+            stream1 = STLStream(
+                packet=pkt_a, mode=STLTXCont(pps=9000)
+            )
             # Direction 1 --> 0
             # second traffic stream with a phase of 10ns (inter-stream gap)
-            stream2 = STLStream(packet=pkt_b, isg=10.0,
-                                mode=STLTXCont(pps=9000))
+            stream2 = STLStream(
+                packet=pkt_b, isg=10.0, mode=STLTXCont(pps=9000)
+            )
 
             # Streams for latency measurement:
             # Direction 0 --> 1
@@ -189,10 +192,12 @@ class TrafficStreamsBaseClass:
                 # Create a base packet and pad it to size
                 pkt_a = STLPktBuilder(
                     pkt=base_pkt_a / self._gen_payload(payload_len_a),
-                    vm=vm1)
+                    vm=vm1
+                )
                 pkt_b = STLPktBuilder(
                     pkt=base_pkt_b / self._gen_payload(payload_len_b),
-                    vm=vm2)
+                    vm=vm2
+                )
 
                 # Create the streams:
                 stream1.append(STLStream(
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1024t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1024t.py
new file mode 100644 (file)
index 0000000..42c0152
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.132.0.255
+   - Destination IP address range:       10.0.1.0 - 10.4.0.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.4.0.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.132.0.255
+   - Source UDP port range:              1024 - 65535
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from trex.stl.api import *
+from scapy.contrib.geneve import GENEVE
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 1024
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-16t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-16t.py
new file mode 100644 (file)
index 0000000..151ae50
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.128.17.255
+   - Destination IP address range:       10.0.1.0 - 10.0.17.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.0.17.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.128.17.255
+   - Source UDP port range:              1024 - 5119
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from scapy.contrib.geneve import GENEVE
+from trex.stl.api import *
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 16
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-1t.py
new file mode 100644 (file)
index 0000000..a62577e
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.128.1.255
+   - Destination IP address range:       10.0.1.0 - 10.0.1.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.0.1.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.128.1.255
+   - Source UDP port range:              1024 - 1279
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from scapy.contrib.geneve import GENEVE
+from trex.stl.api import *
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 1
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-256t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-256t.py
new file mode 100644 (file)
index 0000000..8098f91
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.129.0.255
+   - Destination IP address range:       10.0.1.0 - 10.1.0.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.1.0.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.129.0.255
+   - Source UDP port range:              1024 - 65535
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from scapy.contrib.geneve import GENEVE
+from trex.stl.api import *
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 256
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-4t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-4t.py
new file mode 100644 (file)
index 0000000..975d204
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.128.4.255
+   - Destination IP address range:       10.0.1.0 - 10.0.4.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.0.4.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.128.4.255
+   - Source UDP port range:              1024 - 2047
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from scapy.contrib.geneve import GENEVE
+from trex.stl.api import *
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 4
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
diff --git a/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-64t.py b/GPL/traffic_profiles/trex/trex-stl-2n-ethip4-geneve-64t.py
new file mode 100644 (file)
index 0000000..fd1fa88
--- /dev/null
@@ -0,0 +1,231 @@
+# Copyright (c) 2021 Cisco and/or its affiliates.
+#
+# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+#
+# Licensed under the Apache License 2.0 or
+# GNU General Public License v2.0 or later;  you may not use this file
+# except in compliance with one of these Licenses. You
+# may obtain a copy of the Licenses at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
+#
+# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
+# must be under GPLv2+.  If at any point in the future it is no longer linked
+# with Scapy (or other GPLv2+ licensed software), you are free to choose
+# Apache 2.
+#
+# 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.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Direction 0 --> 1:
+   - Packet: ETH / IP
+   - Source IP address range:            10.128.1.0 - 10.128.65.255
+   - Destination IP address range:       10.0.1.0 - 10.0.65.255
+ - Direction 1 --> 0:
+   - Packet: ETH / IP / UDP / GENEVE / ETH / IP
+   - Outer Source IP address range:      1.1.1.1
+   - Outer Destination IP address range: 1.1.1.2
+   - Inner Source IP address range:      10.0.1.0 - 10.0.65.255
+   - Inner Destination IP address range: 10.128.1.0 - 10.128.65.255
+   - Source UDP port range:              1024 - 17407
+   - Destination UDP port range:         6081
+"""
+
+from ctypes import c_int
+from ipaddress import IPv4Address
+
+from scapy.contrib.geneve import GENEVE
+from trex.stl.api import *
+
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+    """Stream profile."""
+
+    def __init__(self):
+        """Initialization and setting of streams' parameters."""
+
+        super(TrafficStreamsBaseClass, self).__init__()
+
+        # Nr. of GENEVE tunnels
+        self.n_tunnels = 64
+        # VNIs used in GENEVE headers of Direction 1 --> 0.
+        self.p2_geneve_start_vni = 1
+
+        # IPs used in packet headers of Direction 0 --> 1.
+        self.p1_src_start_ip = u"10.128.1.0"
+        self.p1_dst_start_ip = u"10.0.1.0"
+
+        # IPs used in packet headers of Direction 1 --> 0.
+        self.p2_outer_src_ip = u"1.1.1.1"
+        self.p2_outer_dst_ip = u"1.1.1.2"
+
+        self.p2_inner_src_start_ip = u"10.0.1.0"
+        self.p2_inner_dst_start_ip = u"10.128.1.0"
+
+        # MACs used in inner ethernet header of Direction 1 --> 0.
+        self.p2_inner_dst_mac = u"d0:0b:ee:d0:00:00"
+
+        # UDP ports used in packet headers of Direction 1 --> 0.
+        self.p2_udp_sport_start = 1024
+        self.p2_udp_dport = 6081
+
+    def define_packets(self):
+        """Defines the packets to be sent from the traffic generator.
+
+        Packet definition: | ETH | IP | UDP |
+
+        :returns: Packets to be sent from the traffic generator.
+        :rtype: tuple
+        """
+        p1_src_start_ip_int = int(IPv4Address(self.p1_src_start_ip))
+        p1_dst_start_ip_int = int(IPv4Address(self.p1_dst_start_ip))
+        p2_inner_src_start_ip_int = int(IPv4Address(self.p2_inner_src_start_ip))
+        p2_inner_dst_start_ip_int = int(IPv4Address(self.p2_inner_dst_start_ip))
+
+        # Direction 0 --> 1
+        base_pkt_a = (
+            Ether() /
+            IP(
+                src=self.p1_src_start_ip,
+                dst=self.p1_dst_start_ip,
+                proto=61
+            )
+        )
+        # Direction 1 --> 0
+        base_pkt_b = (
+            Ether() /
+            IP(
+                src=self.p2_outer_src_ip,
+                dst=self.p2_outer_dst_ip,
+                proto=17
+            ) /
+            UDP(
+                sport=self.p2_udp_sport_start,
+                dport=self.p2_udp_dport
+            ) /
+            GENEVE(vni=self.p2_geneve_start_vni) /
+            Ether(dst=self.p2_inner_dst_mac) /
+            IP(
+                src=self.p2_inner_src_start_ip,
+                dst=self.p2_inner_dst_start_ip,
+                proto=61
+            )
+        )
+        base_pkt_b /= Raw(load=self._gen_payload(110 - len(base_pkt_b)))
+        # Direction 0 --> 1
+        vm1 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip_src",
+                    min_value=p1_src_start_ip_int,
+                    max_value=p1_src_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_src",
+                    pkt_offset=u"IP.src"
+                ),
+                STLVmFlowVar(
+                    name=u"ip_dst",
+                    min_value=p1_dst_start_ip_int,
+                    max_value=p1_dst_start_ip_int + self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrFlowVar(
+                    fv_name=u"ip_dst",
+                    pkt_offset=u"IP.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                )
+            ]
+        )
+        # Direction 1 --> 0
+        vm2 = STLScVmRaw(
+            [
+                STLVmFlowVar(
+                    name=u"ip",
+                    min_value=0,
+                    max_value=self.n_tunnels * 256 - 1,
+                    size=4,
+                    op=u"inc"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_src_start_ip_int,
+                    pkt_offset=u"IP:1.src"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffffff,
+                    add_value=p2_inner_dst_start_ip_int,
+                    pkt_offset=u"IP:1.dst"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=2,
+                    mask=0xffff,
+                    add_value=self.p2_udp_sport_start,
+                    pkt_offset=u"UDP.sport"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff00,
+                    add_value=(self.p2_geneve_start_vni << 8),
+                    pkt_offset=u"GENEVE.vni"
+                ),
+                STLVmWrMaskFlowVar(
+                    fv_name=u"ip",
+                    pkt_cast_size=4,
+                    mask=0xffffff,
+                    shift=-8,
+                    offset_fixup=2,
+                    add_value=c_int(
+                        int(
+                            self.p2_inner_dst_mac.replace(u":", u"")[6:12], 16
+                        ) << 8
+                    ).value,
+                    pkt_offset=u"Ether:1.dst"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP:1"
+                ),
+                STLVmFixIpv4(
+                    offset=u"IP"
+                ),
+                STLVmFixChecksumHw(
+                    l3_offset=u"IP",
+                    l4_offset=u"UDP",
+                    l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP
+                )
+            ]
+        )
+
+        return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+    """Register this traffic profile to T-rex.
+
+    Do not change this function.
+
+    :return: Traffic streams.
+    :rtype: Object
+    """
+    return TrafficStreams()
index d3e95a6..e860d5a 100644 (file)
@@ -223,6 +223,26 @@ Scaling Tags
 
     Test with 1 GENEVE IPv4 tunnel.
 
+.. topic:: GENEVE4_4TUN
+
+    Test with 4 GENEVE IPv4 tunnels.
+
+.. topic:: GENEVE4_16TUN
+
+    Test with 16 GENEVE IPv4 tunnels.
+
+.. topic:: GENEVE4_64TUN
+
+    Test with 64 GENEVE IPv4 tunnels.
+
+.. topic:: GENEVE4_256TUN
+
+    Test with 256 GENEVE IPv4 tunnels.
+
+.. topic:: GENEVE4_1024TUN
+
+    Test with 1024 GENEVE IPv4 tunnels.
+
 Test Category Tags
 ------------------
 
index 17043aa..e343d38 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 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:
@@ -390,7 +390,7 @@ class VPPUtil:
         :type node: dict
         :type graph_node_name: str
         :type graph_next_name: str
-        :returns: The index of the next node.
+        :returns: The index of the next graph node.
         :rtype: int
         """
         cmd = u"add_node_next"
index 9870639..ffbd506 100644 (file)
 | | | VPP Interface Set IP Address
 | | | ... | ${dut1} | ${tunnel_if_key} | ${if_ip} | 24
 | | | VPP Add IP Neighbor
-| | | ... | ${dut1} | ${tunnel_if_key} | ${dst_ip} | ${TG_pf2_mac}[0]
+| | | ... | ${dut1} | ${tunnel_if_key} | ${tg_if2_ip4} | ${TG_pf2_mac}[0]
 | | | Vpp Route Add
 | | | ... | ${dut1} | ${dst_ip} | ${gen_tunnel.ip_mask}
-| | | ... | interface=${tunnel_if_key}
+| | | ... | gateway=${tg_if2_ip4} | interface=${tunnel_if_key}
 | | | Vpp Route Add
 | | | ... | ${dut1} | ${gen_tunnel.remote} | 32
 | | | ... | gateway=${tg_if2_ip4} | interface=${DUT1_${int}2}[0]
index 130237e..4a6d385 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 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:
 | | ${bps_limit} = | Get From Dictionary
 | | ... | ${NIC_NAME_TO_BPS_LIMIT} | ${nic_name}
 | | Set Numeric Frame Sizes
+| | # We need to add 20B (Ethernet preamble and inter-frame gap)
+| | # to avg_frame_size
 | | ${rate} = | Evaluate | ${bps_limit} / ((${avg_frame_size} + 20.0) * 8)
 | | ${max_rate} = | Set Variable If | ${rate} > ${pps_limit}
 | | ... | ${pps_limit} | ${rate}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..245bc7e
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | SCALE | GENEVE4_1024TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-1024tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnels.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | ${n_tunnels} GENEVE tunnels and ${${4} * ${n_tunnels}} static IPv4 /24\
+| ... | route entries. DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${1024}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-1024tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..4244421
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | SCALE | GENEVE4_16TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-16tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnels.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | ${n_tunnels} GENEVE tunnels and ${${4} * ${n_tunnels}} static IPv4 /24\
+| ... | route entries. DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${16}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-16tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..b052db0
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | BASE | GENEVE4_1TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-1tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnel.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | GENEVE tunnel and 4 static IPv4 /24 route entries.\
+| ... | DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${1}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-1tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..684b893
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | SCALE | GENEVE4_256TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-256tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnels.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | ${n_tunnels} GENEVE tunnels and ${${4} * ${n_tunnels}} static IPv4 /24\
+| ... | route entries. DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${256}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-256tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..78da203
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | SCALE | GENEVE4_4TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-4tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnels.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | ${n_tunnels} GENEVE tunnels and ${${4} * ${n_tunnels}} static IPv4 /24\
+| ... | route entries. DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${4}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-4tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}
diff --git a/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr.robot b/tests/vpp/perf/ip4_tunnels/2n1l-10ge2p1x710-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr.robot
new file mode 100644 (file)
index 0000000..923d26c
--- /dev/null
@@ -0,0 +1,155 @@
+# Copyright (c) 2021 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/ip/geneve.robot
+|
+| Force Tags | 2_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDR
+| ... | NIC_Intel-X710 | ETH | IP4FWD | IP4BASE | UDP | ENCAP | GENEVE_L3MODE
+| ... | SCALE | GENEVE4_64TUN | DRV_VFIO_PCI
+| ... | RXQ_SIZE_0 | TXQ_SIZE_0
+| ... | ethip4--ethip4udpgeneve-64tun-ip4base
+|
+| Suite Setup | Setup suite topology interfaces | performance
+| Suite Teardown | Tear down suite | performance
+| Test Setup | Setup test | performance
+| Test Teardown | Tear down test | performance | geneve4
+|
+| Test Template | Local Template
+|
+| Documentation | *RFC2544: Pkt throughput GENEVE tunnel L3 mode performance
+| ... | test cases*
+|
+| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 between TG-if1 and DUT1-if1 and\
+| ... | Eth-IPv4-UDP-GENEVE-Eth-IPv4 between DUT1-if2 and TG-if2 for IPv4\
+| ... | routing over GENEVE tunnels.
+| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing over\
+| ... | ${n_tunnels} GENEVE tunnels and ${${4} * ${n_tunnels}} static IPv4 /24\
+| ... | route entries. DUT1 is tested with ${nic_name}.
+| ... | *[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 DUT1. TG traffic profile
+| ... | contains two L3 flow-groups (flow-group per direction, 1 flow per
+| ... | flow-group) 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.
+| ... | *[Ref] Applicable standard specifications:* RFC2544, RFC791, RFC768,
+| ... | RFC8926.
+
+*** Variables ***
+| @{plugins_to_enable}= | dpdk_plugin.so | geneve_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}= | ${50}
+# IP settings
+| ${dut1_if1_ip4}= | 20.0.0.1
+| ${dut1_if2_ip4}= | 30.0.0.1
+| ${tg_if1_ip4}= | 20.0.0.2
+| ${tg_if2_ip4}= | 30.0.0.2
+# GENEVE settings
+| ${gen_mode}= | ${osi_layer}
+| ${n_tunnels}= | ${64}
+| &{gen_tunnel}=
+| ... | local=1.1.1.2 | remote=1.1.1.1 | vni=${1}
+| ... | src_ip=10.128.1.0 | dst_ip=10.0.1.0 | ip_mask=${24} | if_ip=11.0.1.2
+# Traffic profile
+| ${traffic_profile}= | trex-stl-2n-ethip4-geneve-${n_tunnels}t
+
+*** Keywords ***
+| Local Template
+| |
+| | [Documentation]
+| | ... | [Cfg] DUT runs GENEVE ${gen_mode} mode configuration.
+| | ... | 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
+| | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer
+| |
+| | [Arguments] | ${frame_size} | ${phy_cores} | ${rxq}=${None}
+| |
+| | Set Test Variable | \${frame_size}
+| | Set Test Variable | \${rxq_ratio} | ${1}
+| |
+| | 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 GENEVE L3 mode in circular topology
+| | Then Find NDR and PDR intervals using optimized search
+
+*** Test Cases ***
+| 64B-1c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 64B | 1C
+| | frame_size=${64} | phy_cores=${1}
+
+| 64B-2c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 64B | 2C
+| | frame_size=${64} | phy_cores=${2}
+
+| 64B-4c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 64B | 4C
+| | frame_size=${64} | phy_cores=${4}
+
+| 1518B-1c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 1C
+| | frame_size=${1518} | phy_cores=${1}
+
+| 1518B-2c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 2C
+| | frame_size=${1518} | phy_cores=${2}
+
+| 1518B-4c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 1518B | 4C
+| | frame_size=${1518} | phy_cores=${4}
+
+| 9000B-1c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 1C
+| | frame_size=${9000} | phy_cores=${1}
+
+| 9000B-2c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 2C
+| | frame_size=${9000} | phy_cores=${2}
+
+| 9000B-4c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | 9000B | 4C
+| | frame_size=${9000} | phy_cores=${4}
+
+| IMIX-1c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 1C
+| | frame_size=IMIX_v4_1 | phy_cores=${1}
+
+| IMIX-2c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 2C
+| | frame_size=IMIX_v4_1 | phy_cores=${2}
+
+| IMIX-4c-ethip4--ethip4udpgeneve-64tun-ip4base-ndrpdr
+| | [Tags] | IMIX | 4C
+| | frame_size=IMIX_v4_1 | phy_cores=${4}