162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Double quotes to prevent globbing and word splitting is recommended in new 562306a36Sopenharmony_ci# code but we accept it. 662306a36Sopenharmony_ci#shellcheck disable=SC2086 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci# Some variables are used below but indirectly, see check_expected_one() 962306a36Sopenharmony_ci#shellcheck disable=SC2034 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cimptcp_lib_check_mptcp 1462306a36Sopenharmony_cimptcp_lib_check_kallsyms 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciif ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 1762306a36Sopenharmony_ci echo "userspace pm tests are not supported by the kernel: SKIP" 1862306a36Sopenharmony_ci exit ${KSFT_SKIP} 1962306a36Sopenharmony_cifi 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciif ! ip -Version &> /dev/null; then 2262306a36Sopenharmony_ci echo "SKIP: Cannot not run test without ip tool" 2362306a36Sopenharmony_ci exit ${KSFT_SKIP} 2462306a36Sopenharmony_cifi 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED 2762306a36Sopenharmony_ciREMOVED=7 # MPTCP_EVENT_REMOVED 2862306a36Sopenharmony_ciSUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED 2962306a36Sopenharmony_ciSUB_CLOSED=11 # MPTCP_EVENT_SUB_CLOSED 3062306a36Sopenharmony_ciLISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED 3162306a36Sopenharmony_ciLISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciAF_INET=2 3462306a36Sopenharmony_ciAF_INET6=10 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cifile="" 3762306a36Sopenharmony_ciserver_evts="" 3862306a36Sopenharmony_ciclient_evts="" 3962306a36Sopenharmony_ciserver_evts_pid=0 4062306a36Sopenharmony_ciclient_evts_pid=0 4162306a36Sopenharmony_ciclient4_pid=0 4262306a36Sopenharmony_ciserver4_pid=0 4362306a36Sopenharmony_ciclient6_pid=0 4462306a36Sopenharmony_ciserver6_pid=0 4562306a36Sopenharmony_ciclient4_token="" 4662306a36Sopenharmony_ciserver4_token="" 4762306a36Sopenharmony_ciclient6_token="" 4862306a36Sopenharmony_ciserver6_token="" 4962306a36Sopenharmony_ciclient4_port=0; 5062306a36Sopenharmony_ciclient6_port=0; 5162306a36Sopenharmony_ciapp4_port=50002 5262306a36Sopenharmony_cinew4_port=50003 5362306a36Sopenharmony_ciapp6_port=50004 5462306a36Sopenharmony_ciclient_addr_id=${RANDOM:0:2} 5562306a36Sopenharmony_ciserver_addr_id=${RANDOM:0:2} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cisec=$(date +%s) 5862306a36Sopenharmony_cirndh=$(printf %x "$sec")-$(mktemp -u XXXXXX) 5962306a36Sopenharmony_cins1="ns1-$rndh" 6062306a36Sopenharmony_cins2="ns2-$rndh" 6162306a36Sopenharmony_ciret=0 6262306a36Sopenharmony_citest_name="" 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci_printf() { 6562306a36Sopenharmony_ci stdbuf -o0 -e0 printf "${@}" 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciprint_title() 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci _printf "INFO: %s\n" "${1}" 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci# $1: test name 7462306a36Sopenharmony_ciprint_test() 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci test_name="${1}" 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci _printf "%-68s" "${test_name}" 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciprint_results() 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci _printf "[%s]\n" "${1}" 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_citest_pass() 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci print_results " OK " 8962306a36Sopenharmony_ci mptcp_lib_result_pass "${test_name}" 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_citest_skip() 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci print_results "SKIP" 9562306a36Sopenharmony_ci mptcp_lib_result_skip "${test_name}" 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci# $1: msg 9962306a36Sopenharmony_citest_fail() 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci print_results "FAIL" 10262306a36Sopenharmony_ci ret=1 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci if [ -n "${1}" ]; then 10562306a36Sopenharmony_ci _printf "\t%s\n" "${1}" 10662306a36Sopenharmony_ci fi 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci mptcp_lib_result_fail "${test_name}" 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci# This function is used in the cleanup trap 11262306a36Sopenharmony_ci#shellcheck disable=SC2317 11362306a36Sopenharmony_cicleanup() 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci print_title "Cleanup" 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci # Terminate the MPTCP connection and related processes 11862306a36Sopenharmony_ci local pid 11962306a36Sopenharmony_ci for pid in $client4_pid $server4_pid $client6_pid $server6_pid\ 12062306a36Sopenharmony_ci $server_evts_pid $client_evts_pid 12162306a36Sopenharmony_ci do 12262306a36Sopenharmony_ci mptcp_lib_kill_wait $pid 12362306a36Sopenharmony_ci done 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci local netns 12662306a36Sopenharmony_ci for netns in "$ns1" "$ns2" ;do 12762306a36Sopenharmony_ci ip netns del "$netns" 12862306a36Sopenharmony_ci done 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci rm -rf $file $client_evts $server_evts 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci _printf "Done\n" 13362306a36Sopenharmony_ci} 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_citrap cleanup EXIT 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci# Create and configure network namespaces for testing 13862306a36Sopenharmony_cifor i in "$ns1" "$ns2" ;do 13962306a36Sopenharmony_ci ip netns add "$i" || exit 1 14062306a36Sopenharmony_ci ip -net "$i" link set lo up 14162306a36Sopenharmony_ci ip netns exec "$i" sysctl -q net.mptcp.enabled=1 14262306a36Sopenharmony_ci ip netns exec "$i" sysctl -q net.mptcp.pm_type=1 14362306a36Sopenharmony_cidone 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci# "$ns1" ns2 14662306a36Sopenharmony_ci# ns1eth2 ns2eth1 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci# Add IPv4/v6 addresses to the namespaces 15162306a36Sopenharmony_ciip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 15262306a36Sopenharmony_ciip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 15362306a36Sopenharmony_ciip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad 15462306a36Sopenharmony_ciip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad 15562306a36Sopenharmony_ciip -net "$ns1" link set ns1eth2 up 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ciip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 15862306a36Sopenharmony_ciip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 15962306a36Sopenharmony_ciip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad 16062306a36Sopenharmony_ciip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad 16162306a36Sopenharmony_ciip -net "$ns2" link set ns2eth1 up 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ciprint_title "Init" 16462306a36Sopenharmony_ciprint_test "Created network namespaces ns1, ns2" 16562306a36Sopenharmony_citest_pass 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cimake_file() 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci # Store a chunk of data in a file to transmit over an MPTCP connection 17062306a36Sopenharmony_ci local name=$1 17162306a36Sopenharmony_ci local ksize=1 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci dd if=/dev/urandom of="$name" bs=2 count=$ksize 2> /dev/null 17462306a36Sopenharmony_ci echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cimake_connection() 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci if [ -z "$file" ]; then 18062306a36Sopenharmony_ci file=$(mktemp) 18162306a36Sopenharmony_ci fi 18262306a36Sopenharmony_ci make_file "$file" "client" 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci local is_v6=$1 18562306a36Sopenharmony_ci local app_port=$app4_port 18662306a36Sopenharmony_ci local connect_addr="10.0.1.1" 18762306a36Sopenharmony_ci local listen_addr="0.0.0.0" 18862306a36Sopenharmony_ci if [ "$is_v6" = "v6" ] 18962306a36Sopenharmony_ci then 19062306a36Sopenharmony_ci connect_addr="dead:beef:1::1" 19162306a36Sopenharmony_ci listen_addr="::" 19262306a36Sopenharmony_ci app_port=$app6_port 19362306a36Sopenharmony_ci else 19462306a36Sopenharmony_ci is_v6="v4" 19562306a36Sopenharmony_ci fi 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci # Capture netlink events over the two network namespaces running 19862306a36Sopenharmony_ci # the MPTCP client and server 19962306a36Sopenharmony_ci if [ -z "$client_evts" ]; then 20062306a36Sopenharmony_ci client_evts=$(mktemp) 20162306a36Sopenharmony_ci fi 20262306a36Sopenharmony_ci :>"$client_evts" 20362306a36Sopenharmony_ci if [ $client_evts_pid -ne 0 ]; then 20462306a36Sopenharmony_ci mptcp_lib_kill_wait $client_evts_pid 20562306a36Sopenharmony_ci fi 20662306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl events >> "$client_evts" 2>&1 & 20762306a36Sopenharmony_ci client_evts_pid=$! 20862306a36Sopenharmony_ci if [ -z "$server_evts" ]; then 20962306a36Sopenharmony_ci server_evts=$(mktemp) 21062306a36Sopenharmony_ci fi 21162306a36Sopenharmony_ci :>"$server_evts" 21262306a36Sopenharmony_ci if [ $server_evts_pid -ne 0 ]; then 21362306a36Sopenharmony_ci mptcp_lib_kill_wait $server_evts_pid 21462306a36Sopenharmony_ci fi 21562306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl events >> "$server_evts" 2>&1 & 21662306a36Sopenharmony_ci server_evts_pid=$! 21762306a36Sopenharmony_ci sleep 0.5 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci # Run the server 22062306a36Sopenharmony_ci ip netns exec "$ns1" \ 22162306a36Sopenharmony_ci ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr > /dev/null 2>&1 & 22262306a36Sopenharmony_ci local server_pid=$! 22362306a36Sopenharmony_ci sleep 0.5 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci # Run the client, transfer $file and stay connected to the server 22662306a36Sopenharmony_ci # to conduct tests 22762306a36Sopenharmony_ci ip netns exec "$ns2" \ 22862306a36Sopenharmony_ci ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr\ 22962306a36Sopenharmony_ci 2>&1 > /dev/null < "$file" & 23062306a36Sopenharmony_ci local client_pid=$! 23162306a36Sopenharmony_ci sleep 1 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci # Capture client/server attributes from MPTCP connection netlink events 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci local client_token 23662306a36Sopenharmony_ci local client_port 23762306a36Sopenharmony_ci local client_serverside 23862306a36Sopenharmony_ci local server_token 23962306a36Sopenharmony_ci local server_serverside 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci client_token=$(mptcp_lib_evts_get_info token "$client_evts") 24262306a36Sopenharmony_ci client_port=$(mptcp_lib_evts_get_info sport "$client_evts") 24362306a36Sopenharmony_ci client_serverside=$(mptcp_lib_evts_get_info server_side "$client_evts") 24462306a36Sopenharmony_ci server_token=$(mptcp_lib_evts_get_info token "$server_evts") 24562306a36Sopenharmony_ci server_serverside=$(mptcp_lib_evts_get_info server_side "$server_evts") 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci print_test "Established IP${is_v6} MPTCP Connection ns2 => ns1" 24862306a36Sopenharmony_ci if [ "$client_token" != "" ] && [ "$server_token" != "" ] && [ "$client_serverside" = 0 ] && 24962306a36Sopenharmony_ci [ "$server_serverside" = 1 ] 25062306a36Sopenharmony_ci then 25162306a36Sopenharmony_ci test_pass 25262306a36Sopenharmony_ci else 25362306a36Sopenharmony_ci test_fail "Expected tokens (c:${client_token} - s:${server_token}) and server (c:${client_serverside} - s:${server_serverside})" 25462306a36Sopenharmony_ci mptcp_lib_result_print_all_tap 25562306a36Sopenharmony_ci exit 1 25662306a36Sopenharmony_ci fi 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci if [ "$is_v6" = "v6" ] 25962306a36Sopenharmony_ci then 26062306a36Sopenharmony_ci client6_token=$client_token 26162306a36Sopenharmony_ci server6_token=$server_token 26262306a36Sopenharmony_ci client6_port=$client_port 26362306a36Sopenharmony_ci client6_pid=$client_pid 26462306a36Sopenharmony_ci server6_pid=$server_pid 26562306a36Sopenharmony_ci else 26662306a36Sopenharmony_ci client4_token=$client_token 26762306a36Sopenharmony_ci server4_token=$server_token 26862306a36Sopenharmony_ci client4_port=$client_port 26962306a36Sopenharmony_ci client4_pid=$client_pid 27062306a36Sopenharmony_ci server4_pid=$server_pid 27162306a36Sopenharmony_ci fi 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci# $1: var name ; $2: prev ret 27562306a36Sopenharmony_cicheck_expected_one() 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci local var="${1}" 27862306a36Sopenharmony_ci local exp="e_${var}" 27962306a36Sopenharmony_ci local prev_ret="${2}" 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci if [ "${!var}" = "${!exp}" ] 28262306a36Sopenharmony_ci then 28362306a36Sopenharmony_ci return 0 28462306a36Sopenharmony_ci fi 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci if [ "${prev_ret}" = "0" ] 28762306a36Sopenharmony_ci then 28862306a36Sopenharmony_ci test_fail 28962306a36Sopenharmony_ci fi 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci _printf "\tExpected value for '%s': '%s', got '%s'.\n" \ 29262306a36Sopenharmony_ci "${var}" "${!exp}" "${!var}" 29362306a36Sopenharmony_ci return 1 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci# $@: all var names to check 29762306a36Sopenharmony_cicheck_expected() 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci local rc=0 30062306a36Sopenharmony_ci local var 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci for var in "${@}" 30362306a36Sopenharmony_ci do 30462306a36Sopenharmony_ci check_expected_one "${var}" "${rc}" || rc=1 30562306a36Sopenharmony_ci done 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci if [ ${rc} -eq 0 ] 30862306a36Sopenharmony_ci then 30962306a36Sopenharmony_ci test_pass 31062306a36Sopenharmony_ci return 0 31162306a36Sopenharmony_ci fi 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci return 1 31462306a36Sopenharmony_ci} 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_civerify_announce_event() 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci local evt=$1 31962306a36Sopenharmony_ci local e_type=$2 32062306a36Sopenharmony_ci local e_token=$3 32162306a36Sopenharmony_ci local e_addr=$4 32262306a36Sopenharmony_ci local e_id=$5 32362306a36Sopenharmony_ci local e_dport=$6 32462306a36Sopenharmony_ci local e_af=$7 32562306a36Sopenharmony_ci local type 32662306a36Sopenharmony_ci local token 32762306a36Sopenharmony_ci local addr 32862306a36Sopenharmony_ci local dport 32962306a36Sopenharmony_ci local id 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 33262306a36Sopenharmony_ci token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 33362306a36Sopenharmony_ci if [ "$e_af" = "v6" ] 33462306a36Sopenharmony_ci then 33562306a36Sopenharmony_ci addr=$(mptcp_lib_evts_get_info daddr6 "$evt" $e_type) 33662306a36Sopenharmony_ci else 33762306a36Sopenharmony_ci addr=$(mptcp_lib_evts_get_info daddr4 "$evt" $e_type) 33862306a36Sopenharmony_ci fi 33962306a36Sopenharmony_ci dport=$(mptcp_lib_evts_get_info dport "$evt" $e_type) 34062306a36Sopenharmony_ci id=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci check_expected "type" "token" "addr" "dport" "id" 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_citest_announce() 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci print_title "Announce tests" 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci # Capture events on the network namespace running the server 35062306a36Sopenharmony_ci :>"$server_evts" 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci # ADD_ADDR using an invalid token should result in no action 35362306a36Sopenharmony_ci local invalid_token=$(( client4_token - 1)) 35462306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id\ 35562306a36Sopenharmony_ci $client_addr_id dev ns2eth1 > /dev/null 2>&1 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci local type 35862306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$server_evts") 35962306a36Sopenharmony_ci print_test "ADD_ADDR 10.0.2.2 (ns2) => ns1, invalid token" 36062306a36Sopenharmony_ci if [ "$type" = "" ] 36162306a36Sopenharmony_ci then 36262306a36Sopenharmony_ci test_pass 36362306a36Sopenharmony_ci else 36462306a36Sopenharmony_ci test_fail "type defined: ${type}" 36562306a36Sopenharmony_ci fi 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci # ADD_ADDR from the client to server machine reusing the subflow port 36862306a36Sopenharmony_ci :>"$server_evts" 36962306a36Sopenharmony_ci ip netns exec "$ns2"\ 37062306a36Sopenharmony_ci ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\ 37162306a36Sopenharmony_ci ns2eth1 37262306a36Sopenharmony_ci print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, reuse port" 37362306a36Sopenharmony_ci sleep 0.5 37462306a36Sopenharmony_ci verify_announce_event $server_evts $ANNOUNCED $server4_token "10.0.2.2" $client_addr_id \ 37562306a36Sopenharmony_ci "$client4_port" 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci # ADD_ADDR6 from the client to server machine reusing the subflow port 37862306a36Sopenharmony_ci :>"$server_evts" 37962306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann\ 38062306a36Sopenharmony_ci dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 38162306a36Sopenharmony_ci print_test "ADD_ADDR6 id:${client_addr_id} dead:beef:2::2 (ns2) => ns1, reuse port" 38262306a36Sopenharmony_ci sleep 0.5 38362306a36Sopenharmony_ci verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:beef:2::2"\ 38462306a36Sopenharmony_ci "$client_addr_id" "$client6_port" "v6" 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci # ADD_ADDR from the client to server machine using a new port 38762306a36Sopenharmony_ci :>"$server_evts" 38862306a36Sopenharmony_ci client_addr_id=$((client_addr_id+1)) 38962306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 39062306a36Sopenharmony_ci $client_addr_id dev ns2eth1 port $new4_port 39162306a36Sopenharmony_ci print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, new port" 39262306a36Sopenharmony_ci sleep 0.5 39362306a36Sopenharmony_ci verify_announce_event "$server_evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\ 39462306a36Sopenharmony_ci "$client_addr_id" "$new4_port" 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci # Capture events on the network namespace running the client 39762306a36Sopenharmony_ci :>"$client_evts" 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci # ADD_ADDR from the server to client machine reusing the subflow port 40062306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 40162306a36Sopenharmony_ci $server_addr_id dev ns1eth2 40262306a36Sopenharmony_ci print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port" 40362306a36Sopenharmony_ci sleep 0.5 40462306a36Sopenharmony_ci verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ 40562306a36Sopenharmony_ci "$server_addr_id" "$app4_port" 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci # ADD_ADDR6 from the server to client machine reusing the subflow port 40862306a36Sopenharmony_ci :>"$client_evts" 40962306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\ 41062306a36Sopenharmony_ci $server_addr_id dev ns1eth2 41162306a36Sopenharmony_ci print_test "ADD_ADDR6 id:${server_addr_id} dead:beef:2::1 (ns1) => ns2, reuse port" 41262306a36Sopenharmony_ci sleep 0.5 41362306a36Sopenharmony_ci verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:beef:2::1"\ 41462306a36Sopenharmony_ci "$server_addr_id" "$app6_port" "v6" 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci # ADD_ADDR from the server to client machine using a new port 41762306a36Sopenharmony_ci :>"$client_evts" 41862306a36Sopenharmony_ci server_addr_id=$((server_addr_id+1)) 41962306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 42062306a36Sopenharmony_ci $server_addr_id dev ns1eth2 port $new4_port 42162306a36Sopenharmony_ci print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, new port" 42262306a36Sopenharmony_ci sleep 0.5 42362306a36Sopenharmony_ci verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ 42462306a36Sopenharmony_ci "$server_addr_id" "$new4_port" 42562306a36Sopenharmony_ci} 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_civerify_remove_event() 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci local evt=$1 43062306a36Sopenharmony_ci local e_type=$2 43162306a36Sopenharmony_ci local e_token=$3 43262306a36Sopenharmony_ci local e_id=$4 43362306a36Sopenharmony_ci local type 43462306a36Sopenharmony_ci local token 43562306a36Sopenharmony_ci local id 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 43862306a36Sopenharmony_ci token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 43962306a36Sopenharmony_ci id=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci check_expected "type" "token" "id" 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_citest_remove() 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci print_title "Remove tests" 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci # Capture events on the network namespace running the server 44962306a36Sopenharmony_ci :>"$server_evts" 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci # RM_ADDR using an invalid token should result in no action 45262306a36Sopenharmony_ci local invalid_token=$(( client4_token - 1 )) 45362306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\ 45462306a36Sopenharmony_ci $client_addr_id > /dev/null 2>&1 45562306a36Sopenharmony_ci print_test "RM_ADDR id:${client_addr_id} ns2 => ns1, invalid token" 45662306a36Sopenharmony_ci local type 45762306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$server_evts") 45862306a36Sopenharmony_ci if [ "$type" = "" ] 45962306a36Sopenharmony_ci then 46062306a36Sopenharmony_ci test_pass 46162306a36Sopenharmony_ci else 46262306a36Sopenharmony_ci test_fail 46362306a36Sopenharmony_ci fi 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci # RM_ADDR using an invalid addr id should result in no action 46662306a36Sopenharmony_ci local invalid_id=$(( client_addr_id + 1 )) 46762306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 46862306a36Sopenharmony_ci $invalid_id > /dev/null 2>&1 46962306a36Sopenharmony_ci print_test "RM_ADDR id:${invalid_id} ns2 => ns1, invalid id" 47062306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$server_evts") 47162306a36Sopenharmony_ci if [ "$type" = "" ] 47262306a36Sopenharmony_ci then 47362306a36Sopenharmony_ci test_pass 47462306a36Sopenharmony_ci else 47562306a36Sopenharmony_ci test_fail 47662306a36Sopenharmony_ci fi 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci # RM_ADDR from the client to server machine 47962306a36Sopenharmony_ci :>"$server_evts" 48062306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 48162306a36Sopenharmony_ci $client_addr_id 48262306a36Sopenharmony_ci print_test "RM_ADDR id:${client_addr_id} ns2 => ns1" 48362306a36Sopenharmony_ci sleep 0.5 48462306a36Sopenharmony_ci verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci # RM_ADDR from the client to server machine 48762306a36Sopenharmony_ci :>"$server_evts" 48862306a36Sopenharmony_ci client_addr_id=$(( client_addr_id - 1 )) 48962306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ 49062306a36Sopenharmony_ci $client_addr_id 49162306a36Sopenharmony_ci print_test "RM_ADDR id:${client_addr_id} ns2 => ns1" 49262306a36Sopenharmony_ci sleep 0.5 49362306a36Sopenharmony_ci verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci # RM_ADDR6 from the client to server machine 49662306a36Sopenharmony_ci :>"$server_evts" 49762306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ 49862306a36Sopenharmony_ci $client_addr_id 49962306a36Sopenharmony_ci print_test "RM_ADDR6 id:${client_addr_id} ns2 => ns1" 50062306a36Sopenharmony_ci sleep 0.5 50162306a36Sopenharmony_ci verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_addr_id" 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci # Capture events on the network namespace running the client 50462306a36Sopenharmony_ci :>"$client_evts" 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci # RM_ADDR from the server to client machine 50762306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ 50862306a36Sopenharmony_ci $server_addr_id 50962306a36Sopenharmony_ci print_test "RM_ADDR id:${server_addr_id} ns1 => ns2" 51062306a36Sopenharmony_ci sleep 0.5 51162306a36Sopenharmony_ci verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci # RM_ADDR from the server to client machine 51462306a36Sopenharmony_ci :>"$client_evts" 51562306a36Sopenharmony_ci server_addr_id=$(( server_addr_id - 1 )) 51662306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ 51762306a36Sopenharmony_ci $server_addr_id 51862306a36Sopenharmony_ci print_test "RM_ADDR id:${server_addr_id} ns1 => ns2" 51962306a36Sopenharmony_ci sleep 0.5 52062306a36Sopenharmony_ci verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci # RM_ADDR6 from the server to client machine 52362306a36Sopenharmony_ci :>"$client_evts" 52462306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ 52562306a36Sopenharmony_ci $server_addr_id 52662306a36Sopenharmony_ci print_test "RM_ADDR6 id:${server_addr_id} ns1 => ns2" 52762306a36Sopenharmony_ci sleep 0.5 52862306a36Sopenharmony_ci verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_addr_id" 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_civerify_subflow_events() 53262306a36Sopenharmony_ci{ 53362306a36Sopenharmony_ci local evt=$1 53462306a36Sopenharmony_ci local e_type=$2 53562306a36Sopenharmony_ci local e_token=$3 53662306a36Sopenharmony_ci local e_family=$4 53762306a36Sopenharmony_ci local e_saddr=$5 53862306a36Sopenharmony_ci local e_daddr=$6 53962306a36Sopenharmony_ci local e_dport=$7 54062306a36Sopenharmony_ci local e_locid=$8 54162306a36Sopenharmony_ci local e_remid=$9 54262306a36Sopenharmony_ci shift 2 54362306a36Sopenharmony_ci local e_from=$8 54462306a36Sopenharmony_ci local e_to=$9 54562306a36Sopenharmony_ci local type 54662306a36Sopenharmony_ci local token 54762306a36Sopenharmony_ci local family 54862306a36Sopenharmony_ci local saddr 54962306a36Sopenharmony_ci local daddr 55062306a36Sopenharmony_ci local dport 55162306a36Sopenharmony_ci local locid 55262306a36Sopenharmony_ci local remid 55362306a36Sopenharmony_ci local info 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci info="${e_saddr} (${e_from}) => ${e_daddr}:${e_dport} (${e_to})" 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci if [ "$e_type" = "$SUB_ESTABLISHED" ] 55862306a36Sopenharmony_ci then 55962306a36Sopenharmony_ci if [ "$e_family" = "$AF_INET6" ] 56062306a36Sopenharmony_ci then 56162306a36Sopenharmony_ci print_test "CREATE_SUBFLOW6 ${info}" 56262306a36Sopenharmony_ci else 56362306a36Sopenharmony_ci print_test "CREATE_SUBFLOW ${info}" 56462306a36Sopenharmony_ci fi 56562306a36Sopenharmony_ci else 56662306a36Sopenharmony_ci if [ "$e_family" = "$AF_INET6" ] 56762306a36Sopenharmony_ci then 56862306a36Sopenharmony_ci print_test "DESTROY_SUBFLOW6 ${info}" 56962306a36Sopenharmony_ci else 57062306a36Sopenharmony_ci print_test "DESTROY_SUBFLOW ${info}" 57162306a36Sopenharmony_ci fi 57262306a36Sopenharmony_ci fi 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$evt" $e_type) 57562306a36Sopenharmony_ci token=$(mptcp_lib_evts_get_info token "$evt" $e_type) 57662306a36Sopenharmony_ci family=$(mptcp_lib_evts_get_info family "$evt" $e_type) 57762306a36Sopenharmony_ci dport=$(mptcp_lib_evts_get_info dport "$evt" $e_type) 57862306a36Sopenharmony_ci locid=$(mptcp_lib_evts_get_info loc_id "$evt" $e_type) 57962306a36Sopenharmony_ci remid=$(mptcp_lib_evts_get_info rem_id "$evt" $e_type) 58062306a36Sopenharmony_ci if [ "$family" = "$AF_INET6" ] 58162306a36Sopenharmony_ci then 58262306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" $e_type) 58362306a36Sopenharmony_ci daddr=$(mptcp_lib_evts_get_info daddr6 "$evt" $e_type) 58462306a36Sopenharmony_ci else 58562306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" $e_type) 58662306a36Sopenharmony_ci daddr=$(mptcp_lib_evts_get_info daddr4 "$evt" $e_type) 58762306a36Sopenharmony_ci fi 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci check_expected "type" "token" "daddr" "dport" "family" "saddr" "locid" "remid" 59062306a36Sopenharmony_ci} 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_citest_subflows() 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci print_title "Subflows v4 or v6 only tests" 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci # Capture events on the network namespace running the server 59762306a36Sopenharmony_ci :>"$server_evts" 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.2:<subflow-port> 60062306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ 60162306a36Sopenharmony_ci "$client4_port" & 60262306a36Sopenharmony_ci local listener_pid=$! 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci # ADD_ADDR from client to server machine reusing the subflow port 60562306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 60662306a36Sopenharmony_ci $client_addr_id 60762306a36Sopenharmony_ci sleep 0.5 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci # CREATE_SUBFLOW from server to client machine 61062306a36Sopenharmony_ci :>"$server_evts" 61162306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ 61262306a36Sopenharmony_ci rport "$client4_port" token "$server4_token" 61362306a36Sopenharmony_ci sleep 0.5 61462306a36Sopenharmony_ci verify_subflow_events $server_evts $SUB_ESTABLISHED $server4_token $AF_INET "10.0.2.1" \ 61562306a36Sopenharmony_ci "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci # Delete the listener from the client ns, if one was created 61862306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci local sport 62162306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci # DESTROY_SUBFLOW from server to client machine 62462306a36Sopenharmony_ci :>"$server_evts" 62562306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0.2.2 rport\ 62662306a36Sopenharmony_ci "$client4_port" token "$server4_token" 62762306a36Sopenharmony_ci sleep 0.5 62862306a36Sopenharmony_ci verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "10.0.2.1"\ 62962306a36Sopenharmony_ci "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci # RM_ADDR from client to server machine 63262306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 63362306a36Sopenharmony_ci "$client4_token" 63462306a36Sopenharmony_ci sleep 0.5 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci # Attempt to add a listener at dead:beef:2::2:<subflow-port> 63762306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ 63862306a36Sopenharmony_ci "$client6_port" & 63962306a36Sopenharmony_ci listener_pid=$! 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci # ADD_ADDR6 from client to server machine reusing the subflow port 64262306a36Sopenharmony_ci :>"$server_evts" 64362306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann dead:beef:2::2 token "$client6_token" id\ 64462306a36Sopenharmony_ci $client_addr_id 64562306a36Sopenharmony_ci sleep 0.5 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci # CREATE_SUBFLOW6 from server to client machine 64862306a36Sopenharmony_ci :>"$server_evts" 64962306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ 65062306a36Sopenharmony_ci dead:beef:2::2 rport "$client6_port" token "$server6_token" 65162306a36Sopenharmony_ci sleep 0.5 65262306a36Sopenharmony_ci verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_INET6"\ 65362306a36Sopenharmony_ci "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ 65462306a36Sopenharmony_ci "$client_addr_id" "ns1" "ns2" 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci # Delete the listener from the client ns, if one was created 65762306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci # DESTROY_SUBFLOW6 from server to client machine 66262306a36Sopenharmony_ci :>"$server_evts" 66362306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" rip\ 66462306a36Sopenharmony_ci dead:beef:2::2 rport "$client6_port" token "$server6_token" 66562306a36Sopenharmony_ci sleep 0.5 66662306a36Sopenharmony_ci verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6"\ 66762306a36Sopenharmony_ci "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ 66862306a36Sopenharmony_ci "$client_addr_id" "ns1" "ns2" 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci # RM_ADDR from client to server machine 67162306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 67262306a36Sopenharmony_ci "$client6_token" 67362306a36Sopenharmony_ci sleep 0.5 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.2:<new-port> 67662306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ 67762306a36Sopenharmony_ci $new4_port & 67862306a36Sopenharmony_ci listener_pid=$! 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci # ADD_ADDR from client to server machine using a new port 68162306a36Sopenharmony_ci :>"$server_evts" 68262306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ 68362306a36Sopenharmony_ci $client_addr_id port $new4_port 68462306a36Sopenharmony_ci sleep 0.5 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci # CREATE_SUBFLOW from server to client machine 68762306a36Sopenharmony_ci :>"$server_evts" 68862306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport\ 68962306a36Sopenharmony_ci $new4_port token "$server4_token" 69062306a36Sopenharmony_ci sleep 0.5 69162306a36Sopenharmony_ci verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_INET"\ 69262306a36Sopenharmony_ci "10.0.2.1" "10.0.2.2" "$new4_port" "23"\ 69362306a36Sopenharmony_ci "$client_addr_id" "ns1" "ns2" 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci # Delete the listener from the client ns, if one was created 69662306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci # DESTROY_SUBFLOW from server to client machine 70162306a36Sopenharmony_ci :>"$server_evts" 70262306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0.2.2 rport\ 70362306a36Sopenharmony_ci $new4_port token "$server4_token" 70462306a36Sopenharmony_ci sleep 0.5 70562306a36Sopenharmony_ci verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "10.0.2.1"\ 70662306a36Sopenharmony_ci "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci # RM_ADDR from client to server machine 70962306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ 71062306a36Sopenharmony_ci "$client4_token" 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci # Capture events on the network namespace running the client 71362306a36Sopenharmony_ci :>"$client_evts" 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.1:<subflow-port> 71662306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 71762306a36Sopenharmony_ci $app4_port & 71862306a36Sopenharmony_ci listener_pid=$! 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci # ADD_ADDR from server to client machine reusing the subflow port 72162306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 72262306a36Sopenharmony_ci $server_addr_id 72362306a36Sopenharmony_ci sleep 0.5 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci # CREATE_SUBFLOW from client to server machine 72662306a36Sopenharmony_ci :>"$client_evts" 72762306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 72862306a36Sopenharmony_ci $app4_port token "$client4_token" 72962306a36Sopenharmony_ci sleep 0.5 73062306a36Sopenharmony_ci verify_subflow_events $client_evts $SUB_ESTABLISHED $client4_token $AF_INET "10.0.2.2"\ 73162306a36Sopenharmony_ci "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ci # Delete the listener from the server ns, if one was created 73462306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci # DESTROY_SUBFLOW from client to server machine 73962306a36Sopenharmony_ci :>"$client_evts" 74062306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 74162306a36Sopenharmony_ci $app4_port token "$client4_token" 74262306a36Sopenharmony_ci sleep 0.5 74362306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "10.0.2.2"\ 74462306a36Sopenharmony_ci "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci # RM_ADDR from server to client machine 74762306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 74862306a36Sopenharmony_ci "$server4_token" 74962306a36Sopenharmony_ci sleep 0.5 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci # Attempt to add a listener at dead:beef:2::1:<subflow-port> 75262306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ 75362306a36Sopenharmony_ci $app6_port & 75462306a36Sopenharmony_ci listener_pid=$! 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci # ADD_ADDR6 from server to client machine reusing the subflow port 75762306a36Sopenharmony_ci :>"$client_evts" 75862306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\ 75962306a36Sopenharmony_ci $server_addr_id 76062306a36Sopenharmony_ci sleep 0.5 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci # CREATE_SUBFLOW6 from client to server machine 76362306a36Sopenharmony_ci :>"$client_evts" 76462306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ 76562306a36Sopenharmony_ci dead:beef:2::1 rport $app6_port token "$client6_token" 76662306a36Sopenharmony_ci sleep 0.5 76762306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ 76862306a36Sopenharmony_ci "$AF_INET6" "dead:beef:2::2"\ 76962306a36Sopenharmony_ci "dead:beef:2::1" "$app6_port" "23"\ 77062306a36Sopenharmony_ci "$server_addr_id" "ns2" "ns1" 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci # Delete the listener from the server ns, if one was created 77362306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci # DESTROY_SUBFLOW6 from client to server machine 77862306a36Sopenharmony_ci :>"$client_evts" 77962306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl dsf lip dead:beef:2::2 lport "$sport" rip\ 78062306a36Sopenharmony_ci dead:beef:2::1 rport $app6_port token "$client6_token" 78162306a36Sopenharmony_ci sleep 0.5 78262306a36Sopenharmony_ci verify_subflow_events $client_evts $SUB_CLOSED $client6_token $AF_INET6 "dead:beef:2::2"\ 78362306a36Sopenharmony_ci "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci # RM_ADDR6 from server to client machine 78662306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 78762306a36Sopenharmony_ci "$server6_token" 78862306a36Sopenharmony_ci sleep 0.5 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.1:<new-port> 79162306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 79262306a36Sopenharmony_ci $new4_port & 79362306a36Sopenharmony_ci listener_pid=$! 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ci # ADD_ADDR from server to client machine using a new port 79662306a36Sopenharmony_ci :>"$client_evts" 79762306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ 79862306a36Sopenharmony_ci $server_addr_id port $new4_port 79962306a36Sopenharmony_ci sleep 0.5 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci # CREATE_SUBFLOW from client to server machine 80262306a36Sopenharmony_ci :>"$client_evts" 80362306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 80462306a36Sopenharmony_ci $new4_port token "$client4_token" 80562306a36Sopenharmony_ci sleep 0.5 80662306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_INET"\ 80762306a36Sopenharmony_ci "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci # Delete the listener from the server ns, if one was created 81062306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci # DESTROY_SUBFLOW from client to server machine 81562306a36Sopenharmony_ci :>"$client_evts" 81662306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 81762306a36Sopenharmony_ci $new4_port token "$client4_token" 81862306a36Sopenharmony_ci sleep 0.5 81962306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "10.0.2.2"\ 82062306a36Sopenharmony_ci "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci # RM_ADDR from server to client machine 82362306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 82462306a36Sopenharmony_ci "$server4_token" 82562306a36Sopenharmony_ci} 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_citest_subflows_v4_v6_mix() 82862306a36Sopenharmony_ci{ 82962306a36Sopenharmony_ci print_title "Subflows v4 and v6 mix tests" 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.1:<subflow-port> 83262306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ 83362306a36Sopenharmony_ci $app6_port & 83462306a36Sopenharmony_ci local listener_pid=$! 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci # ADD_ADDR4 from server to client machine reusing the subflow port on 83762306a36Sopenharmony_ci # the established v6 connection 83862306a36Sopenharmony_ci :>"$client_evts" 83962306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server6_token" id\ 84062306a36Sopenharmony_ci $server_addr_id dev ns1eth2 84162306a36Sopenharmony_ci print_test "ADD_ADDR4 id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port" 84262306a36Sopenharmony_ci sleep 0.5 84362306a36Sopenharmony_ci verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "10.0.2.1"\ 84462306a36Sopenharmony_ci "$server_addr_id" "$app6_port" 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci # CREATE_SUBFLOW from client to server machine 84762306a36Sopenharmony_ci :>"$client_evts" 84862306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport\ 84962306a36Sopenharmony_ci $app6_port token "$client6_token" 85062306a36Sopenharmony_ci sleep 0.5 85162306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ 85262306a36Sopenharmony_ci "$AF_INET" "10.0.2.2" "10.0.2.1" "$app6_port" "23"\ 85362306a36Sopenharmony_ci "$server_addr_id" "ns2" "ns1" 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci # Delete the listener from the server ns, if one was created 85662306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci # DESTROY_SUBFLOW from client to server machine 86162306a36Sopenharmony_ci :>"$client_evts" 86262306a36Sopenharmony_ci ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0.2.1 rport\ 86362306a36Sopenharmony_ci $app6_port token "$client6_token" 86462306a36Sopenharmony_ci sleep 0.5 86562306a36Sopenharmony_ci verify_subflow_events "$client_evts" "$SUB_CLOSED" "$client6_token" \ 86662306a36Sopenharmony_ci "$AF_INET" "10.0.2.2" "10.0.2.1" "$app6_port" "23"\ 86762306a36Sopenharmony_ci "$server_addr_id" "ns2" "ns1" 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci # RM_ADDR from server to client machine 87062306a36Sopenharmony_ci ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ 87162306a36Sopenharmony_ci "$server6_token" 87262306a36Sopenharmony_ci sleep 0.5 87362306a36Sopenharmony_ci} 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_citest_prio() 87662306a36Sopenharmony_ci{ 87762306a36Sopenharmony_ci print_title "Prio tests" 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci local count 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci # Send MP_PRIO signal from client to server machine 88262306a36Sopenharmony_ci 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" 88362306a36Sopenharmony_ci sleep 0.5 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci # Check TX 88662306a36Sopenharmony_ci print_test "MP_PRIO TX" 88762306a36Sopenharmony_ci count=$(mptcp_lib_get_counter "$ns2" "MPTcpExtMPPrioTx") 88862306a36Sopenharmony_ci if [ -z "$count" ]; then 88962306a36Sopenharmony_ci test_skip 89062306a36Sopenharmony_ci elif [ $count != 1 ]; then 89162306a36Sopenharmony_ci test_fail "Count != 1: ${count}" 89262306a36Sopenharmony_ci else 89362306a36Sopenharmony_ci test_pass 89462306a36Sopenharmony_ci fi 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci # Check RX 89762306a36Sopenharmony_ci print_test "MP_PRIO RX" 89862306a36Sopenharmony_ci count=$(mptcp_lib_get_counter "$ns1" "MPTcpExtMPPrioRx") 89962306a36Sopenharmony_ci if [ -z "$count" ]; then 90062306a36Sopenharmony_ci test_skip 90162306a36Sopenharmony_ci elif [ $count != 1 ]; then 90262306a36Sopenharmony_ci test_fail "Count != 1: ${count}" 90362306a36Sopenharmony_ci else 90462306a36Sopenharmony_ci test_pass 90562306a36Sopenharmony_ci fi 90662306a36Sopenharmony_ci} 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_civerify_listener_events() 90962306a36Sopenharmony_ci{ 91062306a36Sopenharmony_ci local evt=$1 91162306a36Sopenharmony_ci local e_type=$2 91262306a36Sopenharmony_ci local e_family=$3 91362306a36Sopenharmony_ci local e_saddr=$4 91462306a36Sopenharmony_ci local e_sport=$5 91562306a36Sopenharmony_ci local type 91662306a36Sopenharmony_ci local family 91762306a36Sopenharmony_ci local saddr 91862306a36Sopenharmony_ci local sport 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci if [ $e_type = $LISTENER_CREATED ]; then 92162306a36Sopenharmony_ci print_test "CREATE_LISTENER $e_saddr:$e_sport" 92262306a36Sopenharmony_ci elif [ $e_type = $LISTENER_CLOSED ]; then 92362306a36Sopenharmony_ci print_test "CLOSE_LISTENER $e_saddr:$e_sport" 92462306a36Sopenharmony_ci fi 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type $evt $e_type) 92762306a36Sopenharmony_ci family=$(mptcp_lib_evts_get_info family $evt $e_type) 92862306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport $evt $e_type) 92962306a36Sopenharmony_ci if [ $family ] && [ $family = $AF_INET6 ]; then 93062306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr6 $evt $e_type) 93162306a36Sopenharmony_ci else 93262306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr4 $evt $e_type) 93362306a36Sopenharmony_ci fi 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci check_expected "type" "family" "saddr" "sport" 93662306a36Sopenharmony_ci} 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_citest_listener() 93962306a36Sopenharmony_ci{ 94062306a36Sopenharmony_ci print_title "Listener tests" 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_ci if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then 94362306a36Sopenharmony_ci print_test "LISTENER events" 94462306a36Sopenharmony_ci test_skip 94562306a36Sopenharmony_ci return 94662306a36Sopenharmony_ci fi 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci # Capture events on the network namespace running the client 94962306a36Sopenharmony_ci :>$client_evts 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci # Attempt to add a listener at 10.0.2.2:<subflow-port> 95262306a36Sopenharmony_ci ip netns exec $ns2 ./pm_nl_ctl listen 10.0.2.2\ 95362306a36Sopenharmony_ci $client4_port & 95462306a36Sopenharmony_ci local listener_pid=$! 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci sleep 0.5 95762306a36Sopenharmony_ci verify_listener_events $client_evts $LISTENER_CREATED $AF_INET 10.0.2.2 $client4_port 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci # ADD_ADDR from client to server machine reusing the subflow port 96062306a36Sopenharmony_ci ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\ 96162306a36Sopenharmony_ci $client_addr_id 96262306a36Sopenharmony_ci sleep 0.5 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci # CREATE_SUBFLOW from server to client machine 96562306a36Sopenharmony_ci ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ 96662306a36Sopenharmony_ci rport $client4_port token $server4_token 96762306a36Sopenharmony_ci sleep 0.5 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci # Delete the listener from the client ns, if one was created 97062306a36Sopenharmony_ci mptcp_lib_kill_wait $listener_pid 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci sleep 0.5 97362306a36Sopenharmony_ci verify_listener_events $client_evts $LISTENER_CLOSED $AF_INET 10.0.2.2 $client4_port 97462306a36Sopenharmony_ci} 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ciprint_title "Make connections" 97762306a36Sopenharmony_cimake_connection 97862306a36Sopenharmony_cimake_connection "v6" 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_citest_announce 98162306a36Sopenharmony_citest_remove 98262306a36Sopenharmony_citest_subflows 98362306a36Sopenharmony_citest_subflows_v4_v6_mix 98462306a36Sopenharmony_citest_prio 98562306a36Sopenharmony_citest_listener 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_cimptcp_lib_result_print_all_tap 98862306a36Sopenharmony_ciexit ${ret} 989