| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # +----------------------------+ +--------------------------+ |
| # | H1 (vrf) | | H2 (vrf) | |
| # | | | | |
| # | + LAG1 (team) | | + LAG4 (team) | |
| # | | 192.0.2.1/28 | | | 192.0.2.130/28 | |
| # | | 2001:db8:1::1/64 | | | 2001:db8:2::2/64 | |
| # | __^___ | | __^_____ | |
| # | / \ | | / \ | |
| # | + $h1 + $h4 | | + $h2 + $h3 | |
| # | | | | | | | | |
| # +----|--------|--------------+ +-|----------|-------------+ |
| # | | | | |
| # +----|--------|------------------------------------|----------|-------------+ |
| # | SW | | | | | |
| # | + $swp1 + $swp4 + $swp2 + $swp3 | |
| # | \__ ___/ \__ _____/ | |
| # | v v | |
| # | +------|-------------------------------+ | | |
| # | | + LAG2 BR1 (802.1q) | + LAG3 (team) | |
| # | | (team) 192.0.2.2/28 | 192.0.2.129/28 | |
| # | | 2001:db8:1::2/64 | 2001:db8:2::1/64 | |
| # | | | | |
| # | +--------------------------------------+ | |
| # +---------------------------------------------------------------------------+ |
| |
| : ${ALL_TESTS:=" |
| ping_ipv4 |
| ping_ipv6 |
| |
| $(: exercise remastering of LAG2 slaves ) |
| config_deslave_swp4 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| config_enslave_swp4 |
| config_deslave_swp1 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| config_deslave_swp4 |
| config_enslave_swp1 |
| config_enslave_swp4 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| |
| $(: exercise remastering of LAG2 itself ) |
| config_remaster_lag2 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| |
| $(: exercise remastering of LAG3 slaves ) |
| config_deslave_swp2 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| config_enslave_swp2 |
| config_deslave_swp3 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| config_deslave_swp2 |
| config_enslave_swp3 |
| config_enslave_swp2 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| |
| $(: move LAG3 to a bridge and then out ) |
| config_remaster_lag3 |
| config_wait |
| ping_ipv4 |
| ping_ipv6 |
| "} |
| NUM_NETIFS=8 |
| : ${lib_dir:=.} |
| source $lib_dir/lib.sh |
| $EXTRA_SOURCE |
| |
| h1_create() |
| { |
| team_create lag1 lacp |
| ip link set dev lag1 address $(mac_get $h1) |
| ip link set dev $h1 master lag1 |
| ip link set dev $h4 master lag1 |
| simple_if_init lag1 192.0.2.1/28 2001:db8:1::1/64 |
| ip link set dev $h1 up |
| ip link set dev $h4 up |
| ip -4 route add 192.0.2.128/28 vrf vlag1 nexthop via 192.0.2.2 |
| ip -6 route add 2001:db8:2::/64 vrf vlag1 nexthop via 2001:db8:1::2 |
| } |
| |
| h1_destroy() |
| { |
| ip -6 route del 2001:db8:2::/64 vrf vlag1 |
| ip -4 route del 192.0.2.128/28 vrf vlag1 |
| ip link set dev $h4 down |
| ip link set dev $h1 down |
| simple_if_fini lag1 192.0.2.1/28 2001:db8:1::1/64 |
| ip link set dev $h4 nomaster |
| ip link set dev $h1 nomaster |
| team_destroy lag1 |
| } |
| |
| h2_create() |
| { |
| team_create lag4 lacp |
| ip link set dev lag4 address $(mac_get $h2) |
| ip link set dev $h2 master lag4 |
| ip link set dev $h3 master lag4 |
| simple_if_init lag4 192.0.2.130/28 2001:db8:2::2/64 |
| ip link set dev $h2 up |
| ip link set dev $h3 up |
| ip -4 route add 192.0.2.0/28 vrf vlag4 nexthop via 192.0.2.129 |
| ip -6 route add 2001:db8:1::/64 vrf vlag4 nexthop via 2001:db8:2::1 |
| } |
| |
| h2_destroy() |
| { |
| ip -6 route del 2001:db8:1::/64 vrf vlag4 |
| ip -4 route del 192.0.2.0/28 vrf vlag4 |
| ip link set dev $h3 down |
| ip link set dev $h2 down |
| simple_if_fini lag4 192.0.2.130/28 2001:db8:2::2/64 |
| ip link set dev $h3 nomaster |
| ip link set dev $h2 nomaster |
| team_destroy lag4 |
| } |
| |
| router_create() |
| { |
| team_create lag2 lacp |
| ip link set dev lag2 address $(mac_get $swp1) |
| ip link set dev $swp1 master lag2 |
| ip link set dev $swp4 master lag2 |
| |
| ip link add name br1 address $(mac_get lag2) \ |
| type bridge vlan_filtering 1 |
| ip link set dev lag2 master br1 |
| |
| ip link set dev $swp1 up |
| ip link set dev $swp4 up |
| ip link set dev br1 up |
| |
| __addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64 |
| |
| team_create lag3 lacp |
| ip link set dev lag3 address $(mac_get $swp2) |
| ip link set dev $swp2 master lag3 |
| ip link set dev $swp3 master lag3 |
| ip link set dev $swp2 up |
| ip link set dev $swp3 up |
| __addr_add_del lag3 add 192.0.2.129/28 2001:db8:2::1/64 |
| } |
| |
| router_destroy() |
| { |
| __addr_add_del lag3 del 192.0.2.129/28 2001:db8:2::1/64 |
| ip link set dev $swp3 down |
| ip link set dev $swp2 down |
| ip link set dev $swp3 nomaster |
| ip link set dev $swp2 nomaster |
| team_destroy lag3 |
| |
| __addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64 |
| |
| ip link set dev $swp4 down |
| ip link set dev $swp1 down |
| ip link set dev br1 down |
| |
| ip link set dev lag2 nomaster |
| ip link del dev br1 |
| |
| ip link set dev $swp4 nomaster |
| ip link set dev $swp1 nomaster |
| team_destroy lag2 |
| } |
| |
| config_remaster_lag2() |
| { |
| log_info "Remaster bridge slave" |
| |
| ip link set dev lag2 nomaster |
| sleep 2 |
| ip link set dev lag2 master br1 |
| } |
| |
| config_remaster_lag3() |
| { |
| log_info "Move lag3 to the bridge, then out again" |
| |
| ip link set dev lag3 master br1 |
| sleep 2 |
| ip link set dev lag3 nomaster |
| } |
| |
| config_deslave() |
| { |
| local netdev=$1; shift |
| |
| log_info "Deslave $netdev" |
| ip link set dev $netdev down |
| ip link set dev $netdev nomaster |
| ip link set dev $netdev up |
| } |
| |
| config_deslave_swp1() |
| { |
| config_deslave $swp1 |
| } |
| |
| config_deslave_swp2() |
| { |
| config_deslave $swp2 |
| } |
| |
| config_deslave_swp3() |
| { |
| config_deslave $swp3 |
| } |
| |
| config_deslave_swp4() |
| { |
| config_deslave $swp4 |
| } |
| |
| config_enslave() |
| { |
| local netdev=$1; shift |
| local master=$1; shift |
| |
| log_info "Enslave $netdev to $master" |
| ip link set dev $netdev down |
| ip link set dev $netdev master $master |
| ip link set dev $netdev up |
| } |
| |
| config_enslave_swp1() |
| { |
| config_enslave $swp1 lag2 |
| } |
| |
| config_enslave_swp2() |
| { |
| config_enslave $swp2 lag3 |
| } |
| |
| config_enslave_swp3() |
| { |
| config_enslave $swp3 lag3 |
| } |
| |
| config_enslave_swp4() |
| { |
| config_enslave $swp4 lag2 |
| } |
| |
| config_wait() |
| { |
| setup_wait_dev lag2 |
| setup_wait_dev lag3 |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| swp1=${NETIFS[p2]} |
| |
| swp2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| swp3=${NETIFS[p5]} |
| h3=${NETIFS[p6]} |
| |
| h4=${NETIFS[p7]} |
| swp4=${NETIFS[p8]} |
| |
| vrf_prepare |
| |
| h1_create |
| h2_create |
| |
| router_create |
| |
| forwarding_enable |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| forwarding_restore |
| |
| router_destroy |
| |
| h2_destroy |
| h1_destroy |
| |
| vrf_cleanup |
| } |
| |
| ping_ipv4() |
| { |
| ping_test lag1 192.0.2.130 |
| } |
| |
| ping_ipv6() |
| { |
| ping6_test lag1 2001:db8:2::2 |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tests_run |
| |
| exit $EXIT_STATUS |