xref: /linux/tools/testing/selftests/drivers/net/netconsole/netcons_sysdata.sh (revision 37a93dd5c49b5fda807fd204edf2547c3493319c)
1*b3827c91SAndre Carvalho#!/usr/bin/env bash
2*b3827c91SAndre Carvalho# SPDX-License-Identifier: GPL-2.0
3*b3827c91SAndre Carvalho
4*b3827c91SAndre Carvalho# A test that makes sure that sysdata runtime CPU data is properly set
5*b3827c91SAndre Carvalho# when a message is sent.
6*b3827c91SAndre Carvalho#
7*b3827c91SAndre Carvalho# There are 3 different tests, every time sent using a random CPU.
8*b3827c91SAndre Carvalho#  - Test #1
9*b3827c91SAndre Carvalho#    * Only enable cpu_nr sysdata feature.
10*b3827c91SAndre Carvalho#  - Test #2
11*b3827c91SAndre Carvalho#    * Keep cpu_nr sysdata feature enable and enable userdata.
12*b3827c91SAndre Carvalho#  - Test #3
13*b3827c91SAndre Carvalho#    * keep userdata enabled, and disable sysdata cpu_nr feature.
14*b3827c91SAndre Carvalho#
15*b3827c91SAndre Carvalho# Author: Breno Leitao <leitao@debian.org>
16*b3827c91SAndre Carvalho
17*b3827c91SAndre Carvalhoset -euo pipefail
18*b3827c91SAndre Carvalho
19*b3827c91SAndre CarvalhoSCRIPTDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")")
20*b3827c91SAndre Carvalho
21*b3827c91SAndre Carvalhosource "${SCRIPTDIR}"/../lib/sh/lib_netcons.sh
22*b3827c91SAndre Carvalho
23*b3827c91SAndre Carvalho# Enable the sysdata cpu_nr feature
24*b3827c91SAndre Carvalhofunction set_cpu_nr() {
25*b3827c91SAndre Carvalho	if [[ ! -f "${NETCONS_PATH}/userdata/cpu_nr_enabled" ]]
26*b3827c91SAndre Carvalho	then
27*b3827c91SAndre Carvalho		echo "Populate CPU configfs path not available in ${NETCONS_PATH}/userdata/cpu_nr_enabled" >&2
28*b3827c91SAndre Carvalho		exit "${ksft_skip}"
29*b3827c91SAndre Carvalho	fi
30*b3827c91SAndre Carvalho
31*b3827c91SAndre Carvalho	echo 1 > "${NETCONS_PATH}/userdata/cpu_nr_enabled"
32*b3827c91SAndre Carvalho}
33*b3827c91SAndre Carvalho
34*b3827c91SAndre Carvalho# Enable the taskname to be appended to sysdata
35*b3827c91SAndre Carvalhofunction set_taskname() {
36*b3827c91SAndre Carvalho	if [[ ! -f "${NETCONS_PATH}/userdata/taskname_enabled" ]]
37*b3827c91SAndre Carvalho	then
38*b3827c91SAndre Carvalho		echo "Not able to enable taskname sysdata append. Configfs not available in ${NETCONS_PATH}/userdata/taskname_enabled" >&2
39*b3827c91SAndre Carvalho		exit "${ksft_skip}"
40*b3827c91SAndre Carvalho	fi
41*b3827c91SAndre Carvalho
42*b3827c91SAndre Carvalho	echo 1 > "${NETCONS_PATH}/userdata/taskname_enabled"
43*b3827c91SAndre Carvalho}
44*b3827c91SAndre Carvalho
45*b3827c91SAndre Carvalho# Enable the release to be appended to sysdata
46*b3827c91SAndre Carvalhofunction set_release() {
47*b3827c91SAndre Carvalho	if [[ ! -f "${NETCONS_PATH}/userdata/release_enabled" ]]
48*b3827c91SAndre Carvalho	then
49*b3827c91SAndre Carvalho		echo "Not able to enable release sysdata append. Configfs not available in ${NETCONS_PATH}/userdata/release_enabled" >&2
50*b3827c91SAndre Carvalho		exit "${ksft_skip}"
51*b3827c91SAndre Carvalho	fi
52*b3827c91SAndre Carvalho
53*b3827c91SAndre Carvalho	echo 1 > "${NETCONS_PATH}/userdata/release_enabled"
54*b3827c91SAndre Carvalho}
55*b3827c91SAndre Carvalho
56*b3827c91SAndre Carvalho# Enable the msgid to be appended to sysdata
57*b3827c91SAndre Carvalhofunction set_msgid() {
58*b3827c91SAndre Carvalho	if [[ ! -f "${NETCONS_PATH}/userdata/msgid_enabled" ]]
59*b3827c91SAndre Carvalho	then
60*b3827c91SAndre Carvalho		echo "Not able to enable msgid sysdata append. Configfs not available in ${NETCONS_PATH}/userdata/msgid_enabled" >&2
61*b3827c91SAndre Carvalho		exit "${ksft_skip}"
62*b3827c91SAndre Carvalho	fi
63*b3827c91SAndre Carvalho
64*b3827c91SAndre Carvalho	echo 1 > "${NETCONS_PATH}/userdata/msgid_enabled"
65*b3827c91SAndre Carvalho}
66*b3827c91SAndre Carvalho
67*b3827c91SAndre Carvalho# Disable the sysdata cpu_nr feature
68*b3827c91SAndre Carvalhofunction unset_cpu_nr() {
69*b3827c91SAndre Carvalho	echo 0 > "${NETCONS_PATH}/userdata/cpu_nr_enabled"
70*b3827c91SAndre Carvalho}
71*b3827c91SAndre Carvalho
72*b3827c91SAndre Carvalho# Once called, taskname=<..> will not be appended anymore
73*b3827c91SAndre Carvalhofunction unset_taskname() {
74*b3827c91SAndre Carvalho	echo 0 > "${NETCONS_PATH}/userdata/taskname_enabled"
75*b3827c91SAndre Carvalho}
76*b3827c91SAndre Carvalho
77*b3827c91SAndre Carvalhofunction unset_release() {
78*b3827c91SAndre Carvalho	echo 0 > "${NETCONS_PATH}/userdata/release_enabled"
79*b3827c91SAndre Carvalho}
80*b3827c91SAndre Carvalho
81*b3827c91SAndre Carvalhofunction unset_msgid() {
82*b3827c91SAndre Carvalho	echo 0 > "${NETCONS_PATH}/userdata/msgid_enabled"
83*b3827c91SAndre Carvalho}
84*b3827c91SAndre Carvalho
85*b3827c91SAndre Carvalho# Test if MSG contains sysdata
86*b3827c91SAndre Carvalhofunction validate_sysdata() {
87*b3827c91SAndre Carvalho	# OUTPUT_FILE will contain something like:
88*b3827c91SAndre Carvalho	# 6.11.1-0_fbk0_rc13_509_g30d75cea12f7,13,1822,115075213798,-;netconsole selftest: netcons_gtJHM
89*b3827c91SAndre Carvalho	#  userdatakey=userdatavalue
90*b3827c91SAndre Carvalho	#  cpu=X
91*b3827c91SAndre Carvalho	#  taskname=<taskname>
92*b3827c91SAndre Carvalho	#  msgid=<id>
93*b3827c91SAndre Carvalho
94*b3827c91SAndre Carvalho	# Echo is what this test uses to create the message. See runtest()
95*b3827c91SAndre Carvalho	# function
96*b3827c91SAndre Carvalho	SENDER="echo"
97*b3827c91SAndre Carvalho
98*b3827c91SAndre Carvalho	if [ ! -f "$OUTPUT_FILE" ]; then
99*b3827c91SAndre Carvalho		echo "FAIL: File was not generated." >&2
100*b3827c91SAndre Carvalho		exit "${ksft_fail}"
101*b3827c91SAndre Carvalho	fi
102*b3827c91SAndre Carvalho
103*b3827c91SAndre Carvalho	if ! grep -q "${MSG}" "${OUTPUT_FILE}"; then
104*b3827c91SAndre Carvalho		echo "FAIL: ${MSG} not found in ${OUTPUT_FILE}" >&2
105*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
106*b3827c91SAndre Carvalho		exit "${ksft_fail}"
107*b3827c91SAndre Carvalho	fi
108*b3827c91SAndre Carvalho
109*b3827c91SAndre Carvalho	# Check if cpu=XX exists in the file and matches the one used
110*b3827c91SAndre Carvalho	# in taskset(1)
111*b3827c91SAndre Carvalho	if ! grep -q "cpu=${CPU}\+" "${OUTPUT_FILE}"; then
112*b3827c91SAndre Carvalho		echo "FAIL: 'cpu=${CPU}' not found in ${OUTPUT_FILE}" >&2
113*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
114*b3827c91SAndre Carvalho		exit "${ksft_fail}"
115*b3827c91SAndre Carvalho	fi
116*b3827c91SAndre Carvalho
117*b3827c91SAndre Carvalho	if ! grep -q "taskname=${SENDER}" "${OUTPUT_FILE}"; then
118*b3827c91SAndre Carvalho		echo "FAIL: 'taskname=echo' not found in ${OUTPUT_FILE}" >&2
119*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
120*b3827c91SAndre Carvalho		exit "${ksft_fail}"
121*b3827c91SAndre Carvalho	fi
122*b3827c91SAndre Carvalho
123*b3827c91SAndre Carvalho	if ! grep -q "msgid=[0-9]\+$" "${OUTPUT_FILE}"; then
124*b3827c91SAndre Carvalho		echo "FAIL: 'msgid=<id>' not found in ${OUTPUT_FILE}" >&2
125*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
126*b3827c91SAndre Carvalho		exit "${ksft_fail}"
127*b3827c91SAndre Carvalho	fi
128*b3827c91SAndre Carvalho
129*b3827c91SAndre Carvalho	rm "${OUTPUT_FILE}"
130*b3827c91SAndre Carvalho	pkill_socat
131*b3827c91SAndre Carvalho}
132*b3827c91SAndre Carvalho
133*b3827c91SAndre Carvalhofunction validate_release() {
134*b3827c91SAndre Carvalho	RELEASE=$(uname -r)
135*b3827c91SAndre Carvalho
136*b3827c91SAndre Carvalho	if [ ! -f "$OUTPUT_FILE" ]; then
137*b3827c91SAndre Carvalho		echo "FAIL: File was not generated." >&2
138*b3827c91SAndre Carvalho		exit "${ksft_fail}"
139*b3827c91SAndre Carvalho	fi
140*b3827c91SAndre Carvalho
141*b3827c91SAndre Carvalho	if ! grep -q "release=${RELEASE}" "${OUTPUT_FILE}"; then
142*b3827c91SAndre Carvalho		echo "FAIL: 'release=${RELEASE}' not found in ${OUTPUT_FILE}" >&2
143*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
144*b3827c91SAndre Carvalho		exit "${ksft_fail}"
145*b3827c91SAndre Carvalho	fi
146*b3827c91SAndre Carvalho}
147*b3827c91SAndre Carvalho
148*b3827c91SAndre Carvalho# Test if MSG content exists in OUTPUT_FILE but no `cpu=` and `taskname=`
149*b3827c91SAndre Carvalho# strings
150*b3827c91SAndre Carvalhofunction validate_no_sysdata() {
151*b3827c91SAndre Carvalho	if [ ! -f "$OUTPUT_FILE" ]; then
152*b3827c91SAndre Carvalho		echo "FAIL: File was not generated." >&2
153*b3827c91SAndre Carvalho		exit "${ksft_fail}"
154*b3827c91SAndre Carvalho	fi
155*b3827c91SAndre Carvalho
156*b3827c91SAndre Carvalho	if ! grep -q "${MSG}" "${OUTPUT_FILE}"; then
157*b3827c91SAndre Carvalho		echo "FAIL: ${MSG} not found in ${OUTPUT_FILE}" >&2
158*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
159*b3827c91SAndre Carvalho		exit "${ksft_fail}"
160*b3827c91SAndre Carvalho	fi
161*b3827c91SAndre Carvalho
162*b3827c91SAndre Carvalho	if grep -q "cpu=" "${OUTPUT_FILE}"; then
163*b3827c91SAndre Carvalho		echo "FAIL: 'cpu=  found in ${OUTPUT_FILE}" >&2
164*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
165*b3827c91SAndre Carvalho		exit "${ksft_fail}"
166*b3827c91SAndre Carvalho	fi
167*b3827c91SAndre Carvalho
168*b3827c91SAndre Carvalho	if grep -q "taskname=" "${OUTPUT_FILE}"; then
169*b3827c91SAndre Carvalho		echo "FAIL: 'taskname=  found in ${OUTPUT_FILE}" >&2
170*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
171*b3827c91SAndre Carvalho		exit "${ksft_fail}"
172*b3827c91SAndre Carvalho	fi
173*b3827c91SAndre Carvalho
174*b3827c91SAndre Carvalho	if grep -q "release=" "${OUTPUT_FILE}"; then
175*b3827c91SAndre Carvalho		echo "FAIL: 'release=  found in ${OUTPUT_FILE}" >&2
176*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
177*b3827c91SAndre Carvalho		exit "${ksft_fail}"
178*b3827c91SAndre Carvalho	fi
179*b3827c91SAndre Carvalho
180*b3827c91SAndre Carvalho	if grep -q "msgid=" "${OUTPUT_FILE}"; then
181*b3827c91SAndre Carvalho		echo "FAIL: 'msgid=  found in ${OUTPUT_FILE}" >&2
182*b3827c91SAndre Carvalho		cat "${OUTPUT_FILE}" >&2
183*b3827c91SAndre Carvalho		exit "${ksft_fail}"
184*b3827c91SAndre Carvalho	fi
185*b3827c91SAndre Carvalho
186*b3827c91SAndre Carvalho	rm "${OUTPUT_FILE}"
187*b3827c91SAndre Carvalho}
188*b3827c91SAndre Carvalho
189*b3827c91SAndre Carvalho# Start socat, send the message and wait for the file to show up in the file
190*b3827c91SAndre Carvalho# system
191*b3827c91SAndre Carvalhofunction runtest {
192*b3827c91SAndre Carvalho	# Listen for netconsole port inside the namespace and destination
193*b3827c91SAndre Carvalho	# interface
194*b3827c91SAndre Carvalho	listen_port_and_save_to "${OUTPUT_FILE}" &
195*b3827c91SAndre Carvalho	# Wait for socat to start and listen to the port.
196*b3827c91SAndre Carvalho	wait_local_port_listen "${NAMESPACE}" "${PORT}" udp
197*b3827c91SAndre Carvalho	# Send the message
198*b3827c91SAndre Carvalho	taskset -c "${CPU}" echo "${MSG}: ${TARGET}" > /dev/kmsg
199*b3827c91SAndre Carvalho	# Wait until socat saves the file to disk
200*b3827c91SAndre Carvalho	busywait "${BUSYWAIT_TIMEOUT}" test -s "${OUTPUT_FILE}"
201*b3827c91SAndre Carvalho}
202*b3827c91SAndre Carvalho
203*b3827c91SAndre Carvalho# ========== #
204*b3827c91SAndre Carvalho# Start here #
205*b3827c91SAndre Carvalho# ========== #
206*b3827c91SAndre Carvalho
207*b3827c91SAndre Carvalhomodprobe netdevsim 2> /dev/null || true
208*b3827c91SAndre Carvalhomodprobe netconsole 2> /dev/null || true
209*b3827c91SAndre Carvalho
210*b3827c91SAndre Carvalho# Check for basic system dependency and exit if not found
211*b3827c91SAndre Carvalhocheck_for_dependencies
212*b3827c91SAndre Carvalho# This test also depends on taskset(1). Check for it before starting the test
213*b3827c91SAndre Carvalhocheck_for_taskset
214*b3827c91SAndre Carvalho
215*b3827c91SAndre Carvalho# Set current loglevel to KERN_INFO(6), and default to KERN_NOTICE(5)
216*b3827c91SAndre Carvalhoecho "6 5" > /proc/sys/kernel/printk
217*b3827c91SAndre Carvalho# Remove the namespace, interfaces and netconsole target on exit
218*b3827c91SAndre Carvalhotrap cleanup EXIT
219*b3827c91SAndre Carvalho# Create one namespace and two interfaces
220*b3827c91SAndre Carvalhoset_network
221*b3827c91SAndre Carvalho# Create a dynamic target for netconsole
222*b3827c91SAndre Carvalhocreate_dynamic_target
223*b3827c91SAndre Carvalho
224*b3827c91SAndre Carvalho#====================================================
225*b3827c91SAndre Carvalho# TEST #1
226*b3827c91SAndre Carvalho# Send message from a random CPU
227*b3827c91SAndre Carvalho#====================================================
228*b3827c91SAndre Carvalho# Random CPU in the system
229*b3827c91SAndre CarvalhoCPU=$((RANDOM % $(nproc)))
230*b3827c91SAndre CarvalhoOUTPUT_FILE="/tmp/${TARGET}_1"
231*b3827c91SAndre CarvalhoMSG="Test #1 from CPU${CPU}"
232*b3827c91SAndre Carvalho# Enable the auto population of cpu_nr
233*b3827c91SAndre Carvalhoset_cpu_nr
234*b3827c91SAndre Carvalho# Enable taskname to be appended to sysdata
235*b3827c91SAndre Carvalhoset_taskname
236*b3827c91SAndre Carvalhoset_release
237*b3827c91SAndre Carvalhoset_msgid
238*b3827c91SAndre Carvalhoruntest
239*b3827c91SAndre Carvalho# Make sure the message was received in the dst part
240*b3827c91SAndre Carvalho# and exit
241*b3827c91SAndre Carvalhovalidate_release
242*b3827c91SAndre Carvalhovalidate_sysdata
243*b3827c91SAndre Carvalho
244*b3827c91SAndre Carvalho#====================================================
245*b3827c91SAndre Carvalho# TEST #2
246*b3827c91SAndre Carvalho# This test now adds userdata together with sysdata
247*b3827c91SAndre Carvalho# ===================================================
248*b3827c91SAndre Carvalho# Get a new random CPU
249*b3827c91SAndre CarvalhoCPU=$((RANDOM % $(nproc)))
250*b3827c91SAndre CarvalhoOUTPUT_FILE="/tmp/${TARGET}_2"
251*b3827c91SAndre CarvalhoMSG="Test #2 from CPU${CPU}"
252*b3827c91SAndre Carvalhoset_user_data
253*b3827c91SAndre Carvalhoruntest
254*b3827c91SAndre Carvalhovalidate_release
255*b3827c91SAndre Carvalhovalidate_sysdata
256*b3827c91SAndre Carvalho
257*b3827c91SAndre Carvalho# ===================================================
258*b3827c91SAndre Carvalho# TEST #3
259*b3827c91SAndre Carvalho# Unset all sysdata, fail if any userdata is set
260*b3827c91SAndre Carvalho# ===================================================
261*b3827c91SAndre CarvalhoCPU=$((RANDOM % $(nproc)))
262*b3827c91SAndre CarvalhoOUTPUT_FILE="/tmp/${TARGET}_3"
263*b3827c91SAndre CarvalhoMSG="Test #3 from CPU${CPU}"
264*b3827c91SAndre Carvalhounset_cpu_nr
265*b3827c91SAndre Carvalhounset_taskname
266*b3827c91SAndre Carvalhounset_release
267*b3827c91SAndre Carvalhounset_msgid
268*b3827c91SAndre Carvalhoruntest
269*b3827c91SAndre Carvalho# At this time, cpu= shouldn't be present in the msg
270*b3827c91SAndre Carvalhovalidate_no_sysdata
271*b3827c91SAndre Carvalho
272*b3827c91SAndre Carvalhoexit "${ksft_pass}"
273