1*c0375944SIdo Schimmel#!/bin/bash 2*c0375944SIdo Schimmel# SPDX-License-Identifier: GPL-2.0 3*c0375944SIdo Schimmel# 4*c0375944SIdo Schimmel# Test the protodown mechanism. Verify basic protodown toggling, protodown 5*c0375944SIdo Schimmel# reasons, operational state when the lower device carrier changes, and correct 6*c0375944SIdo Schimmel# operational state when the lower device has no carrier. 7*c0375944SIdo Schimmel 8*c0375944SIdo Schimmel# shellcheck disable=SC1091,SC2034,SC2154,SC2317 9*c0375944SIdo Schimmelsource lib.sh 10*c0375944SIdo Schimmel 11*c0375944SIdo Schimmelrequire_command jq 12*c0375944SIdo Schimmel 13*c0375944SIdo SchimmelALL_TESTS=" 14*c0375944SIdo Schimmel protodown_basic_macvlan 15*c0375944SIdo Schimmel protodown_basic_vxlan 16*c0375944SIdo Schimmel protodown_reasons 17*c0375944SIdo Schimmel protodown_lower_toggle 18*c0375944SIdo Schimmel protodown_lower_down 19*c0375944SIdo Schimmel" 20*c0375944SIdo Schimmel 21*c0375944SIdo Schimmeloperstate_get() 22*c0375944SIdo Schimmel{ 23*c0375944SIdo Schimmel local ns=$1; shift 24*c0375944SIdo Schimmel local dev=$1; shift 25*c0375944SIdo Schimmel 26*c0375944SIdo Schimmel ip -n "$ns" -j link show dev "$dev" | jq -r '.[].operstate' 27*c0375944SIdo Schimmel} 28*c0375944SIdo Schimmel 29*c0375944SIdo Schimmeloperstate_check() 30*c0375944SIdo Schimmel{ 31*c0375944SIdo Schimmel local ns=$1; shift 32*c0375944SIdo Schimmel local dev=$1; shift 33*c0375944SIdo Schimmel local expected=$1; shift 34*c0375944SIdo Schimmel 35*c0375944SIdo Schimmel local current 36*c0375944SIdo Schimmel current=$(operstate_get "$ns" "$dev") 37*c0375944SIdo Schimmel 38*c0375944SIdo Schimmel [ "$current" = "$expected" ] 39*c0375944SIdo Schimmel} 40*c0375944SIdo Schimmel 41*c0375944SIdo Schimmelsetup_prepare() 42*c0375944SIdo Schimmel{ 43*c0375944SIdo Schimmel setup_ns NS 44*c0375944SIdo Schimmel defer cleanup_all_ns 45*c0375944SIdo Schimmel 46*c0375944SIdo Schimmel ip -n "$NS" link add name dummy0 up type dummy 47*c0375944SIdo Schimmel 48*c0375944SIdo Schimmel ip -n "$NS" link add name macvlan0 link dummy0 up type macvlan mode bridge 49*c0375944SIdo Schimmel 50*c0375944SIdo Schimmel ip -n "$NS" link add name vxlan0 up type vxlan id 10010 dstport 4789 51*c0375944SIdo Schimmel} 52*c0375944SIdo Schimmel 53*c0375944SIdo Schimmelprotodown_basic() 54*c0375944SIdo Schimmel{ 55*c0375944SIdo Schimmel local dev=$1; shift 56*c0375944SIdo Schimmel 57*c0375944SIdo Schimmel ip -n "$NS" link set dev "$dev" protodown on 58*c0375944SIdo Schimmel check_err $? "Failed to set protodown on" 59*c0375944SIdo Schimmel 60*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" "$dev" DOWN 61*c0375944SIdo Schimmel check_err $? "Operational state is not DOWN after setting protodown" 62*c0375944SIdo Schimmel 63*c0375944SIdo Schimmel ip -n "$NS" link set dev "$dev" protodown off 64*c0375944SIdo Schimmel check_err $? "Failed to set protodown off" 65*c0375944SIdo Schimmel 66*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" "$dev" UP 67*c0375944SIdo Schimmel check_err $? "Operational state is not UP after clearing protodown" 68*c0375944SIdo Schimmel} 69*c0375944SIdo Schimmel 70*c0375944SIdo Schimmelprotodown_basic_macvlan() 71*c0375944SIdo Schimmel{ 72*c0375944SIdo Schimmel RET=0 73*c0375944SIdo Schimmel 74*c0375944SIdo Schimmel protodown_basic macvlan0 75*c0375944SIdo Schimmel 76*c0375944SIdo Schimmel log_test "Basic protodown on/off with macvlan" 77*c0375944SIdo Schimmel} 78*c0375944SIdo Schimmel 79*c0375944SIdo Schimmelprotodown_basic_vxlan() 80*c0375944SIdo Schimmel{ 81*c0375944SIdo Schimmel RET=0 82*c0375944SIdo Schimmel 83*c0375944SIdo Schimmel protodown_basic vxlan0 84*c0375944SIdo Schimmel 85*c0375944SIdo Schimmel log_test "Basic protodown on/off with vxlan" 86*c0375944SIdo Schimmel} 87*c0375944SIdo Schimmel 88*c0375944SIdo Schimmelprotodown_reasons() 89*c0375944SIdo Schimmel{ 90*c0375944SIdo Schimmel RET=0 91*c0375944SIdo Schimmel 92*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown on 93*c0375944SIdo Schimmel 94*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown_reason 0 on 95*c0375944SIdo Schimmel check_err $? "Failed to set protodown reason bit 0" 96*c0375944SIdo Schimmel 97*c0375944SIdo Schimmel # Cannot clear protodown while reasons are active. 98*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown off 2>/dev/null 99*c0375944SIdo Schimmel check_fail $? "Clearing protodown succeeded with active reasons" 100*c0375944SIdo Schimmel 101*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown_reason 0 off 102*c0375944SIdo Schimmel check_err $? "Failed to clear protodown reason bit 0" 103*c0375944SIdo Schimmel 104*c0375944SIdo Schimmel # Can clear protodown when no reasons are active. 105*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown off 106*c0375944SIdo Schimmel check_err $? "Failed to clear protodown with no active reasons" 107*c0375944SIdo Schimmel 108*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP 109*c0375944SIdo Schimmel check_err $? "Operational state is not UP after clearing protodown" 110*c0375944SIdo Schimmel 111*c0375944SIdo Schimmel log_test "Protodown reasons" 112*c0375944SIdo Schimmel} 113*c0375944SIdo Schimmel 114*c0375944SIdo Schimmelprotodown_lower_toggle() 115*c0375944SIdo Schimmel{ 116*c0375944SIdo Schimmel RET=0 117*c0375944SIdo Schimmel 118*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown on 119*c0375944SIdo Schimmel 120*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 DOWN 121*c0375944SIdo Schimmel check_err $? "Operational state is not DOWN after setting protodown" 122*c0375944SIdo Schimmel 123*c0375944SIdo Schimmel # Toggle carrier on the lower device. The macvlan should stay DOWN 124*c0375944SIdo Schimmel # because protodown is on. 125*c0375944SIdo Schimmel ip -n "$NS" link set dev dummy0 carrier off 126*c0375944SIdo Schimmel ip -n "$NS" link set dev dummy0 carrier on 127*c0375944SIdo Schimmel 128*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" dummy0 UP 129*c0375944SIdo Schimmel check_err $? "Lower device is not UP after carrier on" 130*c0375944SIdo Schimmel 131*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 DOWN 132*c0375944SIdo Schimmel check_err $? "Macvlan operational state is not DOWN despite protodown" 133*c0375944SIdo Schimmel 134*c0375944SIdo Schimmel # Clear protodown and verify the macvlan comes back up. 135*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown off 136*c0375944SIdo Schimmel 137*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP 138*c0375944SIdo Schimmel check_err $? "Operational state is not UP after clearing protodown" 139*c0375944SIdo Schimmel 140*c0375944SIdo Schimmel log_test "Protodown with lower device toggled" 141*c0375944SIdo Schimmel} 142*c0375944SIdo Schimmel 143*c0375944SIdo Schimmelprotodown_lower_down() 144*c0375944SIdo Schimmel{ 145*c0375944SIdo Schimmel RET=0 146*c0375944SIdo Schimmel 147*c0375944SIdo Schimmel # Bring the lower device carrier down first. 148*c0375944SIdo Schimmel ip -n "$NS" link set dev dummy0 carrier off 149*c0375944SIdo Schimmel 150*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN 151*c0375944SIdo Schimmel check_err $? "Macvlan is not LOWERLAYERDOWN with lower carrier off" 152*c0375944SIdo Schimmel 153*c0375944SIdo Schimmel # Toggle protodown on and off while lower has no carrier. The macvlan 154*c0375944SIdo Schimmel # should not transition to UP. 155*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown on 156*c0375944SIdo Schimmel 157*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN 158*c0375944SIdo Schimmel check_err $? "Macvlan is not LOWERLAYERDOWN after setting protodown" 159*c0375944SIdo Schimmel 160*c0375944SIdo Schimmel ip -n "$NS" link set dev macvlan0 protodown off 161*c0375944SIdo Schimmel 162*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN 163*c0375944SIdo Schimmel check_err $? "Macvlan is not LOWERLAYERDOWN after clearing protodown" 164*c0375944SIdo Schimmel 165*c0375944SIdo Schimmel # Bring the lower device carrier up. The macvlan should transition to 166*c0375944SIdo Schimmel # UP. 167*c0375944SIdo Schimmel ip -n "$NS" link set dev dummy0 carrier on 168*c0375944SIdo Schimmel 169*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" dummy0 UP 170*c0375944SIdo Schimmel check_err $? "Lower device is not UP after carrier on" 171*c0375944SIdo Schimmel 172*c0375944SIdo Schimmel busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP 173*c0375944SIdo Schimmel check_err $? "Macvlan is not UP after lower device is UP" 174*c0375944SIdo Schimmel 175*c0375944SIdo Schimmel log_test "Protodown with lower device down" 176*c0375944SIdo Schimmel} 177*c0375944SIdo Schimmel 178*c0375944SIdo Schimmeltrap defer_scopes_cleanup EXIT 179*c0375944SIdo Schimmelsetup_prepare 180*c0375944SIdo Schimmeltests_run 181*c0375944SIdo Schimmel 182*c0375944SIdo Schimmelexit "$EXIT_STATUS" 183