From 95998a67270ffd72f09ce6f3d43235c723edf36b Mon Sep 17 00:00:00 2001 From: Jan Gelety Date: Tue, 19 Dec 2017 09:15:14 +0100 Subject: [PATCH] CSIT-675: SRv6 performance tests - update L1 KWs - update L2 KWs - tests with one SID (no SRH insertion) - tests with two SIDs (SRH inserted) and decapsulation - tests with two SIDs (SRH inserted) without decapsulation - enabled packet traces and logged packet traces in the test case tear down if test failed Change-Id: I3a0f4c350eed3f42509c6d49e832faa78fe64dbb Signed-off-by: Jan Gelety --- resources/libraries/python/DUTSetup.py | 31 ++- resources/libraries/python/SRv6.py | 142 ++++++------ resources/libraries/robot/overlay/srv6.robot | 61 ++++- .../performance/performance_configuration.robot | 79 ++++++- .../robot/performance/performance_setup.robot | 27 ++- .../robot/performance/performance_utils.robot | 31 ++- resources/templates/vat/enable_dpdk_traces.vat | 1 + .../templates/vat/enable_vhost_user_traces.vat | 1 + tests/vpp/perf/__init__.robot | 2 + ...-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot | 250 ++++++++++++++++++++ ...ip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot | 253 +++++++++++++++++++++ ...-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot | 253 +++++++++++++++++++++ 12 files changed, 1032 insertions(+), 99 deletions(-) create mode 100644 resources/templates/vat/enable_dpdk_traces.vat create mode 100644 resources/templates/vat/enable_vhost_user_traces.vat create mode 100644 tests/vpp/perf/srv6/10ge2p1x520-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot create mode 100644 tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot create mode 100644 tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot diff --git a/resources/libraries/python/DUTSetup.py b/resources/libraries/python/DUTSetup.py index d76a2f4096..e0479cfb60 100644 --- a/resources/libraries/python/DUTSetup.py +++ b/resources/libraries/python/DUTSetup.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -26,7 +26,11 @@ class DUTSetup(object): """Contains methods for setting up DUTs.""" @staticmethod def start_vpp_service_on_all_duts(nodes): - """Start up the VPP service on all nodes.""" + """Start up the VPP service on all nodes. + + :param nodes: Nodes in the topology. + :type nodes: dict + """ ssh = SSH() for node in nodes.values(): if node['type'] == NodeType.DUT: @@ -402,3 +406,26 @@ class DUTSetup(object): if int(ret_code) != 0: raise RuntimeError('Failed to load {0} kernel module on host {1}'. format(module, node['host'])) + + @staticmethod + def vpp_enable_traces_on_all_duts(nodes): + """Enable vpp packet traces on all DUTs in the given topology. + + :param nodes: Nodes in the topology. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + DUTSetup.vpp_enable_traces_on_dut(node) + + @staticmethod + def vpp_enable_traces_on_dut(node): + """Enable vpp packet traces on the DUT node. + + :param node: DUT node to set up. + :type node: dict + """ + + vat = VatExecutor() + vat.execute_script("enable_dpdk_traces.vat", node, json_out=False) + vat.execute_script("enable_vhost_user_traces.vat", node, json_out=False) diff --git a/resources/libraries/python/SRv6.py b/resources/libraries/python/SRv6.py index cafc4a075d..03a55a41ed 100644 --- a/resources/libraries/python/SRv6.py +++ b/resources/libraries/python/SRv6.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -13,29 +13,25 @@ """Segment Routing over IPv6 dataplane utilities library.""" -from enum import Enum - from resources.libraries.python.VatExecutor import VatTerminal -from resources.libraries.python.VatJsonUtil import VatJsonUtil from resources.libraries.python.topology import Topology -class SRv6Behaviour(Enum): - """Defines SRv6 endpoint functions implemented in VPP.""" - # Endpoint function - END = 'end' - # Endpoint function with Layer-3 cross-connect - END_X = 'end.x' - # Endpoint with decapsulation and Layer-2 cross-connect - END_DX2 = 'end.dx2' - # Endpoint with decapsulation and IPv4 cross-connect - END_DX4 = 'end.dx4' - # Endpoint with decapsulation and IPv4 table lookup - END_DT4 = 'end.dt4' - # Endpoint with decapsulation and IPv6 cross-connect - END_DX6 = 'end.dx6' - # Endpoint with decapsulation and IPv6 table lookup - END_DT6 = 'end.dt6' +# SRv6 LocalSID supported functions. +# Endpoint function +SRV6BEHAVIOUR_END = 'end' +# Endpoint function with Layer-3 cross-connect +SRV6BEHAVIOUR_END_X = 'end.x' +# Endpoint with decapsulation and Layer-2 cross-connect +SRV6BEHAVIOUR_END_DX2 = 'end.dx2' +# Endpoint with decapsulation and IPv4 cross-connect +SRV6BEHAVIOUR_END_DX4 = 'end.dx4' +# Endpoint with decapsulation and IPv4 table lookup +SRV6BEHAVIOUR_END_DT4 = 'end.dt4' +# Endpoint with decapsulation and IPv6 cross-connect +SRV6BEHAVIOUR_END_DX6 = 'end.dx6' +# Endpoint with decapsulation and IPv6 table lookup +SRV6BEHAVIOUR_END_DT6 = 'end.dt6' class SRv6(object): @@ -68,21 +64,21 @@ class SRv6(object): :raises ValueError: If unsupported SRv6 LocalSID function used or required parameter is missing. """ - if behavior == SRv6Behaviour.END: + if behavior == SRV6BEHAVIOUR_END: params = '' - elif behavior in [SRv6Behaviour.END_X, SRv6Behaviour.END_DX4, - SRv6Behaviour.END_DX6]: + elif behavior in [SRV6BEHAVIOUR_END_X, SRV6BEHAVIOUR_END_DX4, + SRV6BEHAVIOUR_END_DX6]: if interface is None or next_hop is None: raise ValueError('Required data missing.\ninterface:{0}\n' 'next_hop:{1}'.format(interface, next_hop)) interface_name = Topology.get_interface_name(node, interface) params = '{0} {1}'.format(interface_name, next_hop) - elif behavior == SRv6Behaviour.END_DX2: + elif behavior == SRV6BEHAVIOUR_END_DX2: if interface is None: raise ValueError('Required data missing.\ninterface:{0}\n'. format(interface)) params = '{0}'.format(interface) - elif behavior in [SRv6Behaviour.END_DT4, SRv6Behaviour.END_DT6]: + elif behavior in [SRV6BEHAVIOUR_END_DT4, SRV6BEHAVIOUR_END_DT6]: if fib_table is None: raise ValueError('Required data missing.\nfib_table:{0}\n'. format(fib_table)) @@ -91,15 +87,14 @@ class SRv6(object): raise ValueError('Unsupported SRv6 LocalSID function: {0}'. format(behavior)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsid_add.vat', local_sid=local_sid, behavior=behavior, params=params) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 LocalSID {0} failed on node {1}'.format( - local_sid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 LocalSID {0} failed on node {1}'. + format(local_sid, node['host'])) @staticmethod def delete_sr_localsid(node, local_sid): @@ -110,14 +105,13 @@ class SRv6(object): :type node: dict :type local_sid: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsid_del.vat', local_sid=local_sid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 LocalSID {0} failed on node {1}'.format( - local_sid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 LocalSID {0} failed on node {1}'. + format(local_sid, node['host'])) @staticmethod def show_sr_localsids(node): @@ -126,7 +120,7 @@ class SRv6(object): :param node: Given node to show localSIDs on. :type node: dict """ - with VatTerminal(node) as vat: + with VatTerminal(node, json_param=False) as vat: vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_localsids_show.vat') @@ -145,15 +139,14 @@ class SRv6(object): """ sid_conf = 'next ' + ' next '.join(sid_list) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_policy_add.vat', bsid=bsid, sid_conf=sid_conf, mode=mode) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 policy for BindingSID {0} failed on node ' - '{1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 policy for BindingSID {0} failed on' + ' node {1}'.format(bsid, node['host'])) @staticmethod def delete_sr_policy(node, bsid): @@ -164,14 +157,13 @@ class SRv6(object): :type node: dict :type bsid: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_policy_del.vat', bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 policy for BindingSID {0} failed on node ' - '{1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 policy for BindingSID {0} failed on' + ' node {1}'.format(bsid, node['host'])) @staticmethod def show_sr_policies(node): @@ -186,7 +178,7 @@ class SRv6(object): @staticmethod def configure_sr_steer(node, mode, bsid, interface=None, ip_addr=None, - mask=None): + prefix=None): """Create SRv6 steering policy on the given node. :param node: Given node to create steering policy on. @@ -196,38 +188,38 @@ class SRv6(object): L2 mode). :param ip_addr: IPv4/IPv6 address (Optional, required in case of L3 mode). - :param mask: IP address mask (Optional, required in case of L3 mode). + :param prefix: IP address prefix (Optional, required in case of L3 + mode). :type node: dict :type mode: str :type bsid: str :type interface: str - :type ip_addr: int - :type mask: int + :type ip_addr: str + :type prefix: int :raises ValueError: If unsupported mode used or required parameter is missing. """ - if mode == 'l2': + if mode.lower() == 'l2': if interface is None: raise ValueError('Required data missing.\ninterface:{0}\n'. format(interface)) interface_name = Topology.get_interface_name(node, interface) params = 'l2 {0}'.format(interface_name) - elif mode == 'l3': - if ip_addr is None or mask is None: + elif mode.lower() == 'l3': + if ip_addr is None or prefix is None: raise ValueError('Required data missing.\nIP address:{0}\n' - 'mask:{1}'.format(ip_addr, mask)) - params = '{0}/{1}'.format(ip_addr, mask) + 'mask:{1}'.format(ip_addr, prefix)) + params = 'l3 {0}/{1}'.format(ip_addr, prefix) else: raise ValueError('Unsupported mode: {0}'.format(mode)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_steer_add_del.vat', params=params, bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Create SRv6 steering policy for BindingSID {0} failed on ' - 'node {1}'.format(bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Create SRv6 steering policy for BindingSID {0}' + ' failed on node {1}'.format(bsid, node['host'])) @staticmethod def delete_sr_steer(node, mode, bsid, interface=None, ip_addr=None, @@ -266,14 +258,13 @@ class SRv6(object): else: raise ValueError('Unsupported mode: {0}'.format(mode)) - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_steer_add_del.vat', params=params, bsid=bsid) - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Delete SRv6 policy for bsid {0} failed on node {1}'.format( - bsid, node['host'])) + if "exec error: Misc" in vat.vat_stdout: + raise RuntimeError('Delete SRv6 policy for bsid {0} failed on node' + ' {1}'.format(bsid, node['host'])) @staticmethod def show_sr_steering_policies(node): @@ -295,11 +286,6 @@ class SRv6(object): :type node: dict :type ip6_addr: str """ - with VatTerminal(node) as vat: - resp = vat.vat_terminal_exec_cmd_from_template( + with VatTerminal(node, json_param=False) as vat: + vat.vat_terminal_exec_cmd_from_template( 'srv6/sr_set_encaps_source.vat', ip6_addr=ip6_addr) - - VatJsonUtil.verify_vat_retval( - resp[0], - err_msg='Set SRv6 encapsulation source address {0} failed on node' - ' {1}'.format(ip6_addr, node['host'])) diff --git a/resources/libraries/robot/overlay/srv6.robot b/resources/libraries/robot/overlay/srv6.robot index 9be3f974e3..b253311d0e 100644 --- a/resources/libraries/robot/overlay/srv6.robot +++ b/resources/libraries/robot/overlay/srv6.robot @@ -82,18 +82,19 @@ | | ... | *Arguments:* | | ... | - dut_node - DUT node where to create SRv6 policy on. Type: dictionary | | ... | - bsid - BindingSID - local SID IPv6 address. Type: string -| | ... | - mode - Encapsulation / insertion mode (Optional, default value: -| | ... | encap). Type: string +| | ... | - mode - Encapsulation / insertion mode. Type: string | | ... | - sid_list - SID list. Type: list | | ... | | ... | *Example:* | | ... -| | ... | \| Configure SR Policy on DUT \| ${nodes['DUT2']} \| D:: \ -| | ... | \| mode=insert \| E::\| F:: \| +| | ... | \| Configure SR Policy on DUT \| ${nodes['DUT2']} \| A:: \| encap \ +| | ... | \| B::\| C:: \| +| | ... | \| Configure SR Policy on DUT \| ${nodes['DUT2']} \| D:: \| insert \ +| | ... | \| E::\| F:: \| | | ... -| | [Arguments] | ${dut_node} | ${bsid} | ${mode}=encap | @{sid_list} +| | [Arguments] | ${dut_node} | ${bsid} | ${mode} | @{sid_list} | | ... -| | Configure SR Policy | ${dut_node} | ${bsid} | @{sid_list} | mode=${mode} +| | Configure SR Policy | ${dut_node} | ${bsid} | ${sid_list} | mode=${mode} | Delete SR Policy on DUT | | [Documentation] | Delete SRv6 policy on the given DUT node. @@ -211,3 +212,51 @@ | | [Arguments] | ${dut_node} | ${ip6_addr} | | ... | | Set SR Encaps Source Address | ${dut_node} | ip6_addr=${ip6_addr} + +| Show SR Policies on all DUTs +| | [Documentation] | Show SRv6 policies on all DUT nodes in topology. +| | ... +| | ... | *Arguments:* +| | ... | - nodes - Topology. Type: dictionary +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Show SR Policies on all DUTs \| ${nodes} \| +| | ... +| | [Arguments] | ${nodes} +| | ... +| | ${duts}= | Get Matches | ${nodes} | DUT* +| | :FOR | ${dut} | IN | @{duts} +| | | Show SR Policies | ${nodes['${dut}']} + +| Show SR Steering Policies on all DUTs +| | [Documentation] | Show SRv6 steering policies on all DUT nodes in topology. +| | ... +| | ... | *Arguments:* +| | ... | - nodes - Topology. Type: dictionary +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Show SR Steering Policies on all DUTs \| ${nodes} \| +| | ... +| | [Arguments] | ${nodes} +| | ... +| | ${duts}= | Get Matches | ${nodes} | DUT* +| | :FOR | ${dut} | IN | @{duts} +| | | Show SR Steering Policies | ${nodes['${dut}']} + +| Show SR LocalSIDs on all DUTs +| | [Documentation] | Show SRv6 LocalSIDs on all DUT nodes in topology. +| | ... +| | ... | *Arguments:* +| | ... | - nodes - Topology. Type: dictionary +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Show SR LocalSIDs on all DUTs \| ${nodes} \| +| | ... +| | [Arguments] | ${nodes} +| | ... +| | ${duts}= | Get Matches | ${nodes} | DUT* +| | :FOR | ${dut} | IN | @{duts} +| | | Show SR LocalSIDs | ${nodes['${dut}']} diff --git a/resources/libraries/robot/performance/performance_configuration.robot b/resources/libraries/robot/performance/performance_configuration.robot index f6b1230e7b..52be3a26a8 100644 --- a/resources/libraries/robot/performance/performance_configuration.robot +++ b/resources/libraries/robot/performance/performance_configuration.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -33,6 +33,7 @@ | Resource | resources/libraries/robot/ip/ip6.robot | Resource | resources/libraries/robot/vm/qemu.robot | Resource | resources/libraries/robot/l2/tagging.robot +| Resource | resources/libraries/robot/overlay/srv6.robot | Documentation | Performance suite keywords - configuration. *** Keywords *** @@ -598,6 +599,82 @@ | | And Vpp Enable Input Acl Interface | | ... | ${dut2} | ${dut2_if2} | ip6 | ${table_idx} +| Initialize IPv6 forwarding over SRv6 with encapsulation with '${n}' x SID '${prepos}' decapsulation in 3-node circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces in path on nodes in 3-node circular +| | ... | topology. Get the interface MAC addresses and setup neighbours on all +| | ... | VPP interfaces. Setup IPv6 addresses on all interfaces. Set segment +| | ... | routing for IPv6 for required number of SIDs and configure IPv6 routes +| | ... | on both DUT nodes. +| | ... +| | ${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} | ${dut2_if1} +| | VPP Set If IPv6 Addr | ${dut1} | ${dut1_if1} | ${dut1_if1_ip6} | ${prefix} +| | VPP Set If IPv6 Addr | ${dut1} | ${dut1_if2} | ${dut1_if2_ip6} | ${prefix} +| | VPP Set If IPv6 Addr | ${dut2} | ${dut2_if1} | ${dut2_if1_ip6} | ${prefix} +| | VPP Set If IPv6 Addr | ${dut2} | ${dut2_if2} | ${dut2_if2_ip6} | ${prefix} +| | Suppress ICMPv6 router advertisement message | ${nodes} +| | :FOR | ${number} | IN RANGE | 2 | ${dst_addr_nr}+2 +| | | ${hexa_nr}= | Convert To Hex | ${number} +| | | Add Ip Neighbor | ${dut1} | ${dut1_if1} | ${tg_if1_ip6_subnet}${hexa_nr} +| | | ... | ${tg1_if1_mac} +| | | Add Ip Neighbor | ${dut2} | ${dut2_if2} | ${tg_if2_ip6_subnet}${hexa_nr} +| | | ... | ${tg1_if2_mac} +| | Add Ip Neighbor | ${dut1} | ${dut1_if2} | ${dut2_if1_ip6} | ${dut2_if1_mac} +| | Add Ip Neighbor | ${dut2} | ${dut2_if1} | ${dut1_if2_ip6} | ${dut1_if2_mac} +| | ${sid1}= | Set Variable If +| | ... | "${n}" == "1" | ${dut2_sid1} +| | ... | "${n}" == "2" | ${dut2_sid1_1} +| | ${sid2}= | Set Variable If +| | ... | "${n}" == "1" | ${dut1_sid2} +| | ... | "${n}" == "2" | ${dut1_sid2_1} +| | Vpp Route Add | ${dut1} | ${sid1} | ${sid_prefix} | ${dut2_if1_ip6} +| | ... | ${dut1_if2} +| | Vpp Route Add | ${dut2} | ${sid2} | ${sid_prefix} | ${dut1_if2_ip6} +| | ... | ${dut2_if1} +| | Set SR Encaps Source Address on DUT | ${dut1} | ${dut1_sid1} +| | @{sid_list_dir0}= | Run Keyword If | "${n}" == "1" +| | ... | Create List | ${dut2_sid1} +| | ... | ELSE IF | "${n}" == "2" +| | ... | Create List | ${dut2_sid1_1} | ${dut2_sid1_2} +| | Configure SR Policy on DUT | ${dut1} | ${dut1_bsid} | encap +| | ... | @{sid_list_dir0} +| | Configure SR Steer on DUT | ${dut1} | L3 | ${dut1_bsid} +| | ... | ip_addr=${tg_if2_ip6_subnet} | prefix=${sid_prefix} +| | Run Keyword If | "${n}" == "1" +| | ... | Configure SR LocalSID on DUT | ${dut2} | ${dut2_sid1} | end.dx6 +| | ... | interface=${dut2_if2} | next_hop=${tg_if2_ip6_subnet}2 +| | Run Keyword If | "${n}" == "2" +| | ... | Configure SR LocalSID on DUT | ${dut2} | ${dut2_sid1_1} | end +| | Run Keyword If | "${n}" == "2" and "${prepos}" != "without" +| | ... | Configure SR LocalSID on DUT | ${dut2} | ${dut2_sid1_2} | end.dx6 +| | ... | interface=${dut2_if2} | next_hop=${tg_if2_ip6_subnet}2 +| | Run Keyword If | "${n}" == "2" and "${prepos}" == "without" +| | ... | Vpp Route Add | ${dut2} | ${dut2_sid1_2} | ${sid_prefix} +| | ... | ${tg_if2_ip6_subnet}2 | ${dut2_if2} +| | Set SR Encaps Source Address on DUT | ${dut2} | ${dut2_sid2} +| | @{sid_list_dir1}= | Run Keyword If | "${n}" == "1" +| | ... | Create List | ${dut1_sid2} +| | ... | ELSE IF | "${n}" == "2" +| | ... | Create List | ${dut1_sid2_1} | ${dut1_sid2_2} +| | Configure SR Policy on DUT | ${dut2} | ${dut2_bsid} | encap +| | ... | @{sid_list_dir1} +| | Configure SR Steer on DUT | ${dut2} | L3 | ${dut2_bsid} +| | ... | ip_addr=${tg_if1_ip6_subnet} | prefix=${sid_prefix} +| | Run Keyword If | "${n}" == "1" +| | ... | Configure SR LocalSID on DUT | ${dut1} | ${dut1_sid2} | end.dx6 +| | ... | interface=${dut1_if1} | next_hop=${tg_if1_ip6_subnet}2 +| | Run Keyword If | "${n}" == "2" +| | ... | Configure SR LocalSID on DUT | ${dut1} | ${dut1_sid2_1} | end +| | Run Keyword If | "${n}" == "2" and "${prepos}" != "without" +| | ... | Configure SR LocalSID on DUT | ${dut1} | ${dut1_sid2_2} | end.dx6 +| | ... | interface=${dut1_if1} | next_hop=${tg_if1_ip6_subnet}2 +| | Run Keyword If | "${n}" == "2" and "${prepos}" == "without" +| | ... | Vpp Route Add | ${dut1} | ${dut1_sid2_2} | ${sid_prefix} +| | ... | ${tg_if1_ip6_subnet}2 | ${dut1_if1} + | Initialize L2 xconnect in 3-node circular topology | | [Documentation] | | ... | Setup L2 xconnect topology by cross connecting two interfaces on diff --git a/resources/libraries/robot/performance/performance_setup.robot b/resources/libraries/robot/performance/performance_setup.robot index f1ad973bb8..a3d6eea4c7 100644 --- a/resources/libraries/robot/performance/performance_setup.robot +++ b/resources/libraries/robot/performance/performance_setup.robot @@ -510,6 +510,8 @@ | | Show VAT History On All DUTs | ${nodes} | | Show statistics on all DUTs | ${nodes} | | Run Keyword If Test Failed +| | ... | Set Test Variable | ${pkt_trace} | ${True} +| | Run Keyword If Test Failed | | ... | Traffic should pass with no loss | ${perf_trial_duration} | ${rate} | | ... | ${framesize} | ${topology_type} | fail_on_loss=${False} @@ -697,4 +699,27 @@ | | ... | Get Kubernetes logs on all DUTs | ${nodes} | csit | | Run Keyword If Test Failed | | ... | Describe Kubernetes resource on all DUTs | ${nodes} | csit -| | Delete Kubernetes resource on all DUTs | ${nodes} | csit \ No newline at end of file +| | Delete Kubernetes resource on all DUTs | ${nodes} | csit + +| Tear down performance test with SRv6 with encapsulation +| | [Documentation] | Common test teardown for ndrdisc and pdrdisc performance \ +| | ... | tests with SRv6 with encapsulation feature used. +| | ... +| | ... | *Arguments:* +| | ... | - rate - Rate for sending packets. Type: string +| | ... | - framesize - L2 Frame Size [B]. Type: integer +| | ... | - traffic_profile - Traffic profile. Type: string +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Tear down performance test with MACIP ACL \| 100000pps \| 64 \ +| | ... | \| ${traffic_profile} \| +| | ... +| | [Arguments] | ${rate} | ${framesize} | ${traffic_profile} +| | ... +| | Tear down performance discovery test | ${rate} | ${framesize} +| | ... | ${traffic_profile} +| | Run Keyword If Test Failed | Show SR Policies on all DUTs | ${nodes} +| | Run Keyword If Test Failed +| | ... | Show SR Steering Policies on all DUTs | ${nodes} +| | Run Keyword If Test Failed | Show SR LocalSIDs on all DUTs | ${nodes} diff --git a/resources/libraries/robot/performance/performance_utils.robot b/resources/libraries/robot/performance/performance_utils.robot index 6d6413d966..88826a7c9b 100644 --- a/resources/libraries/robot/performance/performance_utils.robot +++ b/resources/libraries/robot/performance/performance_utils.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -21,6 +21,7 @@ | Library | resources.libraries.python.VhostUser | Library | resources.libraries.python.TrafficGenerator | Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl +| Library | resources.libraries.python.Trace | Resource | resources/libraries/robot/shared/default.robot | Resource | resources/libraries/robot/shared/interfaces.robot | Resource | resources/libraries/robot/shared/counters.robot @@ -82,8 +83,8 @@ | | ... | Return TRUE if variable DPDK_TEST exist, otherwise FALSE. | | ${ret} | ${tmp}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${DPDK_TEST} -| | Return From Keyword If | "${ret}" == "PASS" | ${TRUE} -| | Return From Keyword | ${FALSE} +| | Return From Keyword If | "${ret}" == "PASS" | ${True} +| | Return From Keyword | ${False} | Find NDR using linear search and pps | | [Documentation] @@ -452,10 +453,10 @@ | | ... | | Return From Keyword If | ${rate} <= 10000 | ${-1} | | ${ret}= | Is DPDK performance test -| | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs +| | Run Keyword If | ${ret}==${False} | Clear all counters on all DUTs | | Send traffic on tg | ${duration} | ${rate}pps | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} +| | Run Keyword If | ${ret}==${False} | Show statistics on all DUTs | ${nodes} | | Run keyword and return | Get latency | Traffic should pass with no loss @@ -482,10 +483,14 @@ | | Clear and show runtime counters with running traffic | ${duration} | | ... | ${rate} | ${framesize} | ${topology_type} | | ${ret}= | Is DPDK performance test -| | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs +| | Run Keyword If | ${ret}==${False} | Clear all counters on all DUTs +| | Run Keyword If | ${ret}==${False} and ${pkt_trace}==${True} +| | ... | VPP Enable Traces On All DUTs | ${nodes} | | Send traffic on tg | ${duration} | ${rate} | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} +| | Run Keyword If | ${ret}==${False} | Show statistics on all DUTs | ${nodes} +| | Run Keyword If | ${ret}==${False} and ${pkt_trace}==${True} +| | ... | Show Packet Trace On All Duts | ${nodes} | | Run Keyword If | ${fail_on_loss} | No traffic loss occurred | Traffic should pass with partial loss @@ -513,10 +518,14 @@ | | Clear and show runtime counters with running traffic | ${duration} | | ... | ${rate} | ${framesize} | ${topology_type} | | ${ret}= | Is DPDK performance test -| | Run Keyword If | ${ret}==${FALSE} | Clear all counters on all DUTs +| | Run Keyword If | ${ret}==${False} | Clear all counters on all DUTs +| | Run Keyword If | ${ret}==${False} and ${pkt_trace}==${True} +| | ... | VPP Enable Traces On All DUTs | ${nodes} | | Send traffic on tg | ${duration} | ${rate} | ${framesize} | | ... | ${topology_type} | warmup_time=0 -| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs | ${nodes} +| | Run Keyword If | ${ret}==${False} | Show statistics on all DUTs | ${nodes} +| | Run Keyword If | ${ret}==${False} and ${pkt_trace}==${True} +| | ... | Show Packet Trace On All Duts | ${nodes} | | Run Keyword If | ${fail_on_loss} | Partial traffic loss accepted | | ... | ${loss_acceptance} | ${loss_acceptance_type} @@ -542,9 +551,9 @@ | | Send traffic on tg | -1 | ${rate} | ${framesize} | ${topology_type} | | ... | warmup_time=0 | async_call=${True} | latency=${False} | | ${ret}= | Is DPDK performance test -| | Run Keyword If | ${ret}==${FALSE} +| | Run Keyword If | ${ret}==${False} | | ... | Clear runtime counters on all DUTs | ${nodes} | | Sleep | ${duration} -| | Run Keyword If | ${ret}==${FALSE} +| | Run Keyword If | ${ret}==${False} | | ... | Show runtime counters on all DUTs | ${nodes} | | Stop traffic on tg diff --git a/resources/templates/vat/enable_dpdk_traces.vat b/resources/templates/vat/enable_dpdk_traces.vat new file mode 100644 index 0000000000..38af76a5b5 --- /dev/null +++ b/resources/templates/vat/enable_dpdk_traces.vat @@ -0,0 +1 @@ +exec trace add dpdk-input 100 \ No newline at end of file diff --git a/resources/templates/vat/enable_vhost_user_traces.vat b/resources/templates/vat/enable_vhost_user_traces.vat new file mode 100644 index 0000000000..9b5c6465dc --- /dev/null +++ b/resources/templates/vat/enable_vhost_user_traces.vat @@ -0,0 +1 @@ +exec trace add vhost-user-input 100 \ No newline at end of file diff --git a/tests/vpp/perf/__init__.robot b/tests/vpp/perf/__init__.robot index 3d25ebdb8d..67611cc21d 100644 --- a/tests/vpp/perf/__init__.robot +++ b/tests/vpp/perf/__init__.robot @@ -38,6 +38,7 @@ | | ... | - perf_qemu_qsz - QEMU virtio queue size | | ... | - use_tuned_cfs - Switch to set scheduler policy | | ... | - qemu_built - Information if QEMU build is already prepared +| | ... | - pkt_trace - Switch to enable packet trace for test | | ... | | Set Global Variable | ${perf_trial_duration} | 10 | | Set Global Variable | ${perf_pdr_loss_acceptance} | 0.5 @@ -48,3 +49,4 @@ | | Set Global Variable | ${perf_qemu_qsz} | 1024 | | Set Global Variable | ${use_tuned_cfs} | ${False} | | Set Global Variable | ${qemu_built} | ${False} +| | Set Global Variable | ${pkt_trace} | ${False} diff --git a/tests/vpp/perf/srv6/10ge2p1x520-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot b/tests/vpp/perf/srv6/10ge2p1x520-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot new file mode 100644 index 0000000000..41d244a18f --- /dev/null +++ b/tests/vpp/perf/srv6/10ge2p1x520-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot @@ -0,0 +1,250 @@ +# Copyright (c) 2018 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/performance_setup.robot +| ... +| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC +| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | SRv6 +| ... +| Suite Setup | Set up 3-node performance topology with DUT's NIC model +| ... | L3 | Intel-X520-DA2 +| Suite Teardown | Tear down 3-node performance topology +| ... +| Test Setup | Set up performance test +| ... +| Test Teardown | Tear down performance test with SRv6 with encapsulation +| ... | ${min_rate}pps | ${framesize} | ${traffic_profile} +| ... +| Documentation | *Packet throughput Segment routing over IPv6 dataplane with\ +| ... | one SID (SRH not inserted) test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-IPv6 on DUT1-DUT2, Eth-IPv6 on\ +| ... | TG-DUTn for IPv6 routing over SRv6. +| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\ +| ... | routing and static route, SR policy and steering policy for one\ +| ... | direction and one SR behaviour (function) - End - for other direction.\ +| ... | DUT1 and DUT2 are tested with 2p10GE NIC X520 Niantic by Intel. +| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\ +| ... | Rate) with zero packet loss tolerance or 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 either binary search or linear search\ +| ... | algorithms with configured starting rate and final step that determines\ +| ... | throughput measurement resolution. Test packets are generated by TG on\ +| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\ +| ... | (flow-group per direction, 253 flows per flow-group) with\ +| ... | all packets containing Ethernet header,IPv6 header with static payload.\ +| ... | MAC addresses are matching MAC addresses of the TG node interfaces. +| ... | *[Ref] Applicable standard specifications:* SRv6 Network Programming -\ +| ... | draft 3. +| ... + +*** Variables *** +# X520-DA2 bandwidth limit +| ${s_limit}= | ${10000000000} +# SIDs +| ${dut1_sid1}= | 2002:1:: +| ${dut1_sid2}= | 2003:2:: +| ${dut1_bsid}= | 2002:1::1 +| ${dut2_sid1}= | 2002:2:: +| ${dut2_sid2}= | 2003:1:: +| ${dut2_bsid}= | 2002:2::1 +| ${sid_prefix}= | ${64} +# IP settings +| ${tg_if1_ip6_subnet}= | 2001:1:: +| ${tg_if2_ip6_subnet}= | 2001:2:: +| ${dst_addr_nr}= | ${1} +| ${dut1_if1_ip6}= | 2001:1::1 +| ${dut1_if2_ip6}= | 2001:3::1 +| ${dut2_if1_ip6}= | 2001:3::2 +| ${dut2_if2_ip6}= | 2001:2::1 +| ${prefix}= | ${64} +# outer IPv6 header: 40B +| ${srv6_overhead_nosrh}= | ${40} +# Traffic profile: +| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253 + +*** Keywords *** +| Discover NDR or PDR for IPv6 routing over SRv6 +| | [Arguments] | ${wt} | ${rxq} | ${framesize} | ${min_rate} | ${search_type} +| | Set Test Variable | ${framesize} +| | Set Test Variable | ${min_rate} +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | ${max_rate}= | Calculate pps | ${s_limit} +| | ... | ${get_framesize} + ${srv6_overhead_nosrh} +| | ${binary_min}= | Set Variable | ${min_rate} +| | ${binary_max}= | Set Variable | ${max_rate} +| | ${threshold}= | Set Variable | ${min_rate} +| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology +| | And Add PCI devices to DUTs in 3-node single link topology +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | And Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs +| | And Apply startup configuration on all VPP DUTs +| | When Initialize IPv6 forwarding over SRv6 with encapsulation with '1' x SID 'with' decapsulation in 3-node circular topology +| | Then Run Keyword If | '${search_type}' == 'NDR' +| | ... | Find NDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ELSE IF | '${search_type}' == 'PDR' +| | ... | Find PDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type} + +*** Test Cases *** +| tc01-78B-1t1c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc02-78B-1t1c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc03-78B-2t2c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc04-78B-2t2c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc05-78B-4t4c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc06-78B-4t4c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc07-1518B-1t1c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc08-1518B-1t1c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc09-1518B-2t2c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc10-1518B-2t2c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc11-1518B-4t4c-ethip6ip6-ip6base-srv6enc1sid-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc12-1518B-4t4c-ethip6ip6-ip6base-srv6enc1sid-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=PDR diff --git a/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot b/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot new file mode 100644 index 0000000000..30d84d2645 --- /dev/null +++ b/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot @@ -0,0 +1,253 @@ +# Copyright (c) 2018 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/performance_setup.robot +| ... +| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC +| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | SRv6 +| ... +| Suite Setup | Set up 3-node performance topology with DUT's NIC model +| ... | L3 | Intel-X520-DA2 +| Suite Teardown | Tear down 3-node performance topology +| ... +| Test Setup | Set up performance test +| ... +| Test Teardown | Tear down performance test with SRv6 with encapsulation +| ... | ${min_rate}pps | ${framesize} | ${traffic_profile} +| ... +| Documentation | *Packet throughput Segment routing over IPv6 dataplane with\ +| ... | two SIDs (SRH inserted) test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-SRH-IPv6 on DUT1-DUT2, Eth-IPv6\ +| ... | on TG-DUTn for IPv6 routing over SRv6. +| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\ +| ... | routing and static route, SR policy and steering policy for one\ +| ... | direction and two SR behaviours (functions) - End and End.DX6 - for\ +| ... | other direction. DUT1 and DUT2 are tested with 2p10GE NIC X520 Niantic\ +| ... | by Intel. +| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\ +| ... | Rate) with zero packet loss tolerance or 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 either binary search or linear search\ +| ... | algorithms with configured starting rate and final step that determines\ +| ... | throughput measurement resolution. Test packets are generated by TG on\ +| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\ +| ... | (flow-group per direction, 253 flows per flow-group) with\ +| ... | all packets containing Ethernet header,IPv6 header with static payload.\ +| ... | MAC addresses are matching MAC addresses of the TG node interfaces. +| ... | *[Ref] Applicable standard specifications:* SRv6 Network Programming -\ +| ... | draft 3. +| ... + +*** Variables *** +# X520-DA2 bandwidth limit +| ${s_limit}= | ${10000000000} +# SIDs +| ${dut1_sid1}= | 2002:1:: +| ${dut1_sid2_1}= | 2003:2:: +| ${dut1_sid2_2}= | 2003:3:: +| ${dut1_bsid}= | 2002:1::1 +| ${dut2_sid1_1}= | 2002:2:: +| ${dut2_sid1_2}= | 2002:3:: +| ${dut2_sid2}= | 2003:1:: +| ${dut2_bsid}= | 2002:2::1 +| ${sid_prefix}= | ${64} +# IP settings +| ${tg_if1_ip6_subnet}= | 2001:1:: +| ${tg_if2_ip6_subnet}= | 2001:2:: +| ${dst_addr_nr}= | ${1} +| ${dut1_if1_ip6}= | 2001:1::1 +| ${dut1_if2_ip6}= | 2001:3::1 +| ${dut2_if1_ip6}= | 2001:3::2 +| ${dut2_if2_ip6}= | 2001:2::1 +| ${prefix}= | ${64} +# outer IPv6 header + SRH with 2 SIDs: 40+40B +| ${srv6_overhead_2sids}= | ${80} +# Traffic profile: +| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253 + +*** Keywords *** +| Discover NDR or PDR for IPv6 routing over SRv6 +| | [Arguments] | ${wt} | ${rxq} | ${framesize} | ${min_rate} | ${search_type} +| | Set Test Variable | ${framesize} +| | Set Test Variable | ${min_rate} +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | ${max_rate}= | Calculate pps | ${s_limit} +| | ... | ${get_framesize} + ${srv6_overhead_2sids} +| | ${binary_min}= | Set Variable | ${min_rate} +| | ${binary_max}= | Set Variable | ${max_rate} +| | ${threshold}= | Set Variable | ${min_rate} +| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology +| | And Add PCI devices to DUTs in 3-node single link topology +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | And Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs +| | And Apply startup configuration on all VPP DUTs +| | When Initialize IPv6 forwarding over SRv6 with encapsulation with '2' x SID 'with' decapsulation in 3-node circular topology +| | Then Run Keyword If | '${search_type}' == 'NDR' +| | ... | Find NDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ELSE IF | '${search_type}' == 'PDR' +| | ... | Find PDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type} + +*** Test Cases *** +| tc01-78B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc02-78B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc03-78B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc04-78B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc05-78B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc06-78B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc07-1518B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc08-1518B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc09-1518B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc10-1518B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc11-1518B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc12-1518B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=PDR diff --git a/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot b/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot new file mode 100644 index 0000000000..23d39f00b9 --- /dev/null +++ b/tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot @@ -0,0 +1,253 @@ +# Copyright (c) 2018 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/performance_setup.robot +| ... +| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC +| ... | NIC_Intel-X520-DA2 | ETH | IP6FWD | FEATURE | SRv6 +| ... +| Suite Setup | Set up 3-node performance topology with DUT's NIC model +| ... | L3 | Intel-X520-DA2 +| Suite Teardown | Tear down 3-node performance topology +| ... +| Test Setup | Set up performance test +| ... +| Test Teardown | Tear down performance test with SRv6 with encapsulation +| ... | ${min_rate}pps | ${framesize} | ${traffic_profile} +| ... +| Documentation | *Packet throughput Segment routing over IPv6 dataplane with\ +| ... | two SIDs (SRH inserted) without decapsulation test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-SRH-IPv6 on DUT1-DUT2 and\ +| ... | DUTn->TG, Eth-IPv6 on TG->DUTn for IPv6 routing over SRv6. +| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with IPv6\ +| ... | routing and static route, SR policy and steering policy for one\ +| ... | direction and one SR behaviour (function) - End - for other direction.\ +| ... | DUT1 and DUT2 are tested with 2p10GE NIC X520 Niantic by Intel. +| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop\ +| ... | Rate) with zero packet loss tolerance or 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 either binary search or linear search\ +| ... | algorithms with configured starting rate and final step that determines\ +| ... | throughput measurement resolution. Test packets are generated by TG on\ +| ... | links to DUTs. TG traffic profile contains two L3 flow-groups\ +| ... | (flow-group per direction, 253 flows per flow-group) with\ +| ... | all packets containing Ethernet header,IPv6 header with static payload.\ +| ... | MAC addresses are matching MAC addresses of the TG node interfaces. +| ... | *[Ref] Applicable standard specifications:* SRv6 Network Programming -\ +| ... | draft 3. +| ... + + +*** Variables *** +# X520-DA2 bandwidth limit +| ${s_limit}= | ${10000000000} +# SIDs +| ${dut1_sid1}= | 2002:1:: +| ${dut1_sid2_1}= | 2003:2:: +| ${dut1_sid2_2}= | 2003:3:: +| ${dut1_bsid}= | 2002:1::1 +| ${dut2_sid1_1}= | 2002:2:: +| ${dut2_sid1_2}= | 2002:3:: +| ${dut2_sid2}= | 2003:1:: +| ${dut2_bsid}= | 2002:2::1 +| ${sid_prefix}= | ${64} +# IP settings +| ${tg_if1_ip6_subnet}= | 2001:1:: +| ${tg_if2_ip6_subnet}= | 2001:2:: +| ${dst_addr_nr}= | ${1} +| ${dut1_if1_ip6}= | 2001:1::1 +| ${dut1_if2_ip6}= | 2001:3::1 +| ${dut2_if1_ip6}= | 2001:3::2 +| ${dut2_if2_ip6}= | 2001:2::1 +| ${prefix}= | ${64} +# outer IPv6 header + SRH with 2 SIDs: 40+40B +| ${srv6_overhead_2sids}= | ${80} +# Traffic profile: +| ${traffic_profile} | trex-sl-3n-ethip6-ip6src253 + +*** Keywords *** +| Discover NDR or PDR for IPv6 routing over SRv6 +| | [Arguments] | ${wt} | ${rxq} | ${framesize} | ${min_rate} | ${search_type} +| | Set Test Variable | ${framesize} +| | Set Test Variable | ${min_rate} +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | ${max_rate}= | Calculate pps | ${s_limit} +| | ... | ${get_framesize} + ${srv6_overhead_2sids} +| | ${binary_min}= | Set Variable | ${min_rate} +| | ${binary_max}= | Set Variable | ${max_rate} +| | ${threshold}= | Set Variable | ${min_rate} +| | Given Add '${wt}' worker threads and '${rxq}' rxqueues in 3-node single-link circular topology +| | And Add PCI devices to DUTs in 3-node single link topology +| | ${get_framesize}= | Get Frame Size | ${framesize} +| | And Run Keyword If | ${get_framesize} < ${1522} | Add no multi seg to all DUTs +| | And Apply startup configuration on all VPP DUTs +| | When Initialize IPv6 forwarding over SRv6 with encapsulation with '2' x SID 'without' decapsulation in 3-node circular topology +| | Then Run Keyword If | '${search_type}' == 'NDR' +| | ... | Find NDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ELSE IF | '${search_type}' == 'PDR' +| | ... | Find PDR using binary search and pps +| | ... | ${framesize} | ${binary_min} | ${binary_max} | ${traffic_profile} +| | ... | ${min_rate} | ${max_rate} | ${threshold} +| | ... | ${perf_pdr_loss_acceptance} | ${perf_pdr_loss_acceptance_type} + +*** Test Cases *** +| tc01-78B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc02-78B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc03-78B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc04-78B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc05-78B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=NDR + +| tc06-78B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 78 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 78B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${78} | min_rate=${100000} | search_type=PDR + +| tc07-1518B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc08-1518B-1t1c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 1 thread, 1 phy core, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=1 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc09-1518B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc10-1518B-2t2c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 2 threads, 2 phy cores, 1 receive queue per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=2 | rxq=1 | framesize=${1518} | min_rate=${100000} | search_type=PDR + +| tc11-1518B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | NDRDISC +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=NDR + +| tc12-1518B-4t4c-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-pdrdisc +| | [Documentation] +| | ... | [Cfg] DUT runs IPv6 over SRv6 routing config with\ +| | ... | 4 threads, 4 phy cores, 2 receive queues per NIC port. +| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\ +| | ... | linerate, step 100kpps, LT=0.5%. +| | ... +| | [Tags] | 1518B | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH +| | ... +| | [Template] | Discover NDR or PDR for IPv6 routing over SRv6 +| | wt=4 | rxq=2 | framesize=${1518} | min_rate=${100000} | search_type=PDR -- 2.16.6