hc
2024-10-09 05e59e5fb0064c97a1c10921ecd549f2d4a58565
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
# SPDX-License-Identifier: GPL-2.0
 
check_rate()
{
   local rate=$1; shift
   local min=$1; shift
   local what=$1; shift
 
   if ((rate > min)); then
       return 0
   fi
 
   echo "$what $(humanize $ir) < $(humanize $min)" > /dev/stderr
   return 1
}
 
measure_rate()
{
   local sw_in=$1; shift   # Where the traffic ingresses the switch
   local host_in=$1; shift # Where it ingresses another host
   local counter=$1; shift # Counter to use for measurement
   local what=$1; shift
 
   local interval=10
   local i
   local ret=0
 
   # Dips in performance might cause momentary ingress rate to drop below
   # 1Gbps. That wouldn't saturate egress and MC would thus get through,
   # seemingly winning bandwidth on account of UC. Demand at least 2Gbps
   # average ingress rate to somewhat mitigate this.
   local min_ingress=2147483648
 
   for i in {5..0}; do
       local t0=$(ethtool_stats_get $host_in $counter)
       local u0=$(ethtool_stats_get $sw_in $counter)
       sleep $interval
       local t1=$(ethtool_stats_get $host_in $counter)
       local u1=$(ethtool_stats_get $sw_in $counter)
 
       local ir=$(rate $u0 $u1 $interval)
       local er=$(rate $t0 $t1 $interval)
 
       if check_rate $ir $min_ingress "$what ingress rate"; then
           break
       fi
 
       # Fail the test if we can't get the throughput.
       if ((i == 0)); then
           ret=1
       fi
   done
 
   echo $ir $er
   return $ret
}
 
bail_on_lldpad()
{
   if systemctl is-active --quiet lldpad; then
 
       cat >/dev/stderr <<-EOF
       WARNING: lldpad is running
 
           lldpad will likely configure DCB, and this test will
           configure Qdiscs. mlxsw does not support both at the
           same time, one of them is arbitrarily going to overwrite
           the other. That will cause spurious failures (or,
           unlikely, passes) of this test.
       EOF
 
       if [[ -z $ALLOW_LLDPAD ]]; then
           cat >/dev/stderr <<-EOF
 
               If you want to run the test anyway, please set
               an environment variable ALLOW_LLDPAD to a
               non-empty string.
           EOF
           exit 1
       else
           return
       fi
   fi
}
 
__mlnx_qos()
{
   local err
 
   mlnx_qos "$@" 2>/dev/null
   err=$?
 
   if ((err)); then
       echo "Error ($err) in mlnx_qos $@" >/dev/stderr
   fi
 
   return $err
}