-| | TG interface "${nodes['TG']['interfaces']['port3']['name']}" can route to node "${nodes['TG']}" interface "${nodes['TG']['interfaces']['port5']['name']}" "2" hops away using IPv4
-| | Vpp dump stats table | ${nodes['DUT1']}
-| | Check ipv4 interface counter | ${nodes['DUT1']} | ${nodes['DUT1']['interfaces']['port1']['name']} | ${1}
-| | Check ipv4 interface counter | ${nodes['DUT1']} | ${nodes['DUT1']['interfaces']['port3']['name']} | ${1}
-| | Vpp dump stats table | ${nodes['DUT2']}
-| | Check ipv4 interface counter | ${nodes['DUT2']} | ${nodes['DUT2']['interfaces']['port3']['name']} | ${1}
-| | Check ipv4 interface counter | ${nodes['DUT2']} | ${nodes['DUT2']['interfaces']['port1']['name']} | ${1}
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO | VM_ENV
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | Compute Path
+| | ${src_port} | ${src_node}= | First Interface
+| | ${dst_port} | ${dst_node}= | Last Interface
+| | ${hops}= | Set Variable | ${2}
+| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
+| | ${port} | ${node}= | Next Interface
+| | ${port} | ${node}= | Next Interface
+| | ${exp_counter_val}= | Set Variable | ${1}
+| | Vpp dump stats table | ${node}
+| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
+| | ${port} | ${node}= | Next Interface
+| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
+| | ${port} | ${node}= | Next Interface
+| | Vpp dump stats table | ${node}
+| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
+| | ${port} | ${node}= | Next Interface
+| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
+
+| VPP can process ICMP echo request from min to 1500B packet size with 1B increment
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO | VM_ENV
+| | Ipv4 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']} | 0 | 1452 | 1
+
+| VPP can process ICMP echo request from 1500B to max packet size with 10B increment
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | [Documentation] | This test case cannot be run reliably on VM_ENV because
+| | ... | the virtual hosts can be connected using a bridge which
+| | ... | has its own MTU
+| | [Setup] | Setup MTU on TG based on MTU on DUT | ${nodes['TG']} | ${nodes['DUT1']}
+| | [Teardown] | Set default Ethernet MTU on all interfaces on node | ${nodes['TG']}
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
+| | Compute Path
+| | ${dut_port} | ${dut_node}= | Last Interface
+| | ${mtu}= | Get Interface MTU | ${dut_node} | ${dut_port}
+| | # ICMP payload size is frame size minus size of Ehternet header, FCS,
+| | # IPv4 header and ICMP header
+| | ${end_size}= | Evaluate | ${mtu} - 14 - 4 - 20 - 8
+| | Run Keyword If | ${mtu} > 1518
+| | ... | Ipv4 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | 1452 | ${end_size} | 10
+
+| VPP responds to ARP request
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO | VM_ENV
+| | Send ARP request and validate response | ${nodes['TG']} | ${nodes['DUT1']}