blob: 8f60c1685ad4b6c685bb25c5e427ab9059616c0f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
ALL_TESTS="
rmon_rx_histogram
rmon_tx_histogram
"
NUM_NETIFS=2
lib_dir=$(dirname "$0")
source "$lib_dir"/../../../net/forwarding/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))
len=$((len > 0 ? len : 0))
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_xfail "$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_xfail "$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
|