-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: forwarding: Add multipath tunneling nexthop test
Add a nexthop objects version of gre_multipath.sh. Unlike the original test, it also tests IPv6 overlay which is not possible with the legacy nexthop implementation. See commit 9a2ad36 ("selftests: forwarding: gre_multipath: Drop IPv6 tests") for more info. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Ido Schimmel
authored and
Jakub Kicinski
committed
Nov 20, 2020
1 parent
e96fa54
commit e035146
Showing
1 changed file
with
356 additions
and
0 deletions.
There are no files selected for viewing
356 changes: 356 additions & 0 deletions
356
tools/testing/selftests/net/forwarding/gre_multipath_nh.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,356 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
# Test traffic distribution when a wECMP route forwards traffic to two GRE | ||
# tunnels. | ||
# | ||
# +-------------------------+ | ||
# | H1 | | ||
# | $h1 + | | ||
# | 192.0.2.1/28 | | | ||
# | 2001:db8:1::1/64 | | | ||
# +-------------------|-----+ | ||
# | | ||
# +-------------------|------------------------+ | ||
# | SW1 | | | ||
# | $ol1 + | | ||
# | 192.0.2.2/28 | | ||
# | 2001:db8:1::2/64 | | ||
# | | | ||
# | + g1a (gre) + g1b (gre) | | ||
# | loc=192.0.2.65 loc=192.0.2.81 | | ||
# | rem=192.0.2.66 --. rem=192.0.2.82 --. | | ||
# | tos=inherit | tos=inherit | | | ||
# | .------------------' | | | ||
# | | .------------------' | | ||
# | v v | | ||
# | + $ul1.111 (vlan) + $ul1.222 (vlan) | | ||
# | | 192.0.2.129/28 | 192.0.2.145/28 | | ||
# | \ / | | ||
# | \________________/ | | ||
# | | | | ||
# | + $ul1 | | ||
# +------------|-------------------------------+ | ||
# | | ||
# +------------|-------------------------------+ | ||
# | SW2 + $ul2 | | ||
# | _______|________ | | ||
# | / \ | | ||
# | / \ | | ||
# | + $ul2.111 (vlan) + $ul2.222 (vlan) | | ||
# | ^ 192.0.2.130/28 ^ 192.0.2.146/28 | | ||
# | | | | | ||
# | | '------------------. | | ||
# | '------------------. | | | ||
# | + g2a (gre) | + g2b (gre) | | | ||
# | loc=192.0.2.66 | loc=192.0.2.82 | | | ||
# | rem=192.0.2.65 --' rem=192.0.2.81 --' | | ||
# | tos=inherit tos=inherit | | ||
# | | | ||
# | $ol2 + | | ||
# | 192.0.2.17/28 | | | ||
# | 2001:db8:2::1/64 | | | ||
# +-------------------|------------------------+ | ||
# | | ||
# +-------------------|-----+ | ||
# | H2 | | | ||
# | $h2 + | | ||
# | 192.0.2.18/28 | | ||
# | 2001:db8:2::2/64 | | ||
# +-------------------------+ | ||
|
||
ALL_TESTS=" | ||
ping_ipv4 | ||
ping_ipv6 | ||
multipath_ipv4 | ||
multipath_ipv6 | ||
multipath_ipv6_l4 | ||
" | ||
|
||
NUM_NETIFS=6 | ||
source lib.sh | ||
|
||
h1_create() | ||
{ | ||
simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64 | ||
ip route add vrf v$h1 192.0.2.16/28 via 192.0.2.2 | ||
ip route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2 | ||
} | ||
|
||
h1_destroy() | ||
{ | ||
ip route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2 | ||
ip route del vrf v$h1 192.0.2.16/28 via 192.0.2.2 | ||
simple_if_fini $h1 192.0.2.1/28 | ||
} | ||
|
||
sw1_create() | ||
{ | ||
simple_if_init $ol1 192.0.2.2/28 2001:db8:1::2/64 | ||
__simple_if_init $ul1 v$ol1 | ||
vlan_create $ul1 111 v$ol1 192.0.2.129/28 | ||
vlan_create $ul1 222 v$ol1 192.0.2.145/28 | ||
|
||
tunnel_create g1a gre 192.0.2.65 192.0.2.66 tos inherit dev v$ol1 | ||
__simple_if_init g1a v$ol1 192.0.2.65/32 | ||
ip route add vrf v$ol1 192.0.2.66/32 via 192.0.2.130 | ||
|
||
tunnel_create g1b gre 192.0.2.81 192.0.2.82 tos inherit dev v$ol1 | ||
__simple_if_init g1b v$ol1 192.0.2.81/32 | ||
ip route add vrf v$ol1 192.0.2.82/32 via 192.0.2.146 | ||
|
||
ip -6 nexthop add id 101 dev g1a | ||
ip -6 nexthop add id 102 dev g1b | ||
ip nexthop add id 103 group 101/102 | ||
|
||
ip route add vrf v$ol1 192.0.2.16/28 nhid 103 | ||
ip route add vrf v$ol1 2001:db8:2::/64 nhid 103 | ||
} | ||
|
||
sw1_destroy() | ||
{ | ||
ip route del vrf v$ol1 2001:db8:2::/64 | ||
ip route del vrf v$ol1 192.0.2.16/28 | ||
|
||
ip nexthop del id 103 | ||
ip -6 nexthop del id 102 | ||
ip -6 nexthop del id 101 | ||
|
||
ip route del vrf v$ol1 192.0.2.82/32 via 192.0.2.146 | ||
__simple_if_fini g1b 192.0.2.81/32 | ||
tunnel_destroy g1b | ||
|
||
ip route del vrf v$ol1 192.0.2.66/32 via 192.0.2.130 | ||
__simple_if_fini g1a 192.0.2.65/32 | ||
tunnel_destroy g1a | ||
|
||
vlan_destroy $ul1 222 | ||
vlan_destroy $ul1 111 | ||
__simple_if_fini $ul1 | ||
simple_if_fini $ol1 192.0.2.2/28 2001:db8:1::2/64 | ||
} | ||
|
||
sw2_create() | ||
{ | ||
simple_if_init $ol2 192.0.2.17/28 2001:db8:2::1/64 | ||
__simple_if_init $ul2 v$ol2 | ||
vlan_create $ul2 111 v$ol2 192.0.2.130/28 | ||
vlan_create $ul2 222 v$ol2 192.0.2.146/28 | ||
|
||
tunnel_create g2a gre 192.0.2.66 192.0.2.65 tos inherit dev v$ol2 | ||
__simple_if_init g2a v$ol2 192.0.2.66/32 | ||
ip route add vrf v$ol2 192.0.2.65/32 via 192.0.2.129 | ||
|
||
tunnel_create g2b gre 192.0.2.82 192.0.2.81 tos inherit dev v$ol2 | ||
__simple_if_init g2b v$ol2 192.0.2.82/32 | ||
ip route add vrf v$ol2 192.0.2.81/32 via 192.0.2.145 | ||
|
||
ip -6 nexthop add id 201 dev g2a | ||
ip -6 nexthop add id 202 dev g2b | ||
ip nexthop add id 203 group 201/202 | ||
|
||
ip route add vrf v$ol2 192.0.2.0/28 nhid 203 | ||
ip route add vrf v$ol2 2001:db8:1::/64 nhid 203 | ||
|
||
tc qdisc add dev $ul2 clsact | ||
tc filter add dev $ul2 ingress pref 111 prot 802.1Q \ | ||
flower vlan_id 111 action pass | ||
tc filter add dev $ul2 ingress pref 222 prot 802.1Q \ | ||
flower vlan_id 222 action pass | ||
} | ||
|
||
sw2_destroy() | ||
{ | ||
tc qdisc del dev $ul2 clsact | ||
|
||
ip route del vrf v$ol2 2001:db8:1::/64 | ||
ip route del vrf v$ol2 192.0.2.0/28 | ||
|
||
ip nexthop del id 203 | ||
ip -6 nexthop del id 202 | ||
ip -6 nexthop del id 201 | ||
|
||
ip route del vrf v$ol2 192.0.2.81/32 via 192.0.2.145 | ||
__simple_if_fini g2b 192.0.2.82/32 | ||
tunnel_destroy g2b | ||
|
||
ip route del vrf v$ol2 192.0.2.65/32 via 192.0.2.129 | ||
__simple_if_fini g2a 192.0.2.66/32 | ||
tunnel_destroy g2a | ||
|
||
vlan_destroy $ul2 222 | ||
vlan_destroy $ul2 111 | ||
__simple_if_fini $ul2 | ||
simple_if_fini $ol2 192.0.2.17/28 2001:db8:2::1/64 | ||
} | ||
|
||
h2_create() | ||
{ | ||
simple_if_init $h2 192.0.2.18/28 2001:db8:2::2/64 | ||
ip route add vrf v$h2 192.0.2.0/28 via 192.0.2.17 | ||
ip route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::1 | ||
} | ||
|
||
h2_destroy() | ||
{ | ||
ip route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::1 | ||
ip route del vrf v$h2 192.0.2.0/28 via 192.0.2.17 | ||
simple_if_fini $h2 192.0.2.18/28 2001:db8:2::2/64 | ||
} | ||
|
||
setup_prepare() | ||
{ | ||
h1=${NETIFS[p1]} | ||
ol1=${NETIFS[p2]} | ||
|
||
ul1=${NETIFS[p3]} | ||
ul2=${NETIFS[p4]} | ||
|
||
ol2=${NETIFS[p5]} | ||
h2=${NETIFS[p6]} | ||
|
||
vrf_prepare | ||
h1_create | ||
sw1_create | ||
sw2_create | ||
h2_create | ||
|
||
forwarding_enable | ||
} | ||
|
||
cleanup() | ||
{ | ||
pre_cleanup | ||
|
||
forwarding_restore | ||
|
||
h2_destroy | ||
sw2_destroy | ||
sw1_destroy | ||
h1_destroy | ||
vrf_cleanup | ||
} | ||
|
||
multipath4_test() | ||
{ | ||
local what=$1; shift | ||
local weight1=$1; shift | ||
local weight2=$1; shift | ||
|
||
sysctl_set net.ipv4.fib_multipath_hash_policy 1 | ||
ip nexthop replace id 103 group 101,$weight1/102,$weight2 | ||
|
||
local t0_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t0_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
ip vrf exec v$h1 \ | ||
$MZ $h1 -q -p 64 -A 192.0.2.1 -B 192.0.2.18 \ | ||
-d 1msec -t udp "sp=1024,dp=0-32768" | ||
|
||
local t1_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t1_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
local d111=$((t1_111 - t0_111)) | ||
local d222=$((t1_222 - t0_222)) | ||
multipath_eval "$what" $weight1 $weight2 $d111 $d222 | ||
|
||
ip nexthop replace id 103 group 101/102 | ||
sysctl_restore net.ipv4.fib_multipath_hash_policy | ||
} | ||
|
||
multipath6_test() | ||
{ | ||
local what=$1; shift | ||
local weight1=$1; shift | ||
local weight2=$1; shift | ||
|
||
sysctl_set net.ipv6.fib_multipath_hash_policy 0 | ||
ip nexthop replace id 103 group 101,$weight1/102,$weight2 | ||
|
||
local t0_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t0_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
# Generate 16384 echo requests, each with a random flow label. | ||
for ((i=0; i < 16384; ++i)); do | ||
ip vrf exec v$h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q &> /dev/null | ||
done | ||
|
||
local t1_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t1_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
local d111=$((t1_111 - t0_111)) | ||
local d222=$((t1_222 - t0_222)) | ||
multipath_eval "$what" $weight1 $weight2 $d111 $d222 | ||
|
||
ip nexthop replace id 103 group 101/102 | ||
sysctl_restore net.ipv6.fib_multipath_hash_policy | ||
} | ||
|
||
multipath6_l4_test() | ||
{ | ||
local what=$1; shift | ||
local weight1=$1; shift | ||
local weight2=$1; shift | ||
|
||
sysctl_set net.ipv6.fib_multipath_hash_policy 1 | ||
ip nexthop replace id 103 group 101,$weight1/102,$weight2 | ||
|
||
local t0_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t0_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
ip vrf exec v$h1 \ | ||
$MZ $h1 -6 -q -p 64 -A 2001:db8:1::1 -B 2001:db8:2::2 \ | ||
-d 1msec -t udp "sp=1024,dp=0-32768" | ||
|
||
local t1_111=$(tc_rule_stats_get $ul2 111 ingress) | ||
local t1_222=$(tc_rule_stats_get $ul2 222 ingress) | ||
|
||
local d111=$((t1_111 - t0_111)) | ||
local d222=$((t1_222 - t0_222)) | ||
multipath_eval "$what" $weight1 $weight2 $d111 $d222 | ||
|
||
ip nexthop replace id 103 group 101/102 | ||
sysctl_restore net.ipv6.fib_multipath_hash_policy | ||
} | ||
|
||
ping_ipv4() | ||
{ | ||
ping_test $h1 192.0.2.18 | ||
} | ||
|
||
ping_ipv6() | ||
{ | ||
ping6_test $h1 2001:db8:2::2 | ||
} | ||
|
||
multipath_ipv4() | ||
{ | ||
log_info "Running IPv4 multipath tests" | ||
multipath4_test "ECMP" 1 1 | ||
multipath4_test "Weighted MP 2:1" 2 1 | ||
multipath4_test "Weighted MP 11:45" 11 45 | ||
} | ||
|
||
multipath_ipv6() | ||
{ | ||
log_info "Running IPv6 multipath tests" | ||
multipath6_test "ECMP" 1 1 | ||
multipath6_test "Weighted MP 2:1" 2 1 | ||
multipath6_test "Weighted MP 11:45" 11 45 | ||
} | ||
|
||
multipath_ipv6_l4() | ||
{ | ||
log_info "Running IPv6 L4 hash multipath tests" | ||
multipath6_l4_test "ECMP" 1 1 | ||
multipath6_l4_test "Weighted MP 2:1" 2 1 | ||
multipath6_l4_test "Weighted MP 11:45" 11 45 | ||
} | ||
|
||
trap cleanup EXIT | ||
|
||
setup_prepare | ||
setup_wait | ||
tests_run | ||
|
||
exit $EXIT_STATUS |