1f26b3091SIdo Schimmel#!/bin/bash
2f26b3091SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3f26b3091SIdo Schimmel#
4f26b3091SIdo Schimmel# This test is for checking the psample module. It makes use of netdevsim
5f26b3091SIdo Schimmel# which periodically generates "sampled" packets.
6f26b3091SIdo Schimmel
7f26b3091SIdo Schimmellib_dir=$(dirname $0)/../../../net/forwarding
8f26b3091SIdo Schimmel
9f26b3091SIdo SchimmelALL_TESTS="
10f26b3091SIdo Schimmel	psample_enable_test
11f26b3091SIdo Schimmel	psample_group_num_test
12f26b3091SIdo Schimmel	psample_md_test
13f26b3091SIdo Schimmel"
14f26b3091SIdo SchimmelNETDEVSIM_PATH=/sys/bus/netdevsim/
15f26b3091SIdo SchimmelDEV_ADDR=1337
16f26b3091SIdo SchimmelDEV=netdevsim${DEV_ADDR}
17f26b3091SIdo SchimmelSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
18f26b3091SIdo SchimmelPSAMPLE_DIR=/sys/kernel/debug/netdevsim/$DEV/psample/
19f26b3091SIdo SchimmelCAPTURE_FILE=$(mktemp)
20f26b3091SIdo SchimmelNUM_NETIFS=0
21f26b3091SIdo Schimmelsource $lib_dir/lib.sh
22*0521a262SPetr Machata
23*0521a262SPetr MachataDEVLINK_DEV=
24f26b3091SIdo Schimmelsource $lib_dir/devlink_lib.sh
25*0521a262SPetr MachataDEVLINK_DEV=netdevsim/${DEV}
26f26b3091SIdo Schimmel
27f26b3091SIdo Schimmel# Available at https://github.com/Mellanox/libpsample
28f26b3091SIdo Schimmelrequire_command psample
29f26b3091SIdo Schimmel
30f26b3091SIdo Schimmelpsample_capture()
31f26b3091SIdo Schimmel{
32f26b3091SIdo Schimmel	rm -f $CAPTURE_FILE
33f26b3091SIdo Schimmel
34f26b3091SIdo Schimmel	timeout 2 ip netns exec testns1 psample &> $CAPTURE_FILE
35f26b3091SIdo Schimmel}
36f26b3091SIdo Schimmel
37f26b3091SIdo Schimmelpsample_enable_test()
38f26b3091SIdo Schimmel{
39f26b3091SIdo Schimmel	RET=0
40f26b3091SIdo Schimmel
41f26b3091SIdo Schimmel	echo 1 > $PSAMPLE_DIR/enable
42f26b3091SIdo Schimmel	check_err $? "Failed to enable sampling when should not"
43f26b3091SIdo Schimmel
44f26b3091SIdo Schimmel	echo 1 > $PSAMPLE_DIR/enable 2>/dev/null
45f26b3091SIdo Schimmel	check_fail $? "Sampling enablement succeeded when should fail"
46f26b3091SIdo Schimmel
47f26b3091SIdo Schimmel	psample_capture
48f26b3091SIdo Schimmel	if [ $(cat $CAPTURE_FILE | wc -l) -eq 0 ]; then
49f26b3091SIdo Schimmel		check_err 1 "Failed to capture sampled packets"
50f26b3091SIdo Schimmel	fi
51f26b3091SIdo Schimmel
52f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/enable
53f26b3091SIdo Schimmel	check_err $? "Failed to disable sampling when should not"
54f26b3091SIdo Schimmel
55f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/enable 2>/dev/null
56f26b3091SIdo Schimmel	check_fail $? "Sampling disablement succeeded when should fail"
57f26b3091SIdo Schimmel
58f26b3091SIdo Schimmel	psample_capture
59f26b3091SIdo Schimmel	if [ $(cat $CAPTURE_FILE | wc -l) -ne 0 ]; then
60f26b3091SIdo Schimmel		check_err 1 "Captured sampled packets when should not"
61f26b3091SIdo Schimmel	fi
62f26b3091SIdo Schimmel
63f26b3091SIdo Schimmel	log_test "psample enable / disable"
64f26b3091SIdo Schimmel}
65f26b3091SIdo Schimmel
66f26b3091SIdo Schimmelpsample_group_num_test()
67f26b3091SIdo Schimmel{
68f26b3091SIdo Schimmel	RET=0
69f26b3091SIdo Schimmel
70f26b3091SIdo Schimmel	echo 1234 > $PSAMPLE_DIR/group_num
71f26b3091SIdo Schimmel	echo 1 > $PSAMPLE_DIR/enable
72f26b3091SIdo Schimmel
73f26b3091SIdo Schimmel	psample_capture
74f26b3091SIdo Schimmel	grep -q -e "group 1234" $CAPTURE_FILE
75f26b3091SIdo Schimmel	check_err $? "Sampled packets reported with wrong group number"
76f26b3091SIdo Schimmel
77f26b3091SIdo Schimmel	# New group number should only be used after disable / enable.
78f26b3091SIdo Schimmel	echo 4321 > $PSAMPLE_DIR/group_num
79f26b3091SIdo Schimmel
80f26b3091SIdo Schimmel	psample_capture
81f26b3091SIdo Schimmel	grep -q -e "group 4321" $CAPTURE_FILE
82f26b3091SIdo Schimmel	check_fail $? "Group number changed while sampling is active"
83f26b3091SIdo Schimmel
84f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/enable && echo 1 > $PSAMPLE_DIR/enable
85f26b3091SIdo Schimmel
86f26b3091SIdo Schimmel	psample_capture
87f26b3091SIdo Schimmel	grep -q -e "group 4321" $CAPTURE_FILE
88f26b3091SIdo Schimmel	check_err $? "Group number did not change after restarting sampling"
89f26b3091SIdo Schimmel
90f26b3091SIdo Schimmel	log_test "psample group number"
91f26b3091SIdo Schimmel
92f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/enable
93f26b3091SIdo Schimmel}
94f26b3091SIdo Schimmel
95f26b3091SIdo Schimmelpsample_md_test()
96f26b3091SIdo Schimmel{
97f26b3091SIdo Schimmel	RET=0
98f26b3091SIdo Schimmel
99f26b3091SIdo Schimmel	echo 1 > $PSAMPLE_DIR/enable
100f26b3091SIdo Schimmel
101f26b3091SIdo Schimmel	echo 1234 > $PSAMPLE_DIR/in_ifindex
102f26b3091SIdo Schimmel	echo 4321 > $PSAMPLE_DIR/out_ifindex
103f26b3091SIdo Schimmel	psample_capture
104f26b3091SIdo Schimmel
105f26b3091SIdo Schimmel	grep -q -e "in-ifindex 1234" $CAPTURE_FILE
106f26b3091SIdo Schimmel	check_err $? "Sampled packets reported with wrong in-ifindex"
107f26b3091SIdo Schimmel
108f26b3091SIdo Schimmel	grep -q -e "out-ifindex 4321" $CAPTURE_FILE
109f26b3091SIdo Schimmel	check_err $? "Sampled packets reported with wrong out-ifindex"
110f26b3091SIdo Schimmel
111f26b3091SIdo Schimmel	echo 5 > $PSAMPLE_DIR/out_tc
112f26b3091SIdo Schimmel	psample_capture
113f26b3091SIdo Schimmel
114f26b3091SIdo Schimmel	grep -q -e "out-tc 5" $CAPTURE_FILE
115f26b3091SIdo Schimmel	check_err $? "Sampled packets reported with wrong out-tc"
116f26b3091SIdo Schimmel
117f26b3091SIdo Schimmel	echo $((2**16 - 1)) > $PSAMPLE_DIR/out_tc
118f26b3091SIdo Schimmel	psample_capture
119f26b3091SIdo Schimmel
120f26b3091SIdo Schimmel	grep -q -e "out-tc " $CAPTURE_FILE
121f26b3091SIdo Schimmel	check_fail $? "Sampled packets reported with out-tc when should not"
122f26b3091SIdo Schimmel
123f26b3091SIdo Schimmel	echo 1 > $PSAMPLE_DIR/out_tc
124f26b3091SIdo Schimmel	echo 10000 > $PSAMPLE_DIR/out_tc_occ_max
125f26b3091SIdo Schimmel	psample_capture
126f26b3091SIdo Schimmel
127f26b3091SIdo Schimmel	grep -q -e "out-tc-occ " $CAPTURE_FILE
128f26b3091SIdo Schimmel	check_err $? "Sampled packets not reported with out-tc-occ when should"
129f26b3091SIdo Schimmel
130f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/out_tc_occ_max
131f26b3091SIdo Schimmel	psample_capture
132f26b3091SIdo Schimmel
133f26b3091SIdo Schimmel	grep -q -e "out-tc-occ " $CAPTURE_FILE
134f26b3091SIdo Schimmel	check_fail $? "Sampled packets reported with out-tc-occ when should not"
135f26b3091SIdo Schimmel
136f26b3091SIdo Schimmel	echo 10000 > $PSAMPLE_DIR/latency_max
137f26b3091SIdo Schimmel	psample_capture
138f26b3091SIdo Schimmel
139f26b3091SIdo Schimmel	grep -q -e "latency " $CAPTURE_FILE
140f26b3091SIdo Schimmel	check_err $? "Sampled packets not reported with latency when should"
141f26b3091SIdo Schimmel
142f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/latency_max
143f26b3091SIdo Schimmel	psample_capture
144f26b3091SIdo Schimmel
145f26b3091SIdo Schimmel	grep -q -e "latency " $CAPTURE_FILE
146f26b3091SIdo Schimmel	check_fail $? "Sampled packets reported with latency when should not"
147f26b3091SIdo Schimmel
148f26b3091SIdo Schimmel	log_test "psample metadata"
149f26b3091SIdo Schimmel
150f26b3091SIdo Schimmel	echo 0 > $PSAMPLE_DIR/enable
151f26b3091SIdo Schimmel}
152f26b3091SIdo Schimmel
153f26b3091SIdo Schimmelsetup_prepare()
154f26b3091SIdo Schimmel{
155f26b3091SIdo Schimmel	modprobe netdevsim &> /dev/null
156f26b3091SIdo Schimmel
157f26b3091SIdo Schimmel	echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
158f26b3091SIdo Schimmel	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
159f26b3091SIdo Schimmel
160f26b3091SIdo Schimmel	set -e
161f26b3091SIdo Schimmel
162f26b3091SIdo Schimmel	ip netns add testns1
163f26b3091SIdo Schimmel	devlink dev reload $DEVLINK_DEV netns testns1
164f26b3091SIdo Schimmel
165f26b3091SIdo Schimmel	set +e
166f26b3091SIdo Schimmel}
167f26b3091SIdo Schimmel
168f26b3091SIdo Schimmelcleanup()
169f26b3091SIdo Schimmel{
170f26b3091SIdo Schimmel	pre_cleanup
171f26b3091SIdo Schimmel	rm -f $CAPTURE_FILE
172f26b3091SIdo Schimmel	ip netns del testns1
173f26b3091SIdo Schimmel	echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
174f26b3091SIdo Schimmel	modprobe -r netdevsim &> /dev/null
175f26b3091SIdo Schimmel}
176f26b3091SIdo Schimmel
177f26b3091SIdo Schimmeltrap cleanup EXIT
178f26b3091SIdo Schimmel
179f26b3091SIdo Schimmelsetup_prepare
180f26b3091SIdo Schimmel
181f26b3091SIdo Schimmeltests_run
182f26b3091SIdo Schimmel
183f26b3091SIdo Schimmelexit $EXIT_STATUS
184