blob: fd2ba9f05d4c9a8f3bf2c50847db7ae3725c6948 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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
|