*** Settings ***
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/bridge_domain.robot
+| Resource | resources/libraries/robot/testing_path.robot
| Resource | resources/libraries/robot/qemu.robot
| Library | resources.libraries.python.Trace
| Force Tags | HW_ENV | VM_ENV
| Test Teardown | Show Packet Trace on All DUTs | ${nodes}
| Documentation | *Bridge domain test suite.*
| ...
-| ... | Test suite uses 2-node topology TGTG - DUT1 - TG with two links
+| ... | Test suite uses 2-node topology TG - DUT1 - TG with two links
| ... | between nodes as well as 3-node topology TG - DUT1 - DUT2 - TG
| ... | with one link between nodes. Test packets are sent in both directions
| ... | and contain Ethernet header, IPv4 header and ICMP message. Ethernet
*** Variables ***
| ${bd_id1}= | 1
| ${bd_id2}= | 2
+| ${shg1}= | 3
+| ${shg2}= | 4
| ${sock1}= | /tmp/sock1
| ${sock2}= | /tmp/sock2
| | ... | add there two interfaces and check traffic
| | ... | bidirectionally.
| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
-| | Given Path for 2-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | Given Path for 2-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Interfaces in 2-node path are up
| | When Bridge domain on DUT node is created | ${dut_node} | ${bd_id1}
| | And Interface is added to bridge domain | ${dut_node} | ${dut_to_tg_if1}
| | ... | ${bd_id1}
| | And Interface is added to bridge domain | ${dut_node} | ${dut_to_tg_if2}
| | ... | ${bd_id1}
-| | And Interfaces on all VPP nodes in the path are up | ${dut_node}
| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut_if1}
| | ... | ${tg_to_dut_if2}
| | ... | add two interfaces to each bridge domain and check traffic
| | ... | bidirectionally.
| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
-| | Given Path for 3-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
-| | ... | ${nodes['DUT2']}
+| | Given Path for 3-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Interfaces in 3-node path are up
| | When Bridge domain on DUT node is created | ${dut1_node} | ${bd_id1}
| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg}
| | ... | ${bd_id1}
| | ... | ${bd_id2}
| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_dut1}
| | ... | ${bd_id2}
-| | And Interfaces on all VPP nodes in the path are up | ${dut1_node}
-| | ... | ${dut2_node}
| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut1}
| | ... | ${tg_to_dut2}
| | ... | static L2FIB entry on each interface and check traffic
| | ... | bidirectionally.
| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
-| | Given Path for 3-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
-| | ... | ${nodes['DUT2']}
+| | Given Path for 3-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Interfaces in 3-node path are up
| | When Bridge domain on DUT node is created | ${dut1_node} | ${bd_id1}
| | ... | learn=${FALSE}
| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg}
| | ... | ${dut2_node}
| | ... | ${dut2_to_tg}
| | ... | ${bd_id2}
-| | And Interfaces on all VPP nodes in the path are up | ${dut1_node}
-| | ... | ${dut2_node}
| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut1}
| | ... | ${tg_to_dut2}
+| Vpp forwards packets via L2 bridge domain with split-horizon groups set in circular topology
+| | [Documentation] | Create bridge domains (learning enabled) on two VPP nodes,
+| | ... | add interfaces to each bridge domain where both interfaces
+| | ... | toward TG are in the same split-horizon group and check
+| | ... | traffic bidirectionally.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Path for 3-node BD-SHG testing is set | ${nodes['TG']}
+| | ... | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']}
+| | And Interfaces in 3-node BD-SHG testing are up
+| | When Bridge domain on DUT node is created | ${dut1_node} | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg_if1}
+| | ... | ${bd_id1} | ${shg1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg_if2}
+| | ... | ${bd_id1} | ${shg1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ... | ${bd_id1}
+| | And Bridge domain on DUT node is created | ${dut2_node} | ${bd_id2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_tg_if1}
+| | ... | ${bd_id2} | ${shg2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_tg_if2}
+| | ... | ${bd_id2} | ${shg2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ... | ${bd_id2}
+| | Then Send and receive ICMPv4 bidirectionally | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if1}
+| | And Send and receive ICMPv4 bidirectionally | ${tg_node}
+| | ... | ${tg_to_dut1_if1}
+| | ... | ${tg_to_dut2_if2}
+| | And Send and receive ICMPv4 bidirectionally | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if1}
+| | And Send and receive ICMPv4 bidirectionally | ${tg_node}
+| | ... | ${tg_to_dut1_if2}
+| | ... | ${tg_to_dut2_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send and receive ICMPv4 bidirectionally
+| | | ... | ${tg_node} | ${tg_to_dut1_if1}
+| | | ... | ${tg_to_dut1_if2}
+| | And Run Keyword And Expect Error | ICMP echo Rx timeout
+| | ... | Send and receive ICMPv4 bidirectionally
+| | | ... | ${tg_node} | ${tg_to_dut2_if1}
+| | | ... | ${tg_to_dut2_if2}
+
| VPP forwards packets through VM via two L2 bridge domains
| | [Documentation] | Setup and run VM connected to VPP via Vhost-User
| | ... | interfaces and check packet forwarding through VM via two
| | ... | L2 bridge domains with learning enabled.
| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
-| | Given Path for 2-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | Given Path for 2-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Interfaces in 2-node path are up
| | When VPP Vhost interfaces for L2BD forwarding are setup | ${dut_node}
| | ... | ${sock1}
| | ... | ${sock2}
| | ... | ${bd_id2}
| | And Interface is added to bridge domain | ${dut_node} | ${vhost_if2}
| | ... | ${bd_id2}
-| | And Interfaces on all VPP nodes in the path are up | ${dut_node}
| | And VM for Vhost L2BD forwarding is setup | ${dut_node} | ${sock1}
| | ... | ${sock2}
| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut_if1}
| | ... | L2 bridge domains with learning disabled (static L2BFIB
| | ... | entries).
| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
-| | Given Path for 2-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | Given Path for 2-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Interfaces in 2-node path are up
| | When VPP Vhost interfaces for L2BD forwarding are setup | ${dut_node}
| | ... | ${sock1}
| | ... | ${sock2}
| | ... | ${bd_id2}
| | And Interface is added to bridge domain | ${dut_node} | ${vhost_if2}
| | ... | ${bd_id2}
-| | And Interfaces on all VPP nodes in the path are up | ${dut_node}
| | And Destination port is added to L2FIB on DUT node | ${tg_node}
| | ... | ${tg_to_dut_if2}
| | ... | ${dut_node}