1*dca12e9aSPetr Machata#!/bin/bash 2*dca12e9aSPetr Machata# SPDX-License-Identifier: GPL-2.0 3*dca12e9aSPetr Machata 4*dca12e9aSPetr Machatasource lib.sh 5*dca12e9aSPetr Machata 6*dca12e9aSPetr MachataALL_TESTS=" 7*dca12e9aSPetr Machata test_binding_on 8*dca12e9aSPetr Machata test_binding_off 9*dca12e9aSPetr Machata test_binding_toggle_on 10*dca12e9aSPetr Machata test_binding_toggle_off 11*dca12e9aSPetr Machata test_binding_toggle_on_when_upper_down 12*dca12e9aSPetr Machata test_binding_toggle_off_when_upper_down 13*dca12e9aSPetr Machata test_binding_toggle_on_when_lower_down 14*dca12e9aSPetr Machata test_binding_toggle_off_when_lower_down 15*dca12e9aSPetr Machata" 16*dca12e9aSPetr Machata 17*dca12e9aSPetr Machatasetup_prepare() 18*dca12e9aSPetr Machata{ 19*dca12e9aSPetr Machata local port 20*dca12e9aSPetr Machata 21*dca12e9aSPetr Machata ip_link_add br up type bridge vlan_filtering 1 22*dca12e9aSPetr Machata 23*dca12e9aSPetr Machata for port in d1 d2 d3; do 24*dca12e9aSPetr Machata ip_link_add $port type veth peer name r$port 25*dca12e9aSPetr Machata ip_link_set_up $port 26*dca12e9aSPetr Machata ip_link_set_up r$port 27*dca12e9aSPetr Machata ip_link_set_master $port br 28*dca12e9aSPetr Machata done 29*dca12e9aSPetr Machata 30*dca12e9aSPetr Machata bridge_vlan_add vid 11 dev br self 31*dca12e9aSPetr Machata bridge_vlan_add vid 11 dev d1 master 32*dca12e9aSPetr Machata 33*dca12e9aSPetr Machata bridge_vlan_add vid 12 dev br self 34*dca12e9aSPetr Machata bridge_vlan_add vid 12 dev d2 master 35*dca12e9aSPetr Machata 36*dca12e9aSPetr Machata bridge_vlan_add vid 13 dev br self 37*dca12e9aSPetr Machata bridge_vlan_add vid 13 dev d1 master 38*dca12e9aSPetr Machata bridge_vlan_add vid 13 dev d2 master 39*dca12e9aSPetr Machata 40*dca12e9aSPetr Machata bridge_vlan_add vid 14 dev br self 41*dca12e9aSPetr Machata bridge_vlan_add vid 14 dev d1 master 42*dca12e9aSPetr Machata bridge_vlan_add vid 14 dev d2 master 43*dca12e9aSPetr Machata bridge_vlan_add vid 14 dev d3 master 44*dca12e9aSPetr Machata} 45*dca12e9aSPetr Machata 46*dca12e9aSPetr Machataoperstate_is() 47*dca12e9aSPetr Machata{ 48*dca12e9aSPetr Machata local dev=$1; shift 49*dca12e9aSPetr Machata local expect=$1; shift 50*dca12e9aSPetr Machata 51*dca12e9aSPetr Machata local operstate=$(ip -j link show $dev | jq -r .[].operstate) 52*dca12e9aSPetr Machata if [[ $operstate == UP ]]; then 53*dca12e9aSPetr Machata operstate=1 54*dca12e9aSPetr Machata elif [[ $operstate == DOWN || $operstate == LOWERLAYERDOWN ]]; then 55*dca12e9aSPetr Machata operstate=0 56*dca12e9aSPetr Machata fi 57*dca12e9aSPetr Machata echo -n $operstate 58*dca12e9aSPetr Machata [[ $operstate == $expect ]] 59*dca12e9aSPetr Machata} 60*dca12e9aSPetr Machata 61*dca12e9aSPetr Machatacheck_operstate() 62*dca12e9aSPetr Machata{ 63*dca12e9aSPetr Machata local dev=$1; shift 64*dca12e9aSPetr Machata local expect=$1; shift 65*dca12e9aSPetr Machata local operstate 66*dca12e9aSPetr Machata 67*dca12e9aSPetr Machata operstate=$(busywait 1000 \ 68*dca12e9aSPetr Machata operstate_is "$dev" "$expect") 69*dca12e9aSPetr Machata check_err $? "Got operstate of $operstate, expected $expect" 70*dca12e9aSPetr Machata} 71*dca12e9aSPetr Machata 72*dca12e9aSPetr Machataadd_one_vlan() 73*dca12e9aSPetr Machata{ 74*dca12e9aSPetr Machata local link=$1; shift 75*dca12e9aSPetr Machata local id=$1; shift 76*dca12e9aSPetr Machata 77*dca12e9aSPetr Machata ip_link_add $link.$id link $link type vlan id $id "$@" 78*dca12e9aSPetr Machata} 79*dca12e9aSPetr Machata 80*dca12e9aSPetr Machataadd_vlans() 81*dca12e9aSPetr Machata{ 82*dca12e9aSPetr Machata add_one_vlan br 11 "$@" 83*dca12e9aSPetr Machata add_one_vlan br 12 "$@" 84*dca12e9aSPetr Machata add_one_vlan br 13 "$@" 85*dca12e9aSPetr Machata add_one_vlan br 14 "$@" 86*dca12e9aSPetr Machata} 87*dca12e9aSPetr Machata 88*dca12e9aSPetr Machataset_vlans() 89*dca12e9aSPetr Machata{ 90*dca12e9aSPetr Machata ip link set dev br.11 "$@" 91*dca12e9aSPetr Machata ip link set dev br.12 "$@" 92*dca12e9aSPetr Machata ip link set dev br.13 "$@" 93*dca12e9aSPetr Machata ip link set dev br.14 "$@" 94*dca12e9aSPetr Machata} 95*dca12e9aSPetr Machata 96*dca12e9aSPetr Machatadown_netdevs() 97*dca12e9aSPetr Machata{ 98*dca12e9aSPetr Machata local dev 99*dca12e9aSPetr Machata 100*dca12e9aSPetr Machata for dev in "$@"; do 101*dca12e9aSPetr Machata ip_link_set_down $dev 102*dca12e9aSPetr Machata done 103*dca12e9aSPetr Machata} 104*dca12e9aSPetr Machata 105*dca12e9aSPetr Machatacheck_operstates() 106*dca12e9aSPetr Machata{ 107*dca12e9aSPetr Machata local opst_11=$1; shift 108*dca12e9aSPetr Machata local opst_12=$1; shift 109*dca12e9aSPetr Machata local opst_13=$1; shift 110*dca12e9aSPetr Machata local opst_14=$1; shift 111*dca12e9aSPetr Machata 112*dca12e9aSPetr Machata check_operstate br.11 $opst_11 113*dca12e9aSPetr Machata check_operstate br.12 $opst_12 114*dca12e9aSPetr Machata check_operstate br.13 $opst_13 115*dca12e9aSPetr Machata check_operstate br.14 $opst_14 116*dca12e9aSPetr Machata} 117*dca12e9aSPetr Machata 118*dca12e9aSPetr Machatado_test_binding() 119*dca12e9aSPetr Machata{ 120*dca12e9aSPetr Machata local inject=$1; shift 121*dca12e9aSPetr Machata local what=$1; shift 122*dca12e9aSPetr Machata local opsts_d1=$1; shift 123*dca12e9aSPetr Machata local opsts_d2=$1; shift 124*dca12e9aSPetr Machata local opsts_d12=$1; shift 125*dca12e9aSPetr Machata local opsts_d123=$1; shift 126*dca12e9aSPetr Machata 127*dca12e9aSPetr Machata RET=0 128*dca12e9aSPetr Machata 129*dca12e9aSPetr Machata defer_scope_push 130*dca12e9aSPetr Machata down_netdevs d1 131*dca12e9aSPetr Machata $inject 132*dca12e9aSPetr Machata check_operstates $opsts_d1 133*dca12e9aSPetr Machata defer_scope_pop 134*dca12e9aSPetr Machata 135*dca12e9aSPetr Machata defer_scope_push 136*dca12e9aSPetr Machata down_netdevs d2 137*dca12e9aSPetr Machata $inject 138*dca12e9aSPetr Machata check_operstates $opsts_d2 139*dca12e9aSPetr Machata defer_scope_pop 140*dca12e9aSPetr Machata 141*dca12e9aSPetr Machata defer_scope_push 142*dca12e9aSPetr Machata down_netdevs d1 d2 143*dca12e9aSPetr Machata $inject 144*dca12e9aSPetr Machata check_operstates $opsts_d12 145*dca12e9aSPetr Machata defer_scope_pop 146*dca12e9aSPetr Machata 147*dca12e9aSPetr Machata defer_scope_push 148*dca12e9aSPetr Machata down_netdevs d1 d2 d3 149*dca12e9aSPetr Machata $inject 150*dca12e9aSPetr Machata check_operstates $opsts_d123 151*dca12e9aSPetr Machata defer_scope_pop 152*dca12e9aSPetr Machata 153*dca12e9aSPetr Machata log_test "Test bridge_binding $what" 154*dca12e9aSPetr Machata} 155*dca12e9aSPetr Machata 156*dca12e9aSPetr Machatado_test_binding_on() 157*dca12e9aSPetr Machata{ 158*dca12e9aSPetr Machata local inject=$1; shift 159*dca12e9aSPetr Machata local what=$1; shift 160*dca12e9aSPetr Machata 161*dca12e9aSPetr Machata do_test_binding "$inject" "$what" \ 162*dca12e9aSPetr Machata "0 1 1 1" \ 163*dca12e9aSPetr Machata "1 0 1 1" \ 164*dca12e9aSPetr Machata "0 0 0 1" \ 165*dca12e9aSPetr Machata "0 0 0 0" 166*dca12e9aSPetr Machata} 167*dca12e9aSPetr Machata 168*dca12e9aSPetr Machatado_test_binding_off() 169*dca12e9aSPetr Machata{ 170*dca12e9aSPetr Machata local inject=$1; shift 171*dca12e9aSPetr Machata local what=$1; shift 172*dca12e9aSPetr Machata 173*dca12e9aSPetr Machata do_test_binding "$inject" "$what" \ 174*dca12e9aSPetr Machata "1 1 1 1" \ 175*dca12e9aSPetr Machata "1 1 1 1" \ 176*dca12e9aSPetr Machata "1 1 1 1" \ 177*dca12e9aSPetr Machata "0 0 0 0" 178*dca12e9aSPetr Machata} 179*dca12e9aSPetr Machata 180*dca12e9aSPetr Machatatest_binding_on() 181*dca12e9aSPetr Machata{ 182*dca12e9aSPetr Machata add_vlans bridge_binding on 183*dca12e9aSPetr Machata set_vlans up 184*dca12e9aSPetr Machata do_test_binding_on : "on" 185*dca12e9aSPetr Machata} 186*dca12e9aSPetr Machata 187*dca12e9aSPetr Machatatest_binding_off() 188*dca12e9aSPetr Machata{ 189*dca12e9aSPetr Machata add_vlans bridge_binding off 190*dca12e9aSPetr Machata set_vlans up 191*dca12e9aSPetr Machata do_test_binding_off : "off" 192*dca12e9aSPetr Machata} 193*dca12e9aSPetr Machata 194*dca12e9aSPetr Machatatest_binding_toggle_on() 195*dca12e9aSPetr Machata{ 196*dca12e9aSPetr Machata add_vlans bridge_binding off 197*dca12e9aSPetr Machata set_vlans up 198*dca12e9aSPetr Machata set_vlans type vlan bridge_binding on 199*dca12e9aSPetr Machata do_test_binding_on : "off->on" 200*dca12e9aSPetr Machata} 201*dca12e9aSPetr Machata 202*dca12e9aSPetr Machatatest_binding_toggle_off() 203*dca12e9aSPetr Machata{ 204*dca12e9aSPetr Machata add_vlans bridge_binding on 205*dca12e9aSPetr Machata set_vlans up 206*dca12e9aSPetr Machata set_vlans type vlan bridge_binding off 207*dca12e9aSPetr Machata do_test_binding_off : "on->off" 208*dca12e9aSPetr Machata} 209*dca12e9aSPetr Machata 210*dca12e9aSPetr Machatadfr_set_binding_on() 211*dca12e9aSPetr Machata{ 212*dca12e9aSPetr Machata set_vlans type vlan bridge_binding on 213*dca12e9aSPetr Machata defer set_vlans type vlan bridge_binding off 214*dca12e9aSPetr Machata} 215*dca12e9aSPetr Machata 216*dca12e9aSPetr Machatadfr_set_binding_off() 217*dca12e9aSPetr Machata{ 218*dca12e9aSPetr Machata set_vlans type vlan bridge_binding off 219*dca12e9aSPetr Machata defer set_vlans type vlan bridge_binding on 220*dca12e9aSPetr Machata} 221*dca12e9aSPetr Machata 222*dca12e9aSPetr Machatatest_binding_toggle_on_when_lower_down() 223*dca12e9aSPetr Machata{ 224*dca12e9aSPetr Machata add_vlans bridge_binding off 225*dca12e9aSPetr Machata set_vlans up 226*dca12e9aSPetr Machata do_test_binding_on dfr_set_binding_on "off->on when lower down" 227*dca12e9aSPetr Machata} 228*dca12e9aSPetr Machata 229*dca12e9aSPetr Machatatest_binding_toggle_off_when_lower_down() 230*dca12e9aSPetr Machata{ 231*dca12e9aSPetr Machata add_vlans bridge_binding on 232*dca12e9aSPetr Machata set_vlans up 233*dca12e9aSPetr Machata do_test_binding_off dfr_set_binding_off "on->off when lower down" 234*dca12e9aSPetr Machata} 235*dca12e9aSPetr Machata 236*dca12e9aSPetr Machatatest_binding_toggle_on_when_upper_down() 237*dca12e9aSPetr Machata{ 238*dca12e9aSPetr Machata add_vlans bridge_binding off 239*dca12e9aSPetr Machata set_vlans type vlan bridge_binding on 240*dca12e9aSPetr Machata set_vlans up 241*dca12e9aSPetr Machata do_test_binding_on : "off->on when upper down" 242*dca12e9aSPetr Machata} 243*dca12e9aSPetr Machata 244*dca12e9aSPetr Machatatest_binding_toggle_off_when_upper_down() 245*dca12e9aSPetr Machata{ 246*dca12e9aSPetr Machata add_vlans bridge_binding on 247*dca12e9aSPetr Machata set_vlans type vlan bridge_binding off 248*dca12e9aSPetr Machata set_vlans up 249*dca12e9aSPetr Machata do_test_binding_off : "on->off when upper down" 250*dca12e9aSPetr Machata} 251*dca12e9aSPetr Machata 252*dca12e9aSPetr Machatatrap defer_scopes_cleanup EXIT 253*dca12e9aSPetr Machatasetup_prepare 254*dca12e9aSPetr Machatatests_run 255*dca12e9aSPetr Machata 256*dca12e9aSPetr Machataexit $EXIT_STATUS 257