Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / tools / testing / selftests / net / forwarding / router_mpath_nh.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 ALL_TESTS="ping_ipv4 ping_ipv6 multipath_test"
5 NUM_NETIFS=8
6 source lib.sh
7
8 h1_create()
9 {
10         vrf_create "vrf-h1"
11         ip link set dev $h1 master vrf-h1
12
13         ip link set dev vrf-h1 up
14         ip link set dev $h1 up
15
16         ip address add 192.0.2.2/24 dev $h1
17         ip address add 2001:db8:1::2/64 dev $h1
18
19         ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
20         ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
21 }
22
23 h1_destroy()
24 {
25         ip route del 2001:db8:2::/64 vrf vrf-h1
26         ip route del 198.51.100.0/24 vrf vrf-h1
27
28         ip address del 2001:db8:1::2/64 dev $h1
29         ip address del 192.0.2.2/24 dev $h1
30
31         ip link set dev $h1 down
32         vrf_destroy "vrf-h1"
33 }
34
35 h2_create()
36 {
37         vrf_create "vrf-h2"
38         ip link set dev $h2 master vrf-h2
39
40         ip link set dev vrf-h2 up
41         ip link set dev $h2 up
42
43         ip address add 198.51.100.2/24 dev $h2
44         ip address add 2001:db8:2::2/64 dev $h2
45
46         ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
47         ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
48 }
49
50 h2_destroy()
51 {
52         ip route del 2001:db8:1::/64 vrf vrf-h2
53         ip route del 192.0.2.0/24 vrf vrf-h2
54
55         ip address del 2001:db8:2::2/64 dev $h2
56         ip address del 198.51.100.2/24 dev $h2
57
58         ip link set dev $h2 down
59         vrf_destroy "vrf-h2"
60 }
61
62 router1_create()
63 {
64         vrf_create "vrf-r1"
65         ip link set dev $rp11 master vrf-r1
66         ip link set dev $rp12 master vrf-r1
67         ip link set dev $rp13 master vrf-r1
68
69         ip link set dev vrf-r1 up
70         ip link set dev $rp11 up
71         ip link set dev $rp12 up
72         ip link set dev $rp13 up
73
74         ip address add 192.0.2.1/24 dev $rp11
75         ip address add 2001:db8:1::1/64 dev $rp11
76
77         ip address add 169.254.2.12/24 dev $rp12
78         ip address add fe80:2::12/64 dev $rp12
79
80         ip address add 169.254.3.13/24 dev $rp13
81         ip address add fe80:3::13/64 dev $rp13
82 }
83
84 router1_destroy()
85 {
86         ip route del 2001:db8:2::/64 vrf vrf-r1
87         ip route del 198.51.100.0/24 vrf vrf-r1
88
89         ip address del fe80:3::13/64 dev $rp13
90         ip address del 169.254.3.13/24 dev $rp13
91
92         ip address del fe80:2::12/64 dev $rp12
93         ip address del 169.254.2.12/24 dev $rp12
94
95         ip address del 2001:db8:1::1/64 dev $rp11
96         ip address del 192.0.2.1/24 dev $rp11
97
98         ip nexthop del id 103
99         ip nexthop del id 101
100         ip nexthop del id 102
101         ip nexthop del id 106
102         ip nexthop del id 104
103         ip nexthop del id 105
104
105         ip link set dev $rp13 down
106         ip link set dev $rp12 down
107         ip link set dev $rp11 down
108
109         vrf_destroy "vrf-r1"
110 }
111
112 router2_create()
113 {
114         vrf_create "vrf-r2"
115         ip link set dev $rp21 master vrf-r2
116         ip link set dev $rp22 master vrf-r2
117         ip link set dev $rp23 master vrf-r2
118
119         ip link set dev vrf-r2 up
120         ip link set dev $rp21 up
121         ip link set dev $rp22 up
122         ip link set dev $rp23 up
123
124         ip address add 198.51.100.1/24 dev $rp21
125         ip address add 2001:db8:2::1/64 dev $rp21
126
127         ip address add 169.254.2.22/24 dev $rp22
128         ip address add fe80:2::22/64 dev $rp22
129
130         ip address add 169.254.3.23/24 dev $rp23
131         ip address add fe80:3::23/64 dev $rp23
132 }
133
134 router2_destroy()
135 {
136         ip route del 2001:db8:1::/64 vrf vrf-r2
137         ip route del 192.0.2.0/24 vrf vrf-r2
138
139         ip address del fe80:3::23/64 dev $rp23
140         ip address del 169.254.3.23/24 dev $rp23
141
142         ip address del fe80:2::22/64 dev $rp22
143         ip address del 169.254.2.22/24 dev $rp22
144
145         ip address del 2001:db8:2::1/64 dev $rp21
146         ip address del 198.51.100.1/24 dev $rp21
147
148         ip nexthop del id 201
149         ip nexthop del id 202
150         ip nexthop del id 204
151         ip nexthop del id 205
152
153         ip link set dev $rp23 down
154         ip link set dev $rp22 down
155         ip link set dev $rp21 down
156
157         vrf_destroy "vrf-r2"
158 }
159
160 routing_nh_obj()
161 {
162         ip nexthop add id 101 via 169.254.2.22 dev $rp12
163         ip nexthop add id 102 via 169.254.3.23 dev $rp13
164         ip nexthop add id 103 group 101/102
165         ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103
166
167         ip nexthop add id 104 via fe80:2::22 dev $rp12
168         ip nexthop add id 105 via fe80:3::23 dev $rp13
169         ip nexthop add id 106 group 104/105
170         ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106
171
172         ip nexthop add id 201 via 169.254.2.12 dev $rp22
173         ip nexthop add id 202 via 169.254.3.13 dev $rp23
174         ip nexthop add id 203 group 201/202
175         ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203
176
177         ip nexthop add id 204 via fe80:2::12 dev $rp22
178         ip nexthop add id 205 via fe80:3::13 dev $rp23
179         ip nexthop add id 206 group 204/205
180         ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206
181 }
182
183 multipath4_test()
184 {
185         local desc="$1"
186         local weight_rp12=$2
187         local weight_rp13=$3
188         local t0_rp12 t0_rp13 t1_rp12 t1_rp13
189         local packets_rp12 packets_rp13
190
191         # Transmit multiple flows from h1 to h2 and make sure they are
192         # distributed between both multipath links (rp12 and rp13)
193         # according to the configured weights.
194         sysctl_set net.ipv4.fib_multipath_hash_policy 1
195         ip nexthop replace id 103 group 101,$weight_rp12/102,$weight_rp13
196
197         t0_rp12=$(link_stats_tx_packets_get $rp12)
198         t0_rp13=$(link_stats_tx_packets_get $rp13)
199
200         ip vrf exec vrf-h1 $MZ -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
201                 -d 1msec -t udp "sp=1024,dp=0-32768"
202
203         t1_rp12=$(link_stats_tx_packets_get $rp12)
204         t1_rp13=$(link_stats_tx_packets_get $rp13)
205
206         let "packets_rp12 = $t1_rp12 - $t0_rp12"
207         let "packets_rp13 = $t1_rp13 - $t0_rp13"
208         multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
209
210         # Restore settings.
211         ip nexthop replace id 103 group 101/102
212         sysctl_restore net.ipv4.fib_multipath_hash_policy
213 }
214
215 multipath6_l4_test()
216 {
217         local desc="$1"
218         local weight_rp12=$2
219         local weight_rp13=$3
220         local t0_rp12 t0_rp13 t1_rp12 t1_rp13
221         local packets_rp12 packets_rp13
222
223         # Transmit multiple flows from h1 to h2 and make sure they are
224         # distributed between both multipath links (rp12 and rp13)
225         # according to the configured weights.
226         sysctl_set net.ipv6.fib_multipath_hash_policy 1
227
228         ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13
229
230         t0_rp12=$(link_stats_tx_packets_get $rp12)
231         t0_rp13=$(link_stats_tx_packets_get $rp13)
232
233         $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
234                 -d 1msec -t udp "sp=1024,dp=0-32768"
235
236         t1_rp12=$(link_stats_tx_packets_get $rp12)
237         t1_rp13=$(link_stats_tx_packets_get $rp13)
238
239         let "packets_rp12 = $t1_rp12 - $t0_rp12"
240         let "packets_rp13 = $t1_rp13 - $t0_rp13"
241         multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
242
243         ip nexthop replace id 106 group 104/105
244
245         sysctl_restore net.ipv6.fib_multipath_hash_policy
246 }
247
248 multipath6_test()
249 {
250         local desc="$1"
251         local weight_rp12=$2
252         local weight_rp13=$3
253         local t0_rp12 t0_rp13 t1_rp12 t1_rp13
254         local packets_rp12 packets_rp13
255
256         ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13
257
258         t0_rp12=$(link_stats_tx_packets_get $rp12)
259         t0_rp13=$(link_stats_tx_packets_get $rp13)
260
261         # Generate 16384 echo requests, each with a random flow label.
262         for _ in $(seq 1 16384); do
263                 ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1
264         done
265
266         t1_rp12=$(link_stats_tx_packets_get $rp12)
267         t1_rp13=$(link_stats_tx_packets_get $rp13)
268
269         let "packets_rp12 = $t1_rp12 - $t0_rp12"
270         let "packets_rp13 = $t1_rp13 - $t0_rp13"
271         multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
272
273         ip nexthop replace id 106 group 104/105
274 }
275
276 multipath_test()
277 {
278         log_info "Running IPv4 multipath tests"
279         multipath4_test "ECMP" 1 1
280         multipath4_test "Weighted MP 2:1" 2 1
281         multipath4_test "Weighted MP 11:45" 11 45
282
283         log_info "Running IPv6 multipath tests"
284         multipath6_test "ECMP" 1 1
285         multipath6_test "Weighted MP 2:1" 2 1
286         multipath6_test "Weighted MP 11:45" 11 45
287
288         log_info "Running IPv6 L4 hash multipath tests"
289         multipath6_l4_test "ECMP" 1 1
290         multipath6_l4_test "Weighted MP 2:1" 2 1
291         multipath6_l4_test "Weighted MP 11:45" 11 45
292 }
293
294 setup_prepare()
295 {
296         h1=${NETIFS[p1]}
297         rp11=${NETIFS[p2]}
298
299         rp12=${NETIFS[p3]}
300         rp22=${NETIFS[p4]}
301
302         rp13=${NETIFS[p5]}
303         rp23=${NETIFS[p6]}
304
305         rp21=${NETIFS[p7]}
306         h2=${NETIFS[p8]}
307
308         vrf_prepare
309
310         h1_create
311         h2_create
312
313         router1_create
314         router2_create
315         routing_nh_obj
316
317         forwarding_enable
318 }
319
320 cleanup()
321 {
322         pre_cleanup
323
324         forwarding_restore
325
326         router2_destroy
327         router1_destroy
328
329         h2_destroy
330         h1_destroy
331
332         vrf_cleanup
333 }
334
335 ping_ipv4()
336 {
337         ping_test $h1 198.51.100.2
338 }
339
340 ping_ipv6()
341 {
342         ping6_test $h1 2001:db8:2::2
343 }
344
345 ip nexthop ls >/dev/null 2>&1
346 if [ $? -ne 0 ]; then
347         echo "Nexthop objects not supported; skipping tests"
348         exit 0
349 fi
350
351 trap cleanup EXIT
352
353 setup_prepare
354 setup_wait
355 routing_nh_obj
356
357 tests_run
358
359 exit $EXIT_STATUS