| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # Test traffic distribution when there are multiple routes between an IPv4 |
| # GRE tunnel. The tunnel carries IPv6 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 + | |
| # | 2001:db8:1::2/64 | | |
| # +-------------------|-----+ |
| # | |
| # +-------------------|------------------------+ |
| # | SW1 | | |
| # | $ol1 + | |
| # | 2001:db8:1::1/64 | |
| # | | |
| # | + 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 + | |
| # | 2001:db8:2::1/64 | SW4 | |
| # +--------------------|-----------------------+ |
| # | |
| # +--------------------|---------+ |
| # | | | |
| # | $h2 + | |
| # | 2001:db8:2::2/64 H2 | |
| # +------------------------------+ |
| |
| ALL_TESTS=" |
| ping_ipv6 |
| multipath_ipv6 |
| " |
| |
| NUM_NETIFS=10 |
| source lib.sh |
| |
| h1_create() |
| { |
| simple_if_init $h1 2001:db8:1::2/64 |
| ip -6 route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::1 |
| } |
| |
| h1_destroy() |
| { |
| ip -6 route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::1 |
| simple_if_fini $h1 2001:db8:1::2/64 |
| } |
| |
| sw1_create() |
| { |
| simple_if_init $ol1 2001:db8:1::1/64 |
| __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 -6 route add vrf v$ol1 2001:db8:2::/64 dev g1 |
| } |
| |
| sw1_destroy() |
| { |
| ip -6 route del vrf v$ol1 2001:db8:2::/64 |
| |
| 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 2001:db8:1::1/64 |
| } |
| |
| 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 2001:db8:2::1/64 |
| __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 -6 route add vrf v$ol4 2001:db8:1::/64 dev g2 |
| } |
| |
| sw4_destroy() |
| { |
| ip -6 route del vrf v$ol4 2001:db8:1::/64 |
| |
| 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 2001:db8:2::1/64 |
| } |
| |
| h2_create() |
| { |
| simple_if_init $h2 2001:db8:2::2/64 |
| ip -6 route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::1 |
| } |
| |
| h2_destroy() |
| { |
| ip -6 route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::1 |
| simple_if_fini $h2 2001:db8:2::2/64 |
| } |
| |
| 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 |
| } |
| |
| multipath6_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 -6 -q -p 64 -A "2001:db8:1::2-2001:db8:1::1e" \ |
| -B "2001:db8:2::2-2001:db8:2::1e" \ |
| -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_ipv6() |
| { |
| ping_test $h1 2001:db8:2::2 |
| } |
| |
| multipath_ipv6() |
| { |
| log_info "Running IPv6 over GRE over IPv4 multipath tests" |
| multipath6_test "ECMP" 1 1 |
| multipath6_test "Weighted MP 2:1" 2 1 |
| multipath6_test "Weighted MP 11:45" 11 45 |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| tests_run |
| |
| exit $EXIT_STATUS |