0001
0002
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
0200
0201
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
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
0230
0231
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
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
0278
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
0304
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