2 # SPDX-License-Identifier: GPL-2.0
4 # Double quotes to prevent globbing and word splitting is recommended in new
5 # code but we accept it, especially because there were too many before having
6 # address all other issues detected by shellcheck.
7 #shellcheck disable=SC2086
9 .
"$(dirname "${0}")/mptcp_lib.sh"
17 timeout_test
=$
((timeout_poll
* 2 + 1))
26 echo "Usage: $0 [ -i ] [ -h ]"
27 echo -e "\t-i: use 'ip mptcp' instead of 'pm_nl_ctl'"
31 while getopts "hi" option
;do
38 mptcp_lib_set_ip_mptcp
53 for t
in ${iptables} ${ip6tables}; do
54 # just to debug: check we have multiple subflows connection requests
55 ip netns
exec $ns $t -A OUTPUT
-p tcp
--syn -m mark
--mark $m -j ACCEPT
57 # RST packets might be handled by a internal dummy socket
58 ip netns
exec $ns $t -A OUTPUT
-p tcp
--tcp-flags RST RST
-m mark
--mark 0 -j ACCEPT
60 ip netns
exec $ns $t -A OUTPUT
-p tcp
-m mark
--mark $m -j ACCEPT
61 ip netns
exec $ns $t -A OUTPUT
-p tcp
-m mark
--mark 0 -j DROP
67 mptcp_lib_ns_init ns1 ns2 ns_sbox
70 for i
in $
(seq 1 4); do
71 ip link add ns1eth
$i netns
"$ns1" type veth peer name ns2eth
$i netns
"$ns2"
72 ip
-net "$ns1" addr add
10.0.
$i.1/24 dev ns1eth
$i
73 ip
-net "$ns1" addr add dead
:beef
:$i::1/64 dev ns1eth
$i nodad
74 ip
-net "$ns1" link
set ns1eth
$i up
76 ip
-net "$ns2" addr add
10.0.
$i.2/24 dev ns2eth
$i
77 ip
-net "$ns2" addr add dead
:beef
:$i::2/64 dev ns2eth
$i nodad
78 ip
-net "$ns2" link
set ns2eth
$i up
80 # let $ns2 reach any $ns1 address from any interface
81 ip
-net "$ns2" route add default via
10.0.
$i.1 dev ns2eth
$i metric
10$i
83 mptcp_lib_pm_nl_add_endpoint
"${ns1}" "10.0.${i}.1" flags signal
84 mptcp_lib_pm_nl_add_endpoint
"${ns1}" "dead:beef:${i}::1" flags signal
86 mptcp_lib_pm_nl_add_endpoint
"${ns2}" "10.0.${i}.2" flags signal
87 mptcp_lib_pm_nl_add_endpoint
"${ns2}" "dead:beef:${i}::2" flags signal
90 mptcp_lib_pm_nl_set_limits
"${ns1}" 8 8
91 mptcp_lib_pm_nl_set_limits
"${ns2}" 8 8
97 # This function is used in the cleanup trap
98 #shellcheck disable=SC2317
101 mptcp_lib_ns_exit
"${ns1}" "${ns2}" "${ns_sbox}"
106 mptcp_lib_check_mptcp
107 mptcp_lib_check_kallsyms
108 mptcp_lib_check_tools ip
"${iptables}" "${ip6tables}"
115 local tables
=${iptables}
117 if [ $af -eq 6 ];then
121 local counters values
122 counters
=$
(ip netns
exec $ns $tables -v -L OUTPUT |
grep DROP
)
123 values
=${counters%DROP*}
127 if [ $v -ne 0 ]; then
128 mptcp_lib_pr_fail
"got $tables $values in ns $ns," \
129 "not 0 - not all expected packets marked"
140 mptcp_lib_print_title
"${@}"
145 local listener_ns
="$1"
146 local connector_ns
="$2"
149 local connect_addr
="$5"
156 local mptcp_connect
="./mptcp_connect -r 20"
159 if mptcp_lib_is_v6
"${connect_addr}"; then
168 if mptcp_lib_kallsyms_has
"mptcp_ioctl$"; then
172 timeout
${timeout_test} \
173 ip netns
exec ${listener_ns} \
174 $mptcp_connect -t ${timeout_poll} -l -M 1 -p $port -s ${srv_proto} -c "${cmsg}" \
175 ${local_addr} < "$sin" > "$sout" &
180 timeout ${timeout_test} \
181 ip netns exec ${connector_ns} \
182 $mptcp_connect -t ${timeout_poll} -M 2 -p $port -s ${cl_proto} -c "${cmsg}" \
183 $connect_addr < "$cin" > "$cout" &
192 print_title
"Transfer ${ip:2}"
193 if [ ${rets} -ne 0 ] ||
[ ${retc} -ne 0 ]; then
194 mptcp_lib_pr_fail
"client exit code $retc, server $rets"
195 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
196 ip netns
exec ${listener_ns} ss
-Menita 1>&2 -o "sport = :$port"
198 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
199 ip netns
exec ${connector_ns} ss
-Menita 1>&2 -o "dport = :$port"
201 mptcp_lib_result_fail
"transfer ${ip}"
206 if ! mptcp_lib_check_transfer
$cin $sout "file received by server"; then
211 mptcp_lib_result_code
"${rets}" "transfer ${ip}"
213 print_title
"Mark ${ip:2}"
214 if [ $local_addr = "::" ];then
215 check_mark
$listener_ns 6 || retc
=1
216 check_mark
$connector_ns 6 || retc
=1
218 check_mark
$listener_ns 4 || retc
=1
219 check_mark
$connector_ns 4 || retc
=1
222 mptcp_lib_result_code
"${retc}" "mark ${ip}"
224 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
239 mptcp_lib_make_file
$name 1024 $size
241 echo "Created $name (size $size KB) containing data sent by $who"
244 do_mptcp_sockopt_tests
()
248 if ! mptcp_lib_kallsyms_has
"mptcp_diag_fill_info$"; then
249 mptcp_lib_pr_skip
"MPTCP sockopt not supported"
250 mptcp_lib_result_skip
"sockopt"
254 ip netns
exec "$ns_sbox" .
/mptcp_sockopt
257 print_title
"SOL_MPTCP sockopt v4"
258 if [ $lret -ne 0 ]; then
260 mptcp_lib_result_fail
"sockopt v4"
265 mptcp_lib_result_pass
"sockopt v4"
267 ip netns
exec "$ns_sbox" .
/mptcp_sockopt
-6
270 print_title
"SOL_MPTCP sockopt v6"
271 if [ $lret -ne 0 ]; then
273 mptcp_lib_result_fail
"sockopt v6"
278 mptcp_lib_result_pass
"sockopt v6"
283 local listener_ns
="$1"
284 local connector_ns
="$2"
285 local connect_addr
="$3"
288 do_transfer
${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr}
292 if [ $lret -ne 0 ]; then
300 print_title
"TCP_INQ cmsg/ioctl $*"
301 ip netns
exec "$ns_sbox" .
/mptcp_inq
"$@"
303 if [ $lret -ne 0 ];then
306 mptcp_lib_result_fail
"TCP_INQ: $*"
311 mptcp_lib_result_pass
"TCP_INQ: $*"
319 if ! mptcp_lib_kallsyms_has
"mptcp_ioctl$"; then
320 mptcp_lib_pr_skip
"TCP_INQ not supported"
321 mptcp_lib_result_skip
"TCP_INQ"
326 for args
in "-t tcp" "-r tcp"; do
329 if [ $lret -ne 0 ] ; then
332 do_tcpinq_test
-6 $args
334 if [ $lret -ne 0 ] ; then
339 do_tcpinq_test
-r tcp
-t tcp
349 make_file
"$cin" "client" 1
350 make_file
"$sin" "server" 1
352 mptcp_lib_subtests_last_ts_reset
354 run_tests
$ns1 $ns2 10.0.1.1
355 run_tests
$ns1 $ns2 dead
:beef
:1::1
357 do_mptcp_sockopt_tests
360 mptcp_lib_result_print_all_tap