selftests: hsr: Check duplicates on HSR with VLAN

Previously the hsr_ping test only checked that all nodes in a VLAN are
reachable (using do_ping). Update the test to also check that there is no
packet loss and no duplicate packets by running the same tests for VLANs as
without VLANs (including using do_ping_long). This also adds tests for IPv6
over VLAN. To unify the test code, the topology without VLANs now uses IP
addresses from dead:beef:0::/64 to align with the 100.64.0.0/24 range for
IPv4. Error messages are updated across the board to make it easier to find
what actually failed.

Also update the VLAN test to only run in VLAN 2, as there is no need to
check if ping really works with VLAN IDs 2, 3, 4, and 5. This lowers the
number of long ping tests on VLANs to keep the overall test runtime in
bounds.

It's still necessary to bump the test timeout a bit, though: a ping long
tests takes 1sec, do_ping_tests performs 12 of them, do_link_problem_tests
6, and the VLAN tests again 12. With some buffer for setup and waiting and
for two protocol versions, 90sec timeout seems reasonable.

Signed-off-by: Felix Maurer <fmaurer@redhat.com>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://patch.msgid.link/e3ded0e2547b5f720524b62fabeb96debc579697.1770299429.git.fmaurer@redhat.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Felix Maurer 2026-02-05 14:57:29 +01:00 committed by Paolo Abeni
parent c01a6c700f
commit 776b64ba12
2 changed files with 68 additions and 118 deletions

View file

@ -27,31 +27,34 @@ while getopts "$optstring" option;do
esac
done
do_complete_ping_test()
do_ping_tests()
{
local netid="$1"
echo "INFO: Running ping tests."
echo "INFO: Initial validation ping."
# Each node has to be able each one.
do_ping "$ns1" 100.64.0.2
do_ping "$ns2" 100.64.0.1
do_ping "$ns3" 100.64.0.1
stop_if_error "Initial validation failed."
# Each node has to be able to reach each one.
do_ping "$ns1" "100.64.$netid.2"
do_ping "$ns1" "100.64.$netid.3"
do_ping "$ns2" "100.64.$netid.1"
do_ping "$ns2" "100.64.$netid.3"
do_ping "$ns3" "100.64.$netid.1"
do_ping "$ns3" "100.64.$netid.2"
stop_if_error "Initial validation failed on IPv4."
do_ping "$ns1" 100.64.0.3
do_ping "$ns2" 100.64.0.3
do_ping "$ns3" 100.64.0.2
do_ping "$ns1" dead:beef:1::2
do_ping "$ns1" dead:beef:1::3
do_ping "$ns2" dead:beef:1::1
do_ping "$ns2" dead:beef:1::2
do_ping "$ns3" dead:beef:1::1
do_ping "$ns3" dead:beef:1::2
stop_if_error "Initial validation failed."
do_ping "$ns1" "dead:beef:$netid::2"
do_ping "$ns1" "dead:beef:$netid::3"
do_ping "$ns2" "dead:beef:$netid::1"
do_ping "$ns2" "dead:beef:$netid::2"
do_ping "$ns3" "dead:beef:$netid::1"
do_ping "$ns3" "dead:beef:$netid::2"
stop_if_error "Initial validation failed on IPv6."
# Wait until supervisor all supervision frames have been processed and the node
# entries have been merged. Otherwise duplicate frames will be observed which is
# valid at this stage.
echo "INFO: Wait for node table entries to be merged."
WAIT=5
while [ ${WAIT} -gt 0 ]
do
@ -68,24 +71,28 @@ do_complete_ping_test()
sleep 1
echo "INFO: Longer ping test."
do_ping_long "$ns1" 100.64.0.2
do_ping_long "$ns1" dead:beef:1::2
do_ping_long "$ns1" 100.64.0.3
do_ping_long "$ns1" dead:beef:1::3
do_ping_long "$ns1" "100.64.$netid.2"
do_ping_long "$ns1" "dead:beef:$netid::2"
do_ping_long "$ns1" "100.64.$netid.3"
do_ping_long "$ns1" "dead:beef:$netid::3"
stop_if_error "Longer ping test failed (ns1)."
stop_if_error "Longer ping test failed."
do_ping_long "$ns2" "100.64.$netid.1"
do_ping_long "$ns2" "dead:beef:$netid::1"
do_ping_long "$ns2" "100.64.$netid.3"
do_ping_long "$ns2" "dead:beef:$netid::3"
stop_if_error "Longer ping test failed (ns2)."
do_ping_long "$ns2" 100.64.0.1
do_ping_long "$ns2" dead:beef:1::1
do_ping_long "$ns2" 100.64.0.3
do_ping_long "$ns2" dead:beef:1::2
stop_if_error "Longer ping test failed."
do_ping_long "$ns3" "100.64.$netid.1"
do_ping_long "$ns3" "dead:beef:$netid::1"
do_ping_long "$ns3" "100.64.$netid.2"
do_ping_long "$ns3" "dead:beef:$netid::2"
stop_if_error "Longer ping test failed (ns3)."
}
do_ping_long "$ns3" 100.64.0.1
do_ping_long "$ns3" dead:beef:1::1
do_ping_long "$ns3" 100.64.0.2
do_ping_long "$ns3" dead:beef:1::2
stop_if_error "Longer ping test failed."
do_link_problem_tests()
{
echo "INFO: Running link problem tests."
echo "INFO: Cutting one link."
do_ping_long "$ns1" 100.64.0.3 &
@ -104,26 +111,22 @@ do_complete_ping_test()
do_ping_long "$ns1" 100.64.0.2
do_ping_long "$ns1" 100.64.0.3
stop_if_error "Failed with delay and packetloss."
stop_if_error "Failed with delay and packetloss (ns1)."
do_ping_long "$ns2" 100.64.0.1
do_ping_long "$ns2" 100.64.0.3
stop_if_error "Failed with delay and packetloss."
stop_if_error "Failed with delay and packetloss (ns2)."
do_ping_long "$ns3" 100.64.0.1
do_ping_long "$ns3" 100.64.0.2
stop_if_error "Failed with delay and packetloss."
echo "INFO: All good."
stop_if_error "Failed with delay and packetloss (ns3)."
}
setup_hsr_interfaces()
{
local HSRv="$1"
echo "INFO: preparing interfaces for HSRv${HSRv}."
echo "INFO: Preparing interfaces for HSRv${HSRv}."
# Three HSR nodes. Each node has one link to each of its neighbour, two links in total.
#
# ns1eth1 ----- ns2eth1
@ -140,17 +143,20 @@ setup_hsr_interfaces()
ip link add ns3eth2 netns "$ns3" type veth peer name ns2eth2 netns "$ns2"
# HSRv0/1
ip -net "$ns1" link add name hsr1 type hsr slave1 ns1eth1 slave2 ns1eth2 supervision 45 version $HSRv proto 0
ip -net "$ns2" link add name hsr2 type hsr slave1 ns2eth1 slave2 ns2eth2 supervision 45 version $HSRv proto 0
ip -net "$ns3" link add name hsr3 type hsr slave1 ns3eth1 slave2 ns3eth2 supervision 45 version $HSRv proto 0
ip -net "$ns1" link add name hsr1 type hsr slave1 ns1eth1 \
slave2 ns1eth2 supervision 45 version "$HSRv" proto 0
ip -net "$ns2" link add name hsr2 type hsr slave1 ns2eth1 \
slave2 ns2eth2 supervision 45 version "$HSRv" proto 0
ip -net "$ns3" link add name hsr3 type hsr slave1 ns3eth1 \
slave2 ns3eth2 supervision 45 version "$HSRv" proto 0
# IP for HSR
ip -net "$ns1" addr add 100.64.0.1/24 dev hsr1
ip -net "$ns1" addr add dead:beef:1::1/64 dev hsr1 nodad
ip -net "$ns1" addr add dead:beef:0::1/64 dev hsr1 nodad
ip -net "$ns2" addr add 100.64.0.2/24 dev hsr2
ip -net "$ns2" addr add dead:beef:1::2/64 dev hsr2 nodad
ip -net "$ns2" addr add dead:beef:0::2/64 dev hsr2 nodad
ip -net "$ns3" addr add 100.64.0.3/24 dev hsr3
ip -net "$ns3" addr add dead:beef:1::3/64 dev hsr3 nodad
ip -net "$ns3" addr add dead:beef:0::3/64 dev hsr3 nodad
ip -net "$ns1" link set address 00:11:22:00:01:01 dev ns1eth1
ip -net "$ns1" link set address 00:11:22:00:01:02 dev ns1eth2
@ -177,85 +183,33 @@ setup_hsr_interfaces()
setup_vlan_interfaces() {
ip -net "$ns1" link add link hsr1 name hsr1.2 type vlan id 2
ip -net "$ns1" link add link hsr1 name hsr1.3 type vlan id 3
ip -net "$ns1" link add link hsr1 name hsr1.4 type vlan id 4
ip -net "$ns1" link add link hsr1 name hsr1.5 type vlan id 5
ip -net "$ns2" link add link hsr2 name hsr2.2 type vlan id 2
ip -net "$ns2" link add link hsr2 name hsr2.3 type vlan id 3
ip -net "$ns2" link add link hsr2 name hsr2.4 type vlan id 4
ip -net "$ns2" link add link hsr2 name hsr2.5 type vlan id 5
ip -net "$ns3" link add link hsr3 name hsr3.2 type vlan id 2
ip -net "$ns3" link add link hsr3 name hsr3.3 type vlan id 3
ip -net "$ns3" link add link hsr3 name hsr3.4 type vlan id 4
ip -net "$ns3" link add link hsr3 name hsr3.5 type vlan id 5
ip -net "$ns1" addr add 100.64.2.1/24 dev hsr1.2
ip -net "$ns1" addr add 100.64.3.1/24 dev hsr1.3
ip -net "$ns1" addr add 100.64.4.1/24 dev hsr1.4
ip -net "$ns1" addr add 100.64.5.1/24 dev hsr1.5
ip -net "$ns1" addr add dead:beef:2::1/64 dev hsr1.2 nodad
ip -net "$ns2" addr add 100.64.2.2/24 dev hsr2.2
ip -net "$ns2" addr add 100.64.3.2/24 dev hsr2.3
ip -net "$ns2" addr add 100.64.4.2/24 dev hsr2.4
ip -net "$ns2" addr add 100.64.5.2/24 dev hsr2.5
ip -net "$ns2" addr add dead:beef:2::2/64 dev hsr2.2 nodad
ip -net "$ns3" addr add 100.64.2.3/24 dev hsr3.2
ip -net "$ns3" addr add 100.64.3.3/24 dev hsr3.3
ip -net "$ns3" addr add 100.64.4.3/24 dev hsr3.4
ip -net "$ns3" addr add 100.64.5.3/24 dev hsr3.5
ip -net "$ns3" addr add dead:beef:2::3/64 dev hsr3.2 nodad
ip -net "$ns1" link set dev hsr1.2 up
ip -net "$ns1" link set dev hsr1.3 up
ip -net "$ns1" link set dev hsr1.4 up
ip -net "$ns1" link set dev hsr1.5 up
ip -net "$ns2" link set dev hsr2.2 up
ip -net "$ns2" link set dev hsr2.3 up
ip -net "$ns2" link set dev hsr2.4 up
ip -net "$ns2" link set dev hsr2.5 up
ip -net "$ns3" link set dev hsr3.2 up
ip -net "$ns3" link set dev hsr3.3 up
ip -net "$ns3" link set dev hsr3.4 up
ip -net "$ns3" link set dev hsr3.5 up
}
hsr_vlan_ping() {
do_ping "$ns1" 100.64.2.2
do_ping "$ns1" 100.64.3.2
do_ping "$ns1" 100.64.4.2
do_ping "$ns1" 100.64.5.2
do_ping "$ns1" 100.64.2.3
do_ping "$ns1" 100.64.3.3
do_ping "$ns1" 100.64.4.3
do_ping "$ns1" 100.64.5.3
do_ping "$ns2" 100.64.2.1
do_ping "$ns2" 100.64.3.1
do_ping "$ns2" 100.64.4.1
do_ping "$ns2" 100.64.5.1
do_ping "$ns2" 100.64.2.3
do_ping "$ns2" 100.64.3.3
do_ping "$ns2" 100.64.4.3
do_ping "$ns2" 100.64.5.3
do_ping "$ns3" 100.64.2.1
do_ping "$ns3" 100.64.3.1
do_ping "$ns3" 100.64.4.1
do_ping "$ns3" 100.64.5.1
do_ping "$ns3" 100.64.2.2
do_ping "$ns3" 100.64.3.2
do_ping "$ns3" 100.64.4.2
do_ping "$ns3" 100.64.5.2
run_complete_ping_tests()
{
echo "INFO: Running complete ping tests."
do_ping_tests 0
do_link_problem_tests
}
run_vlan_tests() {
run_vlan_tests()
{
vlan_challenged_hsr1=$(ip net exec "$ns1" ethtool -k hsr1 | grep "vlan-challenged" | awk '{print $2}')
vlan_challenged_hsr2=$(ip net exec "$ns2" ethtool -k hsr2 | grep "vlan-challenged" | awk '{print $2}')
vlan_challenged_hsr3=$(ip net exec "$ns3" ethtool -k hsr3 | grep "vlan-challenged" | awk '{print $2}')
@ -263,27 +217,23 @@ run_vlan_tests() {
if [[ "$vlan_challenged_hsr1" = "off" || "$vlan_challenged_hsr2" = "off" || "$vlan_challenged_hsr3" = "off" ]]; then
echo "INFO: Running VLAN tests"
setup_vlan_interfaces
hsr_vlan_ping
do_ping_tests 2
else
echo "INFO: Not Running VLAN tests as the device does not support VLAN"
fi
}
check_prerequisites
setup_ns ns1 ns2 ns3
trap cleanup_all_ns EXIT
setup_ns ns1 ns2 ns3
setup_hsr_interfaces 0
do_complete_ping_test
run_complete_ping_tests
run_vlan_tests
setup_ns ns1 ns2 ns3
setup_hsr_interfaces 1
do_complete_ping_test
run_complete_ping_tests
run_vlan_tests
exit $ret

View file

@ -1 +1 @@
timeout=50
timeout=90