File Index
Files and directories
Sign in
FILE

pm_netlink.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/mptcp/pm_netlink.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4. "$(dirname "${0}")/mptcp_lib.sh"
  5
  6ret=0
  7
  8usage() {
  9	echo "Usage: $0 [ -i ] [ -h ]"
 10	echo -e "\t-i: use 'ip mptcp' instead of 'pm_nl_ctl'"
 11	echo -e "\t-h: help"
 12}
 13
 14optstring=hi
 15while getopts "$optstring" option;do
 16	case "$option" in
 17	"h")
 18		usage "$0"
 19		exit ${KSFT_PASS}
 20		;;
 21	"i")
 22		mptcp_lib_set_ip_mptcp
 23		;;
 24	"?")
 25		usage "$0"
 26		exit ${KSFT_FAIL}
 27		;;
 28	esac
 29done
 30
 31ns1=""
 32err=$(mktemp)
 33
 34# This function is used in the cleanup trap
 35#shellcheck disable=SC2317,SC2329
 36cleanup()
 37{
 38	rm -f "${err}"
 39	mptcp_lib_ns_exit "${ns1}"
 40}
 41
 42mptcp_lib_check_mptcp
 43mptcp_lib_check_tools ip
 44
 45trap cleanup EXIT
 46
 47mptcp_lib_ns_init ns1
 48
 49format_limits() {
 50	local accept="${1}"
 51	local subflows="${2}"
 52
 53	if mptcp_lib_is_ip_mptcp; then
 54		# with a space at the end
 55		printf "add_addr_accepted %d subflows %d \n" "${accept}" "${subflows}"
 56	else
 57		printf "accept %d\nsubflows %d\n" "${accept}" "${subflows}"
 58	fi
 59}
 60
 61get_limits() {
 62	if mptcp_lib_is_ip_mptcp; then
 63		ip -n "${ns1}" mptcp limits
 64	else
 65		ip netns exec "${ns1}" ./pm_nl_ctl limits
 66	fi
 67}
 68
 69format_endpoints() {
 70	mptcp_lib_pm_nl_format_endpoints "${@}"
 71}
 72
 73# This function is invoked indirectly
 74#shellcheck disable=SC2317,SC2329
 75get_endpoint() {
 76	mptcp_lib_pm_nl_get_endpoint "${ns1}" "${@}"
 77}
 78
 79change_address() {
 80	local addr=${1}
 81	local flags=${2}
 82
 83	if mptcp_lib_is_ip_mptcp; then
 84		ip -n "${ns1}" mptcp endpoint change "${addr}" "${flags}"
 85	else
 86		ip netns exec "${ns1}" ./pm_nl_ctl set "${addr}" flags "${flags}"
 87	fi
 88}
 89
 90set_limits()
 91{
 92	mptcp_lib_pm_nl_set_limits "${ns1}" "${@}"
 93}
 94
 95add_endpoint()
 96{
 97	mptcp_lib_pm_nl_add_endpoint "${ns1}" "${@}"
 98}
 99
100del_endpoint()
101{
102	mptcp_lib_pm_nl_del_endpoint "${ns1}" "${@}"
103}
104
105flush_endpoint()
106{
107	mptcp_lib_pm_nl_flush_endpoint "${ns1}"
108}
109
110show_endpoints()
111{
112	mptcp_lib_pm_nl_show_endpoints "${ns1}"
113}
114
115change_endpoint()
116{
117	mptcp_lib_pm_nl_change_endpoint "${ns1}" "${@}"
118}
119
120check()
121{
122	local cmd="$1"
123	local expected="$2"
124	local msg="$3"
125	local rc=0
126
127	mptcp_lib_print_title "$msg"
128	mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}
129	if [ ${rc} -eq 2 ]; then
130		mptcp_lib_result_fail "${msg} # error ${rc}"
131		ret=${KSFT_FAIL}
132	elif [ ${rc} -eq 0 ]; then
133		mptcp_lib_print_ok "[ OK ]"
134		mptcp_lib_result_pass "${msg}"
135	elif [ ${rc} -eq 1 ]; then
136		mptcp_lib_result_fail "${msg} # different output"
137		ret=${KSFT_FAIL}
138	fi
139}
140
141mptcp_lib_subtests_last_ts_reset
142
143check "show_endpoints" "" "defaults addr list"
144
145default_limits="$(get_limits)"
146if mptcp_lib_expect_all_features; then
147	check "get_limits" "$(format_limits 0 2)" "defaults limits"
148fi
149
150add_endpoint 10.0.1.1
151add_endpoint 10.0.1.2 flags subflow dev lo
152add_endpoint 10.0.1.3 flags signal,backup
153check "get_endpoint 1" "$(format_endpoints "1,10.0.1.1")" "simple add/get addr"
154
155check "show_endpoints" \
156	"$(format_endpoints "1,10.0.1.1" \
157			    "2,10.0.1.2,subflow,lo" \
158			    "3,10.0.1.3,signal backup")" "dump addrs"
159
160del_endpoint 2
161check "get_endpoint 2" "" "simple del addr"
162check "show_endpoints" \
163	"$(format_endpoints "1,10.0.1.1" \
164			    "3,10.0.1.3,signal backup")" "dump addrs after del"
165
166add_endpoint 10.0.1.3 2>/dev/null
167check "get_endpoint 4" "" "duplicate addr"
168
169add_endpoint 10.0.1.4 flags signal
170check "get_endpoint 4" "$(format_endpoints "4,10.0.1.4,signal")" "id addr increment"
171
172for i in $(seq 5 9); do
173	add_endpoint "10.0.1.${i}" flags signal >/dev/null 2>&1
174done
175check "get_endpoint 9" "$(format_endpoints "9,10.0.1.9,signal")" "hard addr limit"
176check "get_endpoint 10" "" "above hard addr limit"
177
178del_endpoint 9
179for i in $(seq 10 255); do
180	add_endpoint 10.0.0.9 id "${i}"
181	del_endpoint "${i}"
182done
183check "show_endpoints" \
184	"$(format_endpoints "1,10.0.1.1" \
185			    "3,10.0.1.3,signal backup" \
186			    "4,10.0.1.4,signal" \
187			    "5,10.0.1.5,signal" \
188			    "6,10.0.1.6,signal" \
189			    "7,10.0.1.7,signal" \
190			    "8,10.0.1.8,signal")" "id limit"
191
192flush_endpoint
193check "show_endpoints" "" "flush addrs"
194
195add_endpoint 10.0.1.1 flags unknown
196check "show_endpoints" "$(format_endpoints "1,10.0.1.1")" "ignore unknown flags"
197flush_endpoint
198
199set_limits 9 1 2>/dev/null
200check "get_limits" "${default_limits}" "rcv addrs above hard limit"
201
202set_limits 1 9 2>/dev/null
203check "get_limits" "${default_limits}" "subflows above hard limit"
204
205set_limits 8 8
206flush_endpoint  ## to make sure it doesn't affect the limits
207check "get_limits" "$(format_limits 8 8)" "set limits"
208
209flush_endpoint
210add_endpoint 10.0.1.1
211add_endpoint 10.0.1.2
212add_endpoint 10.0.1.3 id 100
213add_endpoint 10.0.1.4
214add_endpoint 10.0.1.5 id 254
215add_endpoint 10.0.1.6
216add_endpoint 10.0.1.7
217add_endpoint 10.0.1.8
218check "show_endpoints" \
219	"$(format_endpoints "1,10.0.1.1" \
220			    "2,10.0.1.2" \
221			    "3,10.0.1.7" \
222			    "4,10.0.1.8" \
223			    "100,10.0.1.3" \
224			    "101,10.0.1.4" \
225			    "254,10.0.1.5" \
226			    "255,10.0.1.6")" "set ids"
227
228flush_endpoint
229add_endpoint 10.0.0.1
230add_endpoint 10.0.0.2 id 254
231add_endpoint 10.0.0.3
232add_endpoint 10.0.0.4
233add_endpoint 10.0.0.5 id 253
234add_endpoint 10.0.0.6
235add_endpoint 10.0.0.7
236add_endpoint 10.0.0.8
237check "show_endpoints" \
238	"$(format_endpoints "1,10.0.0.1" \
239			    "2,10.0.0.4" \
240			    "3,10.0.0.6" \
241			    "4,10.0.0.7" \
242			    "5,10.0.0.8" \
243			    "253,10.0.0.5" \
244			    "254,10.0.0.2" \
245			    "255,10.0.0.3")" "wrap-around ids"
246
247flush_endpoint
248add_endpoint 10.0.1.1 flags subflow
249change_address 10.0.1.1 backup
250check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup")" \
251	"set flags (backup)"
252change_address 10.0.1.1 nobackup
253check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
254	"          (nobackup)"
255
256# fullmesh support has been added later
257change_endpoint 1 fullmesh 2>/dev/null
258if show_endpoints | grep -q "fullmesh" ||
259   mptcp_lib_expect_all_features; then
260	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow fullmesh")" \
261		"          (fullmesh)"
262	change_endpoint 1 nofullmesh
263	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
264		"          (nofullmesh)"
265	change_endpoint 1 backup,fullmesh
266	check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup fullmesh")" \
267		"          (backup,fullmesh)"
268else
269	for st in fullmesh nofullmesh backup,fullmesh; do
270		st="          (${st})"
271		mptcp_lib_print_title "${st}"
272		mptcp_lib_pr_skip
273		mptcp_lib_result_skip "${st}"
274	done
275fi
276
277mptcp_lib_result_print_all_tap
278exit $ret
~/ Read-only file preview.