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