Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/drivers/net/netconsole/netcons_resume.sh
121896 views
1
#!/usr/bin/env bash
2
# SPDX-License-Identifier: GPL-2.0
3
4
# This test validates that netconsole is able to resume a target that was
5
# deactivated when its interface was removed when the interface is brought
6
# back up.
7
#
8
# The test configures a netconsole target and then removes netdevsim module to
9
# cause the interface to disappear. Targets are configured via cmdline to ensure
10
# targets bound by interface name and mac address can be resumed.
11
# The test verifies that the target moved to disabled state before adding
12
# netdevsim and the interface back.
13
#
14
# Finally, the test verifies that the target is re-enabled automatically and
15
# the message is received on the destination interface.
16
#
17
# Author: Andre Carvalho <[email protected]>
18
19
set -euo pipefail
20
21
SCRIPTDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")")
22
23
source "${SCRIPTDIR}"/../lib/sh/lib_netcons.sh
24
25
SAVED_SRCMAC="" # to be populated later
26
SAVED_DSTMAC="" # to be populated later
27
28
modprobe netdevsim 2> /dev/null || true
29
rmmod netconsole 2> /dev/null || true
30
31
check_netconsole_module
32
33
function cleanup() {
34
cleanup_netcons "${NETCONS_CONFIGFS}/cmdline0"
35
do_cleanup
36
rmmod netconsole
37
}
38
39
function trigger_reactivation() {
40
# Add back low level module
41
modprobe netdevsim
42
# Recreate namespace and two interfaces
43
set_network
44
# Restore MACs
45
ip netns exec "${NAMESPACE}" ip link set "${DSTIF}" \
46
address "${SAVED_DSTMAC}"
47
if [ "${BINDMODE}" == "mac" ]; then
48
ip link set dev "${SRCIF}" down
49
ip link set dev "${SRCIF}" address "${SAVED_SRCMAC}"
50
# Rename device in order to trigger target resume, as initial
51
# when device was recreated it didn't have correct mac address.
52
ip link set dev "${SRCIF}" name "${TARGET}"
53
fi
54
}
55
56
function trigger_deactivation() {
57
# Start by storing mac addresses so we can be restored in reactivate
58
SAVED_DSTMAC=$(ip netns exec "${NAMESPACE}" \
59
cat /sys/class/net/"$DSTIF"/address)
60
SAVED_SRCMAC=$(mac_get "${SRCIF}")
61
# Remove low level module
62
rmmod netdevsim
63
}
64
65
trap cleanup EXIT
66
67
# Run the test twice, with different cmdline parameters
68
for BINDMODE in "ifname" "mac"
69
do
70
echo "Running with bind mode: ${BINDMODE}" >&2
71
# Set current loglevel to KERN_INFO(6), and default to KERN_NOTICE(5)
72
echo "6 5" > /proc/sys/kernel/printk
73
74
# Create one namespace and two interfaces
75
set_network
76
77
# Create the command line for netconsole, with the configuration from
78
# the function above
79
CMDLINE=$(create_cmdline_str "${BINDMODE}")
80
81
# The content of kmsg will be save to the following file
82
OUTPUT_FILE="/tmp/${TARGET}-${BINDMODE}"
83
84
# Load the module, with the cmdline set
85
modprobe netconsole "${CMDLINE}"
86
# Expose cmdline target in configfs
87
mkdir "${NETCONS_CONFIGFS}/cmdline0"
88
89
# Target should be enabled
90
wait_target_state "cmdline0" "enabled"
91
92
# Trigger deactivation by unloading netdevsim module. Target should be
93
# disabled.
94
trigger_deactivation
95
wait_target_state "cmdline0" "disabled"
96
97
# Trigger reactivation by loading netdevsim, recreating the network and
98
# restoring mac addresses. Target should be re-enabled.
99
trigger_reactivation
100
wait_target_state "cmdline0" "enabled"
101
102
# Listen for netconsole port inside the namespace and destination
103
# interface
104
listen_port_and_save_to "${OUTPUT_FILE}" &
105
# Wait for socat to start and listen to the port.
106
wait_local_port_listen "${NAMESPACE}" "${PORT}" udp
107
# Send the message
108
echo "${MSG}: ${TARGET}" > /dev/kmsg
109
# Wait until socat saves the file to disk
110
busywait "${BUSYWAIT_TIMEOUT}" test -s "${OUTPUT_FILE}"
111
# Make sure the message was received in the dst part
112
# and exit
113
validate_msg "${OUTPUT_FILE}"
114
115
# kill socat in case it is still running
116
pkill_socat
117
# Cleanup & unload the module
118
cleanup
119
120
echo "${BINDMODE} : Test passed" >&2
121
done
122
123
trap - EXIT
124
exit "${EXIT_STATUS}"
125
126