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