Merge tag 'xfs-6.9-merge-8' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-block.git] / tools / testing / selftests / net / arp_ndisc_evict_nocarrier.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Tests sysctl options {arp,ndisc}_evict_nocarrier={0,1}
5 #
6 # Create a veth pair and set IPs/routes on both. Then ping to establish
7 # an entry in the ARP/ND table. Depending on the test set sysctl option to
8 # 1 or 0. Set remote veth down which will cause local veth to go into a no
9 # carrier state. Depending on the test check the ARP/ND table:
10 #
11 # {arp,ndisc}_evict_nocarrier=1 should contain no ARP/ND after no carrier
12 # {arp,ndisc}_evict_nocarrer=0 should still contain the single ARP/ND entry
13 #
14
15 source lib.sh
16
17 readonly V4_ADDR0=10.0.10.1
18 readonly V4_ADDR1=10.0.10.2
19 readonly V6_ADDR0=2001:db8:91::1
20 readonly V6_ADDR1=2001:db8:91::2
21 nsid=100
22 ret=0
23
24 cleanup_v6()
25 {
26     cleanup_ns ${me} ${peer}
27
28     sysctl -w net.ipv6.conf.veth1.ndisc_evict_nocarrier=1 >/dev/null 2>&1
29     sysctl -w net.ipv6.conf.all.ndisc_evict_nocarrier=1 >/dev/null 2>&1
30 }
31
32 setup_v6() {
33     setup_ns me peer
34
35     IP="ip -netns ${me}"
36
37     $IP li add veth1 type veth peer name veth2
38     $IP li set veth1 up
39     $IP -6 addr add $V6_ADDR0/64 dev veth1 nodad
40     $IP li set veth2 netns ${peer} up
41     ip -netns ${peer} -6 addr add $V6_ADDR1/64 dev veth2 nodad
42
43     ip netns exec ${me} sysctl -w $1 >/dev/null 2>&1
44
45     # Establish an ND cache entry
46     ip netns exec ${me} ping -6 -c1 -Iveth1 $V6_ADDR1 >/dev/null 2>&1
47     # Should have the veth1 entry in ND table
48     ip netns exec ${me} ip -6 neigh get $V6_ADDR1 dev veth1 >/dev/null 2>&1
49     if [ $? -ne 0 ]; then
50         cleanup_v6
51         echo "failed"
52         exit 1
53     fi
54
55     # Set veth2 down, which will put veth1 in NOCARRIER state
56     ip netns exec ${peer} ip link set veth2 down
57 }
58
59 setup_v4() {
60     setup_ns PEER_NS
61     ip link add name veth0 type veth peer name veth1
62     ip link set dev veth0 up
63     ip link set dev veth1 netns "${PEER_NS}"
64     ip netns exec "${PEER_NS}" ip link set dev veth1 up
65     ip addr add $V4_ADDR0/24 dev veth0
66     ip netns exec "${PEER_NS}" ip addr add $V4_ADDR1/24 dev veth1
67     ip netns exec ${PEER_NS} ip route add default via $V4_ADDR1 dev veth1
68     ip route add default via $V4_ADDR0 dev veth0
69
70     sysctl -w "$1" >/dev/null 2>&1
71
72     # Establish an ARP cache entry
73     ping -c1 -I veth0 $V4_ADDR1 -q >/dev/null 2>&1
74     # Should have the veth1 entry in ARP table
75     ip neigh get $V4_ADDR1 dev veth0 >/dev/null 2>&1
76     if [ $? -ne 0 ]; then
77         cleanup_v4
78         echo "failed"
79         exit 1
80     fi
81
82     # Set veth1 down, which will put veth0 in NOCARRIER state
83     ip netns exec "${PEER_NS}" ip link set veth1 down
84 }
85
86 cleanup_v4() {
87     ip neigh flush dev veth0
88     ip link del veth0
89     cleanup_ns $PEER_NS
90
91     sysctl -w net.ipv4.conf.veth0.arp_evict_nocarrier=1 >/dev/null 2>&1
92     sysctl -w net.ipv4.conf.all.arp_evict_nocarrier=1 >/dev/null 2>&1
93 }
94
95 # Run test when arp_evict_nocarrier = 1 (default).
96 run_arp_evict_nocarrier_enabled() {
97     echo "run arp_evict_nocarrier=1 test"
98     setup_v4 "net.ipv4.conf.veth0.arp_evict_nocarrier=1"
99
100     # ARP table should be empty
101     ip neigh get $V4_ADDR1 dev veth0 >/dev/null 2>&1
102
103     if [ $? -eq 0 ];then
104         echo "failed"
105         ret=1
106     else
107         echo "ok"
108     fi
109
110     cleanup_v4
111 }
112
113 # Run test when arp_evict_nocarrier = 0
114 run_arp_evict_nocarrier_disabled() {
115     echo "run arp_evict_nocarrier=0 test"
116     setup_v4 "net.ipv4.conf.veth0.arp_evict_nocarrier=0"
117
118     # ARP table should still contain the entry
119     ip neigh get $V4_ADDR1 dev veth0 >/dev/null 2>&1
120
121     if [ $? -eq 0 ];then
122         echo "ok"
123     else
124         echo "failed"
125         ret=1
126     fi
127
128     cleanup_v4
129 }
130
131 run_arp_evict_nocarrier_disabled_all() {
132     echo "run all.arp_evict_nocarrier=0 test"
133     setup_v4 "net.ipv4.conf.all.arp_evict_nocarrier=0"
134
135     # ARP table should still contain the entry
136     ip neigh get $V4_ADDR1 dev veth0 >/dev/null 2>&1
137
138     if [ $? -eq 0 ];then
139         echo "ok"
140     else
141         echo "failed"
142     fi
143
144     cleanup_v4
145 }
146
147 run_ndisc_evict_nocarrier_enabled() {
148     echo "run ndisc_evict_nocarrier=1 test"
149
150     setup_v6 "net.ipv6.conf.veth1.ndisc_evict_nocarrier=1"
151
152     ip netns exec ${me} ip -6 neigh get $V6_ADDR1 dev veth1 >/dev/null 2>&1
153
154     if [ $? -eq 0 ];then
155         echo "failed"
156         ret=1
157     else
158         echo "ok"
159     fi
160
161     cleanup_v6
162 }
163
164 run_ndisc_evict_nocarrier_disabled() {
165     echo "run ndisc_evict_nocarrier=0 test"
166
167     setup_v6 "net.ipv6.conf.veth1.ndisc_evict_nocarrier=0"
168
169     ip netns exec ${me} ip -6 neigh get $V6_ADDR1 dev veth1 >/dev/null 2>&1
170
171     if [ $? -eq 0 ];then
172         echo "ok"
173     else
174         echo "failed"
175         ret=1
176     fi
177
178     cleanup_v6
179 }
180
181 run_ndisc_evict_nocarrier_disabled_all() {
182     echo "run all.ndisc_evict_nocarrier=0 test"
183
184     setup_v6 "net.ipv6.conf.all.ndisc_evict_nocarrier=0"
185
186     ip netns exec ${me} ip -6 neigh get $V6_ADDR1 dev veth1 >/dev/null 2>&1
187
188     if [ $? -eq 0 ];then
189         echo "ok"
190     else
191         echo "failed"
192         ret=1
193     fi
194
195     cleanup_v6
196 }
197
198 run_all_tests() {
199     run_arp_evict_nocarrier_enabled
200     run_arp_evict_nocarrier_disabled
201     run_arp_evict_nocarrier_disabled_all
202     run_ndisc_evict_nocarrier_enabled
203     run_ndisc_evict_nocarrier_disabled
204     run_ndisc_evict_nocarrier_disabled_all
205 }
206
207 if [ "$(id -u)" -ne 0 ];then
208         echo "SKIP: Need root privileges"
209         exit $ksft_skip;
210 fi
211
212 run_all_tests
213 exit $ret