Message ID | 20231214135029.383595-9-tobias@waldekranz.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 00e7f29d9b895cbee58b7071900dd52ed6dcec1e |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: dsa: mv88e6xxx: Add "eth-mac" and "rmon" counter group support | expand |
On Thu, Dec 14, 2023 at 02:50:29PM +0100, Tobias Waldekranz wrote: > Validate the operation of rx and tx histogram counters, if supported > by the interface, by sending batches of packets targeted for each > bucket. > > Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> > --- Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> # enetc + ocelot ./ethtool_rmon.sh eno0 swp0 TEST: rx-pkts64to64 on eno0 [ OK ] TEST: rx-pkts65to127 on eno0 [ OK ] TEST: rx-pkts128to255 on eno0 [ OK ] TEST: rx-pkts256to511 on eno0 [ OK ] TEST: rx-pkts512to1023 on eno0 [ OK ] TEST: rx-pkts1024to1522 on eno0 [ OK ] TEST: rx-pkts1523to9600 on eno0 [ OK ] TEST: rx-pkts64to64 on swp0 [ OK ] TEST: rx-pkts65to127 on swp0 [ OK ] TEST: rx-pkts128to255 on swp0 [ OK ] TEST: rx-pkts256to511 on swp0 [ OK ] TEST: rx-pkts512to1023 on swp0 [ OK ] TEST: rx-pkts1024to1526 on swp0 [ OK ] TEST: rx-pkts1527to65535 on swp0 [ OK ] TEST: tx-pkts64to64 on eno0 [ OK ] TEST: tx-pkts65to127 on eno0 [ OK ] TEST: tx-pkts128to255 on eno0 [ OK ] TEST: tx-pkts256to511 on eno0 [ OK ] TEST: tx-pkts512to1023 on eno0 [ OK ] TEST: tx-pkts1024to1522 on eno0 [ OK ] TEST: tx-pkts1523to9600 on eno0 [ OK ] TEST: tx-pkts64to64 on swp0 [ OK ] TEST: tx-pkts65to127 on swp0 [ OK ] TEST: tx-pkts128to255 on swp0 [ OK ] TEST: tx-pkts256to511 on swp0 [ OK ] TEST: tx-pkts512to1023 on swp0 [ OK ] TEST: tx-pkts1024to1526 on swp0 [ OK ] TEST: tx-pkts1527to65535 on swp0 [ OK ] # mv88e6xxx ./ethtool_rmon.sh lan1 lan2 TEST: rx-pkts64to64 on lan1 [ OK ] TEST: rx-pkts65to127 on lan1 [ OK ] TEST: rx-pkts128to255 on lan1 [ OK ] TEST: rx-pkts256to511 on lan1 [ OK ] TEST: rx-pkts512to1023 on lan1 [ OK ] TEST: rx-pkts1024to65535 on lan1 [ OK ] TEST: rx-pkts64to64 on lan2 [ OK ] TEST: rx-pkts65to127 on lan2 [ OK ] TEST: rx-pkts128to255 on lan2 [ OK ] TEST: rx-pkts256to511 on lan2 [ OK ] TEST: rx-pkts512to1023 on lan2 [ OK ] TEST: rx-pkts1024to65535 on lan2 [ OK ] TEST: lan1 does not support tx histogram counters [SKIP] TEST: lan2 does not support tx histogram counters [SKIP] This is just lovely, thanks for the work, Tobias. Just one nitpick below. > +rmon_histogram() > +{ > + local iface=$1; shift > + local neigh=$1; shift > + local set=$1; shift > + local nbuckets=0 > + local step= > + > + RET=0 > + > + while read -r -a bucket; do > + step="$set-pkts${bucket[0]}to${bucket[1]} on $iface" > + > + for if in $iface $neigh; do My syntax highlighting in vim gets confused by the fact that you name a variable "if". I guess something like "netif" would do the trick. But bash doesn't seem to be confused. I can send a patch renaming this after it gets merged. There's no reason to resend - it's not a functional change. > + if ! ensure_mtu $if ${bucket[0]}; then > + log_test_skip "$if does not support the required MTU for $step" > + return > + fi > + done > + > + if ! bucket_test $iface $neigh $set $nbuckets ${bucket[0]}; then > + check_err 1 "$step failed" > + return 1 > + fi > + log_test "$step" > + nbuckets=$((nbuckets + 1)) > + done < <(ethtool --json -S $iface --groups rmon | \ > + jq -r ".[0].rmon[\"${set}-pktsNtoM\"][]|[.low, .high]|@tsv" 2>/dev/null)
diff --git a/tools/testing/selftests/net/forwarding/Makefile b/tools/testing/selftests/net/forwarding/Makefile index df593b7b3e6b..452693514be4 100644 --- a/tools/testing/selftests/net/forwarding/Makefile +++ b/tools/testing/selftests/net/forwarding/Makefile @@ -17,6 +17,7 @@ TEST_PROGS = bridge_fdb_learning_limit.sh \ dual_vxlan_bridge.sh \ ethtool_extended_state.sh \ ethtool_mm.sh \ + ethtool_rmon.sh \ ethtool.sh \ gre_custom_multipath_hash.sh \ gre_inner_v4_multipath.sh \ diff --git a/tools/testing/selftests/net/forwarding/ethtool_rmon.sh b/tools/testing/selftests/net/forwarding/ethtool_rmon.sh new file mode 100755 index 000000000000..41a34a61f763 --- /dev/null +++ b/tools/testing/selftests/net/forwarding/ethtool_rmon.sh @@ -0,0 +1,143 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ALL_TESTS=" + rmon_rx_histogram + rmon_tx_histogram +" + +NUM_NETIFS=2 +source lib.sh + +ETH_FCS_LEN=4 +ETH_HLEN=$((6+6+2)) + +declare -A netif_mtu + +ensure_mtu() +{ + local iface=$1; shift + local len=$1; shift + local current=$(ip -j link show dev $iface | jq -r '.[0].mtu') + local required=$((len - ETH_HLEN - ETH_FCS_LEN)) + + if [ $current -lt $required ]; then + ip link set dev $iface mtu $required || return 1 + fi +} + +bucket_test() +{ + local iface=$1; shift + local neigh=$1; shift + local set=$1; shift + local bucket=$1; shift + local len=$1; shift + local num_rx=10000 + local num_tx=20000 + local expected= + local before= + local after= + local delta= + + # Mausezahn does not include FCS bytes in its length - but the + # histogram counters do + len=$((len - ETH_FCS_LEN)) + + before=$(ethtool --json -S $iface --groups rmon | \ + jq -r ".[0].rmon[\"${set}-pktsNtoM\"][$bucket].val") + + # Send 10k one way and 20k in the other, to detect counters + # mapped to the wrong direction + $MZ $neigh -q -c $num_rx -p $len -a own -b bcast -d 10us + $MZ $iface -q -c $num_tx -p $len -a own -b bcast -d 10us + + after=$(ethtool --json -S $iface --groups rmon | \ + jq -r ".[0].rmon[\"${set}-pktsNtoM\"][$bucket].val") + + delta=$((after - before)) + + expected=$([ $set = rx ] && echo $num_rx || echo $num_tx) + + # Allow some extra tolerance for other packets sent by the stack + [ $delta -ge $expected ] && [ $delta -le $((expected + 100)) ] +} + +rmon_histogram() +{ + local iface=$1; shift + local neigh=$1; shift + local set=$1; shift + local nbuckets=0 + local step= + + RET=0 + + while read -r -a bucket; do + step="$set-pkts${bucket[0]}to${bucket[1]} on $iface" + + for if in $iface $neigh; do + if ! ensure_mtu $if ${bucket[0]}; then + log_test_skip "$if does not support the required MTU for $step" + return + fi + done + + if ! bucket_test $iface $neigh $set $nbuckets ${bucket[0]}; then + check_err 1 "$step failed" + return 1 + fi + log_test "$step" + nbuckets=$((nbuckets + 1)) + done < <(ethtool --json -S $iface --groups rmon | \ + jq -r ".[0].rmon[\"${set}-pktsNtoM\"][]|[.low, .high]|@tsv" 2>/dev/null) + + if [ $nbuckets -eq 0 ]; then + log_test_skip "$iface does not support $set histogram counters" + return + fi +} + +rmon_rx_histogram() +{ + rmon_histogram $h1 $h2 rx + rmon_histogram $h2 $h1 rx +} + +rmon_tx_histogram() +{ + rmon_histogram $h1 $h2 tx + rmon_histogram $h2 $h1 tx +} + +setup_prepare() +{ + h1=${NETIFS[p1]} + h2=${NETIFS[p2]} + + for iface in $h1 $h2; do + netif_mtu[$iface]=$(ip -j link show dev $iface | jq -r '.[0].mtu') + ip link set dev $iface up + done +} + +cleanup() +{ + pre_cleanup + + for iface in $h2 $h1; do + ip link set dev $iface \ + mtu ${netif_mtu[$iface]} \ + down + done +} + +check_ethtool_counter_group_support +trap cleanup EXIT + +setup_prepare +setup_wait + +tests_run + +exit $EXIT_STATUS diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh index 8f6ca458af9a..e3740163c384 100755 --- a/tools/testing/selftests/net/forwarding/lib.sh +++ b/tools/testing/selftests/net/forwarding/lib.sh @@ -146,6 +146,15 @@ check_ethtool_mm_support() fi } +check_ethtool_counter_group_support() +{ + ethtool --help 2>&1| grep -- '--all-groups' &> /dev/null + if [[ $? -ne 0 ]]; then + echo "SKIP: ethtool too old; it is missing standard counter group support" + exit $ksft_skip + fi +} + check_locked_port_support() { if ! bridge -d link show | grep -q " locked"; then
Validate the operation of rx and tx histogram counters, if supported by the interface, by sending batches of packets targeted for each bucket. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> --- .../testing/selftests/net/forwarding/Makefile | 1 + .../selftests/net/forwarding/ethtool_rmon.sh | 143 ++++++++++++++++++ tools/testing/selftests/net/forwarding/lib.sh | 9 ++ 3 files changed, 153 insertions(+) create mode 100755 tools/testing/selftests/net/forwarding/ethtool_rmon.sh