| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| lib_dir=$(dirname $0)/../../../net/forwarding |
| |
| ALL_TESTS=" |
| default_hw_stats_test |
| immediate_hw_stats_test |
| delayed_hw_stats_test |
| disabled_hw_stats_test |
| " |
| NUM_NETIFS=2 |
| |
| source $lib_dir/tc_common.sh |
| source $lib_dir/lib.sh |
| source $lib_dir/devlink_lib.sh |
| |
| h1_create() |
| { |
| simple_if_init $h1 192.0.2.1/24 |
| } |
| |
| h1_destroy() |
| { |
| simple_if_fini $h1 192.0.2.1/24 |
| } |
| |
| switch_create() |
| { |
| simple_if_init $swp1 192.0.2.2/24 |
| tc qdisc add dev $swp1 clsact |
| } |
| |
| switch_destroy() |
| { |
| tc qdisc del dev $swp1 clsact |
| simple_if_fini $swp1 192.0.2.2/24 |
| } |
| |
| hw_stats_test() |
| { |
| RET=0 |
| |
| local name=$1 |
| local action_hw_stats=$2 |
| local occ_delta=$3 |
| local expected_packet_count=$4 |
| |
| local orig_occ=$(devlink_resource_get "counters" "flow" | jq '.["occ"]') |
| |
| tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \ |
| skip_sw dst_ip 192.0.2.2 action drop $action_hw_stats |
| check_err $? "Failed to add rule with $name hw_stats" |
| |
| local new_occ=$(devlink_resource_get "counters" "flow" | jq '.["occ"]') |
| local expected_occ=$((orig_occ + occ_delta)) |
| [ "$new_occ" == "$expected_occ" ] |
| check_err $? "Expected occupancy of $expected_occ, got $new_occ" |
| |
| $MZ $h1 -c 1 -p 64 -a $h1mac -b $swp1mac -A 192.0.2.1 -B 192.0.2.2 \ |
| -t ip -q |
| |
| tc_check_packets "dev $swp1 ingress" 101 $expected_packet_count |
| check_err $? "Did not match incoming packet" |
| |
| tc filter del dev $swp1 ingress protocol ip pref 1 handle 101 flower |
| |
| log_test "$name hw_stats" |
| } |
| |
| default_hw_stats_test() |
| { |
| hw_stats_test "default" "" 2 1 |
| } |
| |
| immediate_hw_stats_test() |
| { |
| hw_stats_test "immediate" "hw_stats immediate" 2 1 |
| } |
| |
| delayed_hw_stats_test() |
| { |
| RET=0 |
| |
| tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \ |
| skip_sw dst_ip 192.0.2.2 action drop hw_stats delayed |
| check_fail $? "Unexpected success in adding rule with delayed hw_stats" |
| |
| log_test "delayed hw_stats" |
| } |
| |
| disabled_hw_stats_test() |
| { |
| hw_stats_test "disabled" "hw_stats disabled" 0 0 |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| swp1=${NETIFS[p2]} |
| |
| h1mac=$(mac_get $h1) |
| swp1mac=$(mac_get $swp1) |
| |
| vrf_prepare |
| |
| h1_create |
| switch_create |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| switch_destroy |
| h1_destroy |
| |
| vrf_cleanup |
| } |
| |
| check_tc_action_hw_stats_support |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tests_run |
| |
| exit $EXIT_STATUS |