1937eeb34SIdo Schimmel#!/bin/bash
2937eeb34SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3937eeb34SIdo Schimmel
40eb8053cSIdo SchimmelALL_TESTS="ping_ipv4 ping_ipv6 multipath_test"
5937eeb34SIdo SchimmelNUM_NETIFS=8
6937eeb34SIdo Schimmelsource lib.sh
7937eeb34SIdo Schimmel
8937eeb34SIdo Schimmelh1_create()
9937eeb34SIdo Schimmel{
10937eeb34SIdo Schimmel	vrf_create "vrf-h1"
11937eeb34SIdo Schimmel	ip link set dev $h1 master vrf-h1
12937eeb34SIdo Schimmel
13937eeb34SIdo Schimmel	ip link set dev vrf-h1 up
14937eeb34SIdo Schimmel	ip link set dev $h1 up
15937eeb34SIdo Schimmel
16937eeb34SIdo Schimmel	ip address add 192.0.2.2/24 dev $h1
17937eeb34SIdo Schimmel	ip address add 2001:db8:1::2/64 dev $h1
18937eeb34SIdo Schimmel
19937eeb34SIdo Schimmel	ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
20937eeb34SIdo Schimmel	ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
21937eeb34SIdo Schimmel}
22937eeb34SIdo Schimmel
23937eeb34SIdo Schimmelh1_destroy()
24937eeb34SIdo Schimmel{
25937eeb34SIdo Schimmel	ip route del 2001:db8:2::/64 vrf vrf-h1
26937eeb34SIdo Schimmel	ip route del 198.51.100.0/24 vrf vrf-h1
27937eeb34SIdo Schimmel
28937eeb34SIdo Schimmel	ip address del 2001:db8:1::2/64 dev $h1
29937eeb34SIdo Schimmel	ip address del 192.0.2.2/24 dev $h1
30937eeb34SIdo Schimmel
31937eeb34SIdo Schimmel	ip link set dev $h1 down
32937eeb34SIdo Schimmel	vrf_destroy "vrf-h1"
33937eeb34SIdo Schimmel}
34937eeb34SIdo Schimmel
35937eeb34SIdo Schimmelh2_create()
36937eeb34SIdo Schimmel{
37937eeb34SIdo Schimmel	vrf_create "vrf-h2"
38937eeb34SIdo Schimmel	ip link set dev $h2 master vrf-h2
39937eeb34SIdo Schimmel
40937eeb34SIdo Schimmel	ip link set dev vrf-h2 up
41937eeb34SIdo Schimmel	ip link set dev $h2 up
42937eeb34SIdo Schimmel
43937eeb34SIdo Schimmel	ip address add 198.51.100.2/24 dev $h2
44937eeb34SIdo Schimmel	ip address add 2001:db8:2::2/64 dev $h2
45937eeb34SIdo Schimmel
46937eeb34SIdo Schimmel	ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
47937eeb34SIdo Schimmel	ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
48937eeb34SIdo Schimmel}
49937eeb34SIdo Schimmel
50937eeb34SIdo Schimmelh2_destroy()
51937eeb34SIdo Schimmel{
52937eeb34SIdo Schimmel	ip route del 2001:db8:1::/64 vrf vrf-h2
53937eeb34SIdo Schimmel	ip route del 192.0.2.0/24 vrf vrf-h2
54937eeb34SIdo Schimmel
55937eeb34SIdo Schimmel	ip address del 2001:db8:2::2/64 dev $h2
56937eeb34SIdo Schimmel	ip address del 198.51.100.2/24 dev $h2
57937eeb34SIdo Schimmel
58937eeb34SIdo Schimmel	ip link set dev $h2 down
59937eeb34SIdo Schimmel	vrf_destroy "vrf-h2"
60937eeb34SIdo Schimmel}
61937eeb34SIdo Schimmel
62937eeb34SIdo Schimmelrouter1_create()
63937eeb34SIdo Schimmel{
64937eeb34SIdo Schimmel	vrf_create "vrf-r1"
65937eeb34SIdo Schimmel	ip link set dev $rp11 master vrf-r1
66937eeb34SIdo Schimmel	ip link set dev $rp12 master vrf-r1
67937eeb34SIdo Schimmel	ip link set dev $rp13 master vrf-r1
68937eeb34SIdo Schimmel
69937eeb34SIdo Schimmel	ip link set dev vrf-r1 up
70937eeb34SIdo Schimmel	ip link set dev $rp11 up
71937eeb34SIdo Schimmel	ip link set dev $rp12 up
72937eeb34SIdo Schimmel	ip link set dev $rp13 up
73937eeb34SIdo Schimmel
74937eeb34SIdo Schimmel	ip address add 192.0.2.1/24 dev $rp11
75937eeb34SIdo Schimmel	ip address add 2001:db8:1::1/64 dev $rp11
76937eeb34SIdo Schimmel
77937eeb34SIdo Schimmel	ip address add 169.254.2.12/24 dev $rp12
78937eeb34SIdo Schimmel	ip address add fe80:2::12/64 dev $rp12
79937eeb34SIdo Schimmel
80937eeb34SIdo Schimmel	ip address add 169.254.3.13/24 dev $rp13
81937eeb34SIdo Schimmel	ip address add fe80:3::13/64 dev $rp13
82937eeb34SIdo Schimmel
83937eeb34SIdo Schimmel	ip route add 198.51.100.0/24 vrf vrf-r1 \
84937eeb34SIdo Schimmel		nexthop via 169.254.2.22 dev $rp12 \
85937eeb34SIdo Schimmel		nexthop via 169.254.3.23 dev $rp13
86937eeb34SIdo Schimmel	ip route add 2001:db8:2::/64 vrf vrf-r1 \
87937eeb34SIdo Schimmel		nexthop via fe80:2::22 dev $rp12 \
88937eeb34SIdo Schimmel		nexthop via fe80:3::23 dev $rp13
89937eeb34SIdo Schimmel}
90937eeb34SIdo Schimmel
91937eeb34SIdo Schimmelrouter1_destroy()
92937eeb34SIdo Schimmel{
93937eeb34SIdo Schimmel	ip route del 2001:db8:2::/64 vrf vrf-r1
94937eeb34SIdo Schimmel	ip route del 198.51.100.0/24 vrf vrf-r1
95937eeb34SIdo Schimmel
96937eeb34SIdo Schimmel	ip address del fe80:3::13/64 dev $rp13
97937eeb34SIdo Schimmel	ip address del 169.254.3.13/24 dev $rp13
98937eeb34SIdo Schimmel
99937eeb34SIdo Schimmel	ip address del fe80:2::12/64 dev $rp12
100937eeb34SIdo Schimmel	ip address del 169.254.2.12/24 dev $rp12
101937eeb34SIdo Schimmel
102937eeb34SIdo Schimmel	ip address del 2001:db8:1::1/64 dev $rp11
103937eeb34SIdo Schimmel	ip address del 192.0.2.1/24 dev $rp11
104937eeb34SIdo Schimmel
105937eeb34SIdo Schimmel	ip link set dev $rp13 down
106937eeb34SIdo Schimmel	ip link set dev $rp12 down
107937eeb34SIdo Schimmel	ip link set dev $rp11 down
108937eeb34SIdo Schimmel
109937eeb34SIdo Schimmel	vrf_destroy "vrf-r1"
110937eeb34SIdo Schimmel}
111937eeb34SIdo Schimmel
112937eeb34SIdo Schimmelrouter2_create()
113937eeb34SIdo Schimmel{
114937eeb34SIdo Schimmel	vrf_create "vrf-r2"
115937eeb34SIdo Schimmel	ip link set dev $rp21 master vrf-r2
116937eeb34SIdo Schimmel	ip link set dev $rp22 master vrf-r2
117937eeb34SIdo Schimmel	ip link set dev $rp23 master vrf-r2
118937eeb34SIdo Schimmel
119937eeb34SIdo Schimmel	ip link set dev vrf-r2 up
120937eeb34SIdo Schimmel	ip link set dev $rp21 up
121937eeb34SIdo Schimmel	ip link set dev $rp22 up
122937eeb34SIdo Schimmel	ip link set dev $rp23 up
123937eeb34SIdo Schimmel
124937eeb34SIdo Schimmel	ip address add 198.51.100.1/24 dev $rp21
125937eeb34SIdo Schimmel	ip address add 2001:db8:2::1/64 dev $rp21
126937eeb34SIdo Schimmel
127937eeb34SIdo Schimmel	ip address add 169.254.2.22/24 dev $rp22
128937eeb34SIdo Schimmel	ip address add fe80:2::22/64 dev $rp22
129937eeb34SIdo Schimmel
130937eeb34SIdo Schimmel	ip address add 169.254.3.23/24 dev $rp23
131937eeb34SIdo Schimmel	ip address add fe80:3::23/64 dev $rp23
132937eeb34SIdo Schimmel
133937eeb34SIdo Schimmel	ip route add 192.0.2.0/24 vrf vrf-r2 \
134937eeb34SIdo Schimmel		nexthop via 169.254.2.12 dev $rp22 \
135937eeb34SIdo Schimmel		nexthop via 169.254.3.13 dev $rp23
136937eeb34SIdo Schimmel	ip route add 2001:db8:1::/64 vrf vrf-r2 \
137937eeb34SIdo Schimmel		nexthop via fe80:2::12 dev $rp22 \
138937eeb34SIdo Schimmel		nexthop via fe80:3::13 dev $rp23
139937eeb34SIdo Schimmel}
140937eeb34SIdo Schimmel
141937eeb34SIdo Schimmelrouter2_destroy()
142937eeb34SIdo Schimmel{
143937eeb34SIdo Schimmel	ip route del 2001:db8:1::/64 vrf vrf-r2
144937eeb34SIdo Schimmel	ip route del 192.0.2.0/24 vrf vrf-r2
145937eeb34SIdo Schimmel
146937eeb34SIdo Schimmel	ip address del fe80:3::23/64 dev $rp23
147937eeb34SIdo Schimmel	ip address del 169.254.3.23/24 dev $rp23
148937eeb34SIdo Schimmel
149937eeb34SIdo Schimmel	ip address del fe80:2::22/64 dev $rp22
150937eeb34SIdo Schimmel	ip address del 169.254.2.22/24 dev $rp22
151937eeb34SIdo Schimmel
152937eeb34SIdo Schimmel	ip address del 2001:db8:2::1/64 dev $rp21
153937eeb34SIdo Schimmel	ip address del 198.51.100.1/24 dev $rp21
154937eeb34SIdo Schimmel
155937eeb34SIdo Schimmel	ip link set dev $rp23 down
156937eeb34SIdo Schimmel	ip link set dev $rp22 down
157937eeb34SIdo Schimmel	ip link set dev $rp21 down
158937eeb34SIdo Schimmel
159937eeb34SIdo Schimmel	vrf_destroy "vrf-r2"
160937eeb34SIdo Schimmel}
161937eeb34SIdo Schimmel
1623d578d87SIdo Schimmelmultipath4_test()
1633d578d87SIdo Schimmel{
16436b4c0adSDavid Ahern       local desc="$1"
16536b4c0adSDavid Ahern       local weight_rp12=$2
16636b4c0adSDavid Ahern       local weight_rp13=$3
1673d578d87SIdo Schimmel       local t0_rp12 t0_rp13 t1_rp12 t1_rp13
1683d578d87SIdo Schimmel       local packets_rp12 packets_rp13
1693d578d87SIdo Schimmel
1703d578d87SIdo Schimmel       # Transmit multiple flows from h1 to h2 and make sure they are
1713d578d87SIdo Schimmel       # distributed between both multipath links (rp12 and rp13)
1723d578d87SIdo Schimmel       # according to the configured weights.
173d51d10aaSPetr Machata       sysctl_set net.ipv4.fib_multipath_hash_policy 1
1743d578d87SIdo Schimmel       ip route replace 198.51.100.0/24 vrf vrf-r1 \
1753d578d87SIdo Schimmel               nexthop via 169.254.2.22 dev $rp12 weight $weight_rp12 \
1763d578d87SIdo Schimmel               nexthop via 169.254.3.23 dev $rp13 weight $weight_rp13
1773d578d87SIdo Schimmel
1783d578d87SIdo Schimmel       t0_rp12=$(link_stats_tx_packets_get $rp12)
1793d578d87SIdo Schimmel       t0_rp13=$(link_stats_tx_packets_get $rp13)
1803d578d87SIdo Schimmel
181*11df27f7SDanielle Ratson       ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
1823d578d87SIdo Schimmel	       -d 1msec -t udp "sp=1024,dp=0-32768"
1833d578d87SIdo Schimmel
1843d578d87SIdo Schimmel       t1_rp12=$(link_stats_tx_packets_get $rp12)
1853d578d87SIdo Schimmel       t1_rp13=$(link_stats_tx_packets_get $rp13)
1863d578d87SIdo Schimmel
1873d578d87SIdo Schimmel       let "packets_rp12 = $t1_rp12 - $t0_rp12"
1883d578d87SIdo Schimmel       let "packets_rp13 = $t1_rp13 - $t0_rp13"
18936b4c0adSDavid Ahern       multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
1903d578d87SIdo Schimmel
1913d578d87SIdo Schimmel       # Restore settings.
1923d578d87SIdo Schimmel       ip route replace 198.51.100.0/24 vrf vrf-r1 \
1933d578d87SIdo Schimmel               nexthop via 169.254.2.22 dev $rp12 \
1943d578d87SIdo Schimmel               nexthop via 169.254.3.23 dev $rp13
195d51d10aaSPetr Machata       sysctl_restore net.ipv4.fib_multipath_hash_policy
1963d578d87SIdo Schimmel}
1973d578d87SIdo Schimmel
19891a5c1ecSDavid Ahernmultipath6_l4_test()
19991a5c1ecSDavid Ahern{
20091a5c1ecSDavid Ahern       local desc="$1"
20191a5c1ecSDavid Ahern       local weight_rp12=$2
20291a5c1ecSDavid Ahern       local weight_rp13=$3
20391a5c1ecSDavid Ahern       local t0_rp12 t0_rp13 t1_rp12 t1_rp13
20491a5c1ecSDavid Ahern       local packets_rp12 packets_rp13
20591a5c1ecSDavid Ahern
20691a5c1ecSDavid Ahern       # Transmit multiple flows from h1 to h2 and make sure they are
20791a5c1ecSDavid Ahern       # distributed between both multipath links (rp12 and rp13)
20891a5c1ecSDavid Ahern       # according to the configured weights.
209d51d10aaSPetr Machata       sysctl_set net.ipv6.fib_multipath_hash_policy 1
21091a5c1ecSDavid Ahern
21191a5c1ecSDavid Ahern       ip route replace 2001:db8:2::/64 vrf vrf-r1 \
21291a5c1ecSDavid Ahern	       nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
21391a5c1ecSDavid Ahern	       nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
21491a5c1ecSDavid Ahern
21591a5c1ecSDavid Ahern       t0_rp12=$(link_stats_tx_packets_get $rp12)
21691a5c1ecSDavid Ahern       t0_rp13=$(link_stats_tx_packets_get $rp13)
21791a5c1ecSDavid Ahern
21891a5c1ecSDavid Ahern       $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
21991a5c1ecSDavid Ahern	       -d 1msec -t udp "sp=1024,dp=0-32768"
22091a5c1ecSDavid Ahern
22191a5c1ecSDavid Ahern       t1_rp12=$(link_stats_tx_packets_get $rp12)
22291a5c1ecSDavid Ahern       t1_rp13=$(link_stats_tx_packets_get $rp13)
22391a5c1ecSDavid Ahern
22491a5c1ecSDavid Ahern       let "packets_rp12 = $t1_rp12 - $t0_rp12"
22591a5c1ecSDavid Ahern       let "packets_rp13 = $t1_rp13 - $t0_rp13"
22691a5c1ecSDavid Ahern       multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
22791a5c1ecSDavid Ahern
22891a5c1ecSDavid Ahern       ip route replace 2001:db8:2::/64 vrf vrf-r1 \
22991a5c1ecSDavid Ahern	       nexthop via fe80:2::22 dev $rp12 \
23091a5c1ecSDavid Ahern	       nexthop via fe80:3::23 dev $rp13
23191a5c1ecSDavid Ahern
232d51d10aaSPetr Machata       sysctl_restore net.ipv6.fib_multipath_hash_policy
23391a5c1ecSDavid Ahern}
23491a5c1ecSDavid Ahern
2354fb20ae1SIdo Schimmelmultipath6_test()
2364fb20ae1SIdo Schimmel{
23736b4c0adSDavid Ahern       local desc="$1"
23836b4c0adSDavid Ahern       local weight_rp12=$2
23936b4c0adSDavid Ahern       local weight_rp13=$3
2404fb20ae1SIdo Schimmel       local t0_rp12 t0_rp13 t1_rp12 t1_rp13
2414fb20ae1SIdo Schimmel       local packets_rp12 packets_rp13
2424fb20ae1SIdo Schimmel
2434fb20ae1SIdo Schimmel       ip route replace 2001:db8:2::/64 vrf vrf-r1 \
2444fb20ae1SIdo Schimmel	       nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
2454fb20ae1SIdo Schimmel	       nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
2464fb20ae1SIdo Schimmel
2474fb20ae1SIdo Schimmel       t0_rp12=$(link_stats_tx_packets_get $rp12)
2484fb20ae1SIdo Schimmel       t0_rp13=$(link_stats_tx_packets_get $rp13)
2494fb20ae1SIdo Schimmel
2504fb20ae1SIdo Schimmel       # Generate 16384 echo requests, each with a random flow label.
2514fb20ae1SIdo Schimmel       for _ in $(seq 1 16384); do
252993d337cSDavid Ahern	       ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q &> /dev/null
2534fb20ae1SIdo Schimmel       done
2544fb20ae1SIdo Schimmel
2554fb20ae1SIdo Schimmel       t1_rp12=$(link_stats_tx_packets_get $rp12)
2564fb20ae1SIdo Schimmel       t1_rp13=$(link_stats_tx_packets_get $rp13)
2574fb20ae1SIdo Schimmel
2584fb20ae1SIdo Schimmel       let "packets_rp12 = $t1_rp12 - $t0_rp12"
2594fb20ae1SIdo Schimmel       let "packets_rp13 = $t1_rp13 - $t0_rp13"
26036b4c0adSDavid Ahern       multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
2614fb20ae1SIdo Schimmel
2624fb20ae1SIdo Schimmel       ip route replace 2001:db8:2::/64 vrf vrf-r1 \
2634fb20ae1SIdo Schimmel	       nexthop via fe80:2::22 dev $rp12 \
2644fb20ae1SIdo Schimmel	       nexthop via fe80:3::23 dev $rp13
2654fb20ae1SIdo Schimmel}
2664fb20ae1SIdo Schimmel
2673d578d87SIdo Schimmelmultipath_test()
2683d578d87SIdo Schimmel{
2693d578d87SIdo Schimmel	log_info "Running IPv4 multipath tests"
27036b4c0adSDavid Ahern	multipath4_test "ECMP" 1 1
27136b4c0adSDavid Ahern	multipath4_test "Weighted MP 2:1" 2 1
27236b4c0adSDavid Ahern	multipath4_test "Weighted MP 11:45" 11 45
2734fb20ae1SIdo Schimmel
2744fb20ae1SIdo Schimmel	log_info "Running IPv6 multipath tests"
27536b4c0adSDavid Ahern	multipath6_test "ECMP" 1 1
27636b4c0adSDavid Ahern	multipath6_test "Weighted MP 2:1" 2 1
27736b4c0adSDavid Ahern	multipath6_test "Weighted MP 11:45" 11 45
27891a5c1ecSDavid Ahern
27991a5c1ecSDavid Ahern	log_info "Running IPv6 L4 hash multipath tests"
28091a5c1ecSDavid Ahern	multipath6_l4_test "ECMP" 1 1
28191a5c1ecSDavid Ahern	multipath6_l4_test "Weighted MP 2:1" 2 1
28291a5c1ecSDavid Ahern	multipath6_l4_test "Weighted MP 11:45" 11 45
2833d578d87SIdo Schimmel}
2843d578d87SIdo Schimmel
285937eeb34SIdo Schimmelsetup_prepare()
286937eeb34SIdo Schimmel{
287937eeb34SIdo Schimmel	h1=${NETIFS[p1]}
288937eeb34SIdo Schimmel	rp11=${NETIFS[p2]}
289937eeb34SIdo Schimmel
290937eeb34SIdo Schimmel	rp12=${NETIFS[p3]}
291937eeb34SIdo Schimmel	rp22=${NETIFS[p4]}
292937eeb34SIdo Schimmel
293937eeb34SIdo Schimmel	rp13=${NETIFS[p5]}
294937eeb34SIdo Schimmel	rp23=${NETIFS[p6]}
295937eeb34SIdo Schimmel
296937eeb34SIdo Schimmel	rp21=${NETIFS[p7]}
297937eeb34SIdo Schimmel	h2=${NETIFS[p8]}
298937eeb34SIdo Schimmel
299937eeb34SIdo Schimmel	vrf_prepare
300937eeb34SIdo Schimmel
301937eeb34SIdo Schimmel	h1_create
302937eeb34SIdo Schimmel	h2_create
303937eeb34SIdo Schimmel
304937eeb34SIdo Schimmel	router1_create
305937eeb34SIdo Schimmel	router2_create
306937eeb34SIdo Schimmel
307937eeb34SIdo Schimmel	forwarding_enable
308937eeb34SIdo Schimmel}
309937eeb34SIdo Schimmel
310937eeb34SIdo Schimmelcleanup()
311937eeb34SIdo Schimmel{
312937eeb34SIdo Schimmel	pre_cleanup
313937eeb34SIdo Schimmel
314937eeb34SIdo Schimmel	forwarding_restore
315937eeb34SIdo Schimmel
316937eeb34SIdo Schimmel	router2_destroy
317937eeb34SIdo Schimmel	router1_destroy
318937eeb34SIdo Schimmel
319937eeb34SIdo Schimmel	h2_destroy
320937eeb34SIdo Schimmel	h1_destroy
321937eeb34SIdo Schimmel
322937eeb34SIdo Schimmel	vrf_cleanup
323937eeb34SIdo Schimmel}
324937eeb34SIdo Schimmel
3250eb8053cSIdo Schimmelping_ipv4()
3260eb8053cSIdo Schimmel{
3270eb8053cSIdo Schimmel	ping_test $h1 198.51.100.2
3280eb8053cSIdo Schimmel}
3290eb8053cSIdo Schimmel
3300eb8053cSIdo Schimmelping_ipv6()
3310eb8053cSIdo Schimmel{
3320eb8053cSIdo Schimmel	ping6_test $h1 2001:db8:2::2
3330eb8053cSIdo Schimmel}
3340eb8053cSIdo Schimmel
335937eeb34SIdo Schimmeltrap cleanup EXIT
336937eeb34SIdo Schimmel
337937eeb34SIdo Schimmelsetup_prepare
338937eeb34SIdo Schimmelsetup_wait
339937eeb34SIdo Schimmel
3400eb8053cSIdo Schimmeltests_run
341937eeb34SIdo Schimmel
342937eeb34SIdo Schimmelexit $EXIT_STATUS
343