summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/drivers/net/mlxsw/qos_defprio.sh
blob: eff6393ce974ef85be738f6d0fc4208d9624fb1b (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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

# Test for port-default priority. Non-IP packets ingress $swp1 and are
# prioritized according to the default priority specified at the port.
# rx_octets_prio_* counters are used to verify the prioritization.
#
# +-----------------------+
# | H1                    |
# |    + $h1              |
# |    | 192.0.2.1/28     |
# +----|------------------+
#      |
# +----|------------------+
# | SW |                  |
# |    + $swp1            |
# |      192.0.2.2/28     |
# |      APP=<prio>,1,0   |
# +-----------------------+

ALL_TESTS="
	ping_ipv4
	test_defprio
"

lib_dir=$(dirname $0)/../../../net/forwarding

NUM_NETIFS=2
: ${HIT_TIMEOUT:=1000} # ms
source $lib_dir/lib.sh

declare -a APP

defprio_install()
{
	local dev=$1; shift
	local prio=$1; shift
	local app="app=$prio,1,0"

	lldptool -T -i $dev -V APP $app >/dev/null
	lldpad_app_wait_set $dev
	APP[$prio]=$app
}

defprio_uninstall()
{
	local dev=$1; shift
	local prio=$1; shift
	local app=${APP[$prio]}

	lldptool -T -i $dev -V APP -d $app >/dev/null
	lldpad_app_wait_del
	unset APP[$prio]
}

defprio_flush()
{
	local dev=$1; shift
	local prio

	if ((${#APP[@]})); then
		lldptool -T -i $dev -V APP -d ${APP[@]} >/dev/null
	fi
	lldpad_app_wait_del
	APP=()
}

h1_create()
{
	simple_if_init $h1 192.0.2.1/28
}

h1_destroy()
{
	simple_if_fini $h1 192.0.2.1/28
}

switch_create()
{
	ip link set dev $swp1 up
	ip addr add dev $swp1 192.0.2.2/28
}

switch_destroy()
{
	defprio_flush $swp1
	ip addr del dev $swp1 192.0.2.2/28
	ip link set dev $swp1 down
}

setup_prepare()
{
	h1=${NETIFS[p1]}
	swp1=${NETIFS[p2]}

	vrf_prepare

	h1_create
	switch_create
}

cleanup()
{
	pre_cleanup

	switch_destroy
	h1_destroy

	vrf_cleanup
}

ping_ipv4()
{
	ping_test $h1 192.0.2.2
}

wait_for_packets()
{
	local t0=$1; shift
	local prio_observe=$1; shift

	local t1=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
	local delta=$((t1 - t0))
	echo $delta
	((delta >= 10))
}

__test_defprio()
{
	local prio_install=$1; shift
	local prio_observe=$1; shift
	local delta
	local key
	local i

	RET=0

	defprio_install $swp1 $prio_install

	local t0=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
	mausezahn -q $h1 -d 100m -c 10 -t arp reply
	delta=$(busywait "$HIT_TIMEOUT" wait_for_packets $t0 $prio_observe)

	check_err $? "Default priority $prio_install/$prio_observe: Expected to capture 10 packets, got $delta."
	log_test "Default priority $prio_install/$prio_observe"

	defprio_uninstall $swp1 $prio_install
}

test_defprio()
{
	local prio

	for prio in {0..7}; do
		__test_defprio $prio $prio
	done

	defprio_install $swp1 3
	__test_defprio 0 3
	__test_defprio 1 3
	__test_defprio 2 3
	__test_defprio 4 4
	__test_defprio 5 5
	__test_defprio 6 6
	__test_defprio 7 7
	defprio_uninstall $swp1 3
}

trap cleanup EXIT

setup_prepare
setup_wait

tests_run

exit $EXIT_STATUS