-
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: Test multipath hashing on inner IP pkts for GR…
…E tunnel Add selftest scripts for multipath hashing on inner IP pkts when there is a single GRE tunnel but there are multiple underlay routes to reach the other end of the tunnel. Four cases are covered in these scripts: - IPv4 inner, IPv4 outer - IPv6 inner, IPv4 outer - IPv4 inner, IPv6 outer - IPv6 inner, IPv6 outer Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Stephen Suryaputra <ssuryaextr@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Stephen Suryaputra
authored and
David S. Miller
committed
Jul 8, 2019
1 parent
d8f74f0
commit 2800f24
Showing
4 changed files
with
1,220 additions
and
0 deletions.
There are no files selected for viewing
305 changes: 305 additions & 0 deletions
305
tools/testing/selftests/net/forwarding/gre_inner_v4_multipath.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,305 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
# Test traffic distribution when there are multiple routes between an IPv4 | ||
# GRE tunnel. The tunnel carries IPv4 traffic between multiple hosts. | ||
# Multiple routes are in the underlay network. With the default multipath | ||
# policy, SW2 will only look at the outer IP addresses, hence only a single | ||
# route would be used. | ||
# | ||
# +-------------------------+ | ||
# | H1 | | ||
# | $h1 + | | ||
# | 192.0.3.{2-62}/24 | | | ||
# +-------------------|-----+ | ||
# | | ||
# +-------------------|------------------------+ | ||
# | SW1 | | | ||
# | $ol1 + | | ||
# | 192.0.3.1/24 | | ||
# | | | ||
# | + g1 (gre) | | ||
# | loc=192.0.2.65 | | ||
# | rem=192.0.2.66 --. | | ||
# | tos=inherit | | | ||
# | v | | ||
# | + $ul1 | | ||
# | | 192.0.2.129/28 | | ||
# +---------------------|----------------------+ | ||
# | | ||
# +---------------------|----------------------+ | ||
# | SW2 | | | ||
# | $ul21 + | | ||
# | 192.0.2.130/28 | | ||
# | | | | ||
# ! ________________|_____ | | ||
# | / \ | | ||
# | | | | | ||
# | + $ul22.111 (vlan) + $ul22.222 (vlan) | | ||
# | | 192.0.2.145/28 | 192.0.2.161/28 | | ||
# | | | | | ||
# +--|----------------------|------------------+ | ||
# | | | ||
# +--|----------------------|------------------+ | ||
# | | | | | ||
# | + $ul32.111 (vlan) + $ul32.222 (vlan) | | ||
# | | 192.0.2.146/28 | 192.0.2.162/28 | | ||
# | | | | | ||
# | \______________________/ | | ||
# | | | | ||
# | | | | ||
# | $ul31 + | | ||
# | 192.0.2.177/28 | SW3 | | ||
# +---------------------|----------------------+ | ||
# | | ||
# +---------------------|----------------------+ | ||
# | + $ul4 | | ||
# | ^ 192.0.2.178/28 | | ||
# | | | | ||
# | + g2 (gre) | | | ||
# | loc=192.0.2.66 | | | ||
# | rem=192.0.2.65 --' | | ||
# | tos=inherit | | ||
# | | | ||
# | $ol4 + | | ||
# | 192.0.4.1/24 | SW4 | | ||
# +--------------------|-----------------------+ | ||
# | | ||
# +--------------------|---------+ | ||
# | | | | ||
# | $h2 + | | ||
# | 192.0.4.{2-62}/24 H2 | | ||
# +------------------------------+ | ||
|
||
ALL_TESTS=" | ||
ping_ipv4 | ||
multipath_ipv4 | ||
" | ||
|
||
NUM_NETIFS=10 | ||
source lib.sh | ||
|
||
h1_create() | ||
{ | ||
simple_if_init $h1 192.0.3.2/24 | ||
ip route add vrf v$h1 192.0.4.0/24 via 192.0.3.1 | ||
} | ||
|
||
h1_destroy() | ||
{ | ||
ip route del vrf v$h1 192.0.4.0/24 via 192.0.3.1 | ||
simple_if_fini $h1 192.0.3.2/24 | ||
} | ||
|
||
sw1_create() | ||
{ | ||
simple_if_init $ol1 192.0.3.1/24 | ||
__simple_if_init $ul1 v$ol1 192.0.2.129/28 | ||
|
||
tunnel_create g1 gre 192.0.2.65 192.0.2.66 tos inherit dev v$ol1 | ||
__simple_if_init g1 v$ol1 192.0.2.65/32 | ||
ip route add vrf v$ol1 192.0.2.66/32 via 192.0.2.130 | ||
|
||
ip route add vrf v$ol1 192.0.4.0/24 nexthop dev g1 | ||
} | ||
|
||
sw1_destroy() | ||
{ | ||
ip route del vrf v$ol1 192.0.4.0/24 | ||
|
||
ip route del vrf v$ol1 192.0.2.66/32 | ||
__simple_if_fini g1 192.0.2.65/32 | ||
tunnel_destroy g1 | ||
|
||
__simple_if_fini $ul1 192.0.2.129/28 | ||
simple_if_fini $ol1 192.0.3.1/24 | ||
} | ||
|
||
sw2_create() | ||
{ | ||
simple_if_init $ul21 192.0.2.130/28 | ||
__simple_if_init $ul22 v$ul21 | ||
vlan_create $ul22 111 v$ul21 192.0.2.145/28 | ||
vlan_create $ul22 222 v$ul21 192.0.2.161/28 | ||
|
||
ip route add vrf v$ul21 192.0.2.65/32 via 192.0.2.129 | ||
ip route add vrf v$ul21 192.0.2.66/32 \ | ||
nexthop via 192.0.2.146 \ | ||
nexthop via 192.0.2.162 | ||
} | ||
|
||
sw2_destroy() | ||
{ | ||
ip route del vrf v$ul21 192.0.2.66/32 | ||
ip route del vrf v$ul21 192.0.2.65/32 | ||
|
||
vlan_destroy $ul22 222 | ||
vlan_destroy $ul22 111 | ||
__simple_if_fini $ul22 | ||
simple_if_fini $ul21 192.0.2.130/28 | ||
} | ||
|
||
sw3_create() | ||
{ | ||
simple_if_init $ul31 192.0.2.177/28 | ||
__simple_if_init $ul32 v$ul31 | ||
vlan_create $ul32 111 v$ul31 192.0.2.146/28 | ||
vlan_create $ul32 222 v$ul31 192.0.2.162/28 | ||
|
||
ip route add vrf v$ul31 192.0.2.66/32 via 192.0.2.178 | ||
ip route add vrf v$ul31 192.0.2.65/32 \ | ||
nexthop via 192.0.2.145 \ | ||
nexthop via 192.0.2.161 | ||
|
||
tc qdisc add dev $ul32 clsact | ||
tc filter add dev $ul32 ingress pref 111 prot 802.1Q \ | ||
flower vlan_id 111 action pass | ||
tc filter add dev $ul32 ingress pref 222 prot 802.1Q \ | ||
flower vlan_id 222 action pass | ||
} | ||
|
||
sw3_destroy() | ||
{ | ||
tc qdisc del dev $ul32 clsact | ||
|
||
ip route del vrf v$ul31 192.0.2.65/32 | ||
ip route del vrf v$ul31 192.0.2.66/32 | ||
|
||
vlan_destroy $ul32 222 | ||
vlan_destroy $ul32 111 | ||
__simple_if_fini $ul32 | ||
simple_if_fini $ul31 192.0.2.177/28 | ||
} | ||
|
||
sw4_create() | ||
{ | ||
simple_if_init $ol4 192.0.4.1/24 | ||
__simple_if_init $ul4 v$ol4 192.0.2.178/28 | ||
|
||
tunnel_create g2 gre 192.0.2.66 192.0.2.65 tos inherit dev v$ol4 | ||
__simple_if_init g2 v$ol4 192.0.2.66/32 | ||
ip route add vrf v$ol4 192.0.2.65/32 via 192.0.2.177 | ||
|
||
ip route add vrf v$ol4 192.0.3.0/24 nexthop dev g2 | ||
} | ||
|
||
sw4_destroy() | ||
{ | ||
ip route del vrf v$ol4 192.0.3.0/24 | ||
|
||
ip route del vrf v$ol4 192.0.2.65/32 | ||
__simple_if_fini g2 192.0.2.66/32 | ||
tunnel_destroy g2 | ||
|
||
__simple_if_fini $ul4 192.0.2.178/28 | ||
simple_if_fini $ol4 192.0.4.1/24 | ||
} | ||
|
||
h2_create() | ||
{ | ||
simple_if_init $h2 192.0.4.2/24 | ||
ip route add vrf v$h2 192.0.3.0/24 via 192.0.4.1 | ||
} | ||
|
||
h2_destroy() | ||
{ | ||
ip route del vrf v$h2 192.0.3.0/24 via 192.0.4.1 | ||
simple_if_fini $h2 192.0.4.2/24 | ||
} | ||
|
||
setup_prepare() | ||
{ | ||
h1=${NETIFS[p1]} | ||
|
||
ol1=${NETIFS[p2]} | ||
ul1=${NETIFS[p3]} | ||
|
||
ul21=${NETIFS[p4]} | ||
ul22=${NETIFS[p5]} | ||
|
||
ul32=${NETIFS[p6]} | ||
ul31=${NETIFS[p7]} | ||
|
||
ul4=${NETIFS[p8]} | ||
ol4=${NETIFS[p9]} | ||
|
||
h2=${NETIFS[p10]} | ||
|
||
vrf_prepare | ||
h1_create | ||
sw1_create | ||
sw2_create | ||
sw3_create | ||
sw4_create | ||
h2_create | ||
|
||
forwarding_enable | ||
} | ||
|
||
cleanup() | ||
{ | ||
pre_cleanup | ||
|
||
forwarding_restore | ||
|
||
h2_destroy | ||
sw4_destroy | ||
sw3_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 2 | ||
ip route replace vrf v$ul21 192.0.2.66/32 \ | ||
nexthop via 192.0.2.146 weight $weight1 \ | ||
nexthop via 192.0.2.162 weight $weight2 | ||
|
||
local t0_111=$(tc_rule_stats_get $ul32 111 ingress) | ||
local t0_222=$(tc_rule_stats_get $ul32 222 ingress) | ||
|
||
ip vrf exec v$h1 \ | ||
$MZ $h1 -q -p 64 -A "192.0.3.2-192.0.3.62" -B "192.0.4.2-192.0.4.62" \ | ||
-d 1msec -c 50 -t udp "sp=1024,dp=1024" | ||
sleep 1 | ||
|
||
local t1_111=$(tc_rule_stats_get $ul32 111 ingress) | ||
local t1_222=$(tc_rule_stats_get $ul32 222 ingress) | ||
|
||
local d111=$((t1_111 - t0_111)) | ||
local d222=$((t1_222 - t0_222)) | ||
multipath_eval "$what" $weight1 $weight2 $d111 $d222 | ||
|
||
ip route replace vrf v$ul21 192.0.2.66/32 \ | ||
nexthop via 192.0.2.146 \ | ||
nexthop via 192.0.2.162 | ||
sysctl_restore net.ipv4.fib_multipath_hash_policy | ||
} | ||
|
||
ping_ipv4() | ||
{ | ||
ping_test $h1 192.0.4.2 | ||
} | ||
|
||
multipath_ipv4() | ||
{ | ||
log_info "Running IPv4 over GRE over IPv4 multipath tests" | ||
multipath4_test "ECMP" 1 1 | ||
multipath4_test "Weighted MP 2:1" 2 1 | ||
multipath4_test "Weighted MP 11:45" 11 45 | ||
} | ||
|
||
trap cleanup EXIT | ||
|
||
setup_prepare | ||
setup_wait | ||
tests_run | ||
|
||
exit $EXIT_STATUS |
Oops, something went wrong.