| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0-only | |
| source ethtool-common.sh | |
| function get_value { | |
| local query="${SETTINGS_MAP[$1]}" | |
| echo $(ethtool -c $NSIM_NETDEV | \ | |
| awk -F':' -v pattern="$query:" '$0 ~ pattern {gsub(/[ \t]/, "", $2); print $2}') | |
| } | |
| function update_current_settings { | |
| for key in ${!SETTINGS_MAP[@]}; do | |
| CURRENT_SETTINGS[$key]=$(get_value $key) | |
| done | |
| echo ${CURRENT_SETTINGS[@]} | |
| } | |
| if ! ethtool -h | grep -q coalesce; then | |
| echo "SKIP: No --coalesce support in ethtool" | |
| exit 4 | |
| fi | |
| NSIM_NETDEV=$(make_netdev) | |
| set -o pipefail | |
| declare -A SETTINGS_MAP=( | |
| ["rx-frames-low"]="rx-frame-low" | |
| ["tx-frames-low"]="tx-frame-low" | |
| ["rx-frames-high"]="rx-frame-high" | |
| ["tx-frames-high"]="tx-frame-high" | |
| ["rx-usecs"]="rx-usecs" | |
| ["rx-frames"]="rx-frames" | |
| ["rx-usecs-irq"]="rx-usecs-irq" | |
| ["rx-frames-irq"]="rx-frames-irq" | |
| ["tx-usecs"]="tx-usecs" | |
| ["tx-frames"]="tx-frames" | |
| ["tx-usecs-irq"]="tx-usecs-irq" | |
| ["tx-frames-irq"]="tx-frames-irq" | |
| ["stats-block-usecs"]="stats-block-usecs" | |
| ["pkt-rate-low"]="pkt-rate-low" | |
| ["rx-usecs-low"]="rx-usecs-low" | |
| ["tx-usecs-low"]="tx-usecs-low" | |
| ["pkt-rate-high"]="pkt-rate-high" | |
| ["rx-usecs-high"]="rx-usecs-high" | |
| ["tx-usecs-high"]="tx-usecs-high" | |
| ["sample-interval"]="sample-interval" | |
| ) | |
| declare -A CURRENT_SETTINGS=( | |
| ["rx-frames-low"]="" | |
| ["tx-frames-low"]="" | |
| ["rx-frames-high"]="" | |
| ["tx-frames-high"]="" | |
| ["rx-usecs"]="" | |
| ["rx-frames"]="" | |
| ["rx-usecs-irq"]="" | |
| ["rx-frames-irq"]="" | |
| ["tx-usecs"]="" | |
| ["tx-frames"]="" | |
| ["tx-usecs-irq"]="" | |
| ["tx-frames-irq"]="" | |
| ["stats-block-usecs"]="" | |
| ["pkt-rate-low"]="" | |
| ["rx-usecs-low"]="" | |
| ["tx-usecs-low"]="" | |
| ["pkt-rate-high"]="" | |
| ["rx-usecs-high"]="" | |
| ["tx-usecs-high"]="" | |
| ["sample-interval"]="" | |
| ) | |
| declare -A EXPECTED_SETTINGS=( | |
| ["rx-frames-low"]="" | |
| ["tx-frames-low"]="" | |
| ["rx-frames-high"]="" | |
| ["tx-frames-high"]="" | |
| ["rx-usecs"]="" | |
| ["rx-frames"]="" | |
| ["rx-usecs-irq"]="" | |
| ["rx-frames-irq"]="" | |
| ["tx-usecs"]="" | |
| ["tx-frames"]="" | |
| ["tx-usecs-irq"]="" | |
| ["tx-frames-irq"]="" | |
| ["stats-block-usecs"]="" | |
| ["pkt-rate-low"]="" | |
| ["rx-usecs-low"]="" | |
| ["tx-usecs-low"]="" | |
| ["pkt-rate-high"]="" | |
| ["rx-usecs-high"]="" | |
| ["tx-usecs-high"]="" | |
| ["sample-interval"]="" | |
| ) | |
| # populate the expected settings map | |
| for key in ${!SETTINGS_MAP[@]}; do | |
| EXPECTED_SETTINGS[$key]=$(get_value $key) | |
| done | |
| # test | |
| for key in ${!SETTINGS_MAP[@]}; do | |
| value=$((RANDOM % $((2**32-1)))) | |
| ethtool -C $NSIM_NETDEV "$key" "$value" | |
| EXPECTED_SETTINGS[$key]="$value" | |
| expected=${EXPECTED_SETTINGS[@]} | |
| current=$(update_current_settings) | |
| check $? "$current" "$expected" | |
| set +x | |
| done | |
| # bool settings which ethtool displays on the same line | |
| ethtool -C $NSIM_NETDEV adaptive-rx on | |
| s=$(ethtool -c $NSIM_NETDEV | grep -q "Adaptive RX: on TX: off") | |
| check $? "$s" "" | |
| ethtool -C $NSIM_NETDEV adaptive-tx on | |
| s=$(ethtool -c $NSIM_NETDEV | grep -q "Adaptive RX: on TX: on") | |
| check $? "$s" "" | |
| if [ $num_errors -eq 0 ]; then | |
| echo "PASSED all $((num_passes)) checks" | |
| exit 0 | |
| else | |
| echo "FAILED $num_errors/$((num_errors+num_passes)) checks" | |
| exit 1 | |
| fi |