+| | ... | *Example:*
+| | ...
+| | ... | \| L2 bridge domains with Vhost-User initialized in a 3-node \
+| | ... | circular topology \| 1 \| 2 \| /tmp/sock1 \| /tmp/sock2 \|
+| | ...
+| | [Arguments] | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ...
+| | Configure vhost interfaces for L2BD forwarding | ${dut1}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if2} | ${bd_id2}
+| | Configure vhost interfaces for L2BD forwarding | ${dut2}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if2} | ${bd_id2}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Initialize L2 bridge domains with Vhost-User for '${nr}' VMs in 3-node circular topology
+| | [Documentation]
+| | ... | Create pairs of Vhost-User interfaces for defined number of VMs on all
+| | ... | defined VPP nodes. Add each Vhost-User interface into L2 bridge
+| | ... | domains with learning enabled with physical inteface or Vhost-User
+| | ... | interface of another VM.
+| | ...
+| | ... | *Arguments:*
+| | ... | _None_
+| | ...
+| | ... | *Note:*
+| | ... | Socket paths for VM are defined in following format:
+| | ... | - /tmp/sock-${VM_ID}-1
+| | ... | - /tmp/sock-${VM_ID}-2
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| L2 bridge domains with Vhost-User for '2' VMs initialized in \
+| | ... | a 3-node circular topology \|
+| | ...
+| | ${bd_id2}= | Evaluate | ${nr}+1
+| | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${1}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if1} | ${1}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if2} | ${bd_id2}
+| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
+| | | ${sock1}= | Set Variable | /tmp/sock-${number}-1
+| | | ${sock2}= | Set Variable | /tmp/sock-${number}-2
+| | | Configure vhost interfaces for L2BD forwarding | ${dut1}
+| | | ... | ${sock1} | ${sock2} | dut1-vhost-${number}-if1
+| | | ... | dut1-vhost-${number}-if2
+| | | ${bd_id2}= | Evaluate | ${number}+1
+| | | Add interface to bridge domain | ${dut1}
+| | | ... | ${dut1-vhost-${number}-if1} | ${number}
+| | | Add interface to bridge domain | ${dut1}
+| | | ... | ${dut1-vhost-${number}-if2} | ${bd_id2}
+| | | Configure vhost interfaces for L2BD forwarding | ${dut2}
+| | | ... | ${sock1} | ${sock2} | dut2-vhost-${number}-if1
+| | | ... | dut2-vhost-${number}-if2
+| | | Add interface to bridge domain | ${dut2}
+| | | ... | ${dut2-vhost-${number}-if1} | ${number}
+| | | Add interface to bridge domain | ${dut2}
+| | | ... | ${dut2-vhost-${number}-if2} | ${bd_id2}
+
+| Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology
+| | [Documentation]
+| | ... | Setup L2 bridge domain topology with VXLANoIPv4 by connecting
+| | ... | physical and vxlan interfaces on each DUT. All interfaces are brought
+| | ... | up. IPv4 addresses with prefix /24 are configured on interfaces
+| | ... | between DUTs. VXLAN sub-interfaces has same IPv4 address as
+| | ... | interfaces.
+| | ...
+| | Set interfaces in path in 3-node circular topology up
+| | Configure IP addresses on interfaces | ${dut1} | ${dut1_if2} | 172.16.0.1 | 24
+| | Configure IP addresses on interfaces | ${dut2} | ${dut2_if1} | 172.16.0.2 | 24
+| | ${dut1_if2_mac}= | Get Interface MAC | ${dut1} | ${dut1_if2}
+| | ${dut2_if1_mac}= | Get Interface MAC | ${dut2} | ${dut2_if1}
+| | Add arp on dut | ${dut1} | ${dut1_if2} | 172.16.0.2 | ${dut2_if1_mac}
+| | Add arp on dut | ${dut2} | ${dut2_if1} | 172.16.0.1 | ${dut1_if2_mac}
+| | ${dut1s_vxlan}= | Create VXLAN interface | ${dut1} | 24
+| | ... | 172.16.0.1 | 172.16.0.2
+| | ${dut2s_vxlan}= | Create VXLAN interface | ${dut2} | 24
+| | ... | 172.16.0.2 | 172.16.0.1
+| | Configure L2BD forwarding | ${dut1} | ${dut1_if1} | ${dut1s_vxlan}
+| | Configure L2BD forwarding | ${dut2} | ${dut2_if2} | ${dut2s_vxlan}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Initialize L2 bridge domains with Vhost-User and VXLANoIPv4 in 3-node circular topology
+| | [Documentation]
+| | ... | Create two Vhost-User interfaces on all defined VPP nodes. Add each
+| | ... | Vhost-User interface into L2 bridge domains with learning enabled
+| | ... | with physical inteface.
+| | ... | Setup VXLANoIPv4 between DUTs by connecting physical and vxlan
+| | ... | interfaces on each DUT. All interfaces are brought up.
+| | ... | IPv4 addresses with prefix /24 are configured on interfaces between
+| | ... | DUTs. VXLAN sub-interfaces has same IPv4 address as interfaces.
+| | ...
+| | ... | *Arguments:*
+| | ... | - bd_id1 - Bridge domain ID. Type: integer
+| | ... | - bd_id2 - Bridge domain ID. Type: integer
+| | ... | - sock1 - Sock path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Sock path for second Vhost-User interface. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| L2 bridge domains with Vhost-User and VXLANoIPv4 initialized in a\
+| | ... | 3-node circular topology \| 1 \| 2 \| /tmp/sock1 \| /tmp/sock2 \|
+| | ...
+| | [Arguments] | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ...
+| | Set interfaces in path in 3-node circular topology up
+| | Configure IP addresses on interfaces | ${dut1} | ${dut1_if2} | 172.16.0.1 | 24
+| | Configure IP addresses on interfaces | ${dut2} | ${dut2_if1} | 172.16.0.2 | 24
+| | ${dut1s_vxlan}= | Create VXLAN interface | ${dut1} | 24
+| | ... | 172.16.0.1 | 172.16.0.2
+| | ${dut2s_vxlan}= | Create VXLAN interface | ${dut2} | 24
+| | ... | 172.16.0.2 | 172.16.0.1
+| | Configure vhost interfaces for L2BD forwarding | ${dut1}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut1} | ${dut1s_vxlan} | ${bd_id2}
+| | Configure vhost interfaces for L2BD forwarding | ${dut2}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut2} | ${dut2s_vxlan} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if2} | ${bd_id2}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Initialize L2 bridge domains with Vhost-User in 2-node circular topology
+| | [Documentation]
+| | ... | Create two Vhost-User interfaces on all defined VPP nodes. Add each
+| | ... | Vhost-User interface into L2 bridge domains with learning enabled
+| | ... | with physical inteface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - bd_id1 - Bridge domain ID. Type: integer
+| | ... | - bd_id2 - Bridge domain ID. Type: integer
+| | ... | - sock1 - Sock path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Sock path for second Vhost-User interface. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| L2 bridge domains with Vhost-User initialized in a 2-node \
+| | ... | circular topology \| 1 \| 2 \| /tmp/sock1 \| /tmp/sock2 \|
+| | ...
+| | [Arguments] | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2}
+| | ...
+| | Configure vhost interfaces for L2BD forwarding | ${dut1}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if2} | ${bd_id2}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Initialize L2 bridge domains with Vhost-User and VLAN in a 3-node circular topology
+| | [Documentation]
+| | ... | Create two Vhost-User interfaces on all defined VPP nodes. Add each
+| | ... | Vhost-User interface into L2 bridge domains with learning enabled
+| | ... | with physical inteface.
+| | ... | Setup VLAN between DUTs. All interfaces are brought up.
+| | ...
+| | ... | *Arguments:*
+| | ... | - bd_id1 - Bridge domain ID. Type: integer
+| | ... | - bd_id2 - Bridge domain ID. Type: integer
+| | ... | - sock1 - Sock path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Sock path for second Vhost-User interface. Type: string
+| | ... | - subid - ID of the sub-interface to be created. Type: string
+| | ... | - tag_rewrite - Method of tag rewrite. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| L2 bridge domains with Vhost-User and VLAN initialized in a 3-node\
+| | ... | circular topology \| 1 \| 2 \| /tmp/sock1 \| /tmp/sock2 \| 10\
+| | ... | pop-1 \|
+| | ...
+| | [Arguments] | ${bd_id1} | ${bd_id2} | ${sock1} | ${sock2} | ${subid}
+| | ... | ${tag_rewrite}
+| | ...
+| | Set interfaces in path in 3-node circular topology up
+| | Initialize VLAN dot1q sub-interfaces in 3-node circular topology
+| | ... | ${dut1} | ${dut1_if2} | ${dut2} | ${dut2_if1} | ${subid}
+| | Configure L2 tag rewrite method on interfaces
+| | ... | ${dut1} | ${subif_index_1} | ${dut2} | ${subif_index_2}
+| | ... | ${tag_rewrite}
+| | Configure vhost interfaces for L2BD forwarding | ${dut1}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut1} | ${dut1_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut1} | ${vhost_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut1} | ${subif_index_1} | ${bd_id2}
+| | Configure vhost interfaces for L2BD forwarding | ${dut2}
+| | ... | ${sock1} | ${sock2}
+| | Add interface to bridge domain | ${dut2} | ${subif_index_2} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if1} | ${bd_id1}
+| | Add interface to bridge domain | ${dut2} | ${vhost_if2} | ${bd_id2}
+| | Add interface to bridge domain | ${dut2} | ${dut2_if2} | ${bd_id2}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Set up 2-node performance topology with DUT's NIC model
+| | [Documentation]
+| | ... | Suite preparation phase that setup default startup configuration of
+| | ... | VPP on all DUTs. Updates interfaces on all nodes and setup global
+| | ... | variables used in test cases based on interface model provided as an
+| | ... | argument. Initializes traffic generator.
+| | ...
+| | ... | *Arguments:*
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - nic_model - Interface model. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| 2-node Performance Suite Setup \| L2 \| Intel-X520-DA2 \|
+| | ...
+| | [Arguments] | ${topology_type} | ${nic_model}
+| | ...
+| | Show vpp version on all DUTs
+| | Set variables in 2-node circular topology with DUT interface model
+| | ... | ${nic_model}
+| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
+| | ... | ${dut1} | ${dut1_if1} | ${dut1} | ${dut1_if2} | ${topology_type}
+
+| Set up 2-node-switched performance topology with DUT's NIC model
+| | [Documentation]
+| | ... | Suite preparation phase that setup default startup configuration of
+| | ... | VPP on all DUTs. Updates interfaces on all nodes and setup global
+| | ... | variables used in test cases based on interface model provided as an
+| | ... | argument. Initializes traffic generator.
+| | ...
+| | ... | *Arguments:*
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - nic_model - Interface model. Type: string
+| | ... | - tg_if1_dest_mac - Interface 1 destination MAC address. Type: string
+| | ... | - tg_if2_dest_mac - Interface 2 destination MAC address. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| 2-node Performance Suite Setup \| L2 \| Intel-X520-DA2 \
+| | ... | \| 22:22:33:44:55:66 \| 22:22:33:44:55:55 \|
+| | ...
+| | [Arguments] | ${topology_type} | ${nic_model} | ${tg_if1_dest_mac}
+| | ... | ${tg_if2_dest_mac}
+| | ...
+| | Show vpp version on all DUTs
+| | Set variables in 2-node circular topology with DUT interface model
+| | ... | ${nic_model}
+| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
+| | ... | ${dut1} | ${dut1_if1} | ${dut1} | ${dut1_if2} | ${topology_type}
+| | ... | ${tg_if1_dest_mac} | ${tg_if2_dest_mac}
+
+| Set up 3-node performance topology with DUT's NIC model
+| | [Documentation]
+| | ... | Suite preparation phase that setup default startup configuration of
+| | ... | VPP on all DUTs. Updates interfaces on all nodes and setup global
+| | ... | variables used in test cases based on interface model provided as an
+| | ... | argument. Initializes traffic generator.
+| | ...
+| | ... | *Arguments:*
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - nic_model - Interface model. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Set up 3-node performance topology with DUT's NIC model \| L2 \
+| | ... | \| Intel-X520-DA2 \|
+| | ...
+| | [Arguments] | ${topology_type} | ${nic_model}
+| | ...
+| | Show vpp version on all DUTs
+| | Set variables in 3-node circular topology with DUT interface model
+| | ... | ${nic_model}
+| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
+| | ... | ${dut1} | ${dut1_if1} | ${dut2} | ${dut2_if2} | ${topology_type}
+
+| Tear down 3-node performance topology
+| | [Documentation]
+| | ... | Suite teardown phase with traffic generator teardown.
+| | ...
+| | Teardown traffic generator | ${tg}
+
+| Tear down 2-node performance topology
+| | [Documentation]
+| | ... | Suite teardown phase with traffic generator teardown.
+| | ...
+| | Teardown traffic generator | ${tg}
+
+| Find NDR using linear search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 linear search with non drop rate.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - start_rate - Initial start rate [pps]. Type: float
+| | ... | - step_rate - Step of linear search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find NDR using linear search and pps \| 64 \| 5000000 \
+| | ... | \| 100000 \| 3-node-IPv4 \| 100000 \| 14880952 \|
+| | ...
+| | [Arguments] | ${framesize} | ${start_rate} | ${step_rate}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate}
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Linear Step | ${step_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Linear Search | ${start_rate} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%NDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | ${rate_50p}= | Evaluate | int(${rate_per_stream}*0.5)
+| | ${lat_50p}= | Measure latency pps | ${duration} | ${rate_50p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 50%NDR | ${lat_50p}
+| | Append To List | ${latency} | ${tmp}
+| | ${rate_10p}= | Evaluate | int(${rate_per_stream}*0.1)
+| | ${lat_10p}= | Measure latency pps | ${duration} | ${rate_10p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 10%NDR | ${lat_10p}
+| | Append To List | ${latency} | ${tmp}
+| | Display result of NDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${latency}
+| | Traffic should pass with no loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type} | fail_on_loss=${False}
+
+| Find PDR using linear search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 linear search with partial drop rate
+| | ... | with PDR threshold and type specified by parameter.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - start_rate - Initial start rate [pps]. Type: float
+| | ... | - step_rate - Step of linear search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ... | - loss_acceptance - Accepted loss during search. Type: float
+| | ... | - loss_acceptance_type - Percentage or frames. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find PDR using linear search and pps \| 64 \| 5000000 \
+| | ... | \| 100000 \| 3-node-IPv4 \| 100000 \| 14880952 \| 0.5 \| percentage \|
+| | ...
+| | [Arguments] | ${framesize} | ${start_rate} | ${step_rate}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate}
+| | ... | ${loss_acceptance}=0 | ${loss_acceptance_type}='frames'
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Linear Step | ${step_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Set Loss Acceptance | ${loss_acceptance}
+| | Run Keyword If | '${loss_acceptance_type}' == 'percentage'
+| | ... | Set Loss Acceptance Type Percentage
+| | Linear Search | ${start_rate} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%PDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | Display result of PDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${loss_acceptance} | ${loss_acceptance_type} | ${latency}
+| | Traffic should pass with partial loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type} | ${loss_acceptance}
+| | ... | ${loss_acceptance_type} | fail_on_loss=${False}
+
+| Find NDR using binary search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 binary search with non drop rate.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - binary_min - Lower boundary of search [pps]. Type: float
+| | ... | - binary_max - Upper boundary of search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ... | - threshold - Threshold to stop search [pps]. Type: integer
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find NDR using binary search and pps \| 64 \| 6000000 \
+| | ... | \| 12000000 \| 3-node-IPv4 \| 100000 \| 14880952 \| 50000 \|
+| | ...
+| | [Arguments] | ${framesize} | ${binary_min} | ${binary_max}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate} | ${threshold}
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Set Binary Convergence Threshold | ${threshold}
+| | Binary Search | ${binary_min} | ${binary_max} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%NDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | ${rate_50p}= | Evaluate | int(${rate_per_stream}*0.5)
+| | ${lat_50p}= | Measure latency pps | ${duration} | ${rate_50p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 50%NDR | ${lat_50p}
+| | Append To List | ${latency} | ${tmp}
+| | ${rate_10p}= | Evaluate | int(${rate_per_stream}*0.1)
+| | ${lat_10p}= | Measure latency pps | ${duration} | ${rate_10p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 10%NDR | ${lat_10p}
+| | Append To List | ${latency} | ${tmp}
+| | Display result of NDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${latency}
+| | Traffic should pass with no loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type} | fail_on_loss=${False}
+
+| Find PDR using binary search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 binary search with partial drop rate
+| | ... | with PDR threshold and type specified by parameter.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - binary_min - Lower boundary of search [pps]. Type: float
+| | ... | - binary_max - Upper boundary of search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ... | - threshold - Threshold to stop search [pps]. Type: integer
+| | ... | - loss_acceptance - Accepted loss during search. Type: float
+| | ... | - loss_acceptance_type - Percentage or frames. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find PDR using binary search and pps \| 64 \| 6000000 \
+| | ... | \| 12000000 \| 3-node-IPv4 \| 100000 \| 14880952 \| 50000 \| 0.5 \
+| | ... | \| percentage \|
+| | ...
+| | [Arguments] | ${framesize} | ${binary_min} | ${binary_max}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${loss_acceptance}=0 | ${loss_acceptance_type}='frames'
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Set Loss Acceptance | ${loss_acceptance}
+| | Run Keyword If | '${loss_acceptance_type}' == 'percentage'
+| | ... | Set Loss Acceptance Type Percentage
+| | Set Binary Convergence Threshold | ${threshold}
+| | Binary Search | ${binary_min} | ${binary_max} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%PDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | Display result of PDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${loss_acceptance} | ${loss_acceptance_type} | ${latency}
+| | Traffic should pass with partial loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type} | ${loss_acceptance}
+| | ... | ${loss_acceptance_type} | fail_on_loss=${False}
+
+| Find NDR using combined search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 combined search (linear+binary) with
+| | ... | non drop rate.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - start_rate - Initial start rate [pps]. Type: float
+| | ... | - step_rate - Step of linear search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ... | - threshold - Threshold to stop search [pps]. Type: integer
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find NDR using combined search and pps \| 64 \| 5000000 \
+| | ... | \| 100000 \| 3-node-IPv4 \| 100000 \| 14880952 \| 5000 \|
+| | ...
+| | [Arguments] | ${framesize} | ${start_rate} | ${step_rate}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate} | ${threshold}
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Linear Step | ${step_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Set Binary Convergence Threshold | ${threshold}
+| | Combined Search | ${start_rate} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%NDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | ${rate_50p}= | Evaluate | int(${rate_per_stream}*0.5)
+| | ${lat_50p}= | Measure latency pps | ${duration} | ${rate_50p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 50%NDR | ${lat_50p}
+| | Append To List | ${latency} | ${tmp}
+| | ${rate_10p}= | Evaluate | int(${rate_per_stream}*0.1)
+| | ${lat_10p}= | Measure latency pps | ${duration} | ${rate_10p}
+| | ... | ${framesize} | ${topology_type}
+| | ${tmp}= | Create List | 10%NDR | ${lat_10p}
+| | Append To List | ${latency} | ${tmp}
+| | Display result of NDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${latency}
+| | Traffic should pass with no loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type}
+| | ... | fail_on_loss=${False}
+
+| Find PDR using combined search and pps
+| | [Documentation]
+| | ... | Find throughput by using RFC2544 combined search (linear+binary) with
+| | ... | partial drop rate with PDR threshold and type specified by parameter.
+| | ...
+| | ... | *Arguments:*
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - start_rate - Initial start rate [pps]. Type: float
+| | ... | - step_rate - Step of linear search [pps]. Type: float
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - min_rate - Lower limit of search [pps]. Type: float
+| | ... | - max_rate - Upper limit of search [pps]. Type: float
+| | ... | - threshold - Threshold to stop search [pps]. Type: integer
+| | ... | - loss_acceptance - Accepted loss during search. Type: float
+| | ... | - loss_acceptance_type - Percentage or frames. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Find PDR using combined search and pps \| 64 \| 5000000 \
+| | ... | \| 100000 \| 3-node-IPv4 \| 100000 \| 14880952 \| 5000 \| 0.5 \
+| | ... | \| percentage \|
+| | ...
+| | [Arguments] | ${framesize} | ${start_rate} | ${step_rate}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate} | ${threshold}
+| | ... | ${loss_acceptance}=0 | ${loss_acceptance_type}='frames'
+| | ...
+| | ${duration}= | Set Variable | ${perf_trial_duration}
+| | Set Duration | ${duration}
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Linear Step | ${step_rate}
+| | Set Search Frame Size | ${framesize}
+| | Set Search Rate Type pps
+| | Set Loss Acceptance | ${loss_acceptance}
+| | Run Keyword If | '${loss_acceptance_type}' == 'percentage'
+| | ... | Set Loss Acceptance Type Percentage
+| | Set Binary Convergence Threshold | ${threshold}
+| | Combined Search | ${start_rate} | ${topology_type}
+| | ${rate_per_stream} | ${lat}= | Verify Search Result
+| | ${tmp}= | Create List | 100%PDR | ${lat}
+| | ${latency}= | Create List | ${tmp}
+| | Display result of PDR search | ${rate_per_stream} | ${framesize} | 2
+| | ... | ${loss_acceptance} | ${loss_acceptance_type} | ${latency}
+| | Traffic should pass with partial loss | ${duration} | ${rate_per_stream}pps
+| | ... | ${framesize} | ${topology_type} | ${loss_acceptance}
+| | ... | ${loss_acceptance_type} | fail_on_loss=${False}
+
+| Display result of NDR search
+| | [Documentation]
+| | ... | Display result of NDR search in packet per seconds (total and per
+| | ... | stream) and Gbps total bandwidth with untagged packet.
+| | ... | Througput is calculated as:
+| | ... | Measured rate per stream * Total number of streams
+| | ... | Bandwidth is calculated as:
+| | ... | (Througput * (L2 Frame Size + IPG) * 8) / Max bitrate of NIC
+| | ...
+| | ... | *Arguments:*
+| | ... | - rate_per_stream - Measured rate per stream [pps]. Type: string
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - nr_streams - Total number of streams. Type: integer
+| | ... | - latency - Latency stats. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Display result of NDR search \| 4400000 \| 64 \| 2 \
+| | ... | \| [100%NDR, [10/10/10, 1/2/3]] \|
+| | ...
+| | [Arguments] | ${rate_per_stream} | ${framesize} | ${nr_streams} | ${latency}
+| | ...
+| | ${framesize}= | Get Frame Size | ${framesize}
+| | ${rate_total}= | Evaluate | ${rate_per_stream}*${nr_streams}
+| | ${bandwidth_total}= | Evaluate | ${rate_total}*(${framesize}+20)*8/(10**9)
+| | Set Test Message | FINAL_RATE: ${rate_total} pps
+| | Set Test Message | (${nr_streams}x ${rate_per_stream} pps) | append=yes
+| | Set Test Message | ${\n}FINAL_BANDWIDTH: ${bandwidth_total} Gbps (untagged)
+| | ... | append=yes
+| | Set Test Message | ${\n}LATENCY usec [min/avg/max] | append=yes
+| | :FOR | ${lat} | IN | @{latency}
+| | | Set Test Message | ${\n}LAT_${lat[0]}: ${lat[1]} | append=yes
+
+| Display result of PDR search
+| | [Documentation]
+| | ... | Display result of PDR search in packet per seconds (total and per
+| | ... | stream) and Gbps total bandwidth with untagged packet.
+| | ... | Througput is calculated as:
+| | ... | Measured rate per stream * Total number of streams
+| | ... | Bandwidth is calculated as:
+| | ... | (Througput * (L2 Frame Size + IPG) * 8) / Max bitrate of NIC
+| | ...
+| | ... | *Arguments:*
+| | ... | - rate_per_stream - Measured rate per stream [pps]. Type: string
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - nr_streams - Total number of streams. Type: integer
+| | ... | - loss_acceptance - Accepted loss during search. Type: float
+| | ... | - loss_acceptance_type - Percentage or frames. Type: string
+| | ... | - latency - Latency stats. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Display result of PDR search \| 4400000 \| 64 \| 2 \| 0.5 \
+| | ... | \| percentage \| [100%NDR, [10/10/10, 1/2/3]] \|
+| | ...
+| | [Arguments] | ${rate_per_stream} | ${framesize} | ${nr_streams}
+| | ... | ${loss_acceptance} | ${loss_acceptance_type} | ${latency}
+| | ...
+| | ${framesize}= | Get Frame Size | ${framesize}
+| | ${rate_total}= | Evaluate | ${rate_per_stream}*${nr_streams}
+| | ${bandwidth_total}= | Evaluate | ${rate_total}*(${framesize}+20)*8/(10**9)
+| | Set Test Message | FINAL_RATE: ${rate_total} pps
+| | Set Test Message | (${nr_streams}x ${rate_per_stream} pps) | append=yes
+| | Set Test Message | ${\n}FINAL_BANDWIDTH: ${bandwidth_total} Gbps (untagged)
+| | ... | append=yes
+| | Set Test Message | ${\n}LATENCY usec [min/avg/max] | append=yes
+| | :FOR | ${lat} | IN | @{latency}
+| | | Set Test Message | ${\n}LAT_${lat[0]}: ${lat[1]} | append=yes
+| | Set Test Message
+| | ... | ${\n}LOSS_ACCEPTANCE: ${loss_acceptance} ${loss_acceptance_type}
+| | ... | append=yes
+
+| Measure latency pps
+| | [Documentation]
+| | ... | Send traffic at specified rate. Measure min/avg/max latency
+| | ...
+| | ... | *Arguments:*
+| | ... | - duration - Duration of traffic run [s]. Type: integer
+| | ... | - rate - Rate for sending packets. Type: integer
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - topology_type - Topology type. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Measure latency \| 10 \| 4.0 \| 64 \| 3-node-IPv4 \|
+| | ...
+| | [Arguments] | ${duration} | ${rate} | ${framesize} | ${topology_type}
+| | ...
+| | Return From Keyword If | ${rate} <= 10000 | ${-1}
+| | ${ret}= | Is DPDK performance test
+| | 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
+| | Run keyword and return | Get latency
+
+| Traffic should pass with no loss
+| | [Documentation]
+| | ... | Send traffic at specified rate. No packet loss is accepted at loss
+| | ... | evaluation.
+| | ...
+| | ... | *Arguments:*
+| | ... | - duration - Duration of traffic run [s]. Type: integer
+| | ... | - rate - Rate for sending packets. Type: string
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - fail_on_loss - If True, the keyword fails if loss occurred.
+| | ... | Type: boolean
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Traffic should pass with no loss \| 10 \| 4.0mpps \| 64 \
+| | ... | \| 3-node-IPv4 \|
+| | ...
+| | [Arguments] | ${duration} | ${rate} | ${framesize} | ${topology_type}
+| | ... | ${fail_on_loss}=${True}
+| | ...
+| | 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
+| | Send traffic on tg | ${duration} | ${rate} | ${framesize}
+| | ... | ${topology_type} | warmup_time=0
+| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs
+| | Run Keyword If | ${fail_on_loss} | No traffic loss occurred
+
+| Traffic should pass with partial loss
+| | [Documentation]
+| | ... | Send traffic at specified rate. Partial packet loss is accepted
+| | ... | within loss acceptance value specified as argument.
+| | ...
+| | ... | *Arguments:*
+| | ... | - duration - Duration of traffic run [s]. Type: integer
+| | ... | - rate - Rate for sending packets. Type: string
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - topology_type - Topology type. Type: string
+| | ... | - loss_acceptance - Accepted loss during search. Type: float
+| | ... | - loss_acceptance_type - Percentage or frames. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Traffic should pass with partial loss \| 10 \| 4.0mpps \| 64 \
+| | ... | \| 3-node-IPv4 \| 0.5 \| percentage \|
+| | ...
+| | [Arguments] | ${duration} | ${rate} | ${framesize} | ${topology_type}
+| | ... | ${loss_acceptance} | ${loss_acceptance_type}
+| | ... | ${fail_on_loss}=${True}
+| | ...
+| | 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
+| | Send traffic on tg | ${duration} | ${rate} | ${framesize}
+| | ... | ${topology_type} | warmup_time=0
+| | Run Keyword If | ${ret}==${FALSE} | Show statistics on all DUTs
+| | Run Keyword If | ${fail_on_loss} | Partial traffic loss accepted
+| | ... | ${loss_acceptance} | ${loss_acceptance_type}
+
+| Clear and show runtime counters with running traffic
+| | [Documentation]
+| | ... | Start traffic at specified rate then clear runtime counters on all
+| | ... | DUTs. Wait for specified amount of time and capture runtime counters
+| | ... | on all DUTs. Finally stop traffic
+| | ...
+| | ... | *Arguments:*
+| | ... | - duration - Duration of traffic run [s]. Type: integer
+| | ... | - rate - Rate for sending packets. Type: string
+| | ... | - framesize - L2 Frame Size [B]. Type: integer
+| | ... | - topology_type - Topology type. Type: string