1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3
4readonly ksft_skip=4
5readonly cpus=$(nproc)
6ret=0
7
8[ $cpus -gt 2 ] || exit $ksft_skip
9
10readonly INITIAL_RPS_DEFAULT_MASK=$(cat /proc/sys/net/core/rps_default_mask)
11readonly TAG="$(mktemp -u XXXXXX)"
12readonly VETH="veth${TAG}"
13readonly NETNS="ns-${TAG}"
14
15setup() {
16	ip netns add "${NETNS}"
17	ip -netns "${NETNS}" link set lo up
18}
19
20cleanup() {
21	echo $INITIAL_RPS_DEFAULT_MASK > /proc/sys/net/core/rps_default_mask
22	ip netns del $NETNS
23}
24
25chk_rps() {
26	local rps_mask expected_rps_mask=$4
27	local dev_name=$3
28	local netns=$2
29	local cmd="cat"
30	local msg=$1
31
32	[ -n "$netns" ] && cmd="ip netns exec $netns $cmd"
33
34	rps_mask=$($cmd /sys/class/net/$dev_name/queues/rx-0/rps_cpus)
35	printf "%-60s" "$msg"
36	if [ $rps_mask -eq $expected_rps_mask ]; then
37		echo "[ ok ]"
38	else
39		echo "[fail] expected $expected_rps_mask found $rps_mask"
40		ret=1
41	fi
42}
43
44trap cleanup EXIT
45
46echo 0 > /proc/sys/net/core/rps_default_mask
47setup
48chk_rps "empty rps_default_mask" $NETNS lo 0
49cleanup
50
51echo 1 > /proc/sys/net/core/rps_default_mask
52setup
53chk_rps "changing rps_default_mask dont affect existing devices" "" lo $INITIAL_RPS_DEFAULT_MASK
54
55echo 3 > /proc/sys/net/core/rps_default_mask
56chk_rps "changing rps_default_mask dont affect existing netns" $NETNS lo 0
57
58ip link add name $VETH type veth peer netns $NETNS name $VETH
59ip link set dev $VETH up
60ip -n $NETNS link set dev $VETH up
61chk_rps "changing rps_default_mask affect newly created devices" "" $VETH 3
62chk_rps "changing rps_default_mask don't affect newly child netns[II]" $NETNS $VETH 0
63ip netns del $NETNS
64
65setup
66chk_rps "rps_default_mask is 0 by default in child netns" "$NETNS" lo 0
67
68ip netns exec $NETNS sysctl -qw net.core.rps_default_mask=1
69ip link add name $VETH type veth peer netns $NETNS name $VETH
70chk_rps "changing rps_default_mask in child ns don't affect the main one" "" lo $INITIAL_RPS_DEFAULT_MASK
71chk_rps "changing rps_default_mask in child ns affects new childns devices" $NETNS $VETH 1
72chk_rps "changing rps_default_mask in child ns don't affect existing devices" $NETNS lo 0
73
74exit $ret
75