xref: /openbmc/linux/tools/testing/selftests/net/hsr/hsr_ping.sh (revision 27bbf45eae9ca98877a2d52a92a188147cd61b07)
17d0455e9SSebastian Andrzej Siewior#!/bin/bash
27d0455e9SSebastian Andrzej Siewior# SPDX-License-Identifier: GPL-2.0
37d0455e9SSebastian Andrzej Siewior
47d0455e9SSebastian Andrzej Siewiorret=0
57d0455e9SSebastian Andrzej Siewiorksft_skip=4
67d0455e9SSebastian Andrzej Siewioripv6=true
77d0455e9SSebastian Andrzej Siewior
87d0455e9SSebastian Andrzej Siewioroptstring="h4"
97d0455e9SSebastian Andrzej Siewiorusage() {
107d0455e9SSebastian Andrzej Siewior	echo "Usage: $0 [OPTION]"
117d0455e9SSebastian Andrzej Siewior	echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)"
127d0455e9SSebastian Andrzej Siewior}
137d0455e9SSebastian Andrzej Siewior
147d0455e9SSebastian Andrzej Siewiorwhile getopts "$optstring" option;do
157d0455e9SSebastian Andrzej Siewior	case "$option" in
167d0455e9SSebastian Andrzej Siewior	"h")
177d0455e9SSebastian Andrzej Siewior		usage $0
187d0455e9SSebastian Andrzej Siewior		exit 0
197d0455e9SSebastian Andrzej Siewior		;;
207d0455e9SSebastian Andrzej Siewior	"4")
217d0455e9SSebastian Andrzej Siewior		ipv6=false
227d0455e9SSebastian Andrzej Siewior		;;
237d0455e9SSebastian Andrzej Siewior	"?")
247d0455e9SSebastian Andrzej Siewior		usage $0
257d0455e9SSebastian Andrzej Siewior		exit 1
267d0455e9SSebastian Andrzej Siewior		;;
277d0455e9SSebastian Andrzej Siewioresac
287d0455e9SSebastian Andrzej Siewiordone
297d0455e9SSebastian Andrzej Siewior
307d0455e9SSebastian Andrzej Siewiorsec=$(date +%s)
317d0455e9SSebastian Andrzej Siewiorrndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
327d0455e9SSebastian Andrzej Siewiorns1="ns1-$rndh"
337d0455e9SSebastian Andrzej Siewiorns2="ns2-$rndh"
347d0455e9SSebastian Andrzej Siewiorns3="ns3-$rndh"
357d0455e9SSebastian Andrzej Siewior
367d0455e9SSebastian Andrzej Siewiorcleanup()
377d0455e9SSebastian Andrzej Siewior{
387d0455e9SSebastian Andrzej Siewior	local netns
397d0455e9SSebastian Andrzej Siewior	for netns in "$ns1" "$ns2" "$ns3" ;do
407d0455e9SSebastian Andrzej Siewior		ip netns del $netns
417d0455e9SSebastian Andrzej Siewior	done
427d0455e9SSebastian Andrzej Siewior}
437d0455e9SSebastian Andrzej Siewior
447d0455e9SSebastian Andrzej Siewior# $1: IP address
457d0455e9SSebastian Andrzej Siewioris_v6()
467d0455e9SSebastian Andrzej Siewior{
477d0455e9SSebastian Andrzej Siewior	[ -z "${1##*:*}" ]
487d0455e9SSebastian Andrzej Siewior}
497d0455e9SSebastian Andrzej Siewior
507d0455e9SSebastian Andrzej Siewiordo_ping()
517d0455e9SSebastian Andrzej Siewior{
527d0455e9SSebastian Andrzej Siewior	local netns="$1"
537d0455e9SSebastian Andrzej Siewior	local connect_addr="$2"
547d0455e9SSebastian Andrzej Siewior	local ping_args="-q -c 2"
557d0455e9SSebastian Andrzej Siewior
567d0455e9SSebastian Andrzej Siewior	if is_v6 "${connect_addr}"; then
577d0455e9SSebastian Andrzej Siewior		$ipv6 || return 0
587d0455e9SSebastian Andrzej Siewior		ping_args="${ping_args} -6"
597d0455e9SSebastian Andrzej Siewior	fi
607d0455e9SSebastian Andrzej Siewior
617d0455e9SSebastian Andrzej Siewior	ip netns exec ${netns} ping ${ping_args} $connect_addr >/dev/null
627d0455e9SSebastian Andrzej Siewior	if [ $? -ne 0 ] ; then
637d0455e9SSebastian Andrzej Siewior		echo "$netns -> $connect_addr connectivity [ FAIL ]" 1>&2
647d0455e9SSebastian Andrzej Siewior		ret=1
657d0455e9SSebastian Andrzej Siewior		return 1
667d0455e9SSebastian Andrzej Siewior	fi
677d0455e9SSebastian Andrzej Siewior
687d0455e9SSebastian Andrzej Siewior	return 0
697d0455e9SSebastian Andrzej Siewior}
707d0455e9SSebastian Andrzej Siewior
717d0455e9SSebastian Andrzej Siewiordo_ping_long()
727d0455e9SSebastian Andrzej Siewior{
737d0455e9SSebastian Andrzej Siewior	local netns="$1"
747d0455e9SSebastian Andrzej Siewior	local connect_addr="$2"
757d0455e9SSebastian Andrzej Siewior	local ping_args="-q -c 10"
767d0455e9SSebastian Andrzej Siewior
777d0455e9SSebastian Andrzej Siewior	if is_v6 "${connect_addr}"; then
787d0455e9SSebastian Andrzej Siewior		$ipv6 || return 0
797d0455e9SSebastian Andrzej Siewior		ping_args="${ping_args} -6"
807d0455e9SSebastian Andrzej Siewior	fi
817d0455e9SSebastian Andrzej Siewior
827d0455e9SSebastian Andrzej Siewior	OUT="$(LANG=C ip netns exec ${netns} ping ${ping_args} $connect_addr | grep received)"
837d0455e9SSebastian Andrzej Siewior	if [ $? -ne 0 ] ; then
847d0455e9SSebastian Andrzej Siewior		echo "$netns -> $connect_addr ping [ FAIL ]" 1>&2
857d0455e9SSebastian Andrzej Siewior		ret=1
867d0455e9SSebastian Andrzej Siewior		return 1
877d0455e9SSebastian Andrzej Siewior	fi
887d0455e9SSebastian Andrzej Siewior
897d0455e9SSebastian Andrzej Siewior	VAL="$(echo $OUT | cut -d' ' -f1-8)"
907d0455e9SSebastian Andrzej Siewior	if [ "$VAL" != "10 packets transmitted, 10 received, 0% packet loss," ]
917d0455e9SSebastian Andrzej Siewior	then
927d0455e9SSebastian Andrzej Siewior		echo "$netns -> $connect_addr ping TEST [ FAIL ]"
937d0455e9SSebastian Andrzej Siewior		echo "Expect to send and receive 10 packets and no duplicates."
947d0455e9SSebastian Andrzej Siewior		echo "Full message: ${OUT}."
957d0455e9SSebastian Andrzej Siewior		ret=1
967d0455e9SSebastian Andrzej Siewior		return 1
977d0455e9SSebastian Andrzej Siewior	fi
987d0455e9SSebastian Andrzej Siewior
997d0455e9SSebastian Andrzej Siewior	return 0
1007d0455e9SSebastian Andrzej Siewior}
1017d0455e9SSebastian Andrzej Siewior
1027d0455e9SSebastian Andrzej Siewiorstop_if_error()
1037d0455e9SSebastian Andrzej Siewior{
1047d0455e9SSebastian Andrzej Siewior	local msg="$1"
1057d0455e9SSebastian Andrzej Siewior
1067d0455e9SSebastian Andrzej Siewior	if [ ${ret} -ne 0 ]; then
1077d0455e9SSebastian Andrzej Siewior		echo "FAIL: ${msg}" 1>&2
1087d0455e9SSebastian Andrzej Siewior		exit ${ret}
1097d0455e9SSebastian Andrzej Siewior	fi
1107d0455e9SSebastian Andrzej Siewior}
1117d0455e9SSebastian Andrzej Siewior
112d53f23feSSebastian Andrzej Siewiordo_complete_ping_test()
113d53f23feSSebastian Andrzej Siewior{
1147d0455e9SSebastian Andrzej Siewior	echo "INFO: Initial validation ping."
1157d0455e9SSebastian Andrzej Siewior	# Each node has to be able each one.
1167d0455e9SSebastian Andrzej Siewior	do_ping "$ns1" 100.64.0.2
1177d0455e9SSebastian Andrzej Siewior	do_ping "$ns2" 100.64.0.1
1187d0455e9SSebastian Andrzej Siewior	do_ping "$ns3" 100.64.0.1
1197d0455e9SSebastian Andrzej Siewior	stop_if_error "Initial validation failed."
1207d0455e9SSebastian Andrzej Siewior
1217d0455e9SSebastian Andrzej Siewior	do_ping "$ns1" 100.64.0.3
1227d0455e9SSebastian Andrzej Siewior	do_ping "$ns2" 100.64.0.3
1237d0455e9SSebastian Andrzej Siewior	do_ping "$ns3" 100.64.0.2
1247d0455e9SSebastian Andrzej Siewior
1257d0455e9SSebastian Andrzej Siewior	do_ping "$ns1" dead:beef:1::2
1267d0455e9SSebastian Andrzej Siewior	do_ping "$ns1" dead:beef:1::3
1277d0455e9SSebastian Andrzej Siewior	do_ping "$ns2" dead:beef:1::1
1287d0455e9SSebastian Andrzej Siewior	do_ping "$ns2" dead:beef:1::2
1297d0455e9SSebastian Andrzej Siewior	do_ping "$ns3" dead:beef:1::1
1307d0455e9SSebastian Andrzej Siewior	do_ping "$ns3" dead:beef:1::2
1317d0455e9SSebastian Andrzej Siewior
1327d0455e9SSebastian Andrzej Siewior	stop_if_error "Initial validation failed."
1337d0455e9SSebastian Andrzej Siewior
1347d0455e9SSebastian Andrzej Siewior# Wait until supervisor all supervision frames have been processed and the node
1357d0455e9SSebastian Andrzej Siewior# entries have been merged. Otherwise duplicate frames will be observed which is
1367d0455e9SSebastian Andrzej Siewior# valid at this stage.
1377d0455e9SSebastian Andrzej Siewior	WAIT=5
1387d0455e9SSebastian Andrzej Siewior	while [ ${WAIT} -gt 0 ]
1397d0455e9SSebastian Andrzej Siewior	do
1407d0455e9SSebastian Andrzej Siewior		grep 00:00:00:00:00:00 /sys/kernel/debug/hsr/hsr*/node_table
1417d0455e9SSebastian Andrzej Siewior		if [ $? -ne 0 ]
1427d0455e9SSebastian Andrzej Siewior		then
1437d0455e9SSebastian Andrzej Siewior			break
1447d0455e9SSebastian Andrzej Siewior		fi
1457d0455e9SSebastian Andrzej Siewior		sleep 1
1465c3ce539SSebastian Andrzej Siewior		let "WAIT = WAIT - 1"
1477d0455e9SSebastian Andrzej Siewior	done
1487d0455e9SSebastian Andrzej Siewior
1497d0455e9SSebastian Andrzej Siewior# Just a safety delay in case the above check didn't handle it.
1507d0455e9SSebastian Andrzej Siewior	sleep 1
1517d0455e9SSebastian Andrzej Siewior
1527d0455e9SSebastian Andrzej Siewior	echo "INFO: Longer ping test."
1537d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" 100.64.0.2
1547d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" dead:beef:1::2
1557d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" 100.64.0.3
1567d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" dead:beef:1::3
1577d0455e9SSebastian Andrzej Siewior
1587d0455e9SSebastian Andrzej Siewior	stop_if_error "Longer ping test failed."
1597d0455e9SSebastian Andrzej Siewior
1607d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" 100.64.0.1
1617d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" dead:beef:1::1
1627d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" 100.64.0.3
1637d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" dead:beef:1::2
1647d0455e9SSebastian Andrzej Siewior	stop_if_error "Longer ping test failed."
1657d0455e9SSebastian Andrzej Siewior
1667d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" 100.64.0.1
1677d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" dead:beef:1::1
1687d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" 100.64.0.2
1697d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" dead:beef:1::2
1707d0455e9SSebastian Andrzej Siewior	stop_if_error "Longer ping test failed."
1717d0455e9SSebastian Andrzej Siewior
1727d0455e9SSebastian Andrzej Siewior	echo "INFO: Cutting one link."
1737d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" 100.64.0.3 &
1747d0455e9SSebastian Andrzej Siewior
1757d0455e9SSebastian Andrzej Siewior	sleep 3
1767d0455e9SSebastian Andrzej Siewior	ip -net "$ns3" link set ns3eth1 down
1777d0455e9SSebastian Andrzej Siewior	wait
1787d0455e9SSebastian Andrzej Siewior
1797d0455e9SSebastian Andrzej Siewior	ip -net "$ns3" link set ns3eth1 up
1807d0455e9SSebastian Andrzej Siewior
1817d0455e9SSebastian Andrzej Siewior	stop_if_error "Failed with one link down."
1827d0455e9SSebastian Andrzej Siewior
1837d0455e9SSebastian Andrzej Siewior	echo "INFO: Delay the link and drop a few packages."
1847d0455e9SSebastian Andrzej Siewior	tc -net "$ns3" qdisc add dev ns3eth1 root netem delay 50ms
1857d0455e9SSebastian Andrzej Siewior	tc -net "$ns2" qdisc add dev ns2eth1 root netem delay 5ms loss 25%
1867d0455e9SSebastian Andrzej Siewior
1877d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" 100.64.0.2
1887d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns1" 100.64.0.3
1897d0455e9SSebastian Andrzej Siewior
1907d0455e9SSebastian Andrzej Siewior	stop_if_error "Failed with delay and packetloss."
1917d0455e9SSebastian Andrzej Siewior
1927d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" 100.64.0.1
1937d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns2" 100.64.0.3
1947d0455e9SSebastian Andrzej Siewior
1957d0455e9SSebastian Andrzej Siewior	stop_if_error "Failed with delay and packetloss."
1967d0455e9SSebastian Andrzej Siewior
1977d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" 100.64.0.1
1987d0455e9SSebastian Andrzej Siewior	do_ping_long "$ns3" 100.64.0.2
1997d0455e9SSebastian Andrzej Siewior	stop_if_error "Failed with delay and packetloss."
2007d0455e9SSebastian Andrzej Siewior
2017d0455e9SSebastian Andrzej Siewior	echo "INFO: All good."
202d53f23feSSebastian Andrzej Siewior}
203d53f23feSSebastian Andrzej Siewior
204d53f23feSSebastian Andrzej Siewiorsetup_hsr_interfaces()
205d53f23feSSebastian Andrzej Siewior{
206*b0e9c3b5SSebastian Andrzej Siewior	local HSRv="$1"
207*b0e9c3b5SSebastian Andrzej Siewior
208*b0e9c3b5SSebastian Andrzej Siewior	echo "INFO: preparing interfaces for HSRv${HSRv}."
209d53f23feSSebastian Andrzej Siewior# Three HSR nodes. Each node has one link to each of its neighbour, two links in total.
210d53f23feSSebastian Andrzej Siewior#
211d53f23feSSebastian Andrzej Siewior#    ns1eth1 ----- ns2eth1
212d53f23feSSebastian Andrzej Siewior#      hsr1         hsr2
213d53f23feSSebastian Andrzej Siewior#    ns1eth2       ns2eth2
214d53f23feSSebastian Andrzej Siewior#       |            |
215d53f23feSSebastian Andrzej Siewior#    ns3eth1      ns3eth2
216d53f23feSSebastian Andrzej Siewior#           \    /
217d53f23feSSebastian Andrzej Siewior#            hsr3
218d53f23feSSebastian Andrzej Siewior#
219d53f23feSSebastian Andrzej Siewior	# Interfaces
220d53f23feSSebastian Andrzej Siewior	ip link add ns1eth1 netns "$ns1" type veth peer name ns2eth1 netns "$ns2"
221d53f23feSSebastian Andrzej Siewior	ip link add ns1eth2 netns "$ns1" type veth peer name ns3eth1 netns "$ns3"
222d53f23feSSebastian Andrzej Siewior	ip link add ns3eth2 netns "$ns3" type veth peer name ns2eth2 netns "$ns2"
223d53f23feSSebastian Andrzej Siewior
224*b0e9c3b5SSebastian Andrzej Siewior	# HSRv0/1
225*b0e9c3b5SSebastian Andrzej Siewior	ip -net "$ns1" link add name hsr1 type hsr slave1 ns1eth1 slave2 ns1eth2 supervision 45 version $HSRv proto 0
226*b0e9c3b5SSebastian Andrzej Siewior	ip -net "$ns2" link add name hsr2 type hsr slave1 ns2eth1 slave2 ns2eth2 supervision 45 version $HSRv proto 0
227*b0e9c3b5SSebastian Andrzej Siewior	ip -net "$ns3" link add name hsr3 type hsr slave1 ns3eth1 slave2 ns3eth2 supervision 45 version $HSRv proto 0
228d53f23feSSebastian Andrzej Siewior
229d53f23feSSebastian Andrzej Siewior	# IP for HSR
230d53f23feSSebastian Andrzej Siewior	ip -net "$ns1" addr add 100.64.0.1/24 dev hsr1
231d53f23feSSebastian Andrzej Siewior	ip -net "$ns1" addr add dead:beef:1::1/64 dev hsr1 nodad
232d53f23feSSebastian Andrzej Siewior	ip -net "$ns2" addr add 100.64.0.2/24 dev hsr2
233d53f23feSSebastian Andrzej Siewior	ip -net "$ns2" addr add dead:beef:1::2/64 dev hsr2 nodad
234d53f23feSSebastian Andrzej Siewior	ip -net "$ns3" addr add 100.64.0.3/24 dev hsr3
235d53f23feSSebastian Andrzej Siewior	ip -net "$ns3" addr add dead:beef:1::3/64 dev hsr3 nodad
236d53f23feSSebastian Andrzej Siewior
237d53f23feSSebastian Andrzej Siewior	# All Links up
238d53f23feSSebastian Andrzej Siewior	ip -net "$ns1" link set ns1eth1 up
239d53f23feSSebastian Andrzej Siewior	ip -net "$ns1" link set ns1eth2 up
240d53f23feSSebastian Andrzej Siewior	ip -net "$ns1" link set hsr1 up
241d53f23feSSebastian Andrzej Siewior
242d53f23feSSebastian Andrzej Siewior	ip -net "$ns2" link set ns2eth1 up
243d53f23feSSebastian Andrzej Siewior	ip -net "$ns2" link set ns2eth2 up
244d53f23feSSebastian Andrzej Siewior	ip -net "$ns2" link set hsr2 up
245d53f23feSSebastian Andrzej Siewior
246d53f23feSSebastian Andrzej Siewior	ip -net "$ns3" link set ns3eth1 up
247d53f23feSSebastian Andrzej Siewior	ip -net "$ns3" link set ns3eth2 up
248d53f23feSSebastian Andrzej Siewior	ip -net "$ns3" link set hsr3 up
249d53f23feSSebastian Andrzej Siewior}
250d53f23feSSebastian Andrzej Siewior
251d53f23feSSebastian Andrzej Siewiorip -Version > /dev/null 2>&1
252d53f23feSSebastian Andrzej Siewiorif [ $? -ne 0 ];then
253d53f23feSSebastian Andrzej Siewior	echo "SKIP: Could not run test without ip tool"
254d53f23feSSebastian Andrzej Siewior	exit $ksft_skip
255d53f23feSSebastian Andrzej Siewiorfi
256d53f23feSSebastian Andrzej Siewior
257d53f23feSSebastian Andrzej Siewiortrap cleanup EXIT
258d53f23feSSebastian Andrzej Siewior
259d53f23feSSebastian Andrzej Siewiorfor i in "$ns1" "$ns2" "$ns3" ;do
260d53f23feSSebastian Andrzej Siewior	ip netns add $i || exit $ksft_skip
261d53f23feSSebastian Andrzej Siewior	ip -net $i link set lo up
262d53f23feSSebastian Andrzej Siewiordone
263d53f23feSSebastian Andrzej Siewior
264*b0e9c3b5SSebastian Andrzej Siewiorsetup_hsr_interfaces 0
265*b0e9c3b5SSebastian Andrzej Siewiordo_complete_ping_test
266*b0e9c3b5SSebastian Andrzej Siewiorcleanup
267*b0e9c3b5SSebastian Andrzej Siewior
268*b0e9c3b5SSebastian Andrzej Siewiorfor i in "$ns1" "$ns2" "$ns3" ;do
269*b0e9c3b5SSebastian Andrzej Siewior	ip netns add $i || exit $ksft_skip
270*b0e9c3b5SSebastian Andrzej Siewior	ip -net $i link set lo up
271*b0e9c3b5SSebastian Andrzej Siewiordone
272*b0e9c3b5SSebastian Andrzej Siewior
273*b0e9c3b5SSebastian Andrzej Siewiorsetup_hsr_interfaces 1
274d53f23feSSebastian Andrzej Siewiordo_complete_ping_test
275d53f23feSSebastian Andrzej Siewior
2767d0455e9SSebastian Andrzej Siewiorexit $ret
277