1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ksft_skip=4
5ret=0
6
7usage() {
8	echo "Usage: $0 [ -h ]"
9}
10
11
12while getopts "$optstring" option;do
13	case "$option" in
14	"h")
15		usage $0
16		exit 0
17		;;
18	"?")
19		usage $0
20		exit 1
21		;;
22	esac
23done
24
25sec=$(date +%s)
26rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
27ns1="ns1-$rndh"
28err=$(mktemp)
29ret=0
30
31cleanup()
32{
33	rm -f $err
34	ip netns del $ns1
35}
36
37ip -Version > /dev/null 2>&1
38if [ $? -ne 0 ];then
39	echo "SKIP: Could not run test without ip tool"
40	exit $ksft_skip
41fi
42
43trap cleanup EXIT
44
45ip netns add $ns1 || exit $ksft_skip
46ip -net $ns1 link set lo up
47ip netns exec $ns1 sysctl -q net.mptcp.enabled=1
48
49check()
50{
51	local cmd="$1"
52	local expected="$2"
53	local msg="$3"
54	local out=`$cmd 2>$err`
55	local cmd_ret=$?
56
57	printf "%-50s %s" "$msg"
58	if [ $cmd_ret -ne 0 ]; then
59		echo "[FAIL] command execution '$cmd' stderr "
60		cat $err
61		ret=1
62	elif [ "$out" = "$expected" ]; then
63		echo "[ OK ]"
64	else
65		echo -n "[FAIL] "
66		echo "expected '$expected' got '$out'"
67		ret=1
68	fi
69}
70
71check "ip netns exec $ns1 ./pm_nl_ctl dump" "" "defaults addr list"
72check "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 0
73subflows 2" "defaults limits"
74
75ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1
76ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.2 flags subflow dev lo
77ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3 flags signal,backup
78check "ip netns exec $ns1 ./pm_nl_ctl get 1" "id 1 flags  10.0.1.1" "simple add/get addr"
79
80check "ip netns exec $ns1 ./pm_nl_ctl dump" \
81"id 1 flags  10.0.1.1
82id 2 flags subflow dev lo 10.0.1.2
83id 3 flags signal,backup 10.0.1.3" "dump addrs"
84
85ip netns exec $ns1 ./pm_nl_ctl del 2
86check "ip netns exec $ns1 ./pm_nl_ctl get 2" "" "simple del addr"
87check "ip netns exec $ns1 ./pm_nl_ctl dump" \
88"id 1 flags  10.0.1.1
89id 3 flags signal,backup 10.0.1.3" "dump addrs after del"
90
91ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3
92check "ip netns exec $ns1 ./pm_nl_ctl get 4" "" "duplicate addr"
93
94ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4 flags signal
95check "ip netns exec $ns1 ./pm_nl_ctl get 4" "id 4 flags signal 10.0.1.4" "id addr increment"
96
97for i in `seq 5 9`; do
98	ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.$i flags signal >/dev/null 2>&1
99done
100check "ip netns exec $ns1 ./pm_nl_ctl get 9" "id 9 flags signal 10.0.1.9" "hard addr limit"
101check "ip netns exec $ns1 ./pm_nl_ctl get 10" "" "above hard addr limit"
102
103ip netns exec $ns1 ./pm_nl_ctl del 9
104for i in `seq 10 255`; do
105	ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.9 id $i
106	ip netns exec $ns1 ./pm_nl_ctl del $i
107done
108check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.1.1
109id 3 flags signal,backup 10.0.1.3
110id 4 flags signal 10.0.1.4
111id 5 flags signal 10.0.1.5
112id 6 flags signal 10.0.1.6
113id 7 flags signal 10.0.1.7
114id 8 flags signal 10.0.1.8" "id limit"
115
116ip netns exec $ns1 ./pm_nl_ctl flush
117check "ip netns exec $ns1 ./pm_nl_ctl dump" "" "flush addrs"
118
119ip netns exec $ns1 ./pm_nl_ctl limits 9 1
120check "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 0
121subflows 2" "rcv addrs above hard limit"
122
123ip netns exec $ns1 ./pm_nl_ctl limits 1 9
124check "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 0
125subflows 2" "subflows above hard limit"
126
127ip netns exec $ns1 ./pm_nl_ctl limits 8 8
128check "ip netns exec $ns1 ./pm_nl_ctl limits" "accept 8
129subflows 8" "set limits"
130
131ip netns exec $ns1 ./pm_nl_ctl flush
132ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1
133ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.2
134ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.3 id 100
135ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4
136ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.5 id 254
137ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.6
138ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.7
139ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.8
140check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.1.1
141id 2 flags  10.0.1.2
142id 3 flags  10.0.1.7
143id 4 flags  10.0.1.8
144id 100 flags  10.0.1.3
145id 101 flags  10.0.1.4
146id 254 flags  10.0.1.5
147id 255 flags  10.0.1.6" "set ids"
148
149ip netns exec $ns1 ./pm_nl_ctl flush
150ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.1
151ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.2 id 254
152ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.3
153ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.4
154ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.5 id 253
155ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.6
156ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.7
157ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.8
158check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags  10.0.0.1
159id 2 flags  10.0.0.4
160id 3 flags  10.0.0.6
161id 4 flags  10.0.0.7
162id 5 flags  10.0.0.8
163id 253 flags  10.0.0.5
164id 254 flags  10.0.0.2
165id 255 flags  10.0.0.3" "wrap-around ids"
166
167ip netns exec $ns1 ./pm_nl_ctl flush
168ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags subflow
169ip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags backup
170check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
171subflow,backup 10.0.1.1" "set flags (backup)"
172ip netns exec $ns1 ./pm_nl_ctl set 10.0.1.1 flags nobackup
173check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
174subflow 10.0.1.1" "          (nobackup)"
175ip netns exec $ns1 ./pm_nl_ctl set id 1 flags fullmesh
176check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
177subflow,fullmesh 10.0.1.1" "          (fullmesh)"
178ip netns exec $ns1 ./pm_nl_ctl set id 1 flags nofullmesh
179check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
180subflow 10.0.1.1" "          (nofullmesh)"
181ip netns exec $ns1 ./pm_nl_ctl set id 1 flags backup,fullmesh
182check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags \
183subflow,backup,fullmesh 10.0.1.1" "          (backup,fullmesh)"
184
185exit $ret
186