fib.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # This test is for checking the FIB offload API. It makes use of netdevsim
  5. # which registers a listener to the FIB notification chain.
  6. lib_dir=$(dirname $0)/../../../net/forwarding
  7. ALL_TESTS="
  8. ipv4_identical_routes
  9. ipv4_tos
  10. ipv4_metric
  11. ipv4_replace
  12. ipv4_delete
  13. ipv4_plen
  14. ipv4_replay
  15. ipv4_flush
  16. ipv4_error_path
  17. ipv4_delete_fail
  18. ipv6_add
  19. ipv6_metric
  20. ipv6_append_single
  21. ipv6_replace_single
  22. ipv6_metric_multipath
  23. ipv6_append_multipath
  24. ipv6_replace_multipath
  25. ipv6_append_multipath_to_single
  26. ipv6_delete_single
  27. ipv6_delete_multipath
  28. ipv6_replay_single
  29. ipv6_replay_multipath
  30. ipv6_error_path
  31. ipv6_delete_fail
  32. "
  33. NETDEVSIM_PATH=/sys/bus/netdevsim/
  34. DEV_ADDR=1337
  35. DEV=netdevsim${DEV_ADDR}
  36. SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
  37. DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/
  38. NUM_NETIFS=0
  39. source $lib_dir/lib.sh
  40. source $lib_dir/fib_offload_lib.sh
  41. DEVLINK_DEV=
  42. source $lib_dir/devlink_lib.sh
  43. DEVLINK_DEV=netdevsim/${DEV}
  44. ipv4_identical_routes()
  45. {
  46. fib_ipv4_identical_routes_test "testns1"
  47. }
  48. ipv4_tos()
  49. {
  50. fib_ipv4_tos_test "testns1"
  51. }
  52. ipv4_metric()
  53. {
  54. fib_ipv4_metric_test "testns1"
  55. }
  56. ipv4_replace()
  57. {
  58. fib_ipv4_replace_test "testns1"
  59. }
  60. ipv4_delete()
  61. {
  62. fib_ipv4_delete_test "testns1"
  63. }
  64. ipv4_plen()
  65. {
  66. fib_ipv4_plen_test "testns1"
  67. }
  68. ipv4_replay_metric()
  69. {
  70. fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
  71. }
  72. ipv4_replay_tos()
  73. {
  74. fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
  75. }
  76. ipv4_replay_plen()
  77. {
  78. fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
  79. }
  80. ipv4_replay()
  81. {
  82. ipv4_replay_metric
  83. ipv4_replay_tos
  84. ipv4_replay_plen
  85. }
  86. ipv4_flush()
  87. {
  88. fib_ipv4_flush_test "testns1"
  89. }
  90. ipv4_error_path_add()
  91. {
  92. local lsb
  93. RET=0
  94. ip -n testns1 link add name dummy1 type dummy
  95. ip -n testns1 link set dev dummy1 up
  96. devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
  97. devlink -N testns1 dev reload $DEVLINK_DEV
  98. for lsb in $(seq 1 20); do
  99. ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \
  100. &> /dev/null
  101. done
  102. log_test "IPv4 error path - add"
  103. ip -n testns1 link del dev dummy1
  104. }
  105. ipv4_error_path_replay()
  106. {
  107. local lsb
  108. RET=0
  109. ip -n testns1 link add name dummy1 type dummy
  110. ip -n testns1 link set dev dummy1 up
  111. devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
  112. devlink -N testns1 dev reload $DEVLINK_DEV
  113. for lsb in $(seq 1 20); do
  114. ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
  115. done
  116. devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
  117. devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
  118. log_test "IPv4 error path - replay"
  119. ip -n testns1 link del dev dummy1
  120. # Successfully reload after deleting all the routes.
  121. devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
  122. devlink -N testns1 dev reload $DEVLINK_DEV
  123. }
  124. ipv4_error_path()
  125. {
  126. # Test the different error paths of the notifiers by limiting the size
  127. # of the "IPv4/fib" resource.
  128. ipv4_error_path_add
  129. ipv4_error_path_replay
  130. }
  131. ipv4_delete_fail()
  132. {
  133. RET=0
  134. echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
  135. ip -n testns1 link add name dummy1 type dummy
  136. ip -n testns1 link set dev dummy1 up
  137. ip -n testns1 route add 192.0.2.0/24 dev dummy1
  138. ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null
  139. # We should not be able to delete the netdev if we are leaking a
  140. # reference.
  141. ip -n testns1 link del dev dummy1
  142. log_test "IPv4 route delete failure"
  143. echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
  144. }
  145. ipv6_add()
  146. {
  147. fib_ipv6_add_test "testns1"
  148. }
  149. ipv6_metric()
  150. {
  151. fib_ipv6_metric_test "testns1"
  152. }
  153. ipv6_append_single()
  154. {
  155. fib_ipv6_append_single_test "testns1"
  156. }
  157. ipv6_replace_single()
  158. {
  159. fib_ipv6_replace_single_test "testns1"
  160. }
  161. ipv6_metric_multipath()
  162. {
  163. fib_ipv6_metric_multipath_test "testns1"
  164. }
  165. ipv6_append_multipath()
  166. {
  167. fib_ipv6_append_multipath_test "testns1"
  168. }
  169. ipv6_replace_multipath()
  170. {
  171. fib_ipv6_replace_multipath_test "testns1"
  172. }
  173. ipv6_append_multipath_to_single()
  174. {
  175. fib_ipv6_append_multipath_to_single_test "testns1"
  176. }
  177. ipv6_delete_single()
  178. {
  179. fib_ipv6_delete_single_test "testns1"
  180. }
  181. ipv6_delete_multipath()
  182. {
  183. fib_ipv6_delete_multipath_test "testns1"
  184. }
  185. ipv6_replay_single()
  186. {
  187. fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
  188. }
  189. ipv6_replay_multipath()
  190. {
  191. fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
  192. }
  193. ipv6_error_path_add_single()
  194. {
  195. local lsb
  196. RET=0
  197. ip -n testns1 link add name dummy1 type dummy
  198. ip -n testns1 link set dev dummy1 up
  199. devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
  200. devlink -N testns1 dev reload $DEVLINK_DEV
  201. for lsb in $(seq 1 20); do
  202. ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \
  203. &> /dev/null
  204. done
  205. log_test "IPv6 error path - add single"
  206. ip -n testns1 link del dev dummy1
  207. }
  208. ipv6_error_path_add_multipath()
  209. {
  210. local lsb
  211. RET=0
  212. for i in $(seq 1 2); do
  213. ip -n testns1 link add name dummy$i type dummy
  214. ip -n testns1 link set dev dummy$i up
  215. ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i
  216. done
  217. devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
  218. devlink -N testns1 dev reload $DEVLINK_DEV
  219. for lsb in $(seq 1 20); do
  220. ip -n testns1 route add 2001:db8:10::${lsb}/128 \
  221. nexthop via 2001:db8:1::2 dev dummy1 \
  222. nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null
  223. done
  224. log_test "IPv6 error path - add multipath"
  225. for i in $(seq 1 2); do
  226. ip -n testns1 link del dev dummy$i
  227. done
  228. }
  229. ipv6_error_path_replay()
  230. {
  231. local lsb
  232. RET=0
  233. ip -n testns1 link add name dummy1 type dummy
  234. ip -n testns1 link set dev dummy1 up
  235. devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
  236. devlink -N testns1 dev reload $DEVLINK_DEV
  237. for lsb in $(seq 1 20); do
  238. ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
  239. done
  240. devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
  241. devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
  242. log_test "IPv6 error path - replay"
  243. ip -n testns1 link del dev dummy1
  244. # Successfully reload after deleting all the routes.
  245. devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
  246. devlink -N testns1 dev reload $DEVLINK_DEV
  247. }
  248. ipv6_error_path()
  249. {
  250. # Test the different error paths of the notifiers by limiting the size
  251. # of the "IPv6/fib" resource.
  252. ipv6_error_path_add_single
  253. ipv6_error_path_add_multipath
  254. ipv6_error_path_replay
  255. }
  256. ipv6_delete_fail()
  257. {
  258. RET=0
  259. echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
  260. ip -n testns1 link add name dummy1 type dummy
  261. ip -n testns1 link set dev dummy1 up
  262. ip -n testns1 route add 2001:db8:1::/64 dev dummy1
  263. ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null
  264. # We should not be able to delete the netdev if we are leaking a
  265. # reference.
  266. ip -n testns1 link del dev dummy1
  267. log_test "IPv6 route delete failure"
  268. echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
  269. }
  270. fib_notify_on_flag_change_set()
  271. {
  272. local notify=$1; shift
  273. ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify
  274. ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify
  275. log_info "Set fib_notify_on_flag_change to $notify"
  276. }
  277. setup_prepare()
  278. {
  279. local netdev
  280. modprobe netdevsim &> /dev/null
  281. echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
  282. while [ ! -d $SYSFS_NET_DIR ] ; do :; done
  283. ip netns add testns1
  284. if [ $? -ne 0 ]; then
  285. echo "Failed to add netns \"testns1\""
  286. exit 1
  287. fi
  288. devlink dev reload $DEVLINK_DEV netns testns1
  289. if [ $? -ne 0 ]; then
  290. echo "Failed to reload into netns \"testns1\""
  291. exit 1
  292. fi
  293. }
  294. cleanup()
  295. {
  296. pre_cleanup
  297. ip netns del testns1
  298. echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
  299. modprobe -r netdevsim &> /dev/null
  300. }
  301. trap cleanup EXIT
  302. setup_prepare
  303. fib_notify_on_flag_change_set 1
  304. tests_run
  305. fib_notify_on_flag_change_set 0
  306. tests_run
  307. exit $EXIT_STATUS