162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh"
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciksft_skip=4
762306a36Sopenharmony_ciret=0
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciusage() {
1062306a36Sopenharmony_ci	echo "Usage: $0 [ -h ]"
1162306a36Sopenharmony_ci}
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciwhile getopts "$optstring" option;do
1562306a36Sopenharmony_ci	case "$option" in
1662306a36Sopenharmony_ci	"h")
1762306a36Sopenharmony_ci		usage $0
1862306a36Sopenharmony_ci		exit 0
1962306a36Sopenharmony_ci		;;
2062306a36Sopenharmony_ci	"?")
2162306a36Sopenharmony_ci		usage $0
2262306a36Sopenharmony_ci		exit 1
2362306a36Sopenharmony_ci		;;
2462306a36Sopenharmony_ci	esac
2562306a36Sopenharmony_cidone
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cisec=$(date +%s)
2862306a36Sopenharmony_cirndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
2962306a36Sopenharmony_cins1="ns1-$rndh"
3062306a36Sopenharmony_cierr=$(mktemp)
3162306a36Sopenharmony_ciret=0
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cicleanup()
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	rm -f $err
3662306a36Sopenharmony_ci	ip netns del $ns1
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cimptcp_lib_check_mptcp
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciip -Version > /dev/null 2>&1
4262306a36Sopenharmony_ciif [ $? -ne 0 ];then
4362306a36Sopenharmony_ci	echo "SKIP: Could not run test without ip tool"
4462306a36Sopenharmony_ci	exit $ksft_skip
4562306a36Sopenharmony_cifi
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_citrap cleanup EXIT
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciip netns add $ns1 || exit $ksft_skip
5062306a36Sopenharmony_ciip -net $ns1 link set lo up
5162306a36Sopenharmony_ciip netns exec $ns1 sysctl -q net.mptcp.enabled=1
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cicheck()
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	local cmd="$1"
5662306a36Sopenharmony_ci	local expected="$2"
5762306a36Sopenharmony_ci	local msg="$3"
5862306a36Sopenharmony_ci	local out=`$cmd 2>$err`
5962306a36Sopenharmony_ci	local cmd_ret=$?
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	printf "%-50s" "$msg"
6262306a36Sopenharmony_ci	if [ $cmd_ret -ne 0 ]; then
6362306a36Sopenharmony_ci		echo "[FAIL] command execution '$cmd' stderr "
6462306a36Sopenharmony_ci		cat $err
6562306a36Sopenharmony_ci		mptcp_lib_result_fail "${msg} # error ${cmd_ret}"
6662306a36Sopenharmony_ci		ret=1
6762306a36Sopenharmony_ci	elif [ "$out" = "$expected" ]; then
6862306a36Sopenharmony_ci		echo "[ OK ]"
6962306a36Sopenharmony_ci		mptcp_lib_result_pass "${msg}"
7062306a36Sopenharmony_ci	else
7162306a36Sopenharmony_ci		echo -n "[FAIL] "
7262306a36Sopenharmony_ci		echo "expected '$expected' got '$out'"
7362306a36Sopenharmony_ci		mptcp_lib_result_fail "${msg} # different output"
7462306a36Sopenharmony_ci		ret=1
7562306a36Sopenharmony_ci	fi
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "" "defaults addr list"
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cidefault_limits="$(ip netns exec $ns1 ./pm_nl_ctl limits)"
8162306a36Sopenharmony_ciif mptcp_lib_expect_all_features; then
8262306a36Sopenharmony_ci	check "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 0
8362306a36Sopenharmony_cisubflows 2" "defaults limits"
8462306a36Sopenharmony_cifi
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1
8762306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.2 flags subflow dev lo
8862306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3 flags signal,backup
8962306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 1" "id 1 flags  10.0.1.1" "simple add/get addr"
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" \
9262306a36Sopenharmony_ci"id 1 flags  10.0.1.1
9362306a36Sopenharmony_ciid 2 flags subflow dev lo 10.0.1.2
9462306a36Sopenharmony_ciid 3 flags signal,backup 10.0.1.3" "dump addrs"
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl del 2
9762306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 2" "" "simple del addr"
9862306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" \
9962306a36Sopenharmony_ci"id 1 flags  10.0.1.1
10062306a36Sopenharmony_ciid 3 flags signal,backup 10.0.1.3" "dump addrs after del"
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3 2>/dev/null
10362306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 4" "" "duplicate addr"
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4 flags signal
10662306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 4" "id 4 flags signal 10.0.1.4" "id addr increment"
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cifor i in `seq 5 9`; do
10962306a36Sopenharmony_ci	ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.$i flags signal >/dev/null 2>&1
11062306a36Sopenharmony_cidone
11162306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 9" "id 9 flags signal 10.0.1.9" "hard addr limit"
11262306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl get 10" "" "above hard addr limit"
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl del 9
11562306a36Sopenharmony_cifor i in `seq 10 255`; do
11662306a36Sopenharmony_ci	ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.9 id $i
11762306a36Sopenharmony_ci	ip netns exec $ns1 ./pm_nl_ctl del $i
11862306a36Sopenharmony_cidone
11962306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.1.1
12062306a36Sopenharmony_ciid 3 flags signal,backup 10.0.1.3
12162306a36Sopenharmony_ciid 4 flags signal 10.0.1.4
12262306a36Sopenharmony_ciid 5 flags signal 10.0.1.5
12362306a36Sopenharmony_ciid 6 flags signal 10.0.1.6
12462306a36Sopenharmony_ciid 7 flags signal 10.0.1.7
12562306a36Sopenharmony_ciid 8 flags signal 10.0.1.8" "id limit"
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl flush
12862306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "" "flush addrs"
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 9 1 2>/dev/null
13162306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl limits" "$default_limits" "rcv addrs above hard limit"
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 1 9 2>/dev/null
13462306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl limits" "$default_limits" "subflows above hard limit"
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 8 8
13762306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 8
13862306a36Sopenharmony_cisubflows 8" "set limits"
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl flush
14162306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1
14262306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.2
14362306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3 id 100
14462306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4
14562306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.5 id 254
14662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.6
14762306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.7
14862306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.8
14962306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.1.1
15062306a36Sopenharmony_ciid 2 flags  10.0.1.2
15162306a36Sopenharmony_ciid 3 flags  10.0.1.7
15262306a36Sopenharmony_ciid 4 flags  10.0.1.8
15362306a36Sopenharmony_ciid 100 flags  10.0.1.3
15462306a36Sopenharmony_ciid 101 flags  10.0.1.4
15562306a36Sopenharmony_ciid 254 flags  10.0.1.5
15662306a36Sopenharmony_ciid 255 flags  10.0.1.6" "set ids"
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl flush
15962306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.1
16062306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.2 id 254
16162306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.3
16262306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.4
16362306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.5 id 253
16462306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.6
16562306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.7
16662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.0.8
16762306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.0.1
16862306a36Sopenharmony_ciid 2 flags  10.0.0.4
16962306a36Sopenharmony_ciid 3 flags  10.0.0.6
17062306a36Sopenharmony_ciid 4 flags  10.0.0.7
17162306a36Sopenharmony_ciid 5 flags  10.0.0.8
17262306a36Sopenharmony_ciid 253 flags  10.0.0.5
17362306a36Sopenharmony_ciid 254 flags  10.0.0.2
17462306a36Sopenharmony_ciid 255 flags  10.0.0.3" "wrap-around ids"
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl flush
17762306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags subflow
17862306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags backup
17962306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
18062306a36Sopenharmony_cisubflow,backup 10.0.1.1" "set flags (backup)"
18162306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags nobackup
18262306a36Sopenharmony_cicheck "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
18362306a36Sopenharmony_cisubflow 10.0.1.1" "          (nobackup)"
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci# fullmesh support has been added later
18662306a36Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl set id 1 flags fullmesh 2>/dev/null
18762306a36Sopenharmony_ciif ip netns exec $ns1 ./pm_nl_ctl dump | grep -q "fullmesh" ||
18862306a36Sopenharmony_ci   mptcp_lib_expect_all_features; then
18962306a36Sopenharmony_ci	check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
19062306a36Sopenharmony_cisubflow,fullmesh 10.0.1.1" "          (fullmesh)"
19162306a36Sopenharmony_ci	ip netns exec $ns1 ./pm_nl_ctl set id 1 flags nofullmesh
19262306a36Sopenharmony_ci	check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
19362306a36Sopenharmony_cisubflow 10.0.1.1" "          (nofullmesh)"
19462306a36Sopenharmony_ci	ip netns exec $ns1 ./pm_nl_ctl set id 1 flags backup,fullmesh
19562306a36Sopenharmony_ci	check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
19662306a36Sopenharmony_cisubflow,backup,fullmesh 10.0.1.1" "          (backup,fullmesh)"
19762306a36Sopenharmony_cielse
19862306a36Sopenharmony_ci	for st in fullmesh nofullmesh backup,fullmesh; do
19962306a36Sopenharmony_ci		st="          (${st})"
20062306a36Sopenharmony_ci		printf "%-50s%s\n" "${st}" "[SKIP]"
20162306a36Sopenharmony_ci		mptcp_lib_result_skip "${st}"
20262306a36Sopenharmony_ci	done
20362306a36Sopenharmony_cifi
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cimptcp_lib_result_print_all_tap
20662306a36Sopenharmony_ciexit $ret
207