1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# Double quotes to prevent globbing and word splitting is recommended in new 5# code but we accept it. 6#shellcheck disable=SC2086 7 8# Some variables are used below but indirectly, see verify_*_event() 9#shellcheck disable=SC2034 10 11. "$(dirname "${0}")/mptcp_lib.sh" 12 13mptcp_lib_check_mptcp 14mptcp_lib_check_kallsyms 15 16if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 17 echo "userspace pm tests are not supported by the kernel: SKIP" 18 exit ${KSFT_SKIP} 19fi 20mptcp_lib_check_tools ip 21 22ANNOUNCED=${MPTCP_LIB_EVENT_ANNOUNCED} 23REMOVED=${MPTCP_LIB_EVENT_REMOVED} 24SUB_ESTABLISHED=${MPTCP_LIB_EVENT_SUB_ESTABLISHED} 25SUB_CLOSED=${MPTCP_LIB_EVENT_SUB_CLOSED} 26LISTENER_CREATED=${MPTCP_LIB_EVENT_LISTENER_CREATED} 27LISTENER_CLOSED=${MPTCP_LIB_EVENT_LISTENER_CLOSED} 28 29AF_INET=${MPTCP_LIB_AF_INET} 30AF_INET6=${MPTCP_LIB_AF_INET6} 31 32file="" 33server_evts="" 34client_evts="" 35server_evts_pid=0 36client_evts_pid=0 37client4_pid=0 38server4_pid=0 39client6_pid=0 40server6_pid=0 41client4_token="" 42server4_token="" 43client6_token="" 44server6_token="" 45client4_port=0; 46client6_port=0; 47app4_port=50002 48new4_port=50003 49app6_port=50004 50client_addr_id=${RANDOM:0:2} 51server_addr_id=${RANDOM:0:2} 52 53ns1="" 54ns2="" 55ret=0 56test_name="" 57# a bit more space: because we have more to display 58MPTCP_LIB_TEST_FORMAT="%02u %-68s" 59 60print_title() 61{ 62 mptcp_lib_pr_info "${1}" 63} 64 65# $1: test name 66print_test() 67{ 68 test_name="${1}" 69 70 mptcp_lib_print_title "${test_name}" 71} 72 73test_pass() 74{ 75 mptcp_lib_pr_ok 76 mptcp_lib_result_pass "${test_name}" 77} 78 79test_skip() 80{ 81 mptcp_lib_pr_skip 82 mptcp_lib_result_skip "${test_name}" 83} 84 85# $1: msg 86test_fail() 87{ 88 if [ ${#} -gt 0 ] 89 then 90 mptcp_lib_pr_fail "${@}" 91 fi 92 ret=${KSFT_FAIL} 93 mptcp_lib_result_fail "${test_name}" 94} 95 96# This function is used in the cleanup trap 97#shellcheck disable=SC2317,SC2329 98cleanup() 99{ 100 print_title "Cleanup" 101 102 # Terminate the MPTCP connection and related processes 103 local pid 104 for pid in $client4_pid $server4_pid $client6_pid $server6_pid\ 105 $server_evts_pid $client_evts_pid 106 do 107 mptcp_lib_kill_wait $pid 108 done 109 110 mptcp_lib_ns_exit "${ns1}" "${ns2}" 111 112 rm -rf $file $client_evts $server_evts 113 114 mptcp_lib_pr_info "Done" 115} 116 117trap cleanup EXIT 118 119# Create and configure network namespaces for testing 120print_title "Init" 121mptcp_lib_ns_init ns1 ns2 122 123# check path_manager and pm_type sysctl mapping 124if [ -f /proc/sys/net/mptcp/path_manager ]; then 125 ip netns exec "$ns1" sysctl -q net.mptcp.path_manager=userspace 126 pm_type="$(ip netns exec "$ns1" sysctl -n net.mptcp.pm_type)" 127 if [ "${pm_type}" != "1" ]; then 128 test_fail "unexpected pm_type: ${pm_type}" 129 mptcp_lib_result_print_all_tap 130 exit ${KSFT_FAIL} 131 fi 132 133 ip netns exec "$ns1" sysctl -q net.mptcp.path_manager=error 2>/dev/null 134 pm_type="$(ip netns exec "$ns1" sysctl -n net.mptcp.pm_type)" 135 if [ "${pm_type}" != "1" ]; then 136 test_fail "unexpected pm_type after error: ${pm_type}" 137 mptcp_lib_result_print_all_tap 138 exit ${KSFT_FAIL} 139 fi 140 141 ip netns exec "$ns1" sysctl -q net.mptcp.pm_type=0 142 pm_name="$(ip netns exec "$ns1" sysctl -n net.mptcp.path_manager)" 143 if [ "${pm_name}" != "kernel" ]; then 144 test_fail "unexpected path-manager: ${pm_name}" 145 mptcp_lib_result_print_all_tap 146 exit ${KSFT_FAIL} 147 fi 148fi 149 150for i in "$ns1" "$ns2" ;do 151 ip netns exec "$i" sysctl -q net.mptcp.pm_type=1 152done 153 154# "$ns1" ns2 155# ns1eth2 ns2eth1 156 157ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" 158 159# Add IPv4/v6 addresses to the namespaces 160ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 161ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 162ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad 163ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad 164ip -net "$ns1" link set ns1eth2 up 165 166ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 167ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 168ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad 169ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad 170ip -net "$ns2" link set ns2eth1 up 171 172file=$(mktemp) 173mptcp_lib_make_file "$file" 2 1 174 175# Capture netlink events over the two network namespaces running 176# the MPTCP client and server 177client_evts=$(mktemp) 178mptcp_lib_events "${ns2}" "${client_evts}" client_evts_pid 179server_evts=$(mktemp) 180mptcp_lib_events "${ns1}" "${server_evts}" server_evts_pid 181sleep 0.5 182mptcp_lib_subtests_last_ts_reset 183 184print_test "Created network namespaces ns1, ns2" 185test_pass 186 187make_connection() 188{ 189 local is_v6=$1 190 local app_port=$app4_port 191 local connect_addr="10.0.1.1" 192 local client_addr="10.0.1.2" 193 local listen_addr="0.0.0.0" 194 if [ "$is_v6" = "v6" ] 195 then 196 connect_addr="dead:beef:1::1" 197 client_addr="dead:beef:1::2" 198 listen_addr="::" 199 app_port=$app6_port 200 else 201 is_v6="v4" 202 fi 203 204 # set this on the client side only: will not affect the rest 205 ip netns exec "$ns2" sysctl -q net.mptcp.allow_join_initial_addr_port=0 206 207 :>"$client_evts" 208 :>"$server_evts" 209 210 # Run the server 211 ip netns exec "$ns1" \ 212 ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr > /dev/null 2>&1 & 213 local server_pid=$! 214 215 mptcp_lib_wait_local_port_listen "${ns1}" "${port}" 216 217 # Run the client, transfer $file and stay connected to the server 218 # to conduct tests 219 ip netns exec "$ns2" \ 220 ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr\ 221 2>&1 > /dev/null < "$file" & 222 local client_pid=$! 223 sleep 1 224 225 # Capture client/server attributes from MPTCP connection netlink events 226 227 local client_token 228 local client_port 229 local client_serverside 230 local client_nojoin 231 local server_token 232 local server_serverside 233 local server_nojoin 234 235 client_token=$(mptcp_lib_evts_get_info token "$client_evts") 236 client_port=$(mptcp_lib_evts_get_info sport "$client_evts") 237 client_serverside=$(mptcp_lib_evts_get_info server_side "$client_evts") 238 client_nojoin=$(mptcp_lib_evts_get_info deny_join_id0 "$client_evts") 239 server_token=$(mptcp_lib_evts_get_info token "$server_evts") 240 server_serverside=$(mptcp_lib_evts_get_info server_side "$server_evts") 241 server_nojoin=$(mptcp_lib_evts_get_info deny_join_id0 "$server_evts") 242 243 print_test "Established IP${is_v6} MPTCP Connection ns2 => ns1" 244 if [ "${client_token}" != "" ] && [ "${server_token}" != "" ] && 245 [ "${client_serverside:-0}" = 0 ] && [ "${server_serverside:-0}" = 1 ] && 246 [ "${client_nojoin:-0}" = 0 ] && [ "${server_nojoin:-0}" = 1 ] 247 then 248 test_pass 249 print_title "Connection info: ${client_addr}:${client_port} -> ${connect_addr}:${app_port}" 250 else 251 test_fail "Expected tokens (c:${client_token} - s:${server_token}), server (c:${client_serverside} - s:${server_serverside}), nojoin (c:${client_nojoin} - s:${server_nojoin})" 252 mptcp_lib_result_print_all_tap 253 exit ${KSFT_FAIL} 254 fi 255 256 if [ "$is_v6" = "v6" ] 257 then 258 client6_token=$client_token 259 server6_token=$server_token 260 client6_port=$client_port 261 client6_pid=$client_pid 262 server6_pid=$server_pid 263 else 264 client4_token=$client_token 265 server4_token=$server_token 266 client4_port=$client_port 267 client4_pid=$client_pid 268 server4_pid=$server_pid 269 fi 270} 271 272# $@: all var names to check 273check_expected() 274{ 275 if mptcp_lib_check_expected "${@}" 276 then 277 test_pass 278 return 0 279 fi 280 281 test_fail 282 return 1 283} 284 285verify_announce_event() 286{ 287 local evt=$1 288 local e_type=$2 289 local e_token=$3 290 local e_addr=$4 291 local e_id=$5 292 local e_dport=$6 293 local e_af=$7 294 local type 295 local token 296 local addr 297 local dport 298 local id 299 300 type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 301 token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 302 if [ "$e_af" = "v6" ] 303 then 304 addr=$(mptcp_lib_evts_get_info daddr6 "$evt" $e_type) 305 else 306 addr=$(mptcp_lib_evts_get_info daddr4 "$evt" $e_type) 307 fi 308 dport=$(mptcp_lib_evts_get_info dport "$evt" $e_type) 309 id=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 310 311 check_expected "type" "token" "addr" "dport" "id" 312} 313 314test_announce() 315{ 316 print_title "Announce tests" 317 318 # Capture events on the network namespace running the server 319 :>"$server_evts" 320 321 # ADD_ADDR using an invalid token should result in no action 322 local invalid_token=$(( client4_token - 1)) 323 ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id\ 324 $client_addr_id dev ns2eth1 > /dev/null 2>&1 325 326 local type 327 type=$(mptcp_lib_evts_get_info type "$server_evts") 328 print_test "ADD_ADDR 10.0.2.2 (ns2) => ns1, invalid token" 329 if [ "$type" = "" ] 330 then 331 test_pass 332 else 333 test_fail "type defined: ${type}" 334 fi 335 336 # ADD_ADDR from the client to server machine reusing the subflow port 337 :>"$server_evts" 338 ip netns exec "$ns2"\ 339 ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\ 340 ns2eth1 341 print_test "ADD_ADDR id:client 10.0.2.2 (ns2) => ns1, reuse port" 342 sleep 0.5 343 verify_announce_event $server_evts $ANNOUNCED $server4_token "10.0.2.2" $client_addr_id \ 344 "$client4_port" 345 346 # ADD_ADDR6 from the client to server machine reusing the subflow port 347 :>"$server_evts" 348 ip netns exec "$ns2" ./pm_nl_ctl ann\ 349 dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 350 print_test "ADD_ADDR6 id:client dead:beef:2::2 (ns2) => ns1, reuse port" 351 sleep 0.5 352 verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:beef:2::2"\ 353 "$client_addr_id" "$client6_port" "v6" 354 355 # ADD_ADDR from the client to server machine using a new port 356 :>"$server_evts" 357 client_addr_id=$((client_addr_id+1)) 358 ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 359 $client_addr_id dev ns2eth1 port $new4_port 360 print_test "ADD_ADDR id:client+1 10.0.2.2 (ns2) => ns1, new port" 361 sleep 0.5 362 verify_announce_event "$server_evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\ 363 "$client_addr_id" "$new4_port" 364 365 # Capture events on the network namespace running the client 366 :>"$client_evts" 367 368 # ADD_ADDR from the server to client machine reusing the subflow port 369 ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 370 $server_addr_id dev ns1eth2 371 print_test "ADD_ADDR id:server 10.0.2.1 (ns1) => ns2, reuse port" 372 sleep 0.5 373 verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ 374 "$server_addr_id" "$app4_port" 375 376 # ADD_ADDR6 from the server to client machine reusing the subflow port 377 :>"$client_evts" 378 ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\ 379 $server_addr_id dev ns1eth2 380 print_test "ADD_ADDR6 id:server dead:beef:2::1 (ns1) => ns2, reuse port" 381 sleep 0.5 382 verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:beef:2::1"\ 383 "$server_addr_id" "$app6_port" "v6" 384 385 # ADD_ADDR from the server to client machine using a new port 386 :>"$client_evts" 387 server_addr_id=$((server_addr_id+1)) 388 ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 389 $server_addr_id dev ns1eth2 port $new4_port 390 print_test "ADD_ADDR id:server+1 10.0.2.1 (ns1) => ns2, new port" 391 sleep 0.5 392 verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ 393 "$server_addr_id" "$new4_port" 394} 395 396verify_remove_event() 397{ 398 local evt=$1 399 local e_type=$2 400 local e_token=$3 401 local e_id=$4 402 local type 403 local token 404 local id 405 406 type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 407 token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 408 id=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 409 410 check_expected "type" "token" "id" 411} 412 413test_remove() 414{ 415 print_title "Remove tests" 416 417 # Capture events on the network namespace running the server 418 :>"$server_evts" 419 420 # RM_ADDR using an invalid token should result in no action 421 local invalid_token=$(( client4_token - 1 )) 422 ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\ 423 $client_addr_id > /dev/null 2>&1 424 print_test "RM_ADDR id:client ns2 => ns1, invalid token" 425 local type 426 type=$(mptcp_lib_evts_get_info type "$server_evts") 427 if [ "$type" = "" ] 428 then 429 test_pass 430 else 431 test_fail "unexpected type: ${type}" 432 fi 433 434 # RM_ADDR using an invalid addr id should result in no action 435 local invalid_id=$(( client_addr_id + 1 )) 436 ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 437 $invalid_id > /dev/null 2>&1 438 print_test "RM_ADDR id:client+1 ns2 => ns1, invalid id" 439 type=$(mptcp_lib_evts_get_info type "$server_evts") 440 if [ "$type" = "" ] 441 then 442 test_pass 443 else 444 test_fail "unexpected type: ${type}" 445 fi 446 447 # RM_ADDR from the client to server machine 448 :>"$server_evts" 449 ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 450 $client_addr_id 451 print_test "RM_ADDR id:client ns2 => ns1" 452 sleep 0.5 453 verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" 454 455 # RM_ADDR from the client to server machine 456 :>"$server_evts" 457 client_addr_id=$(( client_addr_id - 1 )) 458 ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 459 $client_addr_id 460 print_test "RM_ADDR id:client-1 ns2 => ns1" 461 sleep 0.5 462 verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" 463 464 # RM_ADDR6 from the client to server machine 465 :>"$server_evts" 466 ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ 467 $client_addr_id 468 print_test "RM_ADDR6 id:client-1 ns2 => ns1" 469 sleep 0.5 470 verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_addr_id" 471 472 # Capture events on the network namespace running the client 473 :>"$client_evts" 474 475 # RM_ADDR from the server to client machine 476 ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ 477 $server_addr_id 478 print_test "RM_ADDR id:server ns1 => ns2" 479 sleep 0.5 480 verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" 481 482 # RM_ADDR from the server to client machine 483 :>"$client_evts" 484 server_addr_id=$(( server_addr_id - 1 )) 485 ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ 486 $server_addr_id 487 print_test "RM_ADDR id:server-1 ns1 => ns2" 488 sleep 0.5 489 verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" 490 491 # RM_ADDR6 from the server to client machine 492 :>"$client_evts" 493 ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ 494 $server_addr_id 495 print_test "RM_ADDR6 id:server-1 ns1 => ns2" 496 sleep 0.5 497 verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_addr_id" 498} 499 500verify_subflow_events() 501{ 502 local evt=$1 503 local e_type=$2 504 local e_token=$3 505 local e_family=$4 506 local e_saddr=$5 507 local e_daddr=$6 508 local e_dport=$7 509 local e_locid=$8 510 local e_remid=$9 511 shift 2 512 local e_from=$8 513 local e_to=$9 514 local type 515 local token 516 local family 517 local saddr 518 local daddr 519 local dport 520 local locid 521 local remid 522 local info 523 local e_dport_txt 524 525 # only display the fixed ports 526 if [ "${e_dport}" -ge "${app4_port}" ] && [ "${e_dport}" -le "${app6_port}" ]; then 527 e_dport_txt=":${e_dport}" 528 fi 529 530 info="${e_saddr} (${e_from}) => ${e_daddr}${e_dport_txt} (${e_to})" 531 532 if [ "$e_type" = "$SUB_ESTABLISHED" ] 533 then 534 if [ "$e_family" = "$AF_INET6" ] 535 then 536 print_test "CREATE_SUBFLOW6 ${info}" 537 else 538 print_test "CREATE_SUBFLOW ${info}" 539 fi 540 else 541 if [ "$e_family" = "$AF_INET6" ] 542 then 543 print_test "DESTROY_SUBFLOW6 ${info}" 544 else 545 print_test "DESTROY_SUBFLOW ${info}" 546 fi 547 fi 548 549 type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 550 token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 551 family=$(mptcp_lib_evts_get_info family "$evt" $e_type) 552 dport=$(mptcp_lib_evts_get_info dport "$evt" $e_type) 553 locid=$(mptcp_lib_evts_get_info loc_id "$evt" $e_type) 554 remid=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 555 if [ "$family" = "$AF_INET6" ] 556 then 557 saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" $e_type) 558 daddr=$(mptcp_lib_evts_get_info daddr6 "$evt" $e_type) 559 else 560 saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" $e_type) 561 daddr=$(mptcp_lib_evts_get_info daddr4 "$evt" $e_type) 562 fi 563 564 check_expected "type" "token" "daddr" "dport" "family" "saddr" "locid" "remid" 565} 566 567test_subflows() 568{ 569 print_title "Subflows v4 or v6 only tests" 570 571 # Capture events on the network namespace running the server 572 :>"$server_evts" 573 574 # Attempt to add a listener at 10.0.2.2:<subflow-port> 575 ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ 576 "$client4_port" & 577 local listener_pid=$! 578 579 # ADD_ADDR from client to server machine reusing the subflow port 580 ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 581 $client_addr_id 582 sleep 0.5 583 584 # CREATE_SUBFLOW from server to client machine 585 :>"$server_evts" 586 ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ 587 rport "$client4_port" token "$server4_token" 588 sleep 0.5 589 verify_subflow_events $server_evts $SUB_ESTABLISHED $server4_token $AF_INET "10.0.2.1" \ 590 "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" 591 592 # Delete the listener from the client ns, if one was created 593 mptcp_lib_kill_wait $listener_pid 594 595 local sport 596 sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 597 598 # DESTROY_SUBFLOW from server to client machine 599 :>"$server_evts" 600 ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0.2.2 rport\ 601 "$client4_port" token "$server4_token" 602 sleep 0.5 603 verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "10.0.2.1"\ 604 "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" 605 606 # RM_ADDR from client to server machine 607 ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 608 "$client4_token" 609 sleep 0.5 610 611 # Attempt to add a listener at dead:beef:2::2:<subflow-port> 612 ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ 613 "$client6_port" & 614 listener_pid=$! 615 616 # ADD_ADDR6 from client to server machine reusing the subflow port 617 :>"$server_evts" 618 ip netns exec "$ns2" ./pm_nl_ctl ann dead:beef:2::2 token "$client6_token" id\ 619 $client_addr_id 620 sleep 0.5 621 622 # CREATE_SUBFLOW6 from server to client machine 623 :>"$server_evts" 624 ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ 625 dead:beef:2::2 rport "$client6_port" token "$server6_token" 626 sleep 0.5 627 verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_INET6"\ 628 "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ 629 "$client_addr_id" "ns1" "ns2" 630 631 # Delete the listener from the client ns, if one was created 632 mptcp_lib_kill_wait $listener_pid 633 634 sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 635 636 # DESTROY_SUBFLOW6 from server to client machine 637 :>"$server_evts" 638 ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" rip\ 639 dead:beef:2::2 rport "$client6_port" token "$server6_token" 640 sleep 0.5 641 verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6"\ 642 "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ 643 "$client_addr_id" "ns1" "ns2" 644 645 # RM_ADDR from client to server machine 646 ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 647 "$client6_token" 648 sleep 0.5 649 650 # Attempt to add a listener at 10.0.2.2:<new-port> 651 ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ 652 $new4_port & 653 listener_pid=$! 654 655 # ADD_ADDR from client to server machine using a new port 656 :>"$server_evts" 657 ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 658 $client_addr_id port $new4_port 659 sleep 0.5 660 661 # CREATE_SUBFLOW from server to client machine 662 :>"$server_evts" 663 ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport\ 664 $new4_port token "$server4_token" 665 sleep 0.5 666 verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_INET"\ 667 "10.0.2.1" "10.0.2.2" "$new4_port" "23"\ 668 "$client_addr_id" "ns1" "ns2" 669 670 # Delete the listener from the client ns, if one was created 671 mptcp_lib_kill_wait $listener_pid 672 673 sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 674 675 # DESTROY_SUBFLOW from server to client machine 676 :>"$server_evts" 677 ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0.2.2 rport\ 678 $new4_port token "$server4_token" 679 sleep 0.5 680 verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "10.0.2.1"\ 681 "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" 682 683 # RM_ADDR from client to server machine 684 ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 685 "$client4_token" 686 687 # Capture events on the network namespace running the client 688 :>"$client_evts" 689 690 # Attempt to add a listener at 10.0.2.1:<subflow-port> 691 ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 692 $app4_port & 693 listener_pid=$! 694 695 # ADD_ADDR from server to client machine reusing the subflow port 696 ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 697 $server_addr_id 698 sleep 0.5 699 700 # CREATE_SUBFLOW from client to server machine 701 :>"$client_evts" 702 ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 703 $app4_port token "$client4_token" 704 sleep 0.5 705 verify_subflow_events $client_evts $SUB_ESTABLISHED $client4_token $AF_INET "10.0.2.2"\ 706 "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" 707 708 # Delete the listener from the server ns, if one was created 709 mptcp_lib_kill_wait $listener_pid 710 711 sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 712 713 # DESTROY_SUBFLOW from client to server machine 714 :>"$client_evts" 715 ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 716 $app4_port token "$client4_token" 717 sleep 0.5 718 verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "10.0.2.2"\ 719 "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" 720 721 # RM_ADDR from server to client machine 722 ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 723 "$server4_token" 724 sleep 0.5 725 726 # Attempt to add a listener at dead:beef:2::1:<subflow-port> 727 ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ 728 $app6_port & 729 listener_pid=$! 730 731 # ADD_ADDR6 from server to client machine reusing the subflow port 732 :>"$client_evts" 733 ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\ 734 $server_addr_id 735 sleep 0.5 736 737 # CREATE_SUBFLOW6 from client to server machine 738 :>"$client_evts" 739 ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ 740 dead:beef:2::1 rport $app6_port token "$client6_token" 741 sleep 0.5 742 verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ 743 "$AF_INET6" "dead:beef:2::2"\ 744 "dead:beef:2::1" "$app6_port" "23"\ 745 "$server_addr_id" "ns2" "ns1" 746 747 # Delete the listener from the server ns, if one was created 748 mptcp_lib_kill_wait $listener_pid 749 750 sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 751 752 # DESTROY_SUBFLOW6 from client to server machine 753 :>"$client_evts" 754 ip netns exec "$ns2" ./pm_nl_ctl dsf lip dead:beef:2::2 lport "$sport" rip\ 755 dead:beef:2::1 rport $app6_port token "$client6_token" 756 sleep 0.5 757 verify_subflow_events $client_evts $SUB_CLOSED $client6_token $AF_INET6 "dead:beef:2::2"\ 758 "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" 759 760 # RM_ADDR6 from server to client machine 761 ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 762 "$server6_token" 763 sleep 0.5 764 765 # Attempt to add a listener at 10.0.2.1:<new-port> 766 ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 767 $new4_port & 768 listener_pid=$! 769 770 # ADD_ADDR from server to client machine using a new port 771 :>"$client_evts" 772 ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 773 $server_addr_id port $new4_port 774 sleep 0.5 775 776 # CREATE_SUBFLOW from client to server machine 777 :>"$client_evts" 778 ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 779 $new4_port token "$client4_token" 780 sleep 0.5 781 verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_INET"\ 782 "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" 783 784 # Delete the listener from the server ns, if one was created 785 mptcp_lib_kill_wait $listener_pid 786 787 sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 788 789 # DESTROY_SUBFLOW from client to server machine 790 :>"$client_evts" 791 ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 792 $new4_port token "$client4_token" 793 sleep 0.5 794 verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "10.0.2.2"\ 795 "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" 796 797 # RM_ADDR from server to client machine 798 ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 799 "$server4_token" 800} 801 802test_subflows_v4_v6_mix() 803{ 804 print_title "Subflows v4 and v6 mix tests" 805 806 # Attempt to add a listener at 10.0.2.1:<subflow-port> 807 ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 808 $app6_port & 809 local listener_pid=$! 810 811 # ADD_ADDR4 from server to client machine reusing the subflow port on 812 # the established v6 connection 813 :>"$client_evts" 814 ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server6_token" id\ 815 $server_addr_id dev ns1eth2 816 print_test "ADD_ADDR4 id:server 10.0.2.1 (ns1) => ns2, reuse port" 817 sleep 0.5 818 verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "10.0.2.1"\ 819 "$server_addr_id" "$app6_port" 820 821 # CREATE_SUBFLOW from client to server machine 822 :>"$client_evts" 823 ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 824 $app6_port token "$client6_token" 825 sleep 0.5 826 verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ 827 "$AF_INET" "10.0.2.2" "10.0.2.1" "$app6_port" "23"\ 828 "$server_addr_id" "ns2" "ns1" 829 830 # Delete the listener from the server ns, if one was created 831 mptcp_lib_kill_wait $listener_pid 832 833 sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 834 835 # DESTROY_SUBFLOW from client to server machine 836 :>"$client_evts" 837 ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 838 $app6_port token "$client6_token" 839 sleep 0.5 840 verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client6_token" \ 841 "$AF_INET" "10.0.2.2" "10.0.2.1" "$app6_port" "23"\ 842 "$server_addr_id" "ns2" "ns1" 843 844 # RM_ADDR from server to client machine 845 ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 846 "$server6_token" 847 sleep 0.5 848} 849 850test_prio() 851{ 852 print_title "Prio tests" 853 854 local count 855 856 # Send MP_PRIO signal from client to server machine 857 ip netns exec "$ns2" ./pm_nl_ctl set 10.0.1.2 port "$client4_port" flags backup token "$client4_token" rip 10.0.1.1 rport "$app4_port" 858 sleep 0.5 859 860 # Check TX 861 print_test "MP_PRIO TX" 862 count=$(mptcp_lib_get_counter "$ns2" "MPTcpExtMPPrioTx") 863 if [ -z "$count" ]; then 864 test_skip 865 elif [ $count != 1 ]; then 866 test_fail "Count != 1: ${count}" 867 else 868 test_pass 869 fi 870 871 # Check RX 872 print_test "MP_PRIO RX" 873 count=$(mptcp_lib_get_counter "$ns1" "MPTcpExtMPPrioRx") 874 if [ -z "$count" ]; then 875 test_skip 876 elif [ $count != 1 ]; then 877 test_fail "Count != 1: ${count}" 878 else 879 test_pass 880 fi 881} 882 883verify_listener_events() 884{ 885 if mptcp_lib_verify_listener_events "${@}"; then 886 test_pass 887 else 888 test_fail 889 fi 890} 891 892test_listener() 893{ 894 print_title "Listener tests" 895 896 if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then 897 print_test "LISTENER events" 898 test_skip 899 return 900 fi 901 902 # Capture events on the network namespace running the client 903 :>$client_evts 904 905 # Attempt to add a listener at 10.0.2.2:<subflow-port> 906 ip netns exec $ns2 ./pm_nl_ctl listen 10.0.2.2\ 907 $client4_port & 908 local listener_pid=$! 909 910 sleep 0.5 911 print_test "CREATE_LISTENER 10.0.2.2 (client port)" 912 verify_listener_events $client_evts $LISTENER_CREATED $AF_INET 10.0.2.2 $client4_port 913 914 # ADD_ADDR from client to server machine reusing the subflow port 915 ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\ 916 $client_addr_id 917 sleep 0.5 918 919 # CREATE_SUBFLOW from server to client machine 920 ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ 921 rport $client4_port token $server4_token 922 sleep 0.5 923 924 # Delete the listener from the client ns, if one was created 925 mptcp_lib_kill_wait $listener_pid 926 927 sleep 0.5 928 print_test "CLOSE_LISTENER 10.0.2.2 (client port)" 929 verify_listener_events $client_evts $LISTENER_CLOSED $AF_INET 10.0.2.2 $client4_port 930} 931 932print_title "Make connections" 933make_connection 934make_connection "v6" 935print_title "Will be using address IDs ${client_addr_id} (client) and ${server_addr_id} (server)" 936 937test_announce 938test_remove 939test_subflows 940test_subflows_v4_v6_mix 941test_prio 942test_listener 943 944mptcp_lib_result_print_all_tap 945exit ${ret} 946