Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 ALL_TESTS="
0005         ping_ipv4
0006         ping_ipv6
0007         multipath_test
0008 "
0009 NUM_NETIFS=8
0010 source lib.sh
0011 
0012 h1_create()
0013 {
0014         vrf_create "vrf-h1"
0015         ip link set dev $h1 master vrf-h1
0016 
0017         ip link set dev vrf-h1 up
0018         ip link set dev $h1 up
0019 
0020         ip address add 192.0.2.2/24 dev $h1
0021         ip address add 2001:db8:1::2/64 dev $h1
0022 
0023         ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
0024         ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
0025 }
0026 
0027 h1_destroy()
0028 {
0029         ip route del 2001:db8:2::/64 vrf vrf-h1
0030         ip route del 198.51.100.0/24 vrf vrf-h1
0031 
0032         ip address del 2001:db8:1::2/64 dev $h1
0033         ip address del 192.0.2.2/24 dev $h1
0034 
0035         ip link set dev $h1 down
0036         vrf_destroy "vrf-h1"
0037 }
0038 
0039 h2_create()
0040 {
0041         vrf_create "vrf-h2"
0042         ip link set dev $h2 master vrf-h2
0043 
0044         ip link set dev vrf-h2 up
0045         ip link set dev $h2 up
0046 
0047         ip address add 198.51.100.2/24 dev $h2
0048         ip address add 2001:db8:2::2/64 dev $h2
0049 
0050         ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
0051         ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
0052 }
0053 
0054 h2_destroy()
0055 {
0056         ip route del 2001:db8:1::/64 vrf vrf-h2
0057         ip route del 192.0.2.0/24 vrf vrf-h2
0058 
0059         ip address del 2001:db8:2::2/64 dev $h2
0060         ip address del 198.51.100.2/24 dev $h2
0061 
0062         ip link set dev $h2 down
0063         vrf_destroy "vrf-h2"
0064 }
0065 
0066 router1_create()
0067 {
0068         vrf_create "vrf-r1"
0069         ip link set dev $rp11 master vrf-r1
0070         ip link set dev $rp12 master vrf-r1
0071         ip link set dev $rp13 master vrf-r1
0072 
0073         ip link set dev vrf-r1 up
0074         ip link set dev $rp11 up
0075         ip link set dev $rp12 up
0076         ip link set dev $rp13 up
0077 
0078         ip address add 192.0.2.1/24 dev $rp11
0079         ip address add 2001:db8:1::1/64 dev $rp11
0080 
0081         ip address add 169.254.2.12/24 dev $rp12
0082         ip address add fe80:2::12/64 dev $rp12
0083 
0084         ip address add 169.254.3.13/24 dev $rp13
0085         ip address add fe80:3::13/64 dev $rp13
0086 }
0087 
0088 router1_destroy()
0089 {
0090         ip route del 2001:db8:2::/64 vrf vrf-r1
0091         ip route del 198.51.100.0/24 vrf vrf-r1
0092 
0093         ip address del fe80:3::13/64 dev $rp13
0094         ip address del 169.254.3.13/24 dev $rp13
0095 
0096         ip address del fe80:2::12/64 dev $rp12
0097         ip address del 169.254.2.12/24 dev $rp12
0098 
0099         ip address del 2001:db8:1::1/64 dev $rp11
0100         ip address del 192.0.2.1/24 dev $rp11
0101 
0102         ip nexthop del id 103
0103         ip nexthop del id 101
0104         ip nexthop del id 102
0105         ip nexthop del id 106
0106         ip nexthop del id 104
0107         ip nexthop del id 105
0108 
0109         ip link set dev $rp13 down
0110         ip link set dev $rp12 down
0111         ip link set dev $rp11 down
0112 
0113         vrf_destroy "vrf-r1"
0114 }
0115 
0116 router2_create()
0117 {
0118         vrf_create "vrf-r2"
0119         ip link set dev $rp21 master vrf-r2
0120         ip link set dev $rp22 master vrf-r2
0121         ip link set dev $rp23 master vrf-r2
0122 
0123         ip link set dev vrf-r2 up
0124         ip link set dev $rp21 up
0125         ip link set dev $rp22 up
0126         ip link set dev $rp23 up
0127 
0128         ip address add 198.51.100.1/24 dev $rp21
0129         ip address add 2001:db8:2::1/64 dev $rp21
0130 
0131         ip address add 169.254.2.22/24 dev $rp22
0132         ip address add fe80:2::22/64 dev $rp22
0133 
0134         ip address add 169.254.3.23/24 dev $rp23
0135         ip address add fe80:3::23/64 dev $rp23
0136 }
0137 
0138 router2_destroy()
0139 {
0140         ip route del 2001:db8:1::/64 vrf vrf-r2
0141         ip route del 192.0.2.0/24 vrf vrf-r2
0142 
0143         ip address del fe80:3::23/64 dev $rp23
0144         ip address del 169.254.3.23/24 dev $rp23
0145 
0146         ip address del fe80:2::22/64 dev $rp22
0147         ip address del 169.254.2.22/24 dev $rp22
0148 
0149         ip address del 2001:db8:2::1/64 dev $rp21
0150         ip address del 198.51.100.1/24 dev $rp21
0151 
0152         ip nexthop del id 201
0153         ip nexthop del id 202
0154         ip nexthop del id 204
0155         ip nexthop del id 205
0156 
0157         ip link set dev $rp23 down
0158         ip link set dev $rp22 down
0159         ip link set dev $rp21 down
0160 
0161         vrf_destroy "vrf-r2"
0162 }
0163 
0164 routing_nh_obj()
0165 {
0166         ip nexthop add id 101 via 169.254.2.22 dev $rp12
0167         ip nexthop add id 102 via 169.254.3.23 dev $rp13
0168         ip nexthop add id 103 group 101/102 type resilient buckets 512 \
0169                 idle_timer 0
0170         ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103
0171 
0172         ip nexthop add id 104 via fe80:2::22 dev $rp12
0173         ip nexthop add id 105 via fe80:3::23 dev $rp13
0174         ip nexthop add id 106 group 104/105 type resilient buckets 512 \
0175                 idle_timer 0
0176         ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106
0177 
0178         ip nexthop add id 201 via 169.254.2.12 dev $rp22
0179         ip nexthop add id 202 via 169.254.3.13 dev $rp23
0180         ip nexthop add id 203 group 201/202 type resilient buckets 512 \
0181                 idle_timer 0
0182         ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203
0183 
0184         ip nexthop add id 204 via fe80:2::12 dev $rp22
0185         ip nexthop add id 205 via fe80:3::13 dev $rp23
0186         ip nexthop add id 206 group 204/205 type resilient buckets 512 \
0187                 idle_timer 0
0188         ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206
0189 }
0190 
0191 multipath4_test()
0192 {
0193         local desc="$1"
0194         local weight_rp12=$2
0195         local weight_rp13=$3
0196         local t0_rp12 t0_rp13 t1_rp12 t1_rp13
0197         local packets_rp12 packets_rp13
0198 
0199         # Transmit multiple flows from h1 to h2 and make sure they are
0200         # distributed between both multipath links (rp12 and rp13)
0201         # according to the provided weights.
0202         sysctl_set net.ipv4.fib_multipath_hash_policy 1
0203 
0204         t0_rp12=$(link_stats_tx_packets_get $rp12)
0205         t0_rp13=$(link_stats_tx_packets_get $rp13)
0206 
0207         ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
0208                 -d 1msec -t udp "sp=1024,dp=0-32768"
0209 
0210         t1_rp12=$(link_stats_tx_packets_get $rp12)
0211         t1_rp13=$(link_stats_tx_packets_get $rp13)
0212 
0213         let "packets_rp12 = $t1_rp12 - $t0_rp12"
0214         let "packets_rp13 = $t1_rp13 - $t0_rp13"
0215         multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
0216 
0217         # Restore settings.
0218         sysctl_restore net.ipv4.fib_multipath_hash_policy
0219 }
0220 
0221 multipath6_l4_test()
0222 {
0223         local desc="$1"
0224         local weight_rp12=$2
0225         local weight_rp13=$3
0226         local t0_rp12 t0_rp13 t1_rp12 t1_rp13
0227         local packets_rp12 packets_rp13
0228 
0229         # Transmit multiple flows from h1 to h2 and make sure they are
0230         # distributed between both multipath links (rp12 and rp13)
0231         # according to the provided weights.
0232         sysctl_set net.ipv6.fib_multipath_hash_policy 1
0233 
0234         t0_rp12=$(link_stats_tx_packets_get $rp12)
0235         t0_rp13=$(link_stats_tx_packets_get $rp13)
0236 
0237         $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
0238                 -d 1msec -t udp "sp=1024,dp=0-32768"
0239 
0240         t1_rp12=$(link_stats_tx_packets_get $rp12)
0241         t1_rp13=$(link_stats_tx_packets_get $rp13)
0242 
0243         let "packets_rp12 = $t1_rp12 - $t0_rp12"
0244         let "packets_rp13 = $t1_rp13 - $t0_rp13"
0245         multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
0246 
0247         sysctl_restore net.ipv6.fib_multipath_hash_policy
0248 }
0249 
0250 multipath_test()
0251 {
0252         # Without an idle timer, weight replacement should happen immediately.
0253         log_info "Running multipath tests without an idle timer"
0254         ip nexthop replace id 103 group 101/102 type resilient idle_timer 0
0255         ip nexthop replace id 106 group 104/105 type resilient idle_timer 0
0256 
0257         log_info "Running IPv4 multipath tests"
0258         ip nexthop replace id 103 group 101,1/102,1 type resilient
0259         multipath4_test "ECMP" 1 1
0260         ip nexthop replace id 103 group 101,2/102,1 type resilient
0261         multipath4_test "Weighted MP 2:1" 2 1
0262         ip nexthop replace id 103 group 101,11/102,45 type resilient
0263         multipath4_test "Weighted MP 11:45" 11 45
0264 
0265         ip nexthop replace id 103 group 101,1/102,1 type resilient
0266 
0267         log_info "Running IPv6 L4 hash multipath tests"
0268         ip nexthop replace id 106 group 104,1/105,1 type resilient
0269         multipath6_l4_test "ECMP" 1 1
0270         ip nexthop replace id 106 group 104,2/105,1 type resilient
0271         multipath6_l4_test "Weighted MP 2:1" 2 1
0272         ip nexthop replace id 106 group 104,11/105,45 type resilient
0273         multipath6_l4_test "Weighted MP 11:45" 11 45
0274 
0275         ip nexthop replace id 106 group 104,1/105,1 type resilient
0276 
0277         # With an idle timer, weight replacement should not happen, so the
0278         # expected ratio should always be the initial one (1:1).
0279         log_info "Running multipath tests with an idle timer of 120 seconds"
0280         ip nexthop replace id 103 group 101/102 type resilient idle_timer 120
0281         ip nexthop replace id 106 group 104/105 type resilient idle_timer 120
0282 
0283         log_info "Running IPv4 multipath tests"
0284         ip nexthop replace id 103 group 101,1/102,1 type resilient
0285         multipath4_test "ECMP" 1 1
0286         ip nexthop replace id 103 group 101,2/102,1 type resilient
0287         multipath4_test "Weighted MP 2:1" 1 1
0288         ip nexthop replace id 103 group 101,11/102,45 type resilient
0289         multipath4_test "Weighted MP 11:45" 1 1
0290 
0291         ip nexthop replace id 103 group 101,1/102,1 type resilient
0292 
0293         log_info "Running IPv6 L4 hash multipath tests"
0294         ip nexthop replace id 106 group 104,1/105,1 type resilient
0295         multipath6_l4_test "ECMP" 1 1
0296         ip nexthop replace id 106 group 104,2/105,1 type resilient
0297         multipath6_l4_test "Weighted MP 2:1" 1 1
0298         ip nexthop replace id 106 group 104,11/105,45 type resilient
0299         multipath6_l4_test "Weighted MP 11:45" 1 1
0300 
0301         ip nexthop replace id 106 group 104,1/105,1 type resilient
0302 
0303         # With a short idle timer and enough idle time, weight replacement
0304         # should happen.
0305         log_info "Running multipath tests with an idle timer of 5 seconds"
0306         ip nexthop replace id 103 group 101/102 type resilient idle_timer 5
0307         ip nexthop replace id 106 group 104/105 type resilient idle_timer 5
0308 
0309         log_info "Running IPv4 multipath tests"
0310         sleep 10
0311         ip nexthop replace id 103 group 101,1/102,1 type resilient
0312         multipath4_test "ECMP" 1 1
0313         sleep 10
0314         ip nexthop replace id 103 group 101,2/102,1 type resilient
0315         multipath4_test "Weighted MP 2:1" 2 1
0316         sleep 10
0317         ip nexthop replace id 103 group 101,11/102,45 type resilient
0318         multipath4_test "Weighted MP 11:45" 11 45
0319 
0320         ip nexthop replace id 103 group 101,1/102,1 type resilient
0321 
0322         log_info "Running IPv6 L4 hash multipath tests"
0323         sleep 10
0324         ip nexthop replace id 106 group 104,1/105,1 type resilient
0325         multipath6_l4_test "ECMP" 1 1
0326         sleep 10
0327         ip nexthop replace id 106 group 104,2/105,1 type resilient
0328         multipath6_l4_test "Weighted MP 2:1" 2 1
0329         sleep 10
0330         ip nexthop replace id 106 group 104,11/105,45 type resilient
0331         multipath6_l4_test "Weighted MP 11:45" 11 45
0332 
0333         ip nexthop replace id 106 group 104,1/105,1 type resilient
0334 }
0335 
0336 setup_prepare()
0337 {
0338         h1=${NETIFS[p1]}
0339         rp11=${NETIFS[p2]}
0340 
0341         rp12=${NETIFS[p3]}
0342         rp22=${NETIFS[p4]}
0343 
0344         rp13=${NETIFS[p5]}
0345         rp23=${NETIFS[p6]}
0346 
0347         rp21=${NETIFS[p7]}
0348         h2=${NETIFS[p8]}
0349 
0350         vrf_prepare
0351 
0352         h1_create
0353         h2_create
0354 
0355         router1_create
0356         router2_create
0357 
0358         forwarding_enable
0359 }
0360 
0361 cleanup()
0362 {
0363         pre_cleanup
0364 
0365         forwarding_restore
0366 
0367         router2_destroy
0368         router1_destroy
0369 
0370         h2_destroy
0371         h1_destroy
0372 
0373         vrf_cleanup
0374 }
0375 
0376 ping_ipv4()
0377 {
0378         ping_test $h1 198.51.100.2
0379 }
0380 
0381 ping_ipv6()
0382 {
0383         ping6_test $h1 2001:db8:2::2
0384 }
0385 
0386 ip nexthop ls >/dev/null 2>&1
0387 if [ $? -ne 0 ]; then
0388         echo "Nexthop objects not supported; skipping tests"
0389         exit $ksft_skip
0390 fi
0391 
0392 trap cleanup EXIT
0393 
0394 setup_prepare
0395 setup_wait
0396 routing_nh_obj
0397 
0398 tests_run
0399 
0400 exit $EXIT_STATUS