]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: hsr: Add ping test for PRP
authorFelix Maurer <fmaurer@redhat.com>
Thu, 5 Feb 2026 13:57:28 +0000 (14:57 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 10 Feb 2026 11:02:28 +0000 (12:02 +0100)
Add a selftest for PRP that performs a basic ping test on IPv4 and IPv6,
over the plain PRP interface and a VLAN interface, similar to the existing
ping test for HSR. The test first checks reachability of the other node,
then checks for no loss and no duplicates.

Signed-off-by: Felix Maurer <fmaurer@redhat.com>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://patch.msgid.link/4a342189e842d7308d037da72af566729ee75834.1770299429.git.fmaurer@redhat.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
tools/testing/selftests/net/hsr/Makefile
tools/testing/selftests/net/hsr/prp_ping.sh [new file with mode: 0755]

index 4b6afc0fe9f81125c728a1d20b8ec02399a2f616..1886f345897ac393c1ff62aefb137784e7a66e2d 100644 (file)
@@ -5,6 +5,7 @@ top_srcdir = ../../../../..
 TEST_PROGS := \
        hsr_ping.sh \
        hsr_redbox.sh \
+       prp_ping.sh \
 # end of TEST_PROGS
 
 TEST_FILES += hsr_common.sh
diff --git a/tools/testing/selftests/net/hsr/prp_ping.sh b/tools/testing/selftests/net/hsr/prp_ping.sh
new file mode 100755 (executable)
index 0000000..fd2ba9f
--- /dev/null
@@ -0,0 +1,147 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+ipv6=true
+
+source ./hsr_common.sh
+
+optstring="h4"
+usage() {
+       echo "Usage: $0 [OPTION]"
+       echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)"
+}
+
+while getopts "$optstring" option;do
+       case "$option" in
+       "h")
+               usage "$0"
+               exit 0
+               ;;
+       "4")
+               ipv6=false
+               ;;
+       "?")
+               usage "$0"
+               exit 1
+               ;;
+esac
+done
+
+setup_prp_interfaces()
+{
+       echo "INFO: Preparing interfaces for PRP"
+# Two PRP nodes, connected by two links (treated as LAN A and LAN B).
+#
+#       vethA ----- vethA
+#     prp1             prp2
+#       vethB ----- vethB
+#
+#     node1           node2
+
+       # Interfaces
+       # shellcheck disable=SC2154 # variables assigned by setup_ns
+       ip link add vethA netns "$node1" type veth peer name vethA netns "$node2"
+       ip link add vethB netns "$node1" type veth peer name vethB netns "$node2"
+
+       # MAC addresses will be copied from LAN A interface
+       ip -net "$node1" link set address 00:11:22:00:00:01 dev vethA
+       ip -net "$node2" link set address 00:11:22:00:00:02 dev vethA
+
+       # PRP
+       ip -net "$node1" link add name prp1 type hsr \
+               slave1 vethA slave2 vethB supervision 45 proto 1
+       ip -net "$node2" link add name prp2 type hsr \
+               slave1 vethA slave2 vethB supervision 45 proto 1
+
+       # IP addresses
+       ip -net "$node1" addr add 100.64.0.1/24 dev prp1
+       ip -net "$node1" addr add dead:beef:0::1/64 dev prp1 nodad
+       ip -net "$node2" addr add 100.64.0.2/24 dev prp2
+       ip -net "$node2" addr add dead:beef:0::2/64 dev prp2 nodad
+
+       # All links up
+       ip -net "$node1" link set vethA up
+       ip -net "$node1" link set vethB up
+       ip -net "$node1" link set prp1 up
+
+       ip -net "$node2" link set vethA up
+       ip -net "$node2" link set vethB up
+       ip -net "$node2" link set prp2 up
+}
+
+setup_vlan_interfaces()
+{
+       # Interfaces
+       ip -net "$node1" link add link prp1 name prp1.2 type vlan id 2
+       ip -net "$node2" link add link prp2 name prp2.2 type vlan id 2
+
+       # IP addresses
+       ip -net "$node1" addr add 100.64.2.1/24 dev prp1.2
+       ip -net "$node1" addr add dead:beef:2::1/64 dev prp1.2 nodad
+
+       ip -net "$node2" addr add 100.64.2.2/24 dev prp2.2
+       ip -net "$node2" addr add dead:beef:2::2/64 dev prp2.2 nodad
+
+       # All links up
+       ip -net "$node1" link set prp1.2 up
+       ip -net "$node2" link set prp2.2 up
+}
+
+do_ping_tests()
+{
+       local netid="$1"
+
+       echo "INFO: Initial validation ping"
+
+       do_ping "$node1" "100.64.$netid.2"
+       do_ping "$node2" "100.64.$netid.1"
+       stop_if_error "Initial validation failed on IPv4"
+
+       do_ping "$node1" "dead:beef:$netid::2"
+       do_ping "$node2" "dead:beef:$netid::1"
+       stop_if_error "Initial validation failed on IPv6"
+
+       echo "INFO: Longer ping test."
+
+       do_ping_long "$node1" "100.64.$netid.2"
+       do_ping_long "$node2" "100.64.$netid.1"
+       stop_if_error "Longer ping test failed on IPv4."
+
+       do_ping_long "$node1" "dead:beef:$netid::2"
+       do_ping_long "$node2" "dead:beef:$netid::1"
+       stop_if_error "Longer ping test failed on IPv6."
+}
+
+run_ping_tests()
+{
+       echo "INFO: Running ping tests"
+       do_ping_tests 0
+}
+
+run_vlan_ping_tests()
+{
+       vlan_challenged_prp1=$(ip net exec "$node1" ethtool -k prp1 | \
+               grep "vlan-challenged" | awk '{print $2}')
+       vlan_challenged_prp2=$(ip net exec "$node2" ethtool -k prp2 | \
+               grep "vlan-challenged" | awk '{print $2}')
+
+       if [[ "$vlan_challenged_prp1" = "off" || \
+             "$vlan_challenged_prp2" = "off" ]]; then
+               echo "INFO: Running VLAN ping tests"
+               setup_vlan_interfaces
+               do_ping_tests 2
+       else
+               echo "INFO: Not Running VLAN tests as the device does not support VLAN"
+       fi
+}
+
+check_prerequisites
+trap cleanup_all_ns EXIT
+
+setup_ns node1 node2
+setup_prp_interfaces
+
+run_ping_tests
+run_vlan_ping_tests
+
+exit $ret