| Library | OperatingSystem
| Library | String
| ...
-| Library | resources.libraries.python.CoreDumpUtil
+| Library | resources.libraries.python.Classify.Classify
| Library | resources.libraries.python.CpuUtils
+| Library | resources.libraries.python.CoreDumpUtil
+| Library | resources.libraries.python.Cop
| Library | resources.libraries.python.DUTSetup
| Library | resources.libraries.python.L2Util
| Library | resources.libraries.python.Namespaces
+| Library | resources.libraries.python.PapiHistory
| Library | resources.libraries.python.SchedUtils
| Library | resources.libraries.python.Tap
| Library | resources.libraries.python.TGSetup
-| Library | resources.libraries.python.PapiHistory
+| Library | resources.libraries.python.topology.Topology
+| Library | resources.libraries.python.Trace
| Library | resources.libraries.python.VppCounters
| Library | resources.libraries.python.VPPUtil
-| Library | resources.libraries.python.Trace
-| Library | resources.libraries.python.topology.Topology
| ...
| Resource | resources/libraries/robot/crypto/ipsec.robot
+| Resource | resources/libraries/robot/features/gbp.robot
+| Resource | resources/libraries/robot/features/policer.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Resource | resources/libraries/robot/ip/ip6.robot
+| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
+| Resource | resources/libraries/robot/l2/l2_patch.robot
+| Resource | resources/libraries/robot/l2/l2_xconnect.robot
+| Resource | resources/libraries/robot/l2/tagging.robot
+| Resource | resources/libraries/robot/overlay/srv6.robot
| Resource | resources/libraries/robot/performance/performance_configuration.robot
| Resource | resources/libraries/robot/performance/performance_limits.robot
| Resource | resources/libraries/robot/performance/performance_utils.robot
+| Resource | resources/libraries/robot/shared/counters.robot
+| Resource | resources/libraries/robot/shared/interfaces.robot
| Resource | resources/libraries/robot/shared/container.robot
-| Resource | resources/libraries/robot/shared/qemu.robot
| Resource | resources/libraries/robot/shared/suite_teardown.robot
| Resource | resources/libraries/robot/shared/suite_setup.robot
| Resource | resources/libraries/robot/shared/test_teardown.robot
| Resource | resources/libraries/robot/shared/test_setup.robot
| Resource | resources/libraries/robot/shared/traffic.robot
+| Resource | resources/libraries/robot/shared/vm.robot
*** Keywords ***
| Show Vpp Errors On All DUTs
| | | Run keyword | ${dut}.Add Unix CLI Listen
| | | Run keyword | ${dut}.Add Unix Nodaemon
| | | Run keyword | ${dut}.Add Unix Coredump
+| | | Run keyword | ${dut}.Add Socksvr
| | | Run keyword | ${dut}.Add DPDK No Tx Checksum Offload
| | | Run keyword | ${dut}.Add DPDK Log Level | debug
| | | Run keyword | ${dut}.Add DPDK Uio Driver
| | | ${cpu_main}= | Cpu list per node str | ${nodes['${dut}']} | ${numa}
| | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${CPU_CNT_MAIN}
| | | ${skip_cnt}= | Evaluate | ${CPU_CNT_SYSTEM} + ${CPU_CNT_MAIN}
-| | | ${cpu_wt}= | Cpu list per node str | ${nodes['${dut}']} | ${numa}
+| | | ${cpu_wt}= | Run keyword if | ${cpu_count_int} > 0 |
+| | | ... | Cpu list per node str | ${nodes['${dut}']} | ${numa}
| | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${cpu_count_int}
| | | ... | smt_used=${smt_used}
| | | ${thr_count_int}= | Run keyword if | ${smt_used}
| | | ${rxq_count_int}= | Run keyword if | ${rxq_count_int} == 0
| | | ... | Set variable | ${1}
| | | ... | ELSE | Set variable | ${rxq_count_int}
-| | | Run keyword | ${dut}.Add CPU Main Core | ${cpu_main}
-| | | Run keyword | ${dut}.Add CPU Corelist Workers | ${cpu_wt}
-| | | Run keyword | ${dut}.Add DPDK Dev Default RXQ | ${rxq_count_int}
+| | | Run keyword if | ${cpu_count_int} > 0
+| | | ... | ${dut}.Add CPU Main Core | ${cpu_main}
+| | | Run keyword if | ${cpu_count_int} > 0
+| | | ... | ${dut}.Add CPU Corelist Workers | ${cpu_wt}
+| | | Run keyword
+| | | ... | ${dut}.Add DPDK Dev Default RXQ | ${rxq_count_int}
# For now there is no way to easily predict the number of buffers. Statically
# doing maximum amount of buffers allowed by DPDK.
| | | Run keyword if | ${smt_used}
| | :FOR | ${dut} | IN | @{duts}
| | | Run keyword | ${dut}.Add DPDK Uio Driver | ${uio_driver}
+| Add VLAN strip offload switch off
+| | [Documentation]
+| | ... | Add VLAN Strip Offload switch off on all PCI devices.
+| | ...
+| | :FOR | ${dut} | IN | @{duts}
+| | | ${dut_str}= | Convert To Lowercase | ${dut}
+| | | ${if1_pci}= | Get Interface PCI Addr | ${nodes['${dut}']}
+| | | ... | ${${dut_str}_if1}
+| | | ${if2_pci}= | Get Interface PCI Addr | ${nodes['${dut}']}
+| | | ... | ${${dut_str}_if2}
+| | | Run keyword | ${dut}.Add DPDK Dev Parameter | ${if1_pci}
+| | | ... | vlan-strip-offload | off
+| | | Run keyword | ${dut}.Add DPDK Dev Parameter | ${if2_pci}
+| | | ... | vlan-strip-offload | off
+
+| Add VLAN strip offload switch off between DUTs in 3-node single link topology
+| | [Documentation]
+| | ... | Add VLAN Strip Offload switch off on PCI devices between DUTs to VPP
+| | ... | configuration file.
+| | ...
+| | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_pci}
+| | ... | vlan-strip-offload | off
+| | Run keyword | DUT2.Add DPDK Dev Parameter | ${dut2_if1_pci}
+| | ... | vlan-strip-offload | off
+
+| Add VLAN strip offload switch off between DUTs in 3-node double link topology
+| | [Documentation]
+| | ... | Add VLAN Strip Offload switch off on PCI devices between DUTs to VPP
+| | ... | configuration file
+| | ...
+| | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_1_pci}
+| | ... | vlan-strip-offload | off
+| | Run keyword | DUT1.Add DPDK Dev Parameter | ${dut1_if2_2_pci}
+| | ... | vlan-strip-offload | off
+| | Run keyword | DUT2.Add DPDK Dev Parameter | ${dut2_if1_1_pci}
+| | ... | vlan-strip-offload | off
+| | Run keyword | DUT2.Add DPDK Dev Parameter | ${dut2_if1_2_pci}
+| | ... | vlan-strip-offload | off
+
| Add NAT to all DUTs
| | [Documentation] | Add NAT configuration to all DUTs.
| | ...
| | ... | ${thr_count_int}
| Write startup configuration on all VPP DUTs
-| | [Documentation] | Write VPP startup configuration on all DUTs.
+| | [Documentation] | Write VPP startup configuration without restarting VPP.
| | ...
| | :FOR | ${dut} | IN | @{duts}
| | | Run keyword | ${dut}.Write Config
| | [Documentation] | Write VPP startup configuration and restart VPP on all
| | ... | DUTs.
| | ...
+| | ... | *Arguments:*
+| | ... | - with_trace - Enable packet trace after VPP restart Type: boolean
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Apply startup configuration on all VPP DUTs \| False \|
+| | ...
+| | [Arguments] | ${with_trace}=${False}
+| | ...
| | :FOR | ${dut} | IN | @{duts}
| | | Run keyword | ${dut}.Apply Config
| | Save VPP PIDs
| | Enable Coredump Limit VPP on All DUTs | ${nodes}
| | Update All Interface Data On All Nodes | ${nodes} | skip_tg=${True}
+| | Run keyword If | ${with_trace} | VPP Enable Traces On All Duts | ${nodes}
| Save VPP PIDs
| | [Documentation] | Get PIDs of VPP processes from all DUTs in topology and\