Skip to content

Commit

Permalink
selftests: forwarding: Test IPv4 weighted nexthops
Browse files Browse the repository at this point in the history
Use different weights for the multipath route configured on the first
router and check that the different flows generated by the first host
are distributed according to the provided weights.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ido Schimmel authored and David S. Miller committed Feb 28, 2018
1 parent 937eeb3 commit 3d578d8
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
14 changes: 14 additions & 0 deletions tools/testing/selftests/net/forwarding/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,13 @@ log_test()
return 0
}

log_info()
{
local msg=$1

echo "INFO: $msg"
}

setup_wait()
{
for i in $(eval echo {1..$NUM_NETIFS}); do
Expand Down Expand Up @@ -256,6 +263,13 @@ master_name_get()
ip -j link show dev $if_name | jq -r '.[]["master"]'
}

link_stats_tx_packets_get()
{
local if_name=$1

ip -j -s link show dev $if_name | jq '.[]["stats64"]["tx"]["packets"]'
}

bridge_ageing_time_get()
{
local bridge=$1
Expand Down
77 changes: 77 additions & 0 deletions tools/testing/selftests/net/forwarding/router_multipath.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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]}
Expand Down Expand Up @@ -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

0 comments on commit 3d578d8

Please sign in to comment.