aboutsummaryrefslogtreecommitdiffstats
path: root/dpdk-tests
diff options
context:
space:
mode:
Diffstat (limited to 'dpdk-tests')
-rwxr-xr-xdpdk-tests/dpdk_scripts/cleanup_dpdk.sh39
-rwxr-xr-xdpdk-tests/dpdk_scripts/init_dpdk.sh17
-rwxr-xr-xdpdk-tests/dpdk_scripts/install_dpdk.sh49
-rwxr-xr-xdpdk-tests/dpdk_scripts/run_l2fwd.sh48
-rw-r--r--dpdk-tests/perf/10ge2p1x520-eth-l2xcbase-ndrdisc.robot399
-rw-r--r--dpdk-tests/perf/__init__.robot18
6 files changed, 570 insertions, 0 deletions
diff --git a/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh b/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh
new file mode 100755
index 0000000000..8ab9c6f676
--- /dev/null
+++ b/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+ROOTDIR=/tmp/openvpp-testing
+PWDDIR=$(pwd)
+
+TESTPMD_LOG=/tmp/testpmd.log
+TESTPMD_PID=/tmp/testpmd.pid
+
+port1_driver=$1
+port1_pci=$2
+port2_driver=$3
+port2_pci=$4
+
+#kill the dpdk application
+sudo pkill testpmd
+sudo pkill l2fwd
+sudo pkill l3fwd
+sudo rm -f ${TESTPMD_PID}
+sudo rm -f /dev/hugepages/*
+cat ${TESTPMD_LOG}
+
+sleep 2
+
+cd ${ROOTDIR}/dpdk-16.07/
+./tools/dpdk-devbind.py -b ${port1_driver} ${port1_pci}
+./tools/dpdk-devbind.py -b ${port2_driver} ${port2_pci}
+
+sleep 2
+
+if1_name=`./tools/dpdk-devbind.py --s | grep "${port1_pci}" | sed -n 's/.*if=\(\S\)/\1/p' | awk -F' ' '{print $1}'`
+if2_name=`./tools/dpdk-devbind.py --s | grep "${port2_pci}" | sed -n 's/.*if=\(\S\)/\1/p' | awk -F' ' '{print $1}'`
+
+ifconfig ${if1_name} up
+ifconfig ${if2_name} up
+
+rmmod igb_uio
+rmmod uio
+
+cd ${PWDDIR}
diff --git a/dpdk-tests/dpdk_scripts/init_dpdk.sh b/dpdk-tests/dpdk_scripts/init_dpdk.sh
new file mode 100755
index 0000000000..b0bd426021
--- /dev/null
+++ b/dpdk-tests/dpdk_scripts/init_dpdk.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+ROOTDIR=/tmp/openvpp-testing
+PWDDIR=$(pwd)
+
+cd ${ROOTDIR}/dpdk-16.07/
+modprobe uio
+lsmod | grep igb_uio
+if [ $? -eq 1 ];
+then
+ insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko || exit 1
+else
+ rmmod igb_uio
+ insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko || exit 1
+fi
+./tools/dpdk-devbind.py -b igb_uio $1 $2
+cd ${PWDDIR}
diff --git a/dpdk-tests/dpdk_scripts/install_dpdk.sh b/dpdk-tests/dpdk_scripts/install_dpdk.sh
new file mode 100755
index 0000000000..99fa957d59
--- /dev/null
+++ b/dpdk-tests/dpdk_scripts/install_dpdk.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+DPDK_VERSION=16.07
+DPDK_DIR=dpdk-${DPDK_VERSION}
+DPDK_PACKAGE=${DPDK_DIR}.tar.xz
+
+ROOTDIR=/tmp/openvpp-testing
+PWDDIR=$(pwd)
+
+#download the DPDK package
+#compile and install the DPDK
+cd ${ROOTDIR}
+wget -q "fast.dpdk.org/rel/${DPDK_PACKAGE}" || exit 1
+tar xJf ${DPDK_PACKAGE}
+cd ./${DPDK_DIR}
+make install T=x86_64-native-linuxapp-gcc -j || exit 1
+cd ${PWDDIR}
+
+#compile the l3fwd
+export RTE_SDK=${ROOTDIR}/${DPDK_DIR}/
+export RTE_TARGET=x86_64-native-linuxapp-gcc
+cd ${RTE_SDK}/examples/l3fwd
+make -j || exit 1
+cd ${PWDDIR}
+
+#check and setup the hugepages
+SYS_HUGEPAGE=$(cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages)
+if [ ${SYS_HUGEPAGE} -lt 4096 ]; then
+ MOUNT=$(mount | grep /mnt/huge)
+ while [ "${MOUNT}" != "" ]
+ do
+ sudo umount /mnt/huge
+ sleep 1
+ MOUNT=$(mount | grep /mnt/huge)
+ done
+
+ echo 2048 | sudo tee /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
+ echo 2048 | sudo tee /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
+
+ sudo mkdir -p /mnt/huge
+ sudo mount -t hugetlbfs nodev /mnt/huge/
+ test $? -eq 0 || exit 1
+fi
+
+#check and set the max map count
+SYS_MAP=$(cat /proc/sys/vm/max_map_count)
+if [ ${SYS_MAP} -lt 200000 ]; then
+ echo 200000 | sudo tee /proc/sys/vm/max_map_count
+fi
diff --git a/dpdk-tests/dpdk_scripts/run_l2fwd.sh b/dpdk-tests/dpdk_scripts/run_l2fwd.sh
new file mode 100755
index 0000000000..6df33a1317
--- /dev/null
+++ b/dpdk-tests/dpdk_scripts/run_l2fwd.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+ROOTDIR=/tmp/openvpp-testing
+PWDDIR=$(pwd)
+
+TESTPMD_LOG=/tmp/testpmd.log
+TESTPMD_PID=/tmp/testpmd.pid
+
+cpu_coremask=$1
+nb_cores=$2
+queue_nums=$3
+jumbo_frames=$4
+
+#kill the testpmd
+sudo pkill testpmd
+sudo rm -f ${TESTPMD_PID}
+
+sleep 2
+
+pid=`pgrep testpmd`
+if [ "$pid" != "" ]; then
+ echo "terminate the testpmd failed!"
+ exit 1
+fi
+
+#run the testpmd
+cd ${ROOTDIR}
+if [ "$jumbo_frames" = "yes" ]; then
+#sudo sh -c "screen -dmS DPDK-test ./dpdk-16.07/x86_64-native-linuxapp-gcc/app/testpmd -c ${cpu_coremask} \
+# -n 4 -- --nb-ports=2 --portmask=0x3 --nb-cores=${nb_cores} \
+# --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=${queue_nums} \
+# --txq=${queue_nums} --auto-start"
+tail -f /dev/null | nohup ./dpdk-16.07/x86_64-native-linuxapp-gcc/app/testpmd -c ${cpu_coremask} \
+ -n 4 -- --nb-ports=2 --portmask=0x3 --nb-cores=${nb_cores} \
+ --max-pkt-len=9000 --txqflags=0 --forward-mode=io --rxq=${queue_nums} \
+ --txq=${queue_nums} --auto-start > ${TESTPMD_LOG} 2>&1 &
+echo $! > ${TESTPMD_PID}
+else
+#sudo sh -c "screen -dmS DPDK-test ./dpdk-16.07/x86_64-native-linuxapp-gcc/app/testpmd -c ${cpu_coremask} \
+# -n 4 -- --nb-ports=2 --portmask=0x3 --nb-cores=${nb_cores} \
+# --forward-mode=io --rxq=${queue_nums} --txq=${queue_nums} --auto-start"
+tail -f /dev/null | nohup ./dpdk-16.07/x86_64-native-linuxapp-gcc/app/testpmd -c ${cpu_coremask} \
+ -n 4 -- --nb-ports=2 --portmask=0x3 --nb-cores=${nb_cores} \
+ --forward-mode=io --rxq=${queue_nums} --txq=${queue_nums} --auto-start > ${TESTPMD_LOG} 2>&1 &
+echo $! > ${TESTPMD_PID}
+fi
+
+cd ${PWDDIR}
diff --git a/dpdk-tests/perf/10ge2p1x520-eth-l2xcbase-ndrdisc.robot b/dpdk-tests/perf/10ge2p1x520-eth-l2xcbase-ndrdisc.robot
new file mode 100644
index 0000000000..44c4472663
--- /dev/null
+++ b/dpdk-tests/perf/10ge2p1x520-eth-l2xcbase-ndrdisc.robot
@@ -0,0 +1,399 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/performance.robot
+| Resource | resources/libraries/robot/DPDK/default.robot
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.NodePath
+| Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.DPDK.DPDKTools
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | PERFTEST | NDRPDRDISC | 1NUMA
+| ... | NIC_Intel-X520-DA2 | DPDK | ETH | L2XCFWD | BASE
+| Suite Setup | DPDK 3-node Performance Suite Setup with DUT's NIC model
+| ... | L2 | Intel-X520-DA2
+| Suite Teardown | DPDK 3-node Performance Suite Teardown
+| Documentation | *RFC2544: Pkt throughput IPv4 routing test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology\
+| ... | with single links between nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 frame forwarding.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 run the DPDK testpmd\
+| ... | application and use the io forwarding mode. DUT1 and DUT2 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, IPv4 header with IP protocol=61 and static\
+| ... | payload. MAC addresses are matching MAC addresses of the TG node\
+| ... | interfaces.
+| ... | *[Ref] Applicable standard specifications:* RFC2544.
+
+*** Variables ***
+#X520-DA2 bandwidth limit
+| ${s_limit} | ${10000000000}
+
+*** Test Cases ***
+| TC01: 64B NDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC02: 64B PDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 100kpps, LT=0.5%.
+| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC03: 1518B NDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps.
+| | [Tags] | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC04: 1518B PDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps, LT=0.5%.
+| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC05: 9000B NDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 1T1C | STHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'yes'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC06: 9000B PDR binary search - DUT l2fwd - 1thread 1core 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 1 thread, 1 phy core,\
+| | ... | 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte frames\
+| | ... | using binary search start at 10GE linerate, step 10kpps, LT=0.5%.
+| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '1' worker threads and rxqueues '1' with jumbo frames 'yes'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC07: 64B NDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port. [Ver] Find NDR for 64 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 2T2C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC08: 64B PDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port. [Ver] Find PDR for 64 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 100kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC09: 1518B NDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps.
+| | [Tags] | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC10: 1518B PDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC11: 9000B NDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port. [Ver] Find NDR for 9000 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 2T2C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'yes'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC12: 9000B PDR binary search - DUT l2fwd - 2threads 2cores 1rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 2 threads, 2 phy\
+| | ... | cores, 1 receive queue per NIC port. [Ver] Find PDR for 9000 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 10kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '2' worker threads and rxqueues '1' with jumbo frames 'yes'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC13: 64B NDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port. [Ver] Find NDR for 64 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 100kpps.
+| | [Tags] | 4T4C | MTHREAD | NDRDISC
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC14: 64B PDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port. [Ver] Find PDR for 64 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 100kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${64}
+| | ${min_rate}= | Set Variable | ${100000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC15: 1518B NDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps.
+| | [Tags] | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'no'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC16: 1518B PDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding 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 10kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${1518}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'no'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
+
+| TC17: 9000B NDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port. [Ver] Find NDR for 9000 Byte\
+| | ... | frames using binary search start at 10GE linerate, step 10kpps.
+| | [Tags] | 4T4C | MTHREAD | NDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'yes'
+| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| TC18: 9000B PDR binary search - DUT l2fwd - 4threads 4cores 2rxq
+| | [Documentation]
+| | ... | [Cfg] DUT runs L2 frame forwarding config with 4 threads, 4 phy\
+| | ... | cores, 2 receive queues per NIC port. [Ver] Find PDR for 9000 Byte
+| | ... | frames using binary search start at 10GE linerate, step 5kpps,\
+| | ... | LT=0.5%.
+| | [Tags] | 4T4C | MTHREAD | PDRDISC | SKIP_PATCH
+| | ${framesize}= | Set Variable | ${9000}
+| | ${min_rate}= | Set Variable | ${10000}
+| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize}
+| | ${binary_min}= | Set Variable | ${min_rate}
+| | ${binary_max}= | Set Variable | ${max_rate}
+| | ${threshold}= | Set Variable | ${min_rate}
+| | Given Start L2FWD '4' worker threads and rxqueues '2' with jumbo frames 'yes'
+| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
+| | ... | ${binary_max} | 3-node-bridge
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${glob_loss_acceptance}
+| | ... | ${glob_loss_acceptance_type}
diff --git a/dpdk-tests/perf/__init__.robot b/dpdk-tests/perf/__init__.robot
new file mode 100644
index 0000000000..6358151fcb
--- /dev/null
+++ b/dpdk-tests/perf/__init__.robot
@@ -0,0 +1,18 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/interfaces.robot
+| Library | resources.libraries.python.DPDK.SetupDPDKTest
+| Suite Setup | Run Keyword | Setup DPDK Test | ${nodes}