|
@@ -158,6 +158,82 @@ router2_destroy()
|
|
|
vrf_destroy "vrf-r2"
|
|
|
}
|
|
|
|
|
|
+multipath_eval()
|
|
|
+{
|
|
|
+ local weight_rp12=$1
|
|
|
+ local weight_rp13=$2
|
|
|
+ local packets_rp12=$3
|
|
|
+ local packets_rp13=$4
|
|
|
+ local weights_ratio packets_ratio diff
|
|
|
+
|
|
|
+ RET=0
|
|
|
+
|
|
|
+ if [[ "$weight_rp12" -gt "$weight_rp13" ]]; then
|
|
|
+ weights_ratio=$(echo "scale=2; $weight_rp12 / $weight_rp13" \
|
|
|
+ | bc -l)
|
|
|
+ packets_ratio=$(echo "scale=2; $packets_rp12 / $packets_rp13" \
|
|
|
+ | bc -l)
|
|
|
+ else
|
|
|
+ weights_ratio=$(echo "scale=2; $weight_rp13 / $weight_rp12" | \
|
|
|
+ bc -l)
|
|
|
+ packets_ratio=$(echo "scale=2; $packets_rp13 / $packets_rp12" | \
|
|
|
+ bc -l)
|
|
|
+ fi
|
|
|
+
|
|
|
+ diff=$(echo $weights_ratio - $packets_ratio | bc -l)
|
|
|
+ diff=${diff#-}
|
|
|
+
|
|
|
+ test "$(echo "$diff / $weights_ratio > 0.1" | bc -l)" -eq 0
|
|
|
+ check_err $? "Too large discrepancy between expected and measured ratios"
|
|
|
+ log_test "Multipath"
|
|
|
+ log_info "Expected ratio $weights_ratio Measured ratio $packets_ratio"
|
|
|
+}
|
|
|
+
|
|
|
+multipath4_test()
|
|
|
+{
|
|
|
+ local weight_rp12=$1
|
|
|
+ local weight_rp13=$2
|
|
|
+ local t0_rp12 t0_rp13 t1_rp12 t1_rp13
|
|
|
+ local packets_rp12 packets_rp13
|
|
|
+ local hash_policy
|
|
|
+
|
|
|
+ # Transmit multiple flows from h1 to h2 and make sure they are
|
|
|
+ # distributed between both multipath links (rp12 and rp13)
|
|
|
+ # according to the configured weights.
|
|
|
+ hash_policy=$(sysctl -n net.ipv4.fib_multipath_hash_policy)
|
|
|
+ sysctl -q -w net.ipv4.fib_multipath_hash_policy=1
|
|
|
+ ip route replace 198.51.100.0/24 vrf vrf-r1 \
|
|
|
+ nexthop via 169.254.2.22 dev $rp12 weight $weight_rp12 \
|
|
|
+ nexthop via 169.254.3.23 dev $rp13 weight $weight_rp13
|
|
|
+
|
|
|
+ t0_rp12=$(link_stats_tx_packets_get $rp12)
|
|
|
+ t0_rp13=$(link_stats_tx_packets_get $rp13)
|
|
|
+
|
|
|
+ ip vrf exec vrf-h1 $MZ -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
|
|
|
+ -d 1msec -t udp "sp=1024,dp=0-32768"
|
|
|
+
|
|
|
+ t1_rp12=$(link_stats_tx_packets_get $rp12)
|
|
|
+ t1_rp13=$(link_stats_tx_packets_get $rp13)
|
|
|
+
|
|
|
+ let "packets_rp12 = $t1_rp12 - $t0_rp12"
|
|
|
+ let "packets_rp13 = $t1_rp13 - $t0_rp13"
|
|
|
+ multipath_eval $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
|
|
|
+
|
|
|
+ # Restore settings.
|
|
|
+ ip route replace 198.51.100.0/24 vrf vrf-r1 \
|
|
|
+ nexthop via 169.254.2.22 dev $rp12 \
|
|
|
+ nexthop via 169.254.3.23 dev $rp13
|
|
|
+ sysctl -q -w net.ipv4.fib_multipath_hash_policy=$hash_policy
|
|
|
+}
|
|
|
+
|
|
|
+multipath_test()
|
|
|
+{
|
|
|
+ log_info "Running IPv4 multipath tests"
|
|
|
+ multipath4_test 1 1
|
|
|
+ multipath4_test 2 1
|
|
|
+ multipath4_test 11 45
|
|
|
+}
|
|
|
+
|
|
|
setup_prepare()
|
|
|
{
|
|
|
h1=${NETIFS[p1]}
|
|
@@ -205,5 +281,6 @@ setup_wait
|
|
|
|
|
|
ping_test $h1 198.51.100.2
|
|
|
ping6_test $h1 2001:db8:2::2
|
|
|
+multipath_test
|
|
|
|
|
|
exit $EXIT_STATUS
|