aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFangyin Hu <fangyinx.hu@intel.com>2016-12-23 02:30:04 -0800
committerPeter Mikus <pmikus@cisco.com>2017-05-28 18:33:33 +0000
commitafa3def247a11985b17f310e58b6f5fae16dc306 (patch)
tree7060edcebd1fb4f9f53a34222b3b0291e256dbd7
parente6ae349af548635360216827349cfc1e1ee29cd5 (diff)
Add the DPDK l3fwd performance test case.
fix some code style issue and rebase the code. change the DPDK l3fwd test case name and rebase the code. fix the pylint errors. change the DPDK version to 17.05 Rebase the code. Fix the l3fwd test code like the l2fwd. Fix the run l3fwd script issues. Rebase the code and review. Fix the l3fwd script issues. verify-perf-dpdk-long Change-Id: I5c5625ebcd5ff16f47fbee361789be3fece1ddbc Signed-off-by: Fangyin Hu <fangyinx.hu@intel.com>
-rwxr-xr-xdpdk-tests/dpdk_scripts/cleanup_dpdk.sh27
-rwxr-xr-xdpdk-tests/dpdk_scripts/run_l2fwd.sh27
-rwxr-xr-xdpdk-tests/dpdk_scripts/run_l3fwd.sh104
-rw-r--r--dpdk-tests/perf/10ge2p1x520-ethip4-ip4base-l3fwd-ndrpdrdisc.robot392
-rw-r--r--resources/libraries/python/DPDK/L3fwdTest.py103
-rw-r--r--resources/libraries/python/TrafficGenerator.py19
-rw-r--r--resources/libraries/robot/DPDK/default.robot43
7 files changed, 714 insertions, 1 deletions
diff --git a/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh b/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh
index 505a157d13..48e1a29b63 100755
--- a/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh
+++ b/dpdk-tests/dpdk_scripts/cleanup_dpdk.sh
@@ -41,6 +41,33 @@ else
echo "testpmd is not running"
fi
+#also kill the l3fwd
+sudo pgrep l3fwd
+if [ $? -eq "0" ]; then
+ success=false
+ sudo pkill l3fwd
+ echo "RC = $?"
+ for attempt in {1..5}; do
+ echo "Checking if l3fwd is still alive, attempt nr ${attempt}"
+ sudo pgrep l3fwd
+ if [ $? -eq "1" ]; then
+ echo "l3fwd is dead"
+ success=true
+ break
+ fi
+ echo "l3fwd is still alive, waiting 1 second"
+ sleep 1
+ done
+ if [ "$success" = false ]; then
+ echo "The command sudo pkill l3fwd failed"
+ sudo pkill -9 l3fwd
+ echo "RC = $?"
+ exit 1
+ fi
+else
+ echo "l3fwd is not running"
+fi
+
# Remove hugepages
sudo rm -f /dev/hugepages/*
diff --git a/dpdk-tests/dpdk_scripts/run_l2fwd.sh b/dpdk-tests/dpdk_scripts/run_l2fwd.sh
index 31dc26d728..20c41d6d6f 100755
--- a/dpdk-tests/dpdk_scripts/run_l2fwd.sh
+++ b/dpdk-tests/dpdk_scripts/run_l2fwd.sh
@@ -41,6 +41,33 @@ else
echo "testpmd is not running"
fi
+# Try to kill the l3fwd
+sudo pgrep l3fwd
+if [ $? -eq "0" ]; then
+ success=false
+ sudo pkill l3fwd
+ echo "RC = $?"
+ for attempt in {1..5}; do
+ echo "Checking if l3fwd is still alive, attempt nr ${attempt}"
+ sudo pgrep l3fwd
+ if [ $? -eq "1" ]; then
+ echo "l3fwd is dead"
+ success=true
+ break
+ fi
+ echo "l3fwd is still alive, waiting 1 second"
+ sleep 1
+ done
+ if [ "$success" = false ]; then
+ echo "The command sudo pkill l3fwd failed"
+ sudo pkill -9 l3fwd
+ echo "RC = $?"
+ exit 1
+ fi
+else
+ echo "l3fwd is not running"
+fi
+
# Remove hugepages
sudo rm -f /dev/hugepages/*
diff --git a/dpdk-tests/dpdk_scripts/run_l3fwd.sh b/dpdk-tests/dpdk_scripts/run_l3fwd.sh
new file mode 100755
index 0000000000..3363d71875
--- /dev/null
+++ b/dpdk-tests/dpdk_scripts/run_l3fwd.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+set -x
+
+# Setting variables
+DPDK_VERSION=dpdk-17.05
+ROOTDIR=/tmp/openvpp-testing
+L3FWDLOG=screenlog.0
+PWDDIR=$(pwd)
+
+cpu_corelist=$1
+port_config=$2
+adj_mac0=$3
+adj_mac1=$4
+jumbo_frames=$5
+
+SCRIPT_NAME=$(basename $0)
+
+# define a function to get the l3fwd PID
+function get_l3fwd_pid()
+{
+ pid_l3fwd=`sudo ps -elf | grep l3fwd | grep -v grep | grep -v SCREEN | grep -v ${SCRIPT_NAME} | awk '{print $4}'`
+ echo ${pid_l3fwd}
+}
+
+# Try to kill the l3fwd
+# Don't use the pgrep and pkill
+l3fwd_pid=`get_l3fwd_pid`
+echo ${l3fwd_pid}
+if [ ! -z ${l3fwd_pid} ]; then
+ success=false
+ sudo kill -15 ${l3fwd_pid}
+ echo "RC = $?"
+ for attempt in {1..5}; do
+ echo "Checking if l3fwd is still alive, attempt nr ${attempt}"
+ l3fwd_pid=`get_l3fwd_pid`
+ if [ -z ${l3fwd_pid} ]; then
+ echo "l3fwd is dead"
+ success=true
+ break
+ fi
+ echo "l3fwd is still alive, waiting 1 second"
+ sleep 1
+ done
+ if [ "$success" = false ]; then
+ echo "The command sudo kill -15 l3fwd failed"
+ sudo kill -9 ${l3fwd_pid}
+ echo "RC = $?"
+ exit 1
+ fi
+else
+ echo "l3fwd is not running"
+fi
+
+# Try to kill the testpmd
+sudo pgrep testpmd
+if [ $? -eq "0" ]; then
+ success=false
+ sudo pkill testpmd
+ echo "RC = $?"
+ for attempt in {1..5}; do
+ echo "Checking if testpmd is still alive, attempt nr ${attempt}"
+ sudo pgrep testpmd
+ if [ $? -eq "1" ]; then
+ echo "testpmd is dead"
+ success=true
+ break
+ fi
+ echo "testpmd is still alive, waiting 1 second"
+ sleep 1
+ done
+ if [ "$success" = false ]; then
+ echo "The command sudo pkill testpmd failed"
+ sudo pkill -9 testpmd
+ echo "RC = $?"
+ exit 1
+ fi
+else
+ echo "testpmd is not running"
+fi
+
+sudo rm -f /dev/hugepages/*
+
+sleep 2
+
+#run the l3fwd
+cd ${ROOTDIR}/${DPDK_VERSION}/
+rm -f ${L3FWDLOG}
+if [ "$jumbo_frames" = "yes" ]; then
+ sudo sh -c "screen -dmSL DPDK-test ./examples/l3fwd/build/app/l3fwd \
+ -l ${cpu_corelist} -n 4 -- -P -L -p 0x3 --config='${port_config}' \
+ --enable-jumbo --max-pkt-len=9000 --eth-dest=0,${adj_mac0} \
+ --eth-dest=1,${adj_mac1} --parse-ptype"
+else
+ sudo sh -c "screen -dmSL DPDK-test ./examples/l3fwd/build/app/l3fwd \
+ -l ${cpu_corelist} -n 4 -- -P -L -p 0x3 --config='${port_config}' \
+ --eth-dest=0,${adj_mac0} --eth-dest=1,${adj_mac1} --parse-ptype"
+fi
+
+sleep 10
+less -r ${L3FWDLOG}
+
+cd ${PWDDIR}
+
diff --git a/dpdk-tests/perf/10ge2p1x520-ethip4-ip4base-l3fwd-ndrpdrdisc.robot b/dpdk-tests/perf/10ge2p1x520-ethip4-ip4base-l3fwd-ndrpdrdisc.robot
new file mode 100644
index 0000000000..3d1167bf38
--- /dev/null
+++ b/dpdk-tests/perf/10ge2p1x520-ethip4-ip4base-l3fwd-ndrpdrdisc.robot
@@ -0,0 +1,392 @@
+# 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 | PERFTEST | HW_ENV | NDRPDRDISC | 1NUMA
+| ... | NIC_Intel-X520-DA2 | DPDK | IP4FWD | BASE | ETH
+| Suite Setup | DPDK 3-node Performance Suite Setup with DUT's NIC model
+| ... | L3 | 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 L3 IPv4 routing.
+| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 run the DPDK l3fwd application
+| ... | 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-1t1c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc02-64B-1t1c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc03-1518B-1t1c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc04-1518B-1t1c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc05-9000B-1t1c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 5kpps.
+| | [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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc06-9000B-1t1c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 5kpps, 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc07-64B-2t2c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc08-64B-2t2c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc09-1518B-2t2c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 10kpps.
+| | [Tags] | 2T2C | MTHREAD | 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc10-1518B-2t2c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc11-9000B-2t2c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 5kpps.
+| | [Tags] | 2T2C | MTHREAD | 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc12-9000B-2t2c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 5kpps, 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc13-64B-4t4c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc14-64B-4t4c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc15-1518B-4t4c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc16-1518B-4t4c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 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 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
+
+| tc17-9000B-4t4c-ethip4-ip4base-l3fwd-ndrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 5kpps.
+| | [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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+
+| tc18-9000B-4t4c-ethip4-ip4base-l3fwd-pdrdisc
+| | [Documentation]
+| | ... | [Cfg] DUT runs L3 IPv4 routing 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 L3FWD '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-IPv4-l3fwd
+| | ... | ${min_rate} | ${max_rate}
+| | ... | ${threshold}
+| | ... | ${perf_pdr_loss_acceptance}
+| | ... | ${perf_pdr_loss_acceptance_type}
diff --git a/resources/libraries/python/DPDK/L3fwdTest.py b/resources/libraries/python/DPDK/L3fwdTest.py
new file mode 100644
index 0000000000..6219a08e0c
--- /dev/null
+++ b/resources/libraries/python/DPDK/L3fwdTest.py
@@ -0,0 +1,103 @@
+# 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.
+
+
+"""
+This module exists to provide the l3fwd test for DPDK on topology nodes.
+"""
+
+from robot.api import logger
+
+from resources.libraries.python.ssh import SSH
+from resources.libraries.python.constants import Constants as con
+from resources.libraries.python.topology import Topology
+
+class L3fwdTest(object):
+ """Test the DPDK l3fwd performance."""
+
+ @staticmethod
+ def start_the_l3fwd_test(nodes_info, dut_node, dut_if1, dut_if2,
+ nb_cores, lcores_list, queue_nums, jumbo_frames):
+ """
+ Execute the l3fwd on the dut_node.
+
+ :param nodes_info: All the nodes info in the topology file.
+ :param dut_node: Will execute the l3fwd on this node
+ :param dut_if1: The test link interface 1.
+ :param dut_if2: The test link interface 2.
+ :param nb_cores: The cores number for the forwarding
+ :param lcores_list: The lcore list string for the l3fwd routing
+ :param queue_nums: The queues number for the NIC
+ :param jumbo_frames: Is jumbo frames or not. Accepted: yes / no
+ :type nodes_info: dict
+ :type dut_node: dict
+ :type dut_if1: str
+ :type dut_if2: str
+ :type nb_cores: str
+ :type lcores_list: str
+ :type queue_nums: str
+ :type jumbo_frames: str
+ :return: none
+ """
+
+ if_key0 = dut_if1
+ if_key1 = dut_if2
+ if_pci0 = Topology.get_interface_pci_addr(dut_node, if_key0)
+ if_pci1 = Topology.get_interface_pci_addr(dut_node, if_key1)
+
+ # detect which is the port 0
+ if min(if_pci0, if_pci1) != if_pci0:
+ if_key0, if_key1 = if_key1, if_key0
+ if_pci0, if_pci1 = if_pci1, if_pci0
+
+ adj_node0, adj_if_key0 = Topology.get_adjacent_node_and_interface( \
+ nodes_info, dut_node, if_key0)
+ adj_node1, adj_if_key1 = Topology.get_adjacent_node_and_interface( \
+ nodes_info, dut_node, if_key1)
+
+ adj_mac0 = Topology.get_interface_mac(adj_node0, adj_if_key0)
+ adj_mac1 = Topology.get_interface_mac(adj_node1, adj_if_key1)
+
+ list_cores = lcores_list.split(',')
+
+ # prepare the port config param
+ index = 0
+ port_config = ''
+ for port in range(0, 2):
+ for queue in range(0, int(queue_nums)):
+ if int(nb_cores) == 1:
+ index = 0
+ temp_str = '({0}, {1}, {2}),'.format(port, queue, \
+ int(list_cores[index]))
+ else:
+ temp_str = '({0}, {1}, {2}),'.format(port, queue, \
+ int(list_cores[index]))
+
+ port_config += temp_str
+ index = index + 1
+
+ port_config_param = port_config.rstrip(',')
+
+ ssh = SSH()
+ ssh.connect(dut_node)
+
+ cmd = 'cd {0}/dpdk-tests/dpdk_scripts/ && ./run_l3fwd.sh ' \
+ '"{1}" "{2}" {3} {4} {5}'.format(con.REMOTE_FW_DIR, lcores_list, \
+ port_config_param, adj_mac0, adj_mac1, jumbo_frames)
+
+ (ret_code, _, stderr) = ssh.exec_command(cmd, timeout=600)
+ if ret_code != 0:
+ logger.error('Execute the l3fwd error: {0}'.format(stderr))
+ raise Exception('Failed to execute l3fwd test at node {0}'
+ .format(dut_node['host']))
+
diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py
index c9cd971cf3..8fb9191063 100644
--- a/resources/libraries/python/TrafficGenerator.py
+++ b/resources/libraries/python/TrafficGenerator.py
@@ -709,7 +709,24 @@ class TrafficGenerator(object):
duration, rate, framesize,
_p0, _p1, _async, _latency,
warmup_time),
- timeout=int(duration) + 60)
+ timeout = int(duration) + 60)
+ elif traffic_type in ["3-node-IPv4-l3fwd"]:
+ # add for the DPDK l3fwd routing test
+ # please make sure the TG port 0 connect to the DUT port 0
+ (ret, stdout, stderr) = ssh.exec_command(
+ "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
+ "--duration={1} -r {2} -s {3} "
+ "--p{4}_dst_start_ip 2.1.1.2 "
+ "--p{4}_dst_end_ip 2.1.1.254 "
+ "--p{4}_src_start_ip 20.20.20.2 "
+ "--p{5}_dst_start_ip 1.1.1.2 "
+ "--p{5}_dst_end_ip 1.1.1.254 "
+ "--p{5}_src_start_ip 10.10.10.2 "
+ "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
+ duration, rate, framesize,
+ _p0, _p1, _async, _latency,
+ warmup_time),
+ timeout=int(duration)+60)
else:
raise NotImplementedError('Unsupported traffic type')
diff --git a/resources/libraries/robot/DPDK/default.robot b/resources/libraries/robot/DPDK/default.robot
index b15d48a1d4..070350a082 100644
--- a/resources/libraries/robot/DPDK/default.robot
+++ b/resources/libraries/robot/DPDK/default.robot
@@ -18,6 +18,7 @@
| Library | resources.libraries.python.DUTSetup
| Library | resources.libraries.python.TGSetup
| Library | resources.libraries.python.DPDK.L2fwdTest
+| Library | resources.libraries.python.DPDK.L3fwdTest
| Library | Collections
*** Keywords ***
@@ -65,3 +66,45 @@
| | ... | ${jumbo_frames}
| | Start the l2fwd test | ${dut2} | ${dut2_cpus} | ${nb_cores} | ${rxqueues}
| | ... | ${jumbo_frames}
+
+| Start L3FWD '${m}' worker threads and rxqueues '${n}' with jumbo frames '${b}'
+| | [Documentation] | Start the l3fwd with M worker threads without SMT
+| | ... | and rxqueues N and B(yes or no) jumbo frames in all DUTs.
+| | ${cpu_cnt}= | Convert To Integer | ${m}
+| | ${nb_cores}= | Convert to String | ${m}
+| | ${rxqueues}= | Convert to String | ${n}
+| | ${jumbo_frames}= | Convert to String | ${b}
+| | ${dut1_numa}= | Get interfaces numa node | ${dut1}
+| | ... | ${dut1_if1} | ${dut1_if2}
+| | ${dut2_numa}= | Get interfaces numa node | ${dut2}
+| | ... | ${dut2_if1} | ${dut2_if2}
+| | ${dut1_cpus}= | Cpu List Per Node Str | ${dut1} | ${dut1_numa}
+| | ... | cpu_cnt=${cpu_cnt}
+| | ${dut2_cpus}= | Cpu List Per Node Str | ${dut2} | ${dut2_numa}
+| | ... | cpu_cnt=${cpu_cnt}
+| | Start the l3fwd test | ${nodes} | ${dut1} | ${dut1_if1} | ${dut1_if2}
+| | ... | ${nb_cores} | ${dut1_cpus} | ${rxqueues} | ${jumbo_frames}
+| | Start the l3fwd test | ${nodes} | ${dut2} | ${dut2_if1} | ${dut2_if2}
+| | ... | ${nb_cores} | ${dut2_cpus} | ${rxqueues} | ${jumbo_frames}
+
+| Start L3FWD '${m}' worker threads using SMT and rxqueues '${n}' with jumbo frames '${b}'
+| | [Documentation] | Start the l3fwd with M worker threads with SMT
+| | ... | and rxqueues N and B(yes or no) jumbo frames in all DUTs.
+| | ${cpu_cnt}= | Convert To Integer | ${m}
+| | ${nb_cores_int}= | Evaluate | ${cpu_cnt}*2
+| | ${nb_cores}= | Convert to String | ${nb_cores_int}
+| | ${rxqueues}= | Convert to String | ${n}
+| | ${jumbo_frames}= | Convert to String | ${b}
+| | ${dut1_numa}= | Get interfaces numa node | ${dut1}
+| | ... | ${dut1_if1} | ${dut1_if2}
+| | ${dut2_numa}= | Get interfaces numa node | ${dut2}
+| | ... | ${dut2_if1} | ${dut2_if2}
+| | ${dut1_cpus}= | Cpu List Per Node Str | ${dut1} | ${dut1_numa}
+| | ... | cpu_cnt=${cpu_cnt} | smt_used=${True}
+| | ${dut2_cpus}= | Cpu List Per Node Str | ${dut2} | ${dut2_numa}
+| | ... | cpu_cnt=${cpu_cnt} | smt_used=${True}
+| | Start the l3fwd test | ${nodes} | ${dut1} | ${dut1_if1} | ${dut1_if2}
+| | ... | ${nb_cores} | ${dut1_cpus} | ${rxqueues} | ${jumbo_frames}
+| | Start the l3fwd test | ${nodes} | ${dut2} | ${dut2_if1} | ${dut2_if2}
+| | ... | ${nb_cores} | ${dut2_cpus} | ${rxqueues} | ${jumbo_frames}
+