1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4ret=0 5sin="" 6sout="" 7cin="" 8cinsent="" 9cout="" 10ksft_skip=4 11timeout=30 12mptcp_connect="" 13capture=0 14do_all_tests=1 15 16TEST_COUNT=0 17 18# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || 19# (ip6 && (ip6[74] & 0xf0) == 0x30)'" 20CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, 21 48 0 0 0, 22 84 0 0 240, 23 21 0 3 64, 24 48 0 0 54, 25 84 0 0 240, 26 21 6 7 48, 27 48 0 0 0, 28 84 0 0 240, 29 21 0 4 96, 30 48 0 0 74, 31 84 0 0 240, 32 21 0 1 48, 33 6 0 0 65535, 34 6 0 0 0" 35 36init() 37{ 38 capout=$(mktemp) 39 40 rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) 41 42 ns1="ns1-$rndh" 43 ns2="ns2-$rndh" 44 45 for netns in "$ns1" "$ns2";do 46 ip netns add $netns || exit $ksft_skip 47 ip -net $netns link set lo up 48 ip netns exec $netns sysctl -q net.mptcp.enabled=1 49 ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 50 ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 51 done 52 53 # ns1 ns2 54 # ns1eth1 ns2eth1 55 # ns1eth2 ns2eth2 56 # ns1eth3 ns2eth3 57 # ns1eth4 ns2eth4 58 59 for i in `seq 1 4`; do 60 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" 61 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i 62 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad 63 ip -net "$ns1" link set ns1eth$i up 64 65 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i 66 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad 67 ip -net "$ns2" link set ns2eth$i up 68 69 # let $ns2 reach any $ns1 address from any interface 70 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i 71 done 72} 73 74cleanup_partial() 75{ 76 rm -f "$capout" 77 78 for netns in "$ns1" "$ns2"; do 79 ip netns del $netns 80 done 81} 82 83cleanup() 84{ 85 rm -f "$cin" "$cout" 86 rm -f "$sin" "$sout" "$cinsent" 87 cleanup_partial 88} 89 90reset() 91{ 92 cleanup_partial 93 init 94} 95 96reset_with_cookies() 97{ 98 reset 99 100 for netns in "$ns1" "$ns2";do 101 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 102 done 103} 104 105reset_with_add_addr_timeout() 106{ 107 local ip="${1:-4}" 108 local tables 109 110 tables="iptables" 111 if [ $ip -eq 6 ]; then 112 tables="ip6tables" 113 fi 114 115 reset 116 117 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 118 ip netns exec $ns2 $tables -A OUTPUT -p tcp \ 119 -m tcp --tcp-option 30 \ 120 -m bpf --bytecode \ 121 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ 122 -j DROP 123} 124 125ip -Version > /dev/null 2>&1 126if [ $? -ne 0 ];then 127 echo "SKIP: Could not run test without ip tool" 128 exit $ksft_skip 129fi 130 131iptables -V > /dev/null 2>&1 132if [ $? -ne 0 ];then 133 echo "SKIP: Could not run all tests without iptables tool" 134 exit $ksft_skip 135fi 136 137ip6tables -V > /dev/null 2>&1 138if [ $? -ne 0 ];then 139 echo "SKIP: Could not run all tests without ip6tables tool" 140 exit $ksft_skip 141fi 142 143print_file_err() 144{ 145 ls -l "$1" 1>&2 146 echo "Trailing bytes are: " 147 tail -c 27 "$1" 148} 149 150check_transfer() 151{ 152 in=$1 153 out=$2 154 what=$3 155 156 cmp "$in" "$out" > /dev/null 2>&1 157 if [ $? -ne 0 ] ;then 158 echo "[ FAIL ] $what does not match (in, out):" 159 print_file_err "$in" 160 print_file_err "$out" 161 ret=1 162 163 return 1 164 fi 165 166 return 0 167} 168 169do_ping() 170{ 171 listener_ns="$1" 172 connector_ns="$2" 173 connect_addr="$3" 174 175 ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null 176 if [ $? -ne 0 ] ; then 177 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 178 ret=1 179 fi 180} 181 182link_failure() 183{ 184 ns="$1" 185 186 l=$((RANDOM%4)) 187 l=$((l+1)) 188 189 veth="ns1eth$l" 190 ip -net "$ns" link set "$veth" down 191} 192 193# $1: IP address 194is_v6() 195{ 196 [ -z "${1##*:*}" ] 197} 198 199do_transfer() 200{ 201 listener_ns="$1" 202 connector_ns="$2" 203 cl_proto="$3" 204 srv_proto="$4" 205 connect_addr="$5" 206 test_link_fail="$6" 207 addr_nr_ns1="$7" 208 addr_nr_ns2="$8" 209 speed="$9" 210 bkup="${10}" 211 212 port=$((10000+$TEST_COUNT)) 213 TEST_COUNT=$((TEST_COUNT+1)) 214 215 :> "$cout" 216 :> "$sout" 217 :> "$capout" 218 219 if [ $capture -eq 1 ]; then 220 if [ -z $SUDO_USER ] ; then 221 capuser="" 222 else 223 capuser="-Z $SUDO_USER" 224 fi 225 226 capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") 227 228 echo "Capturing traffic for test $TEST_COUNT into $capfile" 229 ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & 230 cappid=$! 231 232 sleep 1 233 fi 234 235 if [ $speed = "fast" ]; then 236 mptcp_connect="./mptcp_connect -j" 237 elif [ $speed = "slow" ]; then 238 mptcp_connect="./mptcp_connect -r 50" 239 elif [ $speed = "least" ]; then 240 mptcp_connect="./mptcp_connect -r 10" 241 fi 242 243 local local_addr 244 if is_v6 "${connect_addr}"; then 245 local_addr="::" 246 else 247 local_addr="0.0.0.0" 248 fi 249 250 ip netns exec ${listener_ns} $mptcp_connect -t $timeout -l -p $port \ 251 -s ${srv_proto} ${local_addr} < "$sin" > "$sout" & 252 spid=$! 253 254 sleep 1 255 256 if [ "$test_link_fail" -eq 0 ];then 257 ip netns exec ${connector_ns} $mptcp_connect -t $timeout -p $port -s ${cl_proto} $connect_addr < "$cin" > "$cout" & 258 else 259 ( cat "$cin" ; sleep 2; link_failure $listener_ns ; cat "$cin" ) | tee "$cinsent" | \ 260 ip netns exec ${connector_ns} $mptcp_connect -t $timeout -p $port -s ${cl_proto} $connect_addr > "$cout" & 261 fi 262 cpid=$! 263 264 if [ $addr_nr_ns1 -gt 0 ]; then 265 let add_nr_ns1=addr_nr_ns1 266 counter=2 267 sleep 1 268 while [ $add_nr_ns1 -gt 0 ]; do 269 local addr 270 if is_v6 "${connect_addr}"; then 271 addr="dead:beef:$counter::1" 272 else 273 addr="10.0.$counter.1" 274 fi 275 ip netns exec $ns1 ./pm_nl_ctl add $addr flags signal 276 let counter+=1 277 let add_nr_ns1-=1 278 done 279 sleep 1 280 elif [ $addr_nr_ns1 -lt 0 ]; then 281 let rm_nr_ns1=-addr_nr_ns1 282 if [ $rm_nr_ns1 -lt 8 ]; then 283 counter=1 284 dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`) 285 if [ ${#dump[@]} -gt 0 ]; then 286 id=${dump[1]} 287 sleep 1 288 289 while [ $counter -le $rm_nr_ns1 ] 290 do 291 ip netns exec ${listener_ns} ./pm_nl_ctl del $id 292 sleep 1 293 let counter+=1 294 let id+=1 295 done 296 fi 297 else 298 sleep 1 299 ip netns exec ${listener_ns} ./pm_nl_ctl flush 300 fi 301 fi 302 303 if [ $addr_nr_ns2 -gt 0 ]; then 304 let add_nr_ns2=addr_nr_ns2 305 counter=3 306 sleep 1 307 while [ $add_nr_ns2 -gt 0 ]; do 308 local addr 309 if is_v6 "${connect_addr}"; then 310 addr="dead:beef:$counter::2" 311 else 312 addr="10.0.$counter.2" 313 fi 314 ip netns exec $ns2 ./pm_nl_ctl add $addr flags subflow 315 let counter+=1 316 let add_nr_ns2-=1 317 done 318 sleep 1 319 elif [ $addr_nr_ns2 -lt 0 ]; then 320 let rm_nr_ns2=-addr_nr_ns2 321 if [ $rm_nr_ns2 -lt 8 ]; then 322 counter=1 323 dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`) 324 if [ ${#dump[@]} -gt 0 ]; then 325 id=${dump[1]} 326 sleep 1 327 328 while [ $counter -le $rm_nr_ns2 ] 329 do 330 ip netns exec ${connector_ns} ./pm_nl_ctl del $id 331 sleep 1 332 let counter+=1 333 let id+=1 334 done 335 fi 336 else 337 sleep 1 338 ip netns exec ${connector_ns} ./pm_nl_ctl flush 339 fi 340 fi 341 342 if [ ! -z $bkup ]; then 343 sleep 1 344 for netns in "$ns1" "$ns2"; do 345 dump=(`ip netns exec $netns ./pm_nl_ctl dump`) 346 if [ ${#dump[@]} -gt 0 ]; then 347 addr=${dump[${#dump[@]} - 1]} 348 backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup" 349 $backup 350 fi 351 done 352 fi 353 354 wait $cpid 355 retc=$? 356 wait $spid 357 rets=$? 358 359 if [ $capture -eq 1 ]; then 360 sleep 1 361 kill $cappid 362 fi 363 364 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then 365 echo " client exit code $retc, server $rets" 1>&2 366 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 367 ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port" 368 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 369 ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port" 370 371 cat "$capout" 372 ret=1 373 return 1 374 fi 375 376 check_transfer $sin $cout "file received by client" 377 retc=$? 378 if [ "$test_link_fail" -eq 0 ];then 379 check_transfer $cin $sout "file received by server" 380 else 381 check_transfer $cinsent $sout "file received by server" 382 fi 383 rets=$? 384 385 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then 386 cat "$capout" 387 return 0 388 fi 389 390 cat "$capout" 391 return 1 392} 393 394make_file() 395{ 396 name=$1 397 who=$2 398 size=$3 399 400 dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null 401 echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" 402 403 echo "Created $name (size $size KB) containing data sent by $who" 404} 405 406run_tests() 407{ 408 listener_ns="$1" 409 connector_ns="$2" 410 connect_addr="$3" 411 test_linkfail="${4:-0}" 412 addr_nr_ns1="${5:-0}" 413 addr_nr_ns2="${6:-0}" 414 speed="${7:-fast}" 415 bkup="${8:-""}" 416 lret=0 417 oldin="" 418 419 if [ "$test_linkfail" -eq 1 ];then 420 size=$((RANDOM%1024)) 421 size=$((size+1)) 422 size=$((size*128)) 423 424 oldin=$(mktemp) 425 cp "$cin" "$oldin" 426 make_file "$cin" "client" $size 427 fi 428 429 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ 430 ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup} 431 lret=$? 432 433 if [ "$test_linkfail" -eq 1 ];then 434 cp "$oldin" "$cin" 435 rm -f "$oldin" 436 fi 437 438 if [ $lret -ne 0 ]; then 439 ret=$lret 440 return 441 fi 442} 443 444chk_join_nr() 445{ 446 local msg="$1" 447 local syn_nr=$2 448 local syn_ack_nr=$3 449 local ack_nr=$4 450 local count 451 local dump_stats 452 453 printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn" 454 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'` 455 [ -z "$count" ] && count=0 456 if [ "$count" != "$syn_nr" ]; then 457 echo "[fail] got $count JOIN[s] syn expected $syn_nr" 458 ret=1 459 dump_stats=1 460 else 461 echo -n "[ ok ]" 462 fi 463 464 echo -n " - synack" 465 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'` 466 [ -z "$count" ] && count=0 467 if [ "$count" != "$syn_ack_nr" ]; then 468 echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" 469 ret=1 470 dump_stats=1 471 else 472 echo -n "[ ok ]" 473 fi 474 475 echo -n " - ack" 476 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'` 477 [ -z "$count" ] && count=0 478 if [ "$count" != "$ack_nr" ]; then 479 echo "[fail] got $count JOIN[s] ack expected $ack_nr" 480 ret=1 481 dump_stats=1 482 else 483 echo "[ ok ]" 484 fi 485 if [ "${dump_stats}" = 1 ]; then 486 echo Server ns stats 487 ip netns exec $ns1 nstat -as | grep MPTcp 488 echo Client ns stats 489 ip netns exec $ns2 nstat -as | grep MPTcp 490 fi 491} 492 493chk_add_nr() 494{ 495 local add_nr=$1 496 local echo_nr=$2 497 local port_nr=${3:-0} 498 local syn_nr=${4:-$port_nr} 499 local syn_ack_nr=${5:-$port_nr} 500 local ack_nr=${6:-$port_nr} 501 local mis_syn_nr=${7:-0} 502 local mis_ack_nr=${8:-0} 503 local count 504 local dump_stats 505 506 printf "%-39s %s" " " "add" 507 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'` 508 [ -z "$count" ] && count=0 509 if [ "$count" != "$add_nr" ]; then 510 echo "[fail] got $count ADD_ADDR[s] expected $add_nr" 511 ret=1 512 dump_stats=1 513 else 514 echo -n "[ ok ]" 515 fi 516 517 echo -n " - echo " 518 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'` 519 [ -z "$count" ] && count=0 520 if [ "$count" != "$echo_nr" ]; then 521 echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" 522 ret=1 523 dump_stats=1 524 else 525 echo -n "[ ok ]" 526 fi 527 528 if [ $port_nr -gt 0 ]; then 529 echo -n " - pt " 530 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'` 531 [ -z "$count" ] && count=0 532 if [ "$count" != "$port_nr" ]; then 533 echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" 534 ret=1 535 dump_stats=1 536 else 537 echo "[ ok ]" 538 fi 539 540 printf "%-39s %s" " " "syn" 541 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx | 542 awk '{print $2}'` 543 [ -z "$count" ] && count=0 544 if [ "$count" != "$syn_nr" ]; then 545 echo "[fail] got $count JOIN[s] syn with a different \ 546 port-number expected $syn_nr" 547 ret=1 548 dump_stats=1 549 else 550 echo -n "[ ok ]" 551 fi 552 553 echo -n " - synack" 554 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx | 555 awk '{print $2}'` 556 [ -z "$count" ] && count=0 557 if [ "$count" != "$syn_ack_nr" ]; then 558 echo "[fail] got $count JOIN[s] synack with a different \ 559 port-number expected $syn_ack_nr" 560 ret=1 561 dump_stats=1 562 else 563 echo -n "[ ok ]" 564 fi 565 566 echo -n " - ack" 567 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx | 568 awk '{print $2}'` 569 [ -z "$count" ] && count=0 570 if [ "$count" != "$ack_nr" ]; then 571 echo "[fail] got $count JOIN[s] ack with a different \ 572 port-number expected $ack_nr" 573 ret=1 574 dump_stats=1 575 else 576 echo "[ ok ]" 577 fi 578 579 printf "%-39s %s" " " "syn" 580 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx | 581 awk '{print $2}'` 582 [ -z "$count" ] && count=0 583 if [ "$count" != "$mis_syn_nr" ]; then 584 echo "[fail] got $count JOIN[s] syn with a mismatched \ 585 port-number expected $mis_syn_nr" 586 ret=1 587 dump_stats=1 588 else 589 echo -n "[ ok ]" 590 fi 591 592 echo -n " - ack " 593 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx | 594 awk '{print $2}'` 595 [ -z "$count" ] && count=0 596 if [ "$count" != "$mis_ack_nr" ]; then 597 echo "[fail] got $count JOIN[s] ack with a mismatched \ 598 port-number expected $mis_ack_nr" 599 ret=1 600 dump_stats=1 601 else 602 echo "[ ok ]" 603 fi 604 else 605 echo "" 606 fi 607 608 if [ "${dump_stats}" = 1 ]; then 609 echo Server ns stats 610 ip netns exec $ns1 nstat -as | grep MPTcp 611 echo Client ns stats 612 ip netns exec $ns2 nstat -as | grep MPTcp 613 fi 614} 615 616chk_rm_nr() 617{ 618 local rm_addr_nr=$1 619 local rm_subflow_nr=$2 620 local invert=${3:-""} 621 local count 622 local dump_stats 623 local addr_ns 624 local subflow_ns 625 626 if [ -z $invert ]; then 627 addr_ns=$ns1 628 subflow_ns=$ns2 629 elif [ $invert = "invert" ]; then 630 addr_ns=$ns2 631 subflow_ns=$ns1 632 fi 633 634 printf "%-39s %s" " " "rm " 635 count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'` 636 [ -z "$count" ] && count=0 637 if [ "$count" != "$rm_addr_nr" ]; then 638 echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" 639 ret=1 640 dump_stats=1 641 else 642 echo -n "[ ok ]" 643 fi 644 645 echo -n " - sf " 646 count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'` 647 [ -z "$count" ] && count=0 648 if [ "$count" != "$rm_subflow_nr" ]; then 649 echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" 650 ret=1 651 dump_stats=1 652 else 653 echo "[ ok ]" 654 fi 655 656 if [ "${dump_stats}" = 1 ]; then 657 echo Server ns stats 658 ip netns exec $ns1 nstat -as | grep MPTcp 659 echo Client ns stats 660 ip netns exec $ns2 nstat -as | grep MPTcp 661 fi 662} 663 664chk_prio_nr() 665{ 666 local mp_prio_nr_tx=$1 667 local mp_prio_nr_rx=$2 668 local count 669 local dump_stats 670 671 printf "%-39s %s" " " "ptx" 672 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'` 673 [ -z "$count" ] && count=0 674 if [ "$count" != "$mp_prio_nr_tx" ]; then 675 echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" 676 ret=1 677 dump_stats=1 678 else 679 echo -n "[ ok ]" 680 fi 681 682 echo -n " - prx " 683 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'` 684 [ -z "$count" ] && count=0 685 if [ "$count" != "$mp_prio_nr_rx" ]; then 686 echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" 687 ret=1 688 dump_stats=1 689 else 690 echo "[ ok ]" 691 fi 692 693 if [ "${dump_stats}" = 1 ]; then 694 echo Server ns stats 695 ip netns exec $ns1 nstat -as | grep MPTcp 696 echo Client ns stats 697 ip netns exec $ns2 nstat -as | grep MPTcp 698 fi 699} 700 701subflows_tests() 702{ 703 reset 704 run_tests $ns1 $ns2 10.0.1.1 705 chk_join_nr "no JOIN" "0" "0" "0" 706 707 # subflow limited by client 708 reset 709 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 710 run_tests $ns1 $ns2 10.0.1.1 711 chk_join_nr "single subflow, limited by client" 0 0 0 712 713 # subflow limited by server 714 reset 715 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 716 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 717 run_tests $ns1 $ns2 10.0.1.1 718 chk_join_nr "single subflow, limited by server" 1 1 0 719 720 # subflow 721 reset 722 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 723 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 724 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 725 run_tests $ns1 $ns2 10.0.1.1 726 chk_join_nr "single subflow" 1 1 1 727 728 # multiple subflows 729 reset 730 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 731 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 732 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 733 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 734 run_tests $ns1 $ns2 10.0.1.1 735 chk_join_nr "multiple subflows" 2 2 2 736 737 # multiple subflows limited by serverf 738 reset 739 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 740 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 741 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 742 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 743 run_tests $ns1 $ns2 10.0.1.1 744 chk_join_nr "multiple subflows, limited by server" 2 2 1 745} 746 747signal_address_tests() 748{ 749 # add_address, unused 750 reset 751 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 752 run_tests $ns1 $ns2 10.0.1.1 753 chk_join_nr "unused signal address" 0 0 0 754 chk_add_nr 1 1 755 756 # accept and use add_addr 757 reset 758 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 759 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 760 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 761 run_tests $ns1 $ns2 10.0.1.1 762 chk_join_nr "signal address" 1 1 1 763 chk_add_nr 1 1 764 765 # accept and use add_addr with an additional subflow 766 # note: signal address in server ns and local addresses in client ns must 767 # belong to different subnets or one of the listed local address could be 768 # used for 'add_addr' subflow 769 reset 770 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 771 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 772 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 773 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 774 run_tests $ns1 $ns2 10.0.1.1 775 chk_join_nr "subflow and signal" 2 2 2 776 chk_add_nr 1 1 777 778 # accept and use add_addr with additional subflows 779 reset 780 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 781 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 782 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 783 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 784 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 785 run_tests $ns1 $ns2 10.0.1.1 786 chk_join_nr "multiple subflows and signal" 3 3 3 787 chk_add_nr 1 1 788 789 # signal addresses 790 reset 791 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 792 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 793 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 794 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 795 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 796 run_tests $ns1 $ns2 10.0.1.1 797 chk_join_nr "signal addresses" 3 3 3 798 chk_add_nr 3 3 799 800 # signal invalid addresses 801 reset 802 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 803 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 804 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 805 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 806 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 807 run_tests $ns1 $ns2 10.0.1.1 808 chk_join_nr "signal invalid addresses" 1 1 1 809 chk_add_nr 3 3 810} 811 812link_failure_tests() 813{ 814 # accept and use add_addr with additional subflows and link loss 815 reset 816 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 817 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 818 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 819 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 820 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 821 run_tests $ns1 $ns2 10.0.1.1 1 822 chk_join_nr "multiple flows, signal, link failure" 3 3 3 823 chk_add_nr 1 1 824} 825 826add_addr_timeout_tests() 827{ 828 # add_addr timeout 829 reset_with_add_addr_timeout 830 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 831 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 832 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 833 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 834 chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1 835 chk_add_nr 4 0 836 837 # add_addr timeout IPv6 838 reset_with_add_addr_timeout 6 839 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 840 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 841 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 842 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 843 chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1 844 chk_add_nr 4 0 845 846 # signal addresses timeout 847 reset_with_add_addr_timeout 848 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 849 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 850 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 851 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 852 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least 853 chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2 854 chk_add_nr 8 0 855 856 # signal invalid addresses timeout 857 reset_with_add_addr_timeout 858 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 859 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 860 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 861 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 862 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least 863 chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1 864 chk_add_nr 8 0 865} 866 867remove_tests() 868{ 869 # single subflow, remove 870 reset 871 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 872 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 873 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 874 run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow 875 chk_join_nr "remove single subflow" 1 1 1 876 chk_rm_nr 1 1 877 878 # multiple subflows, remove 879 reset 880 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 881 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 882 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 883 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 884 run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow 885 chk_join_nr "remove multiple subflows" 2 2 2 886 chk_rm_nr 2 2 887 888 # single address, remove 889 reset 890 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 891 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 892 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 893 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 894 chk_join_nr "remove single address" 1 1 1 895 chk_add_nr 1 1 896 chk_rm_nr 1 1 invert 897 898 # subflow and signal, remove 899 reset 900 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 901 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 902 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 903 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 904 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 905 chk_join_nr "remove subflow and signal" 2 2 2 906 chk_add_nr 1 1 907 chk_rm_nr 1 1 908 909 # subflows and signal, remove 910 reset 911 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 912 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 913 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 914 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 915 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 916 run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow 917 chk_join_nr "remove subflows and signal" 3 3 3 918 chk_add_nr 1 1 919 chk_rm_nr 2 2 920 921 # addresses remove 922 reset 923 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 924 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250 925 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 926 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 927 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 928 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow 929 chk_join_nr "remove addresses" 3 3 3 930 chk_add_nr 3 3 931 chk_rm_nr 3 3 invert 932 933 # invalid addresses remove 934 reset 935 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 936 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 937 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 938 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 939 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 940 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow 941 chk_join_nr "remove invalid addresses" 1 1 1 942 chk_add_nr 3 3 943 chk_rm_nr 3 1 invert 944 945 # subflows and signal, flush 946 reset 947 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 948 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 949 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 950 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 951 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 952 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 953 chk_join_nr "flush subflows and signal" 3 3 3 954 chk_add_nr 1 1 955 chk_rm_nr 2 2 956 957 # subflows flush 958 reset 959 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 960 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 961 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow id 150 962 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 963 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 964 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 965 chk_join_nr "flush subflows" 3 3 3 966 chk_rm_nr 3 3 967 968 # addresses flush 969 reset 970 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 971 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250 972 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 973 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 974 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 975 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 976 chk_join_nr "flush addresses" 3 3 3 977 chk_add_nr 3 3 978 chk_rm_nr 3 3 invert 979 980 # invalid addresses flush 981 reset 982 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 983 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 984 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 985 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 986 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 987 run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow 988 chk_join_nr "flush invalid addresses" 1 1 1 989 chk_add_nr 3 3 990 chk_rm_nr 3 1 invert 991} 992 993add_tests() 994{ 995 # add single subflow 996 reset 997 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 998 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 999 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow 1000 chk_join_nr "add single subflow" 1 1 1 1001 1002 # add signal address 1003 reset 1004 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1005 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1006 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow 1007 chk_join_nr "add signal address" 1 1 1 1008 chk_add_nr 1 1 1009 1010 # add multiple subflows 1011 reset 1012 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1013 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1014 run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow 1015 chk_join_nr "add multiple subflows" 2 2 2 1016 1017 # add multiple subflows IPv6 1018 reset 1019 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1020 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1021 run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow 1022 chk_join_nr "add multiple subflows IPv6" 2 2 2 1023 1024 # add multiple addresses IPv6 1025 reset 1026 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1027 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1028 run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow 1029 chk_join_nr "add multiple addresses IPv6" 2 2 2 1030 chk_add_nr 2 2 1031} 1032 1033ipv6_tests() 1034{ 1035 # subflow IPv6 1036 reset 1037 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1038 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1039 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow 1040 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1041 chk_join_nr "single subflow IPv6" 1 1 1 1042 1043 # add_address, unused IPv6 1044 reset 1045 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1046 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1047 chk_join_nr "unused signal address IPv6" 0 0 0 1048 chk_add_nr 1 1 1049 1050 # signal address IPv6 1051 reset 1052 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1053 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1054 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1055 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1056 chk_join_nr "single address IPv6" 1 1 1 1057 chk_add_nr 1 1 1058 1059 # single address IPv6, remove 1060 reset 1061 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1062 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1063 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1064 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow 1065 chk_join_nr "remove single address IPv6" 1 1 1 1066 chk_add_nr 1 1 1067 chk_rm_nr 1 1 invert 1068 1069 # subflow and signal IPv6, remove 1070 reset 1071 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1072 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1073 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1074 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow 1075 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow 1076 chk_join_nr "remove subflow and signal IPv6" 2 2 2 1077 chk_add_nr 1 1 1078 chk_rm_nr 1 1 1079} 1080 1081v4mapped_tests() 1082{ 1083 # subflow IPv4-mapped to IPv4-mapped 1084 reset 1085 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1086 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1087 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow 1088 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1089 chk_join_nr "single subflow IPv4-mapped" 1 1 1 1090 1091 # signal address IPv4-mapped with IPv4-mapped sk 1092 reset 1093 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1094 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1095 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal 1096 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1097 chk_join_nr "signal address IPv4-mapped" 1 1 1 1098 chk_add_nr 1 1 1099 1100 # subflow v4-map-v6 1101 reset 1102 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1103 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1104 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1105 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1106 chk_join_nr "single subflow v4-map-v6" 1 1 1 1107 1108 # signal address v4-map-v6 1109 reset 1110 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1111 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1112 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1113 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1114 chk_join_nr "signal address v4-map-v6" 1 1 1 1115 chk_add_nr 1 1 1116 1117 # subflow v6-map-v4 1118 reset 1119 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1120 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1121 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow 1122 run_tests $ns1 $ns2 10.0.1.1 1123 chk_join_nr "single subflow v6-map-v4" 1 1 1 1124 1125 # signal address v6-map-v4 1126 reset 1127 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1128 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1129 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal 1130 run_tests $ns1 $ns2 10.0.1.1 1131 chk_join_nr "signal address v6-map-v4" 1 1 1 1132 chk_add_nr 1 1 1133 1134 # no subflow IPv6 to v4 address 1135 reset 1136 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1137 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1138 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::2 flags subflow 1139 run_tests $ns1 $ns2 10.0.1.1 1140 chk_join_nr "no JOIN with diff families v4-v6" 0 0 0 1141 1142 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end 1143 reset 1144 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1145 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1146 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::10.0.3.2 flags subflow 1147 run_tests $ns1 $ns2 10.0.1.1 1148 chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0 1149 1150 # no subflow IPv4 to v6 address, no need to slow down too then 1151 reset 1152 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1153 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1154 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1155 run_tests $ns1 $ns2 dead:beef:1::1 1156 chk_join_nr "no JOIN with diff families v6-v4" 0 0 0 1157} 1158 1159backup_tests() 1160{ 1161 # single subflow, backup 1162 reset 1163 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1164 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1165 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,backup 1166 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup 1167 chk_join_nr "single subflow, backup" 1 1 1 1168 chk_prio_nr 0 1 1169 1170 # single address, backup 1171 reset 1172 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1173 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1174 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1175 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 1176 chk_join_nr "single address, backup" 1 1 1 1177 chk_add_nr 1 1 1178 chk_prio_nr 1 0 1179} 1180 1181add_addr_ports_tests() 1182{ 1183 # signal address with port 1184 reset 1185 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1186 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1187 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1188 run_tests $ns1 $ns2 10.0.1.1 1189 chk_join_nr "signal address with port" 1 1 1 1190 chk_add_nr 1 1 1 1191 1192 # subflow and signal with port 1193 reset 1194 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1195 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1196 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1197 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1198 run_tests $ns1 $ns2 10.0.1.1 1199 chk_join_nr "subflow and signal with port" 2 2 2 1200 chk_add_nr 1 1 1 1201 1202 # single address with port, remove 1203 reset 1204 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1205 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1206 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1207 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 1208 chk_join_nr "remove single address with port" 1 1 1 1209 chk_add_nr 1 1 1 1210 chk_rm_nr 1 1 invert 1211 1212 # subflow and signal with port, remove 1213 reset 1214 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1215 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1216 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1217 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1218 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 1219 chk_join_nr "remove subflow and signal with port" 2 2 2 1220 chk_add_nr 1 1 1 1221 chk_rm_nr 1 1 1222 1223 # subflows and signal with port, flush 1224 reset 1225 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1226 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1227 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1228 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1229 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1230 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 1231 chk_join_nr "flush subflows and signal with port" 3 3 3 1232 chk_add_nr 1 1 1233 chk_rm_nr 2 2 1234 1235 # multiple addresses with port 1236 reset 1237 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 1238 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1239 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10100 1240 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1241 run_tests $ns1 $ns2 10.0.1.1 1242 chk_join_nr "multiple addresses with port" 2 2 2 1243 chk_add_nr 2 2 2 1244 1245 # multiple addresses with ports 1246 reset 1247 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 1248 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1249 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10101 1250 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1251 run_tests $ns1 $ns2 10.0.1.1 1252 chk_join_nr "multiple addresses with ports" 2 2 2 1253 chk_add_nr 2 2 2 1254} 1255 1256syncookies_tests() 1257{ 1258 # single subflow, syncookies 1259 reset_with_cookies 1260 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1261 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1262 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1263 run_tests $ns1 $ns2 10.0.1.1 1264 chk_join_nr "single subflow with syn cookies" 1 1 1 1265 1266 # multiple subflows with syn cookies 1267 reset_with_cookies 1268 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1269 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1270 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1271 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 1272 run_tests $ns1 $ns2 10.0.1.1 1273 chk_join_nr "multiple subflows with syn cookies" 2 2 2 1274 1275 # multiple subflows limited by server 1276 reset_with_cookies 1277 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1278 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1279 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1280 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 1281 run_tests $ns1 $ns2 10.0.1.1 1282 chk_join_nr "subflows limited by server w cookies" 2 2 1 1283 1284 # test signal address with cookies 1285 reset_with_cookies 1286 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1287 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1288 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1289 run_tests $ns1 $ns2 10.0.1.1 1290 chk_join_nr "signal address with syn cookies" 1 1 1 1291 chk_add_nr 1 1 1292 1293 # test cookie with subflow and signal 1294 reset_with_cookies 1295 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1296 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1297 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1298 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1299 run_tests $ns1 $ns2 10.0.1.1 1300 chk_join_nr "subflow and signal w cookies" 2 2 2 1301 chk_add_nr 1 1 1302 1303 # accept and use add_addr with additional subflows 1304 reset_with_cookies 1305 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1306 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1307 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1308 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1309 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1310 run_tests $ns1 $ns2 10.0.1.1 1311 chk_join_nr "subflows and signal w. cookies" 3 3 3 1312 chk_add_nr 1 1 1313} 1314 1315all_tests() 1316{ 1317 subflows_tests 1318 signal_address_tests 1319 link_failure_tests 1320 add_addr_timeout_tests 1321 remove_tests 1322 add_tests 1323 ipv6_tests 1324 v4mapped_tests 1325 backup_tests 1326 add_addr_ports_tests 1327 syncookies_tests 1328} 1329 1330usage() 1331{ 1332 echo "mptcp_join usage:" 1333 echo " -f subflows_tests" 1334 echo " -s signal_address_tests" 1335 echo " -l link_failure_tests" 1336 echo " -t add_addr_timeout_tests" 1337 echo " -r remove_tests" 1338 echo " -a add_tests" 1339 echo " -6 ipv6_tests" 1340 echo " -4 v4mapped_tests" 1341 echo " -b backup_tests" 1342 echo " -p add_addr_ports_tests" 1343 echo " -k syncookies_tests" 1344 echo " -c capture pcap files" 1345 echo " -h help" 1346} 1347 1348sin=$(mktemp) 1349sout=$(mktemp) 1350cin=$(mktemp) 1351cinsent=$(mktemp) 1352cout=$(mktemp) 1353init 1354make_file "$cin" "client" 1 1355make_file "$sin" "server" 1 1356trap cleanup EXIT 1357 1358for arg in "$@"; do 1359 # check for "capture" arg before launching tests 1360 if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then 1361 capture=1 1362 fi 1363 1364 # exception for the capture option, the rest means: a part of the tests 1365 if [ "${arg}" != "-c" ]; then 1366 do_all_tests=0 1367 fi 1368done 1369 1370if [ $do_all_tests -eq 1 ]; then 1371 all_tests 1372 exit $ret 1373fi 1374 1375while getopts 'fsltra64bpkch' opt; do 1376 case $opt in 1377 f) 1378 subflows_tests 1379 ;; 1380 s) 1381 signal_address_tests 1382 ;; 1383 l) 1384 link_failure_tests 1385 ;; 1386 t) 1387 add_addr_timeout_tests 1388 ;; 1389 r) 1390 remove_tests 1391 ;; 1392 a) 1393 add_tests 1394 ;; 1395 6) 1396 ipv6_tests 1397 ;; 1398 4) 1399 v4mapped_tests 1400 ;; 1401 b) 1402 backup_tests 1403 ;; 1404 p) 1405 add_addr_ports_tests 1406 ;; 1407 k) 1408 syncookies_tests 1409 ;; 1410 c) 1411 ;; 1412 h | *) 1413 usage 1414 ;; 1415 esac 1416done 1417 1418exit $ret 1419