1*541c6ce3SPetr Machata#!/bin/bash 2*541c6ce3SPetr Machata# SPDX-License-Identifier: GPL-2.0 3*541c6ce3SPetr Machata 4*541c6ce3SPetr Machata# Test for "tc action mirred egress mirror" when the underlay route points at a 5*541c6ce3SPetr Machata# team device. 6*541c6ce3SPetr Machata# 7*541c6ce3SPetr Machata# +----------------------+ +----------------------+ 8*541c6ce3SPetr Machata# | H1 | | H2 | 9*541c6ce3SPetr Machata# | + $h1.333 | | $h1.555 + | 10*541c6ce3SPetr Machata# | | 192.0.2.1/28 | | 192.0.2.18/28 | | 11*541c6ce3SPetr Machata# +----|-----------------+ +----------------|-----+ 12*541c6ce3SPetr Machata# | $h1 | 13*541c6ce3SPetr Machata# +---------------------------------+------------------------------+ 14*541c6ce3SPetr Machata# | 15*541c6ce3SPetr Machata# +--------------------------------------|------------------------------------+ 16*541c6ce3SPetr Machata# | SW o---> mirror | 17*541c6ce3SPetr Machata# | | | 18*541c6ce3SPetr Machata# | +----------------------------------+------------------------------+ | 19*541c6ce3SPetr Machata# | | $swp1 | | 20*541c6ce3SPetr Machata# | + $swp1.333 $swp1.555 + | 21*541c6ce3SPetr Machata# | 192.0.2.2/28 192.0.2.17/28 | 22*541c6ce3SPetr Machata# | | 23*541c6ce3SPetr Machata# | | 24*541c6ce3SPetr Machata# | + gt4 (gretap) ,-> + lag1 (team) | 25*541c6ce3SPetr Machata# | loc=192.0.2.129 | | 192.0.2.129/28 | 26*541c6ce3SPetr Machata# | rem=192.0.2.130 --' | | 27*541c6ce3SPetr Machata# | ttl=100 | | 28*541c6ce3SPetr Machata# | tos=inherit | | 29*541c6ce3SPetr Machata# | _____________________|______________________ | 30*541c6ce3SPetr Machata# | / \ | 31*541c6ce3SPetr Machata# | / \ | 32*541c6ce3SPetr Machata# | + $swp3 + $swp4 | 33*541c6ce3SPetr Machata# +---|------------------------------------------------|----------------------+ 34*541c6ce3SPetr Machata# | | 35*541c6ce3SPetr Machata# +---|------------------------------------------------|----------------------+ 36*541c6ce3SPetr Machata# | + $h3 + $h4 H3 | 37*541c6ce3SPetr Machata# | \ / | 38*541c6ce3SPetr Machata# | \____________________________________________/ | 39*541c6ce3SPetr Machata# | | | 40*541c6ce3SPetr Machata# | + lag2 (team) | 41*541c6ce3SPetr Machata# | 192.0.2.130/28 | 42*541c6ce3SPetr Machata# | | 43*541c6ce3SPetr Machata# +---------------------------------------------------------------------------+ 44*541c6ce3SPetr Machata 45*541c6ce3SPetr MachataALL_TESTS=" 46*541c6ce3SPetr Machata test_mirror_gretap_first 47*541c6ce3SPetr Machata test_mirror_gretap_second 48*541c6ce3SPetr Machata" 49*541c6ce3SPetr Machata 50*541c6ce3SPetr MachataNUM_NETIFS=6 51*541c6ce3SPetr Machatasource lib.sh 52*541c6ce3SPetr Machatasource mirror_lib.sh 53*541c6ce3SPetr Machatasource mirror_gre_lib.sh 54*541c6ce3SPetr Machata 55*541c6ce3SPetr Machatarequire_command $ARPING 56*541c6ce3SPetr Machata 57*541c6ce3SPetr Machatavlan_host_create() 58*541c6ce3SPetr Machata{ 59*541c6ce3SPetr Machata local if_name=$1; shift 60*541c6ce3SPetr Machata local vid=$1; shift 61*541c6ce3SPetr Machata local vrf_name=$1; shift 62*541c6ce3SPetr Machata local ips=("${@}") 63*541c6ce3SPetr Machata 64*541c6ce3SPetr Machata vrf_create $vrf_name 65*541c6ce3SPetr Machata ip link set dev $vrf_name up 66*541c6ce3SPetr Machata vlan_create $if_name $vid $vrf_name "${ips[@]}" 67*541c6ce3SPetr Machata} 68*541c6ce3SPetr Machata 69*541c6ce3SPetr Machatavlan_host_destroy() 70*541c6ce3SPetr Machata{ 71*541c6ce3SPetr Machata local if_name=$1; shift 72*541c6ce3SPetr Machata local vid=$1; shift 73*541c6ce3SPetr Machata local vrf_name=$1; shift 74*541c6ce3SPetr Machata 75*541c6ce3SPetr Machata vlan_destroy $if_name $vid 76*541c6ce3SPetr Machata ip link set dev $vrf_name down 77*541c6ce3SPetr Machata vrf_destroy $vrf_name 78*541c6ce3SPetr Machata} 79*541c6ce3SPetr Machata 80*541c6ce3SPetr Machatah1_create() 81*541c6ce3SPetr Machata{ 82*541c6ce3SPetr Machata vlan_host_create $h1 333 vrf-h1 192.0.2.1/28 83*541c6ce3SPetr Machata ip -4 route add 192.0.2.16/28 vrf vrf-h1 nexthop via 192.0.2.2 84*541c6ce3SPetr Machata} 85*541c6ce3SPetr Machata 86*541c6ce3SPetr Machatah1_destroy() 87*541c6ce3SPetr Machata{ 88*541c6ce3SPetr Machata ip -4 route del 192.0.2.16/28 vrf vrf-h1 89*541c6ce3SPetr Machata vlan_host_destroy $h1 333 vrf-h1 90*541c6ce3SPetr Machata} 91*541c6ce3SPetr Machata 92*541c6ce3SPetr Machatah2_create() 93*541c6ce3SPetr Machata{ 94*541c6ce3SPetr Machata vlan_host_create $h1 555 vrf-h2 192.0.2.18/28 95*541c6ce3SPetr Machata ip -4 route add 192.0.2.0/28 vrf vrf-h2 nexthop via 192.0.2.17 96*541c6ce3SPetr Machata} 97*541c6ce3SPetr Machata 98*541c6ce3SPetr Machatah2_destroy() 99*541c6ce3SPetr Machata{ 100*541c6ce3SPetr Machata ip -4 route del 192.0.2.0/28 vrf vrf-h2 101*541c6ce3SPetr Machata vlan_host_destroy $h1 555 vrf-h2 102*541c6ce3SPetr Machata} 103*541c6ce3SPetr Machata 104*541c6ce3SPetr Machatah3_create_team() 105*541c6ce3SPetr Machata{ 106*541c6ce3SPetr Machata team_create lag2 lacp $h3 $h4 107*541c6ce3SPetr Machata __simple_if_init lag2 vrf-h3 192.0.2.130/32 108*541c6ce3SPetr Machata ip -4 route add vrf vrf-h3 192.0.2.129/32 dev lag2 109*541c6ce3SPetr Machata} 110*541c6ce3SPetr Machata 111*541c6ce3SPetr Machatah3_destroy_team() 112*541c6ce3SPetr Machata{ 113*541c6ce3SPetr Machata ip -4 route del vrf vrf-h3 192.0.2.129/32 dev lag2 114*541c6ce3SPetr Machata __simple_if_fini lag2 192.0.2.130/32 115*541c6ce3SPetr Machata team_destroy lag2 116*541c6ce3SPetr Machata 117*541c6ce3SPetr Machata ip link set dev $h3 down 118*541c6ce3SPetr Machata ip link set dev $h4 down 119*541c6ce3SPetr Machata} 120*541c6ce3SPetr Machata 121*541c6ce3SPetr Machatah3_create() 122*541c6ce3SPetr Machata{ 123*541c6ce3SPetr Machata vrf_create vrf-h3 124*541c6ce3SPetr Machata ip link set dev vrf-h3 up 125*541c6ce3SPetr Machata tc qdisc add dev $h3 clsact 126*541c6ce3SPetr Machata tc qdisc add dev $h4 clsact 127*541c6ce3SPetr Machata h3_create_team 128*541c6ce3SPetr Machata} 129*541c6ce3SPetr Machata 130*541c6ce3SPetr Machatah3_destroy() 131*541c6ce3SPetr Machata{ 132*541c6ce3SPetr Machata h3_destroy_team 133*541c6ce3SPetr Machata tc qdisc del dev $h4 clsact 134*541c6ce3SPetr Machata tc qdisc del dev $h3 clsact 135*541c6ce3SPetr Machata ip link set dev vrf-h3 down 136*541c6ce3SPetr Machata vrf_destroy vrf-h3 137*541c6ce3SPetr Machata} 138*541c6ce3SPetr Machata 139*541c6ce3SPetr Machataswitch_create() 140*541c6ce3SPetr Machata{ 141*541c6ce3SPetr Machata ip link set dev $swp1 up 142*541c6ce3SPetr Machata tc qdisc add dev $swp1 clsact 143*541c6ce3SPetr Machata vlan_create $swp1 333 "" 192.0.2.2/28 144*541c6ce3SPetr Machata vlan_create $swp1 555 "" 192.0.2.17/28 145*541c6ce3SPetr Machata 146*541c6ce3SPetr Machata tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \ 147*541c6ce3SPetr Machata ttl 100 tos inherit 148*541c6ce3SPetr Machata 149*541c6ce3SPetr Machata ip link set dev $swp3 up 150*541c6ce3SPetr Machata ip link set dev $swp4 up 151*541c6ce3SPetr Machata team_create lag1 lacp $swp3 $swp4 152*541c6ce3SPetr Machata __addr_add_del lag1 add 192.0.2.129/32 153*541c6ce3SPetr Machata ip -4 route add 192.0.2.130/32 dev lag1 154*541c6ce3SPetr Machata} 155*541c6ce3SPetr Machata 156*541c6ce3SPetr Machataswitch_destroy() 157*541c6ce3SPetr Machata{ 158*541c6ce3SPetr Machata ip -4 route del 192.0.2.130/32 dev lag1 159*541c6ce3SPetr Machata __addr_add_del lag1 del 192.0.2.129/32 160*541c6ce3SPetr Machata team_destroy lag1 161*541c6ce3SPetr Machata 162*541c6ce3SPetr Machata ip link set dev $swp4 down 163*541c6ce3SPetr Machata ip link set dev $swp3 down 164*541c6ce3SPetr Machata 165*541c6ce3SPetr Machata tunnel_destroy gt4 166*541c6ce3SPetr Machata 167*541c6ce3SPetr Machata vlan_destroy $swp1 555 168*541c6ce3SPetr Machata vlan_destroy $swp1 333 169*541c6ce3SPetr Machata tc qdisc del dev $swp1 clsact 170*541c6ce3SPetr Machata ip link set dev $swp1 down 171*541c6ce3SPetr Machata} 172*541c6ce3SPetr Machata 173*541c6ce3SPetr Machatasetup_prepare() 174*541c6ce3SPetr Machata{ 175*541c6ce3SPetr Machata h1=${NETIFS[p1]} 176*541c6ce3SPetr Machata swp1=${NETIFS[p2]} 177*541c6ce3SPetr Machata 178*541c6ce3SPetr Machata swp3=${NETIFS[p3]} 179*541c6ce3SPetr Machata h3=${NETIFS[p4]} 180*541c6ce3SPetr Machata 181*541c6ce3SPetr Machata swp4=${NETIFS[p5]} 182*541c6ce3SPetr Machata h4=${NETIFS[p6]} 183*541c6ce3SPetr Machata 184*541c6ce3SPetr Machata vrf_prepare 185*541c6ce3SPetr Machata 186*541c6ce3SPetr Machata ip link set dev $h1 up 187*541c6ce3SPetr Machata h1_create 188*541c6ce3SPetr Machata h2_create 189*541c6ce3SPetr Machata h3_create 190*541c6ce3SPetr Machata switch_create 191*541c6ce3SPetr Machata 192*541c6ce3SPetr Machata trap_install $h3 ingress 193*541c6ce3SPetr Machata trap_install $h4 ingress 194*541c6ce3SPetr Machata} 195*541c6ce3SPetr Machata 196*541c6ce3SPetr Machatacleanup() 197*541c6ce3SPetr Machata{ 198*541c6ce3SPetr Machata pre_cleanup 199*541c6ce3SPetr Machata 200*541c6ce3SPetr Machata trap_uninstall $h4 ingress 201*541c6ce3SPetr Machata trap_uninstall $h3 ingress 202*541c6ce3SPetr Machata 203*541c6ce3SPetr Machata switch_destroy 204*541c6ce3SPetr Machata h3_destroy 205*541c6ce3SPetr Machata h2_destroy 206*541c6ce3SPetr Machata h1_destroy 207*541c6ce3SPetr Machata ip link set dev $h1 down 208*541c6ce3SPetr Machata 209*541c6ce3SPetr Machata vrf_cleanup 210*541c6ce3SPetr Machata} 211*541c6ce3SPetr Machata 212*541c6ce3SPetr Machatatest_lag_slave() 213*541c6ce3SPetr Machata{ 214*541c6ce3SPetr Machata local up_dev=$1; shift 215*541c6ce3SPetr Machata local down_dev=$1; shift 216*541c6ce3SPetr Machata local what=$1; shift 217*541c6ce3SPetr Machata 218*541c6ce3SPetr Machata RET=0 219*541c6ce3SPetr Machata 220*541c6ce3SPetr Machata mirror_install $swp1 ingress gt4 \ 221*541c6ce3SPetr Machata "proto 802.1q flower vlan_id 333 $tcflags" 222*541c6ce3SPetr Machata 223*541c6ce3SPetr Machata # Move $down_dev away from the team. That will prompt change in 224*541c6ce3SPetr Machata # txability of the connected device, without changing its upness. The 225*541c6ce3SPetr Machata # driver should notice the txability change and move the traffic to the 226*541c6ce3SPetr Machata # other slave. 227*541c6ce3SPetr Machata ip link set dev $down_dev nomaster 228*541c6ce3SPetr Machata sleep 2 229*541c6ce3SPetr Machata mirror_test vrf-h1 192.0.2.1 192.0.2.18 $up_dev 1 10 230*541c6ce3SPetr Machata 231*541c6ce3SPetr Machata # Test lack of connectivity when neither slave is txable. 232*541c6ce3SPetr Machata ip link set dev $up_dev nomaster 233*541c6ce3SPetr Machata sleep 2 234*541c6ce3SPetr Machata mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h3 1 0 235*541c6ce3SPetr Machata mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h4 1 0 236*541c6ce3SPetr Machata mirror_uninstall $swp1 ingress 237*541c6ce3SPetr Machata 238*541c6ce3SPetr Machata # Recreate H3's team device, because mlxsw, which this test is 239*541c6ce3SPetr Machata # predominantly mean to test, requires a bottom-up construction and 240*541c6ce3SPetr Machata # doesn't allow enslavement to a device that already has an upper. 241*541c6ce3SPetr Machata h3_destroy_team 242*541c6ce3SPetr Machata h3_create_team 243*541c6ce3SPetr Machata # Wait for ${h,swp}{3,4}. 244*541c6ce3SPetr Machata setup_wait 245*541c6ce3SPetr Machata 246*541c6ce3SPetr Machata log_test "$what ($tcflags)" 247*541c6ce3SPetr Machata} 248*541c6ce3SPetr Machata 249*541c6ce3SPetr Machatatest_mirror_gretap_first() 250*541c6ce3SPetr Machata{ 251*541c6ce3SPetr Machata test_lag_slave $h3 $h4 "mirror to gretap: LAG first slave" 252*541c6ce3SPetr Machata} 253*541c6ce3SPetr Machata 254*541c6ce3SPetr Machatatest_mirror_gretap_second() 255*541c6ce3SPetr Machata{ 256*541c6ce3SPetr Machata test_lag_slave $h4 $h3 "mirror to gretap: LAG second slave" 257*541c6ce3SPetr Machata} 258*541c6ce3SPetr Machata 259*541c6ce3SPetr Machatatest_all() 260*541c6ce3SPetr Machata{ 261*541c6ce3SPetr Machata slow_path_trap_install $swp1 ingress 262*541c6ce3SPetr Machata slow_path_trap_install $swp1 egress 263*541c6ce3SPetr Machata 264*541c6ce3SPetr Machata tests_run 265*541c6ce3SPetr Machata 266*541c6ce3SPetr Machata slow_path_trap_uninstall $swp1 egress 267*541c6ce3SPetr Machata slow_path_trap_uninstall $swp1 ingress 268*541c6ce3SPetr Machata} 269*541c6ce3SPetr Machata 270*541c6ce3SPetr Machatatrap cleanup EXIT 271*541c6ce3SPetr Machata 272*541c6ce3SPetr Machatasetup_prepare 273*541c6ce3SPetr Machatasetup_wait 274*541c6ce3SPetr Machata 275*541c6ce3SPetr Machatatcflags="skip_hw" 276*541c6ce3SPetr Machatatest_all 277*541c6ce3SPetr Machata 278*541c6ce3SPetr Machataif ! tc_offload_check; then 279*541c6ce3SPetr Machata echo "WARN: Could not test offloaded functionality" 280*541c6ce3SPetr Machataelse 281*541c6ce3SPetr Machata tcflags="skip_sw" 282*541c6ce3SPetr Machata test_all 283*541c6ce3SPetr Machatafi 284*541c6ce3SPetr Machata 285*541c6ce3SPetr Machataexit $EXIT_STATUS 286