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