pm_netlink.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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
  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. get_endpoint() {
  60. # shellcheck disable=SC2317 # invoked indirectly
  61. mptcp_lib_pm_nl_get_endpoint "${ns1}" "${@}"
  62. }
  63. change_address() {
  64. local addr=${1}
  65. local flags=${2}
  66. if mptcp_lib_is_ip_mptcp; then
  67. ip -n "${ns1}" mptcp endpoint change "${addr}" "${flags}"
  68. else
  69. ip netns exec "${ns1}" ./pm_nl_ctl set "${addr}" flags "${flags}"
  70. fi
  71. }
  72. set_limits()
  73. {
  74. mptcp_lib_pm_nl_set_limits "${ns1}" "${@}"
  75. }
  76. add_endpoint()
  77. {
  78. mptcp_lib_pm_nl_add_endpoint "${ns1}" "${@}"
  79. }
  80. del_endpoint()
  81. {
  82. mptcp_lib_pm_nl_del_endpoint "${ns1}" "${@}"
  83. }
  84. flush_endpoint()
  85. {
  86. mptcp_lib_pm_nl_flush_endpoint "${ns1}"
  87. }
  88. show_endpoints()
  89. {
  90. mptcp_lib_pm_nl_show_endpoints "${ns1}"
  91. }
  92. change_endpoint()
  93. {
  94. mptcp_lib_pm_nl_change_endpoint "${ns1}" "${@}"
  95. }
  96. check()
  97. {
  98. local cmd="$1"
  99. local expected="$2"
  100. local msg="$3"
  101. local rc=0
  102. mptcp_lib_print_title "$msg"
  103. mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}
  104. if [ ${rc} -eq 2 ]; then
  105. mptcp_lib_result_fail "${msg} # error ${rc}"
  106. ret=${KSFT_FAIL}
  107. elif [ ${rc} -eq 0 ]; then
  108. mptcp_lib_print_ok "[ OK ]"
  109. mptcp_lib_result_pass "${msg}"
  110. elif [ ${rc} -eq 1 ]; then
  111. mptcp_lib_result_fail "${msg} # different output"
  112. ret=${KSFT_FAIL}
  113. fi
  114. }
  115. mptcp_lib_subtests_last_ts_reset
  116. check "show_endpoints" "" "defaults addr list"
  117. default_limits="$(get_limits)"
  118. if mptcp_lib_expect_all_features; then
  119. check "get_limits" "$(format_limits 0 2)" "defaults limits"
  120. fi
  121. add_endpoint 10.0.1.1
  122. add_endpoint 10.0.1.2 flags subflow dev lo
  123. add_endpoint 10.0.1.3 flags signal,backup
  124. check "get_endpoint 1" "$(format_endpoints "1,10.0.1.1")" "simple add/get addr"
  125. check "show_endpoints" \
  126. "$(format_endpoints "1,10.0.1.1" \
  127. "2,10.0.1.2,subflow,lo" \
  128. "3,10.0.1.3,signal backup")" "dump addrs"
  129. del_endpoint 2
  130. check "get_endpoint 2" "" "simple del addr"
  131. check "show_endpoints" \
  132. "$(format_endpoints "1,10.0.1.1" \
  133. "3,10.0.1.3,signal backup")" "dump addrs after del"
  134. add_endpoint 10.0.1.3 2>/dev/null
  135. check "get_endpoint 4" "" "duplicate addr"
  136. add_endpoint 10.0.1.4 flags signal
  137. check "get_endpoint 4" "$(format_endpoints "4,10.0.1.4,signal")" "id addr increment"
  138. for i in $(seq 5 9); do
  139. add_endpoint "10.0.1.${i}" flags signal >/dev/null 2>&1
  140. done
  141. check "get_endpoint 9" "$(format_endpoints "9,10.0.1.9,signal")" "hard addr limit"
  142. check "get_endpoint 10" "" "above hard addr limit"
  143. del_endpoint 9
  144. for i in $(seq 10 255); do
  145. add_endpoint 10.0.0.9 id "${i}"
  146. del_endpoint "${i}"
  147. done
  148. check "show_endpoints" \
  149. "$(format_endpoints "1,10.0.1.1" \
  150. "3,10.0.1.3,signal backup" \
  151. "4,10.0.1.4,signal" \
  152. "5,10.0.1.5,signal" \
  153. "6,10.0.1.6,signal" \
  154. "7,10.0.1.7,signal" \
  155. "8,10.0.1.8,signal")" "id limit"
  156. flush_endpoint
  157. check "show_endpoints" "" "flush addrs"
  158. set_limits 9 1 2>/dev/null
  159. check "get_limits" "${default_limits}" "rcv addrs above hard limit"
  160. set_limits 1 9 2>/dev/null
  161. check "get_limits" "${default_limits}" "subflows above hard limit"
  162. set_limits 8 8
  163. flush_endpoint ## to make sure it doesn't affect the limits
  164. check "get_limits" "$(format_limits 8 8)" "set limits"
  165. flush_endpoint
  166. add_endpoint 10.0.1.1
  167. add_endpoint 10.0.1.2
  168. add_endpoint 10.0.1.3 id 100
  169. add_endpoint 10.0.1.4
  170. add_endpoint 10.0.1.5 id 254
  171. add_endpoint 10.0.1.6
  172. add_endpoint 10.0.1.7
  173. add_endpoint 10.0.1.8
  174. check "show_endpoints" \
  175. "$(format_endpoints "1,10.0.1.1" \
  176. "2,10.0.1.2" \
  177. "3,10.0.1.7" \
  178. "4,10.0.1.8" \
  179. "100,10.0.1.3" \
  180. "101,10.0.1.4" \
  181. "254,10.0.1.5" \
  182. "255,10.0.1.6")" "set ids"
  183. flush_endpoint
  184. add_endpoint 10.0.0.1
  185. add_endpoint 10.0.0.2 id 254
  186. add_endpoint 10.0.0.3
  187. add_endpoint 10.0.0.4
  188. add_endpoint 10.0.0.5 id 253
  189. add_endpoint 10.0.0.6
  190. add_endpoint 10.0.0.7
  191. add_endpoint 10.0.0.8
  192. check "show_endpoints" \
  193. "$(format_endpoints "1,10.0.0.1" \
  194. "2,10.0.0.4" \
  195. "3,10.0.0.6" \
  196. "4,10.0.0.7" \
  197. "5,10.0.0.8" \
  198. "253,10.0.0.5" \
  199. "254,10.0.0.2" \
  200. "255,10.0.0.3")" "wrap-around ids"
  201. flush_endpoint
  202. add_endpoint 10.0.1.1 flags subflow
  203. change_address 10.0.1.1 backup
  204. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup")" \
  205. "set flags (backup)"
  206. change_address 10.0.1.1 nobackup
  207. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
  208. " (nobackup)"
  209. # fullmesh support has been added later
  210. change_endpoint 1 fullmesh 2>/dev/null
  211. if show_endpoints | grep -q "fullmesh" ||
  212. mptcp_lib_expect_all_features; then
  213. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow fullmesh")" \
  214. " (fullmesh)"
  215. change_endpoint 1 nofullmesh
  216. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow")" \
  217. " (nofullmesh)"
  218. change_endpoint 1 backup,fullmesh
  219. check "show_endpoints" "$(format_endpoints "1,10.0.1.1,subflow backup fullmesh")" \
  220. " (backup,fullmesh)"
  221. else
  222. for st in fullmesh nofullmesh backup,fullmesh; do
  223. st=" (${st})"
  224. mptcp_lib_print_title "${st}"
  225. mptcp_lib_pr_skip
  226. mptcp_lib_result_skip "${st}"
  227. done
  228. fi
  229. mptcp_lib_result_print_all_tap
  230. exit $ret