aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Gelety <jgelety@cisco.com>2017-12-19 09:15:14 +0100
committerPeter Mikus <pmikus@cisco.com>2018-01-17 16:00:52 +0000
commit8215cf7caa6f6fc1d78971f78a934499f3998a4c (patch)
tree2b3705c80191c9676f85dfb750d871e93f491812
parentf13401bd90a789e9a736dfdb7cbe80313f0304fd (diff)
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 <jgelety@cisco.com> (cherry picked from commit 95998a67270ffd72f09ce6f3d43235c723edf36b)
-rw-r--r--resources/libraries/python/DUTSetup.py31
-rw-r--r--resources/libraries/python/SRv6.py142
-rw-r--r--resources/libraries/robot/overlay/srv6.robot61
-rw-r--r--resources/libraries/robot/performance/performance_configuration.robot79
-rw-r--r--resources/libraries/robot/performance/performance_setup.robot27
-rw-r--r--resources/libraries/robot/performance/performance_utils.robot31
-rw-r--r--resources/templates/vat/enable_dpdk_traces.vat1
-rw-r--r--resources/templates/vat/enable_vhost_user_traces.vat1
-rw-r--r--tests/vpp/perf/__init__.robot2
-rw-r--r--tests/vpp/perf/srv6/10ge2p1x520-ethip6ip6-ip6base-srv6enc1sid-ndrpdrdisc.robot250
-rw-r--r--tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-ndrpdrdisc.robot253
-rw-r--r--tests/vpp/perf/srv6/10ge2p1x520-ethip6srhip6-ip6base-srv6enc2sids-nodecaps-ndrpdrdisc.robot253
12 files changed, 1032 insertions, 99 deletions
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