xref: /linux/tools/testing/selftests/net/hsr/prp_ping.sh (revision c01a6c700fd54dd775020a8ddfe69dedeaca73cc)
1*c01a6c70SFelix Maurer#!/bin/bash
2*c01a6c70SFelix Maurer# SPDX-License-Identifier: GPL-2.0
3*c01a6c70SFelix Maurer
4*c01a6c70SFelix Maureripv6=true
5*c01a6c70SFelix Maurer
6*c01a6c70SFelix Maurersource ./hsr_common.sh
7*c01a6c70SFelix Maurer
8*c01a6c70SFelix Maureroptstring="h4"
9*c01a6c70SFelix Maurerusage() {
10*c01a6c70SFelix Maurer	echo "Usage: $0 [OPTION]"
11*c01a6c70SFelix Maurer	echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)"
12*c01a6c70SFelix Maurer}
13*c01a6c70SFelix Maurer
14*c01a6c70SFelix Maurerwhile getopts "$optstring" option;do
15*c01a6c70SFelix Maurer	case "$option" in
16*c01a6c70SFelix Maurer	"h")
17*c01a6c70SFelix Maurer		usage "$0"
18*c01a6c70SFelix Maurer		exit 0
19*c01a6c70SFelix Maurer		;;
20*c01a6c70SFelix Maurer	"4")
21*c01a6c70SFelix Maurer		ipv6=false
22*c01a6c70SFelix Maurer		;;
23*c01a6c70SFelix Maurer	"?")
24*c01a6c70SFelix Maurer		usage "$0"
25*c01a6c70SFelix Maurer		exit 1
26*c01a6c70SFelix Maurer		;;
27*c01a6c70SFelix Maureresac
28*c01a6c70SFelix Maurerdone
29*c01a6c70SFelix Maurer
30*c01a6c70SFelix Maurersetup_prp_interfaces()
31*c01a6c70SFelix Maurer{
32*c01a6c70SFelix Maurer	echo "INFO: Preparing interfaces for PRP"
33*c01a6c70SFelix Maurer# Two PRP nodes, connected by two links (treated as LAN A and LAN B).
34*c01a6c70SFelix Maurer#
35*c01a6c70SFelix Maurer#       vethA ----- vethA
36*c01a6c70SFelix Maurer#     prp1             prp2
37*c01a6c70SFelix Maurer#       vethB ----- vethB
38*c01a6c70SFelix Maurer#
39*c01a6c70SFelix Maurer#     node1           node2
40*c01a6c70SFelix Maurer
41*c01a6c70SFelix Maurer	# Interfaces
42*c01a6c70SFelix Maurer	# shellcheck disable=SC2154 # variables assigned by setup_ns
43*c01a6c70SFelix Maurer	ip link add vethA netns "$node1" type veth peer name vethA netns "$node2"
44*c01a6c70SFelix Maurer	ip link add vethB netns "$node1" type veth peer name vethB netns "$node2"
45*c01a6c70SFelix Maurer
46*c01a6c70SFelix Maurer	# MAC addresses will be copied from LAN A interface
47*c01a6c70SFelix Maurer	ip -net "$node1" link set address 00:11:22:00:00:01 dev vethA
48*c01a6c70SFelix Maurer	ip -net "$node2" link set address 00:11:22:00:00:02 dev vethA
49*c01a6c70SFelix Maurer
50*c01a6c70SFelix Maurer	# PRP
51*c01a6c70SFelix Maurer	ip -net "$node1" link add name prp1 type hsr \
52*c01a6c70SFelix Maurer		slave1 vethA slave2 vethB supervision 45 proto 1
53*c01a6c70SFelix Maurer	ip -net "$node2" link add name prp2 type hsr \
54*c01a6c70SFelix Maurer		slave1 vethA slave2 vethB supervision 45 proto 1
55*c01a6c70SFelix Maurer
56*c01a6c70SFelix Maurer	# IP addresses
57*c01a6c70SFelix Maurer	ip -net "$node1" addr add 100.64.0.1/24 dev prp1
58*c01a6c70SFelix Maurer	ip -net "$node1" addr add dead:beef:0::1/64 dev prp1 nodad
59*c01a6c70SFelix Maurer	ip -net "$node2" addr add 100.64.0.2/24 dev prp2
60*c01a6c70SFelix Maurer	ip -net "$node2" addr add dead:beef:0::2/64 dev prp2 nodad
61*c01a6c70SFelix Maurer
62*c01a6c70SFelix Maurer	# All links up
63*c01a6c70SFelix Maurer	ip -net "$node1" link set vethA up
64*c01a6c70SFelix Maurer	ip -net "$node1" link set vethB up
65*c01a6c70SFelix Maurer	ip -net "$node1" link set prp1 up
66*c01a6c70SFelix Maurer
67*c01a6c70SFelix Maurer	ip -net "$node2" link set vethA up
68*c01a6c70SFelix Maurer	ip -net "$node2" link set vethB up
69*c01a6c70SFelix Maurer	ip -net "$node2" link set prp2 up
70*c01a6c70SFelix Maurer}
71*c01a6c70SFelix Maurer
72*c01a6c70SFelix Maurersetup_vlan_interfaces()
73*c01a6c70SFelix Maurer{
74*c01a6c70SFelix Maurer	# Interfaces
75*c01a6c70SFelix Maurer	ip -net "$node1" link add link prp1 name prp1.2 type vlan id 2
76*c01a6c70SFelix Maurer	ip -net "$node2" link add link prp2 name prp2.2 type vlan id 2
77*c01a6c70SFelix Maurer
78*c01a6c70SFelix Maurer	# IP addresses
79*c01a6c70SFelix Maurer	ip -net "$node1" addr add 100.64.2.1/24 dev prp1.2
80*c01a6c70SFelix Maurer	ip -net "$node1" addr add dead:beef:2::1/64 dev prp1.2 nodad
81*c01a6c70SFelix Maurer
82*c01a6c70SFelix Maurer	ip -net "$node2" addr add 100.64.2.2/24 dev prp2.2
83*c01a6c70SFelix Maurer	ip -net "$node2" addr add dead:beef:2::2/64 dev prp2.2 nodad
84*c01a6c70SFelix Maurer
85*c01a6c70SFelix Maurer	# All links up
86*c01a6c70SFelix Maurer	ip -net "$node1" link set prp1.2 up
87*c01a6c70SFelix Maurer	ip -net "$node2" link set prp2.2 up
88*c01a6c70SFelix Maurer}
89*c01a6c70SFelix Maurer
90*c01a6c70SFelix Maurerdo_ping_tests()
91*c01a6c70SFelix Maurer{
92*c01a6c70SFelix Maurer	local netid="$1"
93*c01a6c70SFelix Maurer
94*c01a6c70SFelix Maurer	echo "INFO: Initial validation ping"
95*c01a6c70SFelix Maurer
96*c01a6c70SFelix Maurer	do_ping "$node1" "100.64.$netid.2"
97*c01a6c70SFelix Maurer	do_ping "$node2" "100.64.$netid.1"
98*c01a6c70SFelix Maurer	stop_if_error "Initial validation failed on IPv4"
99*c01a6c70SFelix Maurer
100*c01a6c70SFelix Maurer	do_ping "$node1" "dead:beef:$netid::2"
101*c01a6c70SFelix Maurer	do_ping "$node2" "dead:beef:$netid::1"
102*c01a6c70SFelix Maurer	stop_if_error "Initial validation failed on IPv6"
103*c01a6c70SFelix Maurer
104*c01a6c70SFelix Maurer	echo "INFO: Longer ping test."
105*c01a6c70SFelix Maurer
106*c01a6c70SFelix Maurer	do_ping_long "$node1" "100.64.$netid.2"
107*c01a6c70SFelix Maurer	do_ping_long "$node2" "100.64.$netid.1"
108*c01a6c70SFelix Maurer	stop_if_error "Longer ping test failed on IPv4."
109*c01a6c70SFelix Maurer
110*c01a6c70SFelix Maurer	do_ping_long "$node1" "dead:beef:$netid::2"
111*c01a6c70SFelix Maurer	do_ping_long "$node2" "dead:beef:$netid::1"
112*c01a6c70SFelix Maurer	stop_if_error "Longer ping test failed on IPv6."
113*c01a6c70SFelix Maurer}
114*c01a6c70SFelix Maurer
115*c01a6c70SFelix Maurerrun_ping_tests()
116*c01a6c70SFelix Maurer{
117*c01a6c70SFelix Maurer	echo "INFO: Running ping tests"
118*c01a6c70SFelix Maurer	do_ping_tests 0
119*c01a6c70SFelix Maurer}
120*c01a6c70SFelix Maurer
121*c01a6c70SFelix Maurerrun_vlan_ping_tests()
122*c01a6c70SFelix Maurer{
123*c01a6c70SFelix Maurer	vlan_challenged_prp1=$(ip net exec "$node1" ethtool -k prp1 | \
124*c01a6c70SFelix Maurer		grep "vlan-challenged" | awk '{print $2}')
125*c01a6c70SFelix Maurer	vlan_challenged_prp2=$(ip net exec "$node2" ethtool -k prp2 | \
126*c01a6c70SFelix Maurer		grep "vlan-challenged" | awk '{print $2}')
127*c01a6c70SFelix Maurer
128*c01a6c70SFelix Maurer	if [[ "$vlan_challenged_prp1" = "off" || \
129*c01a6c70SFelix Maurer	      "$vlan_challenged_prp2" = "off" ]]; then
130*c01a6c70SFelix Maurer		echo "INFO: Running VLAN ping tests"
131*c01a6c70SFelix Maurer		setup_vlan_interfaces
132*c01a6c70SFelix Maurer		do_ping_tests 2
133*c01a6c70SFelix Maurer	else
134*c01a6c70SFelix Maurer		echo "INFO: Not Running VLAN tests as the device does not support VLAN"
135*c01a6c70SFelix Maurer	fi
136*c01a6c70SFelix Maurer}
137*c01a6c70SFelix Maurer
138*c01a6c70SFelix Maurercheck_prerequisites
139*c01a6c70SFelix Maurertrap cleanup_all_ns EXIT
140*c01a6c70SFelix Maurer
141*c01a6c70SFelix Maurersetup_ns node1 node2
142*c01a6c70SFelix Maurersetup_prp_interfaces
143*c01a6c70SFelix Maurer
144*c01a6c70SFelix Maurerrun_ping_tests
145*c01a6c70SFelix Maurerrun_vlan_ping_tests
146*c01a6c70SFelix Maurer
147*c01a6c70SFelix Maurerexit $ret
148