| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # Test for "tc action mirred egress mirror" when the underlay route points at a |
| # bridge device with vlan filtering (802.1q), and the egress device is a team |
| # device. |
| # |
| # +----------------------+ +----------------------+ |
| # | H1 | | H2 | |
| # | + $h1.333 | | $h1.555 + | |
| # | | 192.0.2.1/28 | | 192.0.2.18/28 | | |
| # +-----|----------------+ +----------------|-----+ |
| # | $h1 | |
| # +--------------------------------+------------------------------+ |
| # | |
| # +--------------------------------------|------------------------------------+ |
| # | SW o---> mirror | |
| # | | | |
| # | +--------------------------------+------------------------------+ | |
| # | | $swp1 | | |
| # | + $swp1.333 $swp1.555 + | |
| # | 192.0.2.2/28 192.0.2.17/28 | |
| # | | |
| # | +-----------------------------------------------------------------------+ | |
| # | | BR1 (802.1q) | | |
| # | | + lag (team) 192.0.2.129/28 | | |
| # | | / \ 2001:db8:2::1/64 | | |
| # | +---/---\---------------------------------------------------------------+ | |
| # | / \ ^ | |
| # | | \ + gt4 (gretap) | | |
| # | | \ loc=192.0.2.129 | | |
| # | | \ rem=192.0.2.130 -+ | |
| # | | \ ttl=100 | |
| # | | \ tos=inherit | |
| # | | \ | |
| # | | \_________________________________ | |
| # | | \ | |
| # | + $swp3 + $swp4 | |
| # +---|------------------------------------------------|----------------------+ |
| # | | |
| # +---|----------------------+ +---|----------------------+ |
| # | + $h3 H3 | | + $h4 H4 | |
| # | 192.0.2.130/28 | | 192.0.2.130/28 | |
| # | 2001:db8:2::2/64 | | 2001:db8:2::2/64 | |
| # +--------------------------+ +--------------------------+ |
| |
| ALL_TESTS=" |
| test_mirror_gretap_first |
| test_mirror_gretap_second |
| " |
| |
| NUM_NETIFS=6 |
| source lib.sh |
| source mirror_lib.sh |
| source mirror_gre_lib.sh |
| |
| require_command $ARPING |
| |
| vlan_host_create() |
| { |
| local if_name=$1; shift |
| local vid=$1; shift |
| local vrf_name=$1; shift |
| local ips=("${@}") |
| |
| vrf_create $vrf_name |
| ip link set dev $vrf_name up |
| vlan_create $if_name $vid $vrf_name "${ips[@]}" |
| } |
| |
| vlan_host_destroy() |
| { |
| local if_name=$1; shift |
| local vid=$1; shift |
| local vrf_name=$1; shift |
| |
| vlan_destroy $if_name $vid |
| ip link set dev $vrf_name down |
| vrf_destroy $vrf_name |
| } |
| |
| h1_create() |
| { |
| vlan_host_create $h1 333 vrf-h1 192.0.2.1/28 |
| ip -4 route add 192.0.2.16/28 vrf vrf-h1 nexthop via 192.0.2.2 |
| } |
| |
| h1_destroy() |
| { |
| ip -4 route del 192.0.2.16/28 vrf vrf-h1 |
| vlan_host_destroy $h1 333 vrf-h1 |
| } |
| |
| h2_create() |
| { |
| vlan_host_create $h1 555 vrf-h2 192.0.2.18/28 |
| ip -4 route add 192.0.2.0/28 vrf vrf-h2 nexthop via 192.0.2.17 |
| } |
| |
| h2_destroy() |
| { |
| ip -4 route del 192.0.2.0/28 vrf vrf-h2 |
| vlan_host_destroy $h1 555 vrf-h2 |
| } |
| |
| h3_create() |
| { |
| simple_if_init $h3 192.0.2.130/28 |
| tc qdisc add dev $h3 clsact |
| } |
| |
| h3_destroy() |
| { |
| tc qdisc del dev $h3 clsact |
| simple_if_fini $h3 192.0.2.130/28 |
| } |
| |
| h4_create() |
| { |
| simple_if_init $h4 192.0.2.130/28 |
| tc qdisc add dev $h4 clsact |
| } |
| |
| h4_destroy() |
| { |
| tc qdisc del dev $h4 clsact |
| simple_if_fini $h4 192.0.2.130/28 |
| } |
| |
| switch_create() |
| { |
| ip link set dev $swp1 up |
| tc qdisc add dev $swp1 clsact |
| vlan_create $swp1 333 "" 192.0.2.2/28 |
| vlan_create $swp1 555 "" 192.0.2.17/28 |
| |
| tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \ |
| ttl 100 tos inherit |
| |
| ip link set dev $swp3 up |
| ip link set dev $swp4 up |
| |
| ip link add name br1 type bridge vlan_filtering 1 |
| ip link set dev br1 up |
| __addr_add_del br1 add 192.0.2.129/32 |
| ip -4 route add 192.0.2.130/32 dev br1 |
| |
| team_create lag loadbalance $swp3 $swp4 |
| ip link set dev lag master br1 |
| } |
| |
| switch_destroy() |
| { |
| ip link set dev lag nomaster |
| team_destroy lag |
| |
| ip -4 route del 192.0.2.130/32 dev br1 |
| __addr_add_del br1 del 192.0.2.129/32 |
| ip link set dev br1 down |
| ip link del dev br1 |
| |
| ip link set dev $swp4 down |
| ip link set dev $swp3 down |
| |
| tunnel_destroy gt4 |
| |
| vlan_destroy $swp1 555 |
| vlan_destroy $swp1 333 |
| tc qdisc del dev $swp1 clsact |
| ip link set dev $swp1 down |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| swp1=${NETIFS[p2]} |
| |
| swp3=${NETIFS[p3]} |
| h3=${NETIFS[p4]} |
| |
| swp4=${NETIFS[p5]} |
| h4=${NETIFS[p6]} |
| |
| vrf_prepare |
| |
| ip link set dev $h1 up |
| h1_create |
| h2_create |
| h3_create |
| h4_create |
| switch_create |
| |
| trap_install $h3 ingress |
| trap_install $h4 ingress |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| trap_uninstall $h4 ingress |
| trap_uninstall $h3 ingress |
| |
| switch_destroy |
| h4_destroy |
| h3_destroy |
| h2_destroy |
| h1_destroy |
| ip link set dev $h1 down |
| |
| vrf_cleanup |
| } |
| |
| test_lag_slave() |
| { |
| local host_dev=$1; shift |
| local up_dev=$1; shift |
| local down_dev=$1; shift |
| local what=$1; shift |
| |
| RET=0 |
| |
| mirror_install $swp1 ingress gt4 \ |
| "proto 802.1q flower vlan_id 333 $tcflags" |
| |
| # Test connectivity through $up_dev when $down_dev is set down. |
| ip link set dev $down_dev down |
| setup_wait_dev $up_dev |
| setup_wait_dev $host_dev |
| $ARPING -I br1 192.0.2.130 -qfc 1 |
| sleep 2 |
| mirror_test vrf-h1 192.0.2.1 192.0.2.18 $host_dev 1 10 |
| |
| # Test lack of connectivity when both slaves are down. |
| ip link set dev $up_dev down |
| sleep 2 |
| mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h3 1 0 |
| mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h4 1 0 |
| |
| ip link set dev $up_dev up |
| ip link set dev $down_dev up |
| mirror_uninstall $swp1 ingress |
| |
| log_test "$what ($tcflags)" |
| } |
| |
| test_mirror_gretap_first() |
| { |
| test_lag_slave $h3 $swp3 $swp4 "mirror to gretap: LAG first slave" |
| } |
| |
| test_mirror_gretap_second() |
| { |
| test_lag_slave $h4 $swp4 $swp3 "mirror to gretap: LAG second slave" |
| } |
| |
| test_all() |
| { |
| slow_path_trap_install $swp1 ingress |
| slow_path_trap_install $swp1 egress |
| |
| tests_run |
| |
| slow_path_trap_uninstall $swp1 egress |
| slow_path_trap_uninstall $swp1 ingress |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tcflags="skip_hw" |
| test_all |
| |
| if ! tc_offload_check; then |
| echo "WARN: Could not test offloaded functionality" |
| else |
| tcflags="skip_sw" |
| test_all |
| fi |
| |
| exit $EXIT_STATUS |