Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 ALL_TESTS="ping_ipv4 ping_ipv6 multipath_test"
0005 NUM_NETIFS=8
0006 source lib.sh
0007 
0008 h1_create()
0009 {
0010         vrf_create "vrf-h1"
0011         ip link set dev $h1 master vrf-h1
0012 
0013         ip link set dev vrf-h1 up
0014         ip link set dev $h1 up
0015 
0016         ip address add 192.0.2.2/24 dev $h1
0017         ip address add 2001:db8:1::2/64 dev $h1
0018 
0019         ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
0020         ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
0021 }
0022 
0023 h1_destroy()
0024 {
0025         ip route del 2001:db8:2::/64 vrf vrf-h1
0026         ip route del 198.51.100.0/24 vrf vrf-h1
0027 
0028         ip address del 2001:db8:1::2/64 dev $h1
0029         ip address del 192.0.2.2/24 dev $h1
0030 
0031         ip link set dev $h1 down
0032         vrf_destroy "vrf-h1"
0033 }
0034 
0035 h2_create()
0036 {
0037         vrf_create "vrf-h2"
0038         ip link set dev $h2 master vrf-h2
0039 
0040         ip link set dev vrf-h2 up
0041         ip link set dev $h2 up
0042 
0043         ip address add 198.51.100.2/24 dev $h2
0044         ip address add 2001:db8:2::2/64 dev $h2
0045 
0046         ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
0047         ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
0048 }
0049 
0050 h2_destroy()
0051 {
0052         ip route del 2001:db8:1::/64 vrf vrf-h2
0053         ip route del 192.0.2.0/24 vrf vrf-h2
0054 
0055         ip address del 2001:db8:2::2/64 dev $h2
0056         ip address del 198.51.100.2/24 dev $h2
0057 
0058         ip link set dev $h2 down
0059         vrf_destroy "vrf-h2"
0060 }
0061 
0062 router1_create()
0063 {
0064         vrf_create "vrf-r1"
0065         ip link set dev $rp11 master vrf-r1
0066         ip link set dev $rp12 master vrf-r1
0067         ip link set dev $rp13 master vrf-r1
0068 
0069         ip link set dev vrf-r1 up
0070         ip link set dev $rp11 up
0071         ip link set dev $rp12 up
0072         ip link set dev $rp13 up
0073 
0074         ip address add 192.0.2.1/24 dev $rp11
0075         ip address add 2001:db8:1::1/64 dev $rp11
0076 
0077         ip address add 169.254.2.12/24 dev $rp12
0078         ip address add fe80:2::12/64 dev $rp12
0079 
0080         ip address add 169.254.3.13/24 dev $rp13
0081         ip address add fe80:3::13/64 dev $rp13
0082 
0083         ip route add 198.51.100.0/24 vrf vrf-r1 \
0084                 nexthop via 169.254.2.22 dev $rp12 \
0085                 nexthop via 169.254.3.23 dev $rp13
0086         ip route add 2001:db8:2::/64 vrf vrf-r1 \
0087                 nexthop via fe80:2::22 dev $rp12 \
0088                 nexthop via fe80:3::23 dev $rp13
0089 }
0090 
0091 router1_destroy()
0092 {
0093         ip route del 2001:db8:2::/64 vrf vrf-r1
0094         ip route del 198.51.100.0/24 vrf vrf-r1
0095 
0096         ip address del fe80:3::13/64 dev $rp13
0097         ip address del 169.254.3.13/24 dev $rp13
0098 
0099         ip address del fe80:2::12/64 dev $rp12
0100         ip address del 169.254.2.12/24 dev $rp12
0101 
0102         ip address del 2001:db8:1::1/64 dev $rp11
0103         ip address del 192.0.2.1/24 dev $rp11
0104 
0105         ip link set dev $rp13 down
0106         ip link set dev $rp12 down
0107         ip link set dev $rp11 down
0108 
0109         vrf_destroy "vrf-r1"
0110 }
0111 
0112 router2_create()
0113 {
0114         vrf_create "vrf-r2"
0115         ip link set dev $rp21 master vrf-r2
0116         ip link set dev $rp22 master vrf-r2
0117         ip link set dev $rp23 master vrf-r2
0118 
0119         ip link set dev vrf-r2 up
0120         ip link set dev $rp21 up
0121         ip link set dev $rp22 up
0122         ip link set dev $rp23 up
0123 
0124         ip address add 198.51.100.1/24 dev $rp21
0125         ip address add 2001:db8:2::1/64 dev $rp21
0126 
0127         ip address add 169.254.2.22/24 dev $rp22
0128         ip address add fe80:2::22/64 dev $rp22
0129 
0130         ip address add 169.254.3.23/24 dev $rp23
0131         ip address add fe80:3::23/64 dev $rp23
0132 
0133         ip route add 192.0.2.0/24 vrf vrf-r2 \
0134                 nexthop via 169.254.2.12 dev $rp22 \
0135                 nexthop via 169.254.3.13 dev $rp23
0136         ip route add 2001:db8:1::/64 vrf vrf-r2 \
0137                 nexthop via fe80:2::12 dev $rp22 \
0138                 nexthop via fe80:3::13 dev $rp23
0139 }
0140 
0141 router2_destroy()
0142 {
0143         ip route del 2001:db8:1::/64 vrf vrf-r2
0144         ip route del 192.0.2.0/24 vrf vrf-r2
0145 
0146         ip address del fe80:3::23/64 dev $rp23
0147         ip address del 169.254.3.23/24 dev $rp23
0148 
0149         ip address del fe80:2::22/64 dev $rp22
0150         ip address del 169.254.2.22/24 dev $rp22
0151 
0152         ip address del 2001:db8:2::1/64 dev $rp21
0153         ip address del 198.51.100.1/24 dev $rp21
0154 
0155         ip link set dev $rp23 down
0156         ip link set dev $rp22 down
0157         ip link set dev $rp21 down
0158 
0159         vrf_destroy "vrf-r2"
0160 }
0161 
0162 multipath4_test()
0163 {
0164        local desc="$1"
0165        local weight_rp12=$2
0166        local weight_rp13=$3
0167        local t0_rp12 t0_rp13 t1_rp12 t1_rp13
0168        local packets_rp12 packets_rp13
0169 
0170        # Transmit multiple flows from h1 to h2 and make sure they are
0171        # distributed between both multipath links (rp12 and rp13)
0172        # according to the configured weights.
0173        sysctl_set net.ipv4.fib_multipath_hash_policy 1
0174        ip route replace 198.51.100.0/24 vrf vrf-r1 \
0175                nexthop via 169.254.2.22 dev $rp12 weight $weight_rp12 \
0176                nexthop via 169.254.3.23 dev $rp13 weight $weight_rp13
0177 
0178        t0_rp12=$(link_stats_tx_packets_get $rp12)
0179        t0_rp13=$(link_stats_tx_packets_get $rp13)
0180 
0181        ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
0182                -d 1msec -t udp "sp=1024,dp=0-32768"
0183 
0184        t1_rp12=$(link_stats_tx_packets_get $rp12)
0185        t1_rp13=$(link_stats_tx_packets_get $rp13)
0186 
0187        let "packets_rp12 = $t1_rp12 - $t0_rp12"
0188        let "packets_rp13 = $t1_rp13 - $t0_rp13"
0189        multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
0190 
0191        # Restore settings.
0192        ip route replace 198.51.100.0/24 vrf vrf-r1 \
0193                nexthop via 169.254.2.22 dev $rp12 \
0194                nexthop via 169.254.3.23 dev $rp13
0195        sysctl_restore net.ipv4.fib_multipath_hash_policy
0196 }
0197 
0198 multipath6_l4_test()
0199 {
0200        local desc="$1"
0201        local weight_rp12=$2
0202        local weight_rp13=$3
0203        local t0_rp12 t0_rp13 t1_rp12 t1_rp13
0204        local packets_rp12 packets_rp13
0205 
0206        # Transmit multiple flows from h1 to h2 and make sure they are
0207        # distributed between both multipath links (rp12 and rp13)
0208        # according to the configured weights.
0209        sysctl_set net.ipv6.fib_multipath_hash_policy 1
0210 
0211        ip route replace 2001:db8:2::/64 vrf vrf-r1 \
0212                nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
0213                nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
0214 
0215        t0_rp12=$(link_stats_tx_packets_get $rp12)
0216        t0_rp13=$(link_stats_tx_packets_get $rp13)
0217 
0218        $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
0219                -d 1msec -t udp "sp=1024,dp=0-32768"
0220 
0221        t1_rp12=$(link_stats_tx_packets_get $rp12)
0222        t1_rp13=$(link_stats_tx_packets_get $rp13)
0223 
0224        let "packets_rp12 = $t1_rp12 - $t0_rp12"
0225        let "packets_rp13 = $t1_rp13 - $t0_rp13"
0226        multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
0227 
0228        ip route replace 2001:db8:2::/64 vrf vrf-r1 \
0229                nexthop via fe80:2::22 dev $rp12 \
0230                nexthop via fe80:3::23 dev $rp13
0231 
0232        sysctl_restore net.ipv6.fib_multipath_hash_policy
0233 }
0234 
0235 multipath6_test()
0236 {
0237        local desc="$1"
0238        local weight_rp12=$2
0239        local weight_rp13=$3
0240        local t0_rp12 t0_rp13 t1_rp12 t1_rp13
0241        local packets_rp12 packets_rp13
0242 
0243        ip route replace 2001:db8:2::/64 vrf vrf-r1 \
0244                nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
0245                nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
0246 
0247        t0_rp12=$(link_stats_tx_packets_get $rp12)
0248        t0_rp13=$(link_stats_tx_packets_get $rp13)
0249 
0250        # Generate 16384 echo requests, each with a random flow label.
0251        for _ in $(seq 1 16384); do
0252                ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q &> /dev/null
0253        done
0254 
0255        t1_rp12=$(link_stats_tx_packets_get $rp12)
0256        t1_rp13=$(link_stats_tx_packets_get $rp13)
0257 
0258        let "packets_rp12 = $t1_rp12 - $t0_rp12"
0259        let "packets_rp13 = $t1_rp13 - $t0_rp13"
0260        multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
0261 
0262        ip route replace 2001:db8:2::/64 vrf vrf-r1 \
0263                nexthop via fe80:2::22 dev $rp12 \
0264                nexthop via fe80:3::23 dev $rp13
0265 }
0266 
0267 multipath_test()
0268 {
0269         log_info "Running IPv4 multipath tests"
0270         multipath4_test "ECMP" 1 1
0271         multipath4_test "Weighted MP 2:1" 2 1
0272         multipath4_test "Weighted MP 11:45" 11 45
0273 
0274         log_info "Running IPv6 multipath tests"
0275         multipath6_test "ECMP" 1 1
0276         multipath6_test "Weighted MP 2:1" 2 1
0277         multipath6_test "Weighted MP 11:45" 11 45
0278 
0279         log_info "Running IPv6 L4 hash multipath tests"
0280         multipath6_l4_test "ECMP" 1 1
0281         multipath6_l4_test "Weighted MP 2:1" 2 1
0282         multipath6_l4_test "Weighted MP 11:45" 11 45
0283 }
0284 
0285 setup_prepare()
0286 {
0287         h1=${NETIFS[p1]}
0288         rp11=${NETIFS[p2]}
0289 
0290         rp12=${NETIFS[p3]}
0291         rp22=${NETIFS[p4]}
0292 
0293         rp13=${NETIFS[p5]}
0294         rp23=${NETIFS[p6]}
0295 
0296         rp21=${NETIFS[p7]}
0297         h2=${NETIFS[p8]}
0298 
0299         vrf_prepare
0300 
0301         h1_create
0302         h2_create
0303 
0304         router1_create
0305         router2_create
0306 
0307         forwarding_enable
0308 }
0309 
0310 cleanup()
0311 {
0312         pre_cleanup
0313 
0314         forwarding_restore
0315 
0316         router2_destroy
0317         router1_destroy
0318 
0319         h2_destroy
0320         h1_destroy
0321 
0322         vrf_cleanup
0323 }
0324 
0325 ping_ipv4()
0326 {
0327         ping_test $h1 198.51.100.2
0328 }
0329 
0330 ping_ipv6()
0331 {
0332         ping6_test $h1 2001:db8:2::2
0333 }
0334 
0335 trap cleanup EXIT
0336 
0337 setup_prepare
0338 setup_wait
0339 
0340 tests_run
0341 
0342 exit $EXIT_STATUS