0001
0002
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
0171
0172
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
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
0207
0208
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
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