1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# Test that policers shared by different tc filters are correctly reference 5# counted by observing policers' occupancy via devlink-resource. 6 7lib_dir=$(dirname $0)/../../../net/forwarding 8 9ALL_TESTS=" 10 tc_police_occ_test 11" 12NUM_NETIFS=2 13source $lib_dir/lib.sh 14source $lib_dir/devlink_lib.sh 15 16h1_create() 17{ 18 simple_if_init $h1 19} 20 21h1_destroy() 22{ 23 simple_if_fini $h1 24} 25 26switch_create() 27{ 28 simple_if_init $swp1 29 tc qdisc add dev $swp1 clsact 30} 31 32switch_destroy() 33{ 34 tc qdisc del dev $swp1 clsact 35 simple_if_fini $swp1 36} 37 38setup_prepare() 39{ 40 h1=${NETIFS[p1]} 41 swp1=${NETIFS[p2]} 42 43 vrf_prepare 44 45 h1_create 46 switch_create 47} 48 49cleanup() 50{ 51 pre_cleanup 52 53 switch_destroy 54 h1_destroy 55 56 vrf_cleanup 57} 58 59tc_police_occ_get() 60{ 61 devlink_resource_occ_get global_policers single_rate_policers 62} 63 64tc_police_occ_test() 65{ 66 RET=0 67 68 local occ=$(tc_police_occ_get) 69 70 tc filter add dev $swp1 ingress pref 1 handle 101 proto ip \ 71 flower skip_sw \ 72 action police rate 100mbit burst 100k conform-exceed drop/ok 73 (( occ + 1 == $(tc_police_occ_get) )) 74 check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))" 75 76 tc filter del dev $swp1 ingress pref 1 handle 101 flower 77 (( occ == $(tc_police_occ_get) )) 78 check_err $? "Got occupancy $(tc_police_occ_get), expected $occ" 79 80 tc filter add dev $swp1 ingress pref 1 handle 101 proto ip \ 81 flower skip_sw \ 82 action police rate 100mbit burst 100k conform-exceed drop/ok \ 83 index 10 84 tc filter add dev $swp1 ingress pref 2 handle 102 proto ip \ 85 flower skip_sw action police index 10 86 87 (( occ + 1 == $(tc_police_occ_get) )) 88 check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))" 89 90 tc filter del dev $swp1 ingress pref 2 handle 102 flower 91 (( occ + 1 == $(tc_police_occ_get) )) 92 check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))" 93 94 tc filter del dev $swp1 ingress pref 1 handle 101 flower 95 (( occ == $(tc_police_occ_get) )) 96 check_err $? "Got occupancy $(tc_police_occ_get), expected $occ" 97 98 log_test "tc police occupancy" 99} 100 101trap cleanup EXIT 102 103setup_prepare 104setup_wait 105 106tests_run 107 108exit $EXIT_STATUS 109