Performance IPv6 library and short/long test cases 24/824/17
authorpmikus <pmikus@cisco.com>
Wed, 20 Apr 2016 11:24:11 +0000 (13:24 +0200)
committerStefan Kobza <skobza@cisco.com>
Wed, 11 May 2016 11:52:13 +0000 (11:52 +0000)
- JIRA: CSIT-2
- Create IPv6 test cases for long/short/singlethread/multithread performance testing
- Create robot KWs for IPv6 performance testing
- Add T-Rex IPv6 profile

Change-Id: I306d5c894d9b9287bf91929764aeb1c7083d802c
Signed-off-by: pmikus <pmikus@cisco.com>
Signed-off-by: Peter Mikus <pmikus@cisco.com>
bootstrap-verify-perf.sh
resources/libraries/python/IPv6Setup.py
resources/libraries/python/TrafficGenerator.py
resources/libraries/robot/performance.robot
resources/templates/vat/add_ip_neighbor.vat
resources/tools/t-rex/t-rex-stateless.py
tests/suites/performance/long_ipv6.robot [new file with mode: 0644]
tests/suites/performance/short_ipv6.robot [new file with mode: 0644]

index 26ec3f5..a60b18d 100755 (executable)
@@ -133,6 +133,12 @@ case "$TEST_TAG" in
               -s performance.long_ipv4 \
               tests/
         ;;
+    PERFTEST_LONG_IPV6 )
+        pybot -L TRACE \
+              -v TOPOLOGY_PATH:${WORKING_TOPOLOGY} \
+              -s performance.long_ipv6 \
+              tests/
+        ;;
     PERFTEST_LONG_XCONNECT )
         pybot -L TRACE \
               -v TOPOLOGY_PATH:${WORKING_TOPOLOGY} \
index c016423..6b5d8a5 100644 (file)
@@ -210,6 +210,27 @@ class IPv6Setup(object):
                                                     sw_if_index=sw_if_index,
                                                     state='admin-down')
 
+
+    @staticmethod
+    def vpp_set_ipv6_neighbor(node, interface, ipaddr, macaddr):
+        """Set IPv6 neighbor.
+
+           :param node: VPP node.
+           :param interface: Interface name.
+           :param ip_address: IPv6 address.
+           :param mac_address: mac address.
+           :type node: dict
+           :type interface: str
+           :type ip_address: str
+           :type mac_address: str
+        """
+        sw_if_index = Topology.get_interface_sw_index(node, interface)
+        VatExecutor.cmd_from_template(node,
+                                      'add_ip_neighbor.vat',
+                                      sw_if_index=sw_if_index,
+                                      ip_address=ipaddr,
+                                      mac_address=macaddr)
+
     @staticmethod
     def vpp_ra_suppress_link_layer(node, interface):
         """Suppress ICMPv6 router advertisement message for link scope address.
index adc22b3..b125a0b 100644 (file)
@@ -236,6 +236,19 @@ class TrafficGenerator(object):
                 "--p{4}_dst_start_ip 10.10.10.2'".\
                 format(duration, rate, framesize, _p0, _p1),\
                 timeout=int(duration)+60)
+        elif traffic_type in ["3-node-IPv6"]:
+            (ret, stdout, stderr) = ssh.exec_command(
+                "sh -c '/tmp/openvpp-testing/resources/tools/t-rex/"
+                "t-rex-stateless.py "
+                "-d {0} -r {1} -s {2} -6 "
+                "--p{3}_src_start_ip 2001:1::2 "
+                "--p{3}_src_end_ip 2001:1::FE "
+                "--p{3}_dst_start_ip 2001:2::2 "
+                "--p{4}_src_start_ip 2001:2::2 "
+                "--p{4}_src_end_ip 2001:2::FE "
+                "--p{4}_dst_start_ip 2001:1::2'".\
+                format(duration, rate, framesize, _p0, _p1),\
+                timeout=int(duration)+60)
         else:
             raise NotImplementedError('Unsupported traffic type')
 
index a2c8acd..d43073d 100644 (file)
 # limitations under the License.
 
 *** Settings ***
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.TrafficGenerator
+| Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl
 | Resource | resources/libraries/robot/default.robot
 | Resource | resources/libraries/robot/interfaces.robot
+| Resource | resources/libraries/robot/counters.robot
+| Resource | resources/libraries/robot/bridge_domain.robot
 | Resource | resources/libraries/robot/l2_xconnect.robot
 | Resource | resources/libraries/robot/ipv4.robot
-| Resource | resources/libraries/robot/bridge_domain.robot
-| Resource | resources/libraries/robot/counters.robot
-| Library | resources.libraries.python.TrafficGenerator
-| Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl
+| Resource | resources/libraries/robot/ipv6.robot
 | Documentation | Performance suite keywords
 
 *** Keywords ***
 | | dut2_v4.set_route | 10.10.10.0 | 24 | 1.1.1.1 | ${dut2_if1}
 | | All Vpp Interfaces Ready Wait | ${nodes}
 
+| IPv6 forwarding initialized in a 3-node circular topology
+| | [Documentation] | Custom setup of IPv6 topology on all DUT nodes
+| | ${prefix}= | Set Variable | 64
+| | ${tg1_if1_mac}= | Get Interface MAC | ${tg} | ${tg_if1}
+| | ${tg1_if2_mac}= | Get Interface MAC | ${tg} | ${tg_if2}
+| | ${dut1_if2_mac}= | Get Interface MAC | ${dut1} | ${dut1_if2}
+| | ${dut2_if1_mac}= | Get Interface MAC | ${dut2} | ${dut1_if1}
+| | VPP Set If IPv6 Addr | ${dut1} | ${dut1_if1} | 2001:1::1 | ${prefix}
+| | VPP Set If IPv6 Addr | ${dut1} | ${dut1_if2} | 2001:3::1 | ${prefix}
+| | VPP Set If IPv6 Addr | ${dut2} | ${dut2_if1} | 2001:3::2 | ${prefix}
+| | VPP Set If IPv6 Addr | ${dut2} | ${dut2_if2} | 2001:2::1 | ${prefix}
+| | Vpp nodes ra suppress link layer | ${nodes}
+| | Vpp set IPv6 neighbor | ${dut1} | ${dut1_if1} | 2001:1::2
+| | ...                    | ${tg1_if1_mac}
+| | Vpp set IPv6 neighbor | ${dut2} | ${dut2_if2} | 2001:2::2
+| | ...                    | ${tg1_if2_mac}
+| | Vpp set IPv6 neighbor | ${dut1} | ${dut1_if2} | 2001:3::2
+| | ...                    | ${dut2_if1_mac}
+| | Vpp set IPv6 neighbor | ${dut2} | ${dut2_if1} | 2001:3::1
+| | ...                    | ${dut1_if2_mac}
+| | Vpp Route Add | ${dut1} | 2001:2::0 | ${prefix} | 2001:3::2 | ${dut1_if2}
+| | Vpp Route Add | ${dut2} | 2001:1::0 | ${prefix} | 2001:3::1 | ${dut2_if1}
+
 | L2 xconnect initialized in a 3-node circular topology
 | | [Documentation] | Custom setup of L2 xconnect topology
 | | L2 setup xconnect on DUT | ${dut1} | ${dut1_if1} | ${dut1_if2}
 | | ...         | ${topology_type} | ${min_rate} | ${max_rate} | ${threshold}
 | | Set Duration | 60
 | | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Frame Size | ${framesize}
 | | Set Search Rate Type pps
 | | Set Binary Convergence Threshold | ${threshold}
 | | Binary Search | ${binary_min} | ${binary_max} | ${topology_type}
index e8587b2..cbea0e1 100644 (file)
@@ -1 +1 @@
-ip_neighbor_add_del sw_if_index {sw_if_index} dst {ip_address} mac {mac_address}
\ No newline at end of file
+ip_neighbor_add_del sw_if_index {sw_if_index} dst {ip_address} mac {mac_address}\r
index d32fd96..97ccc97 100755 (executable)
@@ -42,7 +42,9 @@ Functionality:
 """
 
 import json
+import socket
 import string
+import struct
 import sys, getopt
 
 sys.path.insert(0, "/opt/trex-core-2.00/scripts/automation/"+\
@@ -51,11 +53,11 @@ from trex_stl_lib.api import *
 
 
 def generate_payload(length):
-    """Generate random payload.
+    """Generate payload.
 
     :param length: Length of payload.
     :type length: int
-    :return: Payload filled with random chars.
+    :return: Payload filled with chars.
     :rtype string
     """
 
@@ -66,6 +68,38 @@ def generate_payload(length):
 
     return word
 
+
+def get_start_end_ipv6(start_ip, end_ip):
+    """Get start and end host from IPv6 as integer.
+
+    :param start_ip: Start IPv6.
+    :param end_ip: End IPv6.
+    :type start_ip: string
+    :type end_ip: string
+    :return: Start host, end host.
+    :rtype int
+    """
+
+    try:
+        ip1 = socket.inet_pton(socket.AF_INET6, start_ip)
+        ip2 = socket.inet_pton(socket.AF_INET6, end_ip)
+
+        hi1, lo1 = struct.unpack('!QQ', ip1)
+        hi2, lo2 = struct.unpack('!QQ', ip2)
+
+        if ((hi1 << 64) | lo1) > ((hi2 << 64) | lo2):
+            print "IPv6: start_ip is greater then end_ip"
+            sys.exit(2)
+
+        max_p1 = abs(int(lo1) - int(lo2)) + 1
+        base_p1 = lo1
+    except AddressValueError as ex_error:
+        print ex_error
+        sys.exit(2)
+
+    return base_p1, max_p1
+
+
 def create_packets(traffic_options, frame_size=64):
     """Create two IP packets to be used in stream.
 
@@ -103,7 +137,6 @@ def create_packets(traffic_options, frame_size=64):
                       STLVmWrFlowVar(fv_name="src", pkt_offset="IP.src"),
                       STLVmFixIpv4(offset="IP"),
                      ], split_by_field="src")
-
     # The following code applies raw instructions to packet (IP src increment).
     # It splits the generated traffic by "ip_src" variable to cores and fix
     # IPv4 header checksum.
@@ -115,6 +148,66 @@ def create_packets(traffic_options, frame_size=64):
                       STLVmFixIpv4(offset="IP"),
                      ], split_by_field="src")
 
+    pkt_a = STLPktBuilder(pkt=base_pkt_a/generate_payload(
+        fsize_no_fcs-len(base_pkt_a)), vm=vm1)
+    pkt_b = STLPktBuilder(pkt=base_pkt_b/generate_payload(
+        fsize_no_fcs-len(base_pkt_b)), vm=vm2)
+
+    return(pkt_a, pkt_b)
+
+
+def create_packets_v6(traffic_options, frame_size=78):
+    """Create two IPv6 packets to be used in stream.
+
+    :param traffic_options: Parameters for packets.
+    :param frame_size: Size of L2 frame.
+    :type traffic_options: List
+    :type frame_size: int
+    :return: Packet instances.
+    :rtype STLPktBuilder
+    """
+
+    if frame_size < 78:
+        print "Packet min. size is 78B"
+        sys.exit(2)
+
+    fsize_no_fcs = frame_size - 4 # no FCS
+
+    p1_src_start_ip = traffic_options['p1_src_start_ip']
+    p1_src_end_ip = traffic_options['p1_src_end_ip']
+    p1_dst_start_ip = traffic_options['p1_dst_start_ip']
+    p2_src_start_ip = traffic_options['p2_src_start_ip']
+    p2_src_end_ip = traffic_options['p2_src_end_ip']
+    p2_dst_start_ip = traffic_options['p2_dst_start_ip']
+
+    base_p1, max_p1 = get_start_end_ipv6(p1_src_start_ip, p1_src_end_ip)
+    base_p2, max_p2 = get_start_end_ipv6(p2_src_start_ip, p2_src_end_ip)
+
+    base_pkt_a = Ether()/IPv6(src=p1_src_start_ip, dst=p1_dst_start_ip)
+    base_pkt_b = Ether()/IPv6(src=p2_src_start_ip, dst=p2_dst_start_ip)
+
+    # The following code applies raw instructions to packet (IP src increment).
+    # It splits the generated traffic by "ip_src" variable to cores
+    vm1 = STLScVmRaw([STLVmFlowVar(name="ipv6_src",
+                                   min_value=base_p1,
+                                   max_value=max_p1+base_p1,
+                                   size=8, op="inc"),
+                      STLVmWrFlowVar(fv_name="ipv6_src", pkt_offset="IPv6.src",
+                                     offset_fixup=8)
+                     ]
+                     , split_by_field="ipv6_src")
+
+    # The following code applies raw instructions to packet (IP src increment).
+    # It splits the generated traffic by "ip_src" variable to cores
+    vm2 = STLScVmRaw([STLVmFlowVar(name="ipv6_src",
+                                   min_value=base_p2,
+                                   max_value=max_p2+base_p2,
+                                   size=8, op="inc"),
+                      STLVmWrFlowVar(fv_name="ipv6_src", pkt_offset="IPv6.src",
+                                     offset_fixup=8)
+                     ]
+                     , split_by_field="ipv6_src")
+
     pkt_a = STLPktBuilder(pkt=base_pkt_a/generate_payload(
         max(0, fsize_no_fcs-len(base_pkt_a))), vm=vm1)
     pkt_b = STLPktBuilder(pkt=base_pkt_b/generate_payload(
@@ -122,6 +215,7 @@ def create_packets(traffic_options, frame_size=64):
 
     return(pkt_a, pkt_b)
 
+
 def simple_burst(pkt_a, pkt_b, duration=10, rate="1mpps", warmup_time=5):
     """Run the traffic with specific parameters.
 
@@ -159,7 +253,6 @@ def simple_burst(pkt_a, pkt_b, duration=10, rate="1mpps", warmup_time=5):
                             isg=10.0,
                             mode=STLTXCont(pps=100))
 
-
         # connect to server
         client.connect()
 
@@ -174,7 +267,7 @@ def simple_burst(pkt_a, pkt_b, duration=10, rate="1mpps", warmup_time=5):
         if warmup_time is not None:
             client.clear_stats()
             client.start(ports=[0, 1], mult=rate, duration=warmup_time)
-            client.wait_on_traffic(ports=[0, 1], timeout=(duration+30))
+            client.wait_on_traffic(ports=[0, 1], timeout=(warmup_time+30))
             stats = client.get_stats()
             print stats
             print "#####warmup statistics#####"
@@ -189,6 +282,10 @@ def simple_burst(pkt_a, pkt_b, duration=10, rate="1mpps", warmup_time=5):
 
         # clear the stats before injecting
         client.clear_stats()
+        total_rcvd = 0
+        total_sent = 0
+        lost_a = 0
+        lost_b = 0
 
         # choose rate and start traffic
         client.start(ports=[0, 1], mult=rate, duration=duration)
@@ -227,6 +324,7 @@ def print_help():
 
     print "args: [-h] -d <duration> -s <size of frame in bytes>"+\
     " [-r] <traffic rate with unit: %, mpps> "+\
+    " [-6] Use of ipv6 "+\
     "--p1_src_mac <port1_src_mac> "+\
     "--p1_dst_mac <port1_dst_mac> "+\
     "--p1_src_start_ip <port1_src_start_ip> "+\
@@ -240,6 +338,7 @@ def print_help():
     "--p2_dst_start_ip <port2_dst_start_ip> "+\
     "--p2_dst_end_ip <port2_dst_end_ip>"
 
+
 def print_error(msg):
     """Print error message on stderr.
 
@@ -258,9 +357,10 @@ def main(argv):
     _frame_size = 64
     _rate = '1mpps'
     _traffic_options = {}
+    _use_ipv6 = False
 
     try:
-        opts, _ = getopt.getopt(argv, "hd:s:r:o:",
+        opts, _ = getopt.getopt(argv, "hd:s:r:6o:",
                                 ["help",
                                  "p1_src_mac=",
                                  "p1_dst_mac=",
@@ -287,6 +387,8 @@ def main(argv):
             _frame_size = int(arg)
         elif opt == '-r':
             _rate = arg
+        elif opt == '-6':
+            _use_ipv6 = True
         elif opt.startswith("--p"):
             _traffic_options[opt[2:]] = arg
 
@@ -296,11 +398,14 @@ def main(argv):
         print_help()
         sys.exit(1)
 
-    pkt_a, pkt_b = create_packets(_traffic_options,
-                                  frame_size=_frame_size)
+    if _use_ipv6:
+        pkt_a, pkt_b = create_packets_v6(_traffic_options,
+                                         frame_size=_frame_size)
+    else:
+        pkt_a, pkt_b = create_packets(_traffic_options,
+                                      frame_size=_frame_size)
 
     simple_burst(pkt_a, pkt_b, duration=_duration, rate=_rate)
 
 if __name__ == "__main__":
     main(sys.argv[1:])
-
diff --git a/tests/suites/performance/long_ipv6.robot b/tests/suites/performance/long_ipv6.robot
new file mode 100644 (file)
index 0000000..af7faae
--- /dev/null
@@ -0,0 +1,214 @@
+# Copyright (c) 2016 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/performance.robot
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PERFTEST_LONG
+| Suite Setup | 3-node Performance Suite Setup | L3
+| Suite Teardown | 3-node Performance Suite Teardown
+| Test Setup | Setup all DUTs before test
+| Test Teardown | Run Keyword | Show statistics on all DUTs
+| Documentation | *Throughput search suite (based on RFC2544).*
+| ...
+| ... | Test suite uses 3-node topology TG - DUT1 - DUT2 - TG, with one link
+| ... | between nodes. Traffic profile contain 2 L3 streams (1 stream per
+| ... | direction). Packets contain Ethernet header, IPv6 header, and random
+| ... | payload. Ethernet header MAC addresses are matching MAC addresses
+| ... | of the TG node.
+
+*** Test Cases ***
+| Find NDR by using RFC2544 linear search and 78B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput with non drop rate for 78B frames by using
+| | ... | linear search starting at 4.0Mpps, stepping down with step of 0.1Mpps
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${start_rate}= | Set Variable | 4000000
+| | ${step_rate}= | Set Variable | 100000
+| | ${min_rate}= | Set Variable | 100000
+| | ${max_rate}= | Set Variable | 14880952
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR by using RFC2544 linear search and 1518B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput with non drop rate for 1518B frames by using
+| | ... | linear search starting at 812,743pps, stepping down with step of
+| | ... | 10,000pps
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${start_rate}= | Set Variable | 812743
+| | ${step_rate}= | Set Variable | 10000
+| | ${min_rate}= | Set Variable | 10000
+| | ${max_rate}= | Set Variable | 812743
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR by using RFC2544 linear search and 9000B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput with non drop rate for 9000B frames by using
+| | ... | linear search starting at 138,580pps, stepping down with step of
+| | ... | 5,000pps
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${start_rate}= | Set Variable | 138580
+| | ${step_rate}= | Set Variable | 5000
+| | ${min_rate}= | Set Variable | 5000
+| | ${max_rate}= | Set Variable | 138580
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 2 cores and rss 1 by using RFC2544 linear search and 78B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 2 cores with non drop rate for 78B frames by using
+| | ... | linear search starting at 7.8Mpps, stepping down with step of 0.1Mpps
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${start_rate}= | Set Variable | 7800000
+| | ${step_rate}= | Set Variable | 100000
+| | ${min_rate}= | Set Variable | 100000
+| | ${max_rate}= | Set Variable | 14880952
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 2 cores and rss 1 by using RFC2544 linear search and 1518B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 2 cores with non drop rate for 1518B frames by
+| | ... | using linear search starting at 812,743pps, stepping down with step
+| | ... | of 10.000pps
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${start_rate}= | Set Variable | 812743
+| | ${step_rate}= | Set Variable | 10000
+| | ${min_rate}= | Set Variable | 10000
+| | ${max_rate}= | Set Variable | 812743
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 2 cores and rss 1 by using RFC2544 linear search and 9000B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 2 cores with non drop rate for 9000B frames by
+| | ... | using linear search starting at 138,580pps, stepping down with step
+| | ... | of 5,000pps
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${start_rate}= | Set Variable | 138580
+| | ${step_rate}= | Set Variable | 5000
+| | ${min_rate}= | Set Variable | 5000
+| | ${max_rate}= | Set Variable | 138580
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 4 cores and rss 2 by using RFC2544 linear search and 78B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 4 cores and rss 2 with non drop rate for 78B
+| | ... | frames by using linear search starting at 9.8Mpps, stepping down with
+| | ... | step of 0.1Mpps
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${start_rate}= | Set Variable | 9800000
+| | ${step_rate}= | Set Variable | 100000
+| | ${min_rate}= | Set Variable | 100000
+| | ${max_rate}= | Set Variable | 14880952
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 4 cores and rss 2 by using RFC2544 linear search and 1518B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 4 cores and rss 2 with non drop rate for 1518B
+| | ... | frames by using linear search starting at 812,743pps, stepping down
+| | ... | with step of 10.000pps
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${start_rate}= | Set Variable | 812743
+| | ${step_rate}= | Set Variable | 10000
+| | ${min_rate}= | Set Variable | 10000
+| | ${max_rate}= | Set Variable | 812743
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 4 cores and rss 2 by using RFC2544 linear search and 9000B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 4 cores and rss 2 with non drop rate for 9000B
+| | ... | frames by using linear search starting at 138,580pps, stepping down
+| | ... | with step of 5,000pps
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${start_rate}= | Set Variable | 138580
+| | ${step_rate}= | Set Variable | 5000
+| | ${min_rate}= | Set Variable | 5000
+| | ${max_rate}= | Set Variable | 138580
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using linear search and pps | ${framesize} | ${start_rate}
+| | ...                                       | ${step_rate} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+
+| Find NDR with 2 cores by using RFC2544 binary search and 78B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 2 cores with non drop rate for 78B
+| | ... | frames by using binary search with threshold 5,000pps
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${binary_min}= | Set Variable | 5000000
+| | ${binary_max}= | Set Variable | 9000000
+| | ${min_rate}= | Set Variable | 100000
+| | ${max_rate}= | Set Variable | 14880952
+| | ${threshold}= | Set Variable | 5000
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ...                                       | ${binary_max} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+| | ...                                       | ${threshold}
+
+| Find NDR with 4 cores and rss 2 by using RFC2544 binary search and 78B frames through IPv6 forwarding in 3-node topology
+| | [Documentation]
+| | ... | Find throughput on 4 cores and rss 2 with non drop rate for 78B
+| | ... | frames by using binary search with threshold 5,000pps
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${binary_min}= | Set Variable | 6000000
+| | ${binary_max}= | Set Variable | 11000000
+| | ${min_rate}= | Set Variable | 100000
+| | ${max_rate}= | Set Variable | 14880952
+| | ${threshold}= | Set Variable | 5000
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ...                                       | ${binary_max} | 3-node-IPv6
+| | ...                                       | ${min_rate} | ${max_rate}
+| | ...                                       | ${threshold}
diff --git a/tests/suites/performance/short_ipv6.robot b/tests/suites/performance/short_ipv6.robot
new file mode 100644 (file)
index 0000000..776dd5f
--- /dev/null
@@ -0,0 +1,138 @@
+# Copyright (c) 2016 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/performance.robot
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PERFTEST_SHORT
+| Suite Setup | 3-node Performance Suite Setup | L3
+| Suite Teardown | 3-node Performance Suite Teardown
+| Test Setup | Setup all DUTs before test
+| Test Teardown | Run Keyword | Show statistics on all DUTs
+| Documentation | Minimal throughput acceptance test cases
+
+*** Test Cases ***
+| 1core VPP passes 78B frames through IPv6 forwarding at 2x 2.9Mpps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 1 core should pass 78B frames through IPv6 forwarding
+| | ... | at 2x2.9Mpps in 3-node topology
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 2.9mpps
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 1core VPP passes 1518B frames through IPv6 forwarding at 2x 812,743pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 1 core should pass 1518B frames through IPv6 forwarding
+| | ... | at 2x812,743pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 812743pps
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 1core VPP passes 9000B frames through IPv6 forwarding at 2x 138,580pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 1 core should pass 9000B frames through IPv6 forwarding
+| | ... | at 2x138,580pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 1_THREAD_NOHTT_RSS_1 | SINGLE_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 138580pps
+| | Given Setup '1' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 2core VPP with rss 1 passes 78B frames through IPv6 forwarding at 2x 5.9Mpps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 2 cores should pass 78B frames through IPv6 forwarding
+| | ... | at 2x5.9Mpps in 3-node topology
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 5.9mpps
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 2core VPP with rss 1 passes 1518B frames through IPv6 forwarding at 2x 812,743pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 2 cores should pass 1518B frames through IPv6 forwarding
+| | ... | at 2x812,743pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 812743pps
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 2core VPP with rss 1 passes 9000B frames through IPv6 forwarding at 2x 138,580pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 2 cores should pass 9000B frames through IPv6 forwarding
+| | ... | at 2x138,580pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 2_THREAD_NOHTT_RSS_1 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 138580pps
+| | Given Setup '2' worker threads and rss '1' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 4core VPP with rss 2 passes 78B frames through IPv6 forwarding at 2x 7.3Mpps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 4 cores and rss 2 should pass 78B frames through IPv6
+| | ... | forwarding at 2x7.3Mpps in 3-node topology
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 78
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 7.3mpps
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 4core VPP with rss 2 passes 1518B frames through IPv6 forwarding at 2x 812,743pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 4 cores and rss 2 should pass 1518B frames through IPv6
+| | ... | forwarding at 2x812,743pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 1518
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 812743pps
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6
+
+| 4core VPP with rss 2 passes 9000B frames through IPv6 forwarding at 2x 138,580pps in 3-node topology
+| | [Documentation]
+| | ... | VPP with 4 cores and rss 2 should pass 9000B frames through IPv6
+| | ... | forwarding at 2x138,580pps (2x 10Gbps) in 3-node topology
+| | [Tags] | 4_THREAD_NOHTT_RSS_2 | MULTI_THREAD
+| | ${framesize}= | Set Variable | 9000
+| | ${duration}= | Set Variable | 10
+| | ${rate}= | Set Variable | 138580pps
+| | Given Setup '4' worker threads and rss '2' without HTT on all DUTs
+| | And   IPv6 forwarding initialized in a 3-node circular topology
+| | Then Traffic should pass with no loss | ${duration} | ${rate}
+| | ...                                   | ${framesize} | 3-node-IPv6