pm_netlink.sh 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. . "$(dirname "${0}")/mptcp_lib.sh"
  4. ret=0
  5. usage() {
  6. echo "Usage: $0 [ -i ] [ -h ]"
  7. echo -e "\t-i: use 'ip mptcp' instead of 'pm_nl_ctl'"
  8. echo -e "\t-h: help"
  9. }
  10. optstring=hi
  11. while getopts "$optstring" option;do
  12. case "$option" in
  13. "h")
  14. usage "$0"
  15. exit ${KSFT_PASS}
  16. ;;
  17. "i")
  18. mptcp_lib_set_ip_mptcp
  19. ;;
  20. "?")
  21. usage "$0"
  22. exit ${KSFT_FAIL}
  23. ;;
  24. esac
  25. done
  26. ns1=""
  27. err=$(mktemp)
  28. # This function is used in the cleanup trap
  29. #shellcheck disable=SC2317,SC2329
  30. cleanup()
  31. {
  32. rm -f "${err}"
  33. mptcp_lib_ns_exit "${ns1}"
  34. }
  35. mptcp_lib_check_mptcp
  36. mptcp_lib_check_tools ip
  37. trap cleanup EXIT
  38. mptcp_lib_ns_init ns1
  39. format_limits() {
  40. local accept="${1}"
  41. local subflows="${2}"
  42. if mptcp_lib_is_ip_mptcp; then
  43. # with a space at the end
  44. printf "add_addr_accepted %d subflows %d \n" "${accept}" "${subflows}"
  45. else
  46. printf "accept %d\nsubflows %d\n" "${accept}" "${subflows}"
  47. fi
  48. }
  49. get_limits() {
  50. if mptcp_lib_is_ip_mptcp; then
  51. ip -n "${ns1}" mptcp limits
  52. else
  53. ip netns exec "${ns1}" ./pm_nl_ctl limits
  54. fi
  55. }
  56. format_endpoints() {
  57. mptcp_lib_pm_nl_format_endpoints "${@}"
  58. }
  59. # This function is invoked indirectly
  60. #shellcheck disable=SC2317,SC2329
  61. get_endpoint() {
  62. mptcp_lib_pm_nl_get_endpoint "${ns1}" "${@}"
  63. }
  64. change_address() {
  65. local addr=${1}
  66. local flags=${2}
  67. if mptcp_lib_is_ip_mptcp; then
  68. ip -n "${ns1}" mptcp endpoint change "${addr}" "${flags}"
  69. else
  70. ip netns exec "${ns1}" ./pm_nl_ctl set "${addr}" flags "${flags}"
  71. fi
  72. }
  73. set_limits()
  74. {
  75. mptcp_lib_pm_nl_set_limits "${ns1}" "${@}"
  76. }
  77. add_endpoint()
  78. {
  79. mptcp_lib_pm_nl_add_endpoint "${ns1}" "${@}"
  80. }
  81. del_endpoint()
  82. {
  83. mptcp_lib_pm_nl_del_endpoint "${ns1}" "${@}"
  84. }
  85. flush_endpoint()
  86. {
  87. mptcp_lib_pm_nl_flush_endpoint "${ns1}"
  88. }
  89. show_endpoints()
  90. {
  91. mptcp_lib_pm_nl_show_endpoints "${ns1}"
  92. }
  93. change_endpoint()
  94. {
  95. mptcp_lib_pm_nl_change_endpoint "${ns1}" "${@}"
  96. }
  97. check()
  98. {
  99. local cmd="$1"
  100. local expected="$2"
  101. local msg="$3"
  102. local rc=0
  103. mptcp_lib_print_title "$msg"
  104. mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}
  105. if [ ${rc} -eq 2 ]; then
  106. mptcp_lib_result_fail "${msg} # error ${rc}"
  107. ret=${KSFT_FAIL}
  108. elif [ ${rc} -eq 0 ]; then
  109. mptcp_lib_print_ok "[ OK ]"
  110. mptcp_lib_result_pass "${msg}"
  111. elif [ ${rc} -eq 1 ]; then
  112. mptcp_lib_result_fail "${msg} # different output"
  113. ret=${KSFT_FAIL}
  114. fi
  115. }
  116. mptcp_lib_subtests_last_ts_reset
  117. check "show_endpoints" "" "defaults addr list"
  118. default_limits="$(get_limits)"
  119. if mptcp_lib_expect_all_features; then
  120. check "get_limits" "$(format_limits 0 2)" "defaults limits"
  121. fi
  122. add_endpoint 10.0.1.1
  123. add_endpoint 10.0.1.2 flags subflow dev lo
  124. add_endpoint 10.0.1.3 flags signal,backup
  125. check "get_endpoint 1" "$(format_endpoints "1,10.0.1.1")" "simple add/get addr"
  126. check "show_endpoints" \
  127. "$(format_endpoints "1,10.0.1.1" \
  128. "2,10.0.1.2,subflow,lo" \
  129. "3,10.0.1.3,signal backup")" "dump addrs"
  130. del_endpoint 2
  131. check "get_endpoint 2" "" "simple del addr"
  132. check "show_endpoints" \
  133. "$(format_endpoints "1,10.0.1.1" \
  134. "3,10.0.1.3,signal backup")" "dump addrs after del"
  135. add_endpoint 10.0.1.3 2>/dev/null
  136. check "get_endpoint 4" "" "duplicate addr"
  137. add_endpoint 10.0.1.4 flags signal
  138. check "get_endpoint 4" "$(format_endpoints "4,10.0.1.4,signal")" "id addr increment"
  139. for i in $(seq 5 9); do
  140. add_endpoint "10.0.1.${i}" flags signal >/dev/null 2>&1
  141. done
  142. check "get_endpoint 9" "$(format_endpoints "9,10.0.1.9,signal")" "hard addr limit"
  143. check "get_endpoint 10" "" "above hard addr limit"
  144. del_endpoint 9
  145. for i in $(seq 10 255); do
  146. add_endpoint 10.0.0.9 id "${i}"
  147. del_endpoint "${i}"
  148. done
  149. check "show_endpoints" \
  150. "$(format_endpoints "1,10.0.1.1" \
  151. "3,10.0.1.3,signal backup" \
  152. "4,10.0.1.4,signal" \
  153. "5,10.0.1.5,signal" \
  154. "6,10.0.1.6,signal" \
  155. "7,10.0.1.7,signal" \
  156. "8,10.0.1.8,signal")" "id limit"
  157. flush_endpoint
  158. check "show_endpoints" "" "flush addrs"
  159. add_endpoint 10.0.1.1 flags unknown
  160. check "show_endpoints" "$(format_endpoints "1,10.0.1.1")" "ignore unknown flags"
  161. flush_endpoint
  162. set_limits 9 1 2>/dev/null
  163. check "get_limits" "${default_limits}" "rcv addrs above hard limit"
  164. set_limits 1 9 2>/dev/null
  165. check "get_limits" "${default_limits}" "subflows above hard limit"
  166. set_limits 8 8
  167. flush_endpoint ## to make sure it doesn't affect the limits
  168. check "get_limits" "$(format_limits 8 8)" "set limits"
  169. flush_endpoint
  170. add_endpoint 10.0.1.1
  171. add_endpoint 10.0.1.2
  172. add_endpoint 10.0.1.3 id 100
  173. add_endpoint 10.0.1.4
  174. add_endpoint 10.0.1.5 id 254
  175. add_endpoint 10.0.1.6
  176. add_endpoint 10.0.1.7
  177. add_endpoint 10.0.1.8
  178. check "show_endpoints" \
  179. "$(format_endpoints "1,10.0.1.1" \
  180. "2,10.0.1.2" \
  181. "3,10.0.1.7" \
  182. "4,10.0.1.8" \
  183. "100,10.0.1.3" \
  184. "101,10.0.1.4" \
  185. "254,10.0.1.5" \
  186. "255,10.0.1.6")" "set ids"
  187. flush_endpoint
  188. add_endpoint 10.0.0.1
  189. add_endpoint 10.0.0.2 id 254
  190. add_endpoint 10.0.0.3
  191. add_endpoint 10.0.0.4
  192. add_endpoint 10.0.0.5 id 253
  193. add_endpoint 10.0.0.6
  194. add_endpoint 10.0.0.7
  195. add_endpoint 10.0.0.8
  196. check "show_endpoints" \
  197. "$(format_endpoints "1,10.0.0.1" \
  198. "2,10.0.0.4" \
  199. "3,10.0.0.6" \
  200. "4,10.0.0.7" \
  201. "5,10.0.0.8" \
  202. "253,10.0.0.5" \
  203. "254,10.0.0.2" \
  204. "255,10.0.0.3")" "wrap-around ids"
  205. flush_endpoint
  206. add_endpoint 10.0.1.1 flags subflow
  207. change_address 10.0.1.1 backup
  208. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup")" \
  209. "set flags (backup)"
  210. change_address 10.0.1.1 nobackup
  211. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
  212. " (nobackup)"
  213. # fullmesh support has been added later
  214. change_endpoint 1 fullmesh 2>/dev/null
  215. if show_endpoints | grep -q "fullmesh" ||
  216. mptcp_lib_expect_all_features; then
  217. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow fullmesh")" \
  218. " (fullmesh)"
  219. change_endpoint 1 nofullmesh
  220. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
  221. " (nofullmesh)"
  222. change_endpoint 1 backup,fullmesh
  223. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup fullmesh")" \
  224. " (backup,fullmesh)"
  225. else
  226. for st in fullmesh nofullmesh backup,fullmesh; do
  227. st=" (${st})"
  228. mptcp_lib_print_title "${st}"
  229. mptcp_lib_pr_skip
  230. mptcp_lib_result_skip "${st}"
  231. done
  232. fi
  233. mptcp_lib_result_print_all_tap
  234. exit $ret