diff options
author | pmikus <pmikus@cisco.com> | 2016-04-20 13:24:11 +0200 |
---|---|---|
committer | Stefan Kobza <skobza@cisco.com> | 2016-05-11 11:52:13 +0000 |
commit | 10f3b07a5c883e20ef345c8b1c8e24063a50281f (patch) | |
tree | 659b4e11dd7d028640538c56d813e5084d870704 | |
parent | 187868525f59884c74de5a75721594658fa8f4d3 (diff) |
Performance IPv6 library and short/long test cases
- 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>
-rwxr-xr-x | bootstrap-verify-perf.sh | 6 | ||||
-rw-r--r-- | resources/libraries/python/IPv6Setup.py | 21 | ||||
-rw-r--r-- | resources/libraries/python/TrafficGenerator.py | 13 | ||||
-rw-r--r-- | resources/libraries/robot/performance.robot | 36 | ||||
-rw-r--r-- | resources/templates/vat/add_ip_neighbor.vat | 2 | ||||
-rwxr-xr-x | resources/tools/t-rex/t-rex-stateless.py | 123 | ||||
-rw-r--r-- | tests/suites/performance/long_ipv6.robot | 214 | ||||
-rw-r--r-- | tests/suites/performance/short_ipv6.robot | 138 |
8 files changed, 539 insertions, 14 deletions
diff --git a/bootstrap-verify-perf.sh b/bootstrap-verify-perf.sh index 26ec3f53d5..a60b18d2f6 100755 --- a/bootstrap-verify-perf.sh +++ b/bootstrap-verify-perf.sh @@ -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} \ diff --git a/resources/libraries/python/IPv6Setup.py b/resources/libraries/python/IPv6Setup.py index c016423f32..6b5d8a5f66 100644 --- a/resources/libraries/python/IPv6Setup.py +++ b/resources/libraries/python/IPv6Setup.py @@ -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. diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py index adc22b3de6..b125a0b53d 100644 --- a/resources/libraries/python/TrafficGenerator.py +++ b/resources/libraries/python/TrafficGenerator.py @@ -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') diff --git a/resources/libraries/robot/performance.robot b/resources/libraries/robot/performance.robot index a2c8acde27..d43073d30d 100644 --- a/resources/libraries/robot/performance.robot +++ b/resources/libraries/robot/performance.robot @@ -12,14 +12,18 @@ # 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 *** @@ -95,6 +99,29 @@ | | 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} @@ -150,6 +177,7 @@ | | ... | ${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} diff --git a/resources/templates/vat/add_ip_neighbor.vat b/resources/templates/vat/add_ip_neighbor.vat index e8587b28ca..cbea0e14a6 100644 --- a/resources/templates/vat/add_ip_neighbor.vat +++ b/resources/templates/vat/add_ip_neighbor.vat @@ -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}
diff --git a/resources/tools/t-rex/t-rex-stateless.py b/resources/tools/t-rex/t-rex-stateless.py index d32fd96dd7..97ccc97304 100755 --- a/resources/tools/t-rex/t-rex-stateless.py +++ b/resources/tools/t-rex/t-rex-stateless.py @@ -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. @@ -116,12 +149,73 @@ def create_packets(traffic_options, frame_size=64): ], 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( max(0, fsize_no_fcs-len(base_pkt_b))), vm=vm2) 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 index 0000000000..af7faaebbb --- /dev/null +++ b/tests/suites/performance/long_ipv6.robot @@ -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 index 0000000000..776dd5f342 --- /dev/null +++ b/tests/suites/performance/short_ipv6.robot @@ -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 |