Path: blob/master/tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh
26299 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.02#3# This test is for checking devlink-trap functionality. It makes use of4# netdevsim which implements the required callbacks.56lib_dir=$(dirname $0)/../../../net/forwarding78ALL_TESTS="9init_test10trap_action_test11trap_metadata_test12bad_trap_test13bad_trap_action_test14trap_stats_test15trap_group_action_test16bad_trap_group_test17trap_group_stats_test18trap_policer_test19trap_policer_bind_test20port_del_test21dev_del_test22"23NETDEVSIM_PATH=/sys/bus/netdevsim/24DEV_ADDR=133725DEV=netdevsim${DEV_ADDR}26DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/27SLEEP_TIME=128NETDEV=""29NUM_NETIFS=030source $lib_dir/lib.sh3132DEVLINK_DEV=33source $lib_dir/devlink_lib.sh34DEVLINK_DEV=netdevsim/${DEV}3536require_command udevadm3738modprobe netdevsim &> /dev/null39if [ ! -d "$NETDEVSIM_PATH" ]; then40echo "SKIP: No netdevsim support"41exit 142fi4344if [ -d "${NETDEVSIM_PATH}/devices/netdevsim${DEV_ADDR}" ]; then45echo "SKIP: Device netdevsim${DEV_ADDR} already exists"46exit 147fi4849check_netdev_down()50{51state=$(cat /sys/class/net/${NETDEV}/flags)5253if [ $((state & 1)) -ne 0 ]; then54echo "WARNING: unexpected interface UP, disable NetworkManager?"5556ip link set dev $NETDEV down57fi58}5960init_test()61{62RET=06364test $(devlink_traps_num_get) -ne 065check_err $? "No traps were registered"6667log_test "Initialization"68}6970trap_action_test()71{72local orig_action73local trap_name74local action7576RET=07778for trap_name in $(devlink_traps_get); do79# The action of non-drop traps cannot be changed.80if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then81devlink_trap_action_set $trap_name "trap"82action=$(devlink_trap_action_get $trap_name)83if [ $action != "trap" ]; then84check_err 1 "Trap $trap_name did not change action to trap"85fi8687devlink_trap_action_set $trap_name "drop"88action=$(devlink_trap_action_get $trap_name)89if [ $action != "drop" ]; then90check_err 1 "Trap $trap_name did not change action to drop"91fi92else93orig_action=$(devlink_trap_action_get $trap_name)9495devlink_trap_action_set $trap_name "trap"96action=$(devlink_trap_action_get $trap_name)97if [ $action != $orig_action ]; then98check_err 1 "Trap $trap_name changed action when should not"99fi100101devlink_trap_action_set $trap_name "drop"102action=$(devlink_trap_action_get $trap_name)103if [ $action != $orig_action ]; then104check_err 1 "Trap $trap_name changed action when should not"105fi106fi107done108109log_test "Trap action"110}111112trap_metadata_test()113{114local trap_name115116RET=0117118for trap_name in $(devlink_traps_get); do119devlink_trap_metadata_test $trap_name "input_port"120check_err $? "Input port not reported as metadata of trap $trap_name"121if [ $trap_name == "ingress_flow_action_drop" ] ||122[ $trap_name == "egress_flow_action_drop" ]; then123devlink_trap_metadata_test $trap_name "flow_action_cookie"124check_err $? "Flow action cookie not reported as metadata of trap $trap_name"125fi126done127128log_test "Trap metadata"129}130131bad_trap_test()132{133RET=0134135devlink_trap_action_set "made_up_trap" "drop"136check_fail $? "Did not get an error for non-existing trap"137138log_test "Non-existing trap"139}140141bad_trap_action_test()142{143local traps_arr144local trap_name145146RET=0147148# Pick first trap.149traps_arr=($(devlink_traps_get))150trap_name=${traps_arr[0]}151152devlink_trap_action_set $trap_name "made_up_action"153check_fail $? "Did not get an error for non-existing trap action"154155log_test "Non-existing trap action"156}157158trap_stats_test()159{160local trap_name161162RET=0163164check_netdev_down165for trap_name in $(devlink_traps_get); do166devlink_trap_stats_idle_test $trap_name167check_err $? "Stats of trap $trap_name not idle when netdev down"168169ip link set dev $NETDEV up170171if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then172devlink_trap_action_set $trap_name "trap"173devlink_trap_stats_idle_test $trap_name174check_fail $? "Stats of trap $trap_name idle when action is trap"175176devlink_trap_action_set $trap_name "drop"177devlink_trap_stats_idle_test $trap_name178check_err $? "Stats of trap $trap_name not idle when action is drop"179180echo "y"> $DEBUGFS_DIR/fail_trap_drop_counter_get181devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null182check_fail $? "Managed to read trap (hard dropped) statistics when should not"183echo "n"> $DEBUGFS_DIR/fail_trap_drop_counter_get184devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null185check_err $? "Did not manage to read trap (hard dropped) statistics when should"186187devlink_trap_drop_stats_idle_test $trap_name188check_fail $? "Drop stats of trap $trap_name idle when should not"189else190devlink_trap_stats_idle_test $trap_name191check_fail $? "Stats of non-drop trap $trap_name idle when should not"192fi193194ip link set dev $NETDEV down195done196197log_test "Trap statistics"198}199200trap_group_action_test()201{202local curr_group group_name203local trap_name204local trap_type205local action206207RET=0208209for group_name in $(devlink_trap_groups_get); do210devlink_trap_group_action_set $group_name "trap"211212for trap_name in $(devlink_traps_get); do213curr_group=$(devlink_trap_group_get $trap_name)214if [ $curr_group != $group_name ]; then215continue216fi217218trap_type=$(devlink_trap_type_get $trap_name)219if [ $trap_type != "drop" ]; then220continue221fi222223action=$(devlink_trap_action_get $trap_name)224if [ $action != "trap" ]; then225check_err 1 "Trap $trap_name did not change action to trap"226fi227done228229devlink_trap_group_action_set $group_name "drop"230231for trap_name in $(devlink_traps_get); do232curr_group=$(devlink_trap_group_get $trap_name)233if [ $curr_group != $group_name ]; then234continue235fi236237trap_type=$(devlink_trap_type_get $trap_name)238if [ $trap_type != "drop" ]; then239continue240fi241242action=$(devlink_trap_action_get $trap_name)243if [ $action != "drop" ]; then244check_err 1 "Trap $trap_name did not change action to drop"245fi246done247done248249log_test "Trap group action"250}251252bad_trap_group_test()253{254RET=0255256devlink_trap_group_action_set "made_up_trap_group" "drop"257check_fail $? "Did not get an error for non-existing trap group"258259log_test "Non-existing trap group"260}261262trap_group_stats_test()263{264local group_name265266RET=0267268check_netdev_down269for group_name in $(devlink_trap_groups_get); do270devlink_trap_group_stats_idle_test $group_name271check_err $? "Stats of trap group $group_name not idle when netdev down"272273ip link set dev $NETDEV up274275devlink_trap_group_action_set $group_name "trap"276devlink_trap_group_stats_idle_test $group_name277check_fail $? "Stats of trap group $group_name idle when action is trap"278279devlink_trap_group_action_set $group_name "drop"280ip link set dev $NETDEV down281done282283log_test "Trap group statistics"284}285286trap_policer_test()287{288local packets_t0289local packets_t1290291RET=0292293if [ $(devlink_trap_policers_num_get) -eq 0 ]; then294check_err 1 "Failed to dump policers"295fi296297devlink trap policer set $DEVLINK_DEV policer 1337 &> /dev/null298check_fail $? "Did not get an error for setting a non-existing policer"299devlink trap policer show $DEVLINK_DEV policer 1337 &> /dev/null300check_fail $? "Did not get an error for getting a non-existing policer"301302devlink trap policer set $DEVLINK_DEV policer 1 rate 2000 burst 16303check_err $? "Failed to set valid parameters for a valid policer"304if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then305check_err 1 "Policer rate was not changed"306fi307if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then308check_err 1 "Policer burst size was not changed"309fi310311devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null312check_fail $? "Policer rate was changed to rate lower than limit"313devlink trap policer set $DEVLINK_DEV policer 1 rate 9000 &> /dev/null314check_fail $? "Policer rate was changed to rate higher than limit"315devlink trap policer set $DEVLINK_DEV policer 1 burst 2 &> /dev/null316check_fail $? "Policer burst size was changed to burst size lower than limit"317devlink trap policer set $DEVLINK_DEV policer 1 rate 65537 &> /dev/null318check_fail $? "Policer burst size was changed to burst size higher than limit"319echo "y" > $DEBUGFS_DIR/fail_trap_policer_set320devlink trap policer set $DEVLINK_DEV policer 1 rate 3000 &> /dev/null321check_fail $? "Managed to set policer rate when should not"322echo "n" > $DEBUGFS_DIR/fail_trap_policer_set323if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then324check_err 1 "Policer rate was changed to an invalid value"325fi326if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then327check_err 1 "Policer burst size was changed to an invalid value"328fi329330packets_t0=$(devlink_trap_policer_rx_dropped_get 1)331sleep .5332packets_t1=$(devlink_trap_policer_rx_dropped_get 1)333if [ ! $packets_t1 -gt $packets_t0 ]; then334check_err 1 "Policer drop counter was not incremented"335fi336337echo "y"> $DEBUGFS_DIR/fail_trap_policer_counter_get338devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null339check_fail $? "Managed to read policer drop counter when should not"340echo "n"> $DEBUGFS_DIR/fail_trap_policer_counter_get341devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null342check_err $? "Did not manage to read policer drop counter when should"343344log_test "Trap policer"345}346347trap_group_check_policer()348{349local group_name=$1; shift350351devlink -j -p trap group show $DEVLINK_DEV group $group_name \352| jq -e '.[][][]["policer"]' &> /dev/null353}354355trap_policer_bind_test()356{357RET=0358359devlink trap group set $DEVLINK_DEV group l2_drops policer 1360check_err $? "Failed to bind a valid policer"361if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then362check_err 1 "Bound policer was not changed"363fi364365devlink trap group set $DEVLINK_DEV group l2_drops policer 1337 \366&> /dev/null367check_fail $? "Did not get an error for binding a non-existing policer"368if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then369check_err 1 "Bound policer was changed when should not"370fi371372devlink trap group set $DEVLINK_DEV group l2_drops policer 0373check_err $? "Failed to unbind a policer when using ID 0"374trap_group_check_policer "l2_drops"375check_fail $? "Trap group has a policer after unbinding with ID 0"376377devlink trap group set $DEVLINK_DEV group l2_drops policer 1378check_err $? "Failed to bind a valid policer"379380devlink trap group set $DEVLINK_DEV group l2_drops nopolicer381check_err $? "Failed to unbind a policer when using 'nopolicer' keyword"382trap_group_check_policer "l2_drops"383check_fail $? "Trap group has a policer after unbinding with 'nopolicer' keyword"384385devlink trap group set $DEVLINK_DEV group l2_drops policer 1386check_err $? "Failed to bind a valid policer"387388echo "y"> $DEBUGFS_DIR/fail_trap_group_set389devlink trap group set $DEVLINK_DEV group l2_drops policer 2 \390&> /dev/null391check_fail $? "Managed to bind a policer when should not"392echo "n"> $DEBUGFS_DIR/fail_trap_group_set393devlink trap group set $DEVLINK_DEV group l2_drops policer 2394check_err $? "Did not manage to bind a policer when should"395396devlink trap group set $DEVLINK_DEV group l2_drops action drop \397policer 1337 &> /dev/null398check_fail $? "Did not get an error for partially modified trap group"399400log_test "Trap policer binding"401}402403port_del_test()404{405local group_name406local i407408# The test never fails. It is meant to exercise different code paths409# and make sure we properly dismantle a port while packets are410# in-flight.411RET=0412413devlink_traps_enable_all414415for i in $(seq 1 10); do416ip link set dev $NETDEV up417418sleep $SLEEP_TIME419420netdevsim_port_destroy421netdevsim_port_create422udevadm settle423done424425devlink_traps_disable_all426427log_test "Port delete"428}429430dev_del_test()431{432local group_name433local i434435# The test never fails. It is meant to exercise different code paths436# and make sure we properly unregister traps while packets are437# in-flight.438RET=0439440devlink_traps_enable_all441442for i in $(seq 1 10); do443ip link set dev $NETDEV up444445sleep $SLEEP_TIME446447cleanup448setup_prepare449done450451devlink_traps_disable_all452453log_test "Device delete"454}455456netdevsim_dev_create()457{458echo "$DEV_ADDR 0" > ${NETDEVSIM_PATH}/new_device459}460461netdevsim_dev_destroy()462{463echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device464}465466netdevsim_port_create()467{468echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/new_port469}470471netdevsim_port_destroy()472{473echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/del_port474}475476setup_prepare()477{478local netdev479480netdevsim_dev_create481482if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}" ]; then483echo "Failed to create netdevsim device"484exit 1485fi486487netdevsim_port_create488489if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}/net/" ]; then490echo "Failed to create netdevsim port"491exit 1492fi493494# Wait for udev to rename newly created netdev.495udevadm settle496497NETDEV=$(ls ${NETDEVSIM_PATH}/devices/${DEV}/net/)498}499500cleanup()501{502pre_cleanup503netdevsim_port_destroy504netdevsim_dev_destroy505}506507trap cleanup EXIT508509setup_prepare510511tests_run512513exit $EXIT_STATUS514515516