router_multipath.sh 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ALL_TESTS="ping_ipv4 ping_ipv6 multipath_test"
  4. NUM_NETIFS=8
  5. source lib.sh
  6. h1_create()
  7. {
  8. vrf_create "vrf-h1"
  9. ip link set dev $h1 master vrf-h1
  10. ip link set dev vrf-h1 up
  11. ip link set dev $h1 up
  12. ip address add 192.0.2.2/24 dev $h1
  13. ip address add 2001:db8:1::2/64 dev $h1
  14. ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
  15. ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
  16. }
  17. h1_destroy()
  18. {
  19. ip route del 2001:db8:2::/64 vrf vrf-h1
  20. ip route del 198.51.100.0/24 vrf vrf-h1
  21. ip address del 2001:db8:1::2/64 dev $h1
  22. ip address del 192.0.2.2/24 dev $h1
  23. ip link set dev $h1 down
  24. vrf_destroy "vrf-h1"
  25. }
  26. h2_create()
  27. {
  28. vrf_create "vrf-h2"
  29. ip link set dev $h2 master vrf-h2
  30. ip link set dev vrf-h2 up
  31. ip link set dev $h2 up
  32. ip address add 198.51.100.2/24 dev $h2
  33. ip address add 2001:db8:2::2/64 dev $h2
  34. ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
  35. ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
  36. }
  37. h2_destroy()
  38. {
  39. ip route del 2001:db8:1::/64 vrf vrf-h2
  40. ip route del 192.0.2.0/24 vrf vrf-h2
  41. ip address del 2001:db8:2::2/64 dev $h2
  42. ip address del 198.51.100.2/24 dev $h2
  43. ip link set dev $h2 down
  44. vrf_destroy "vrf-h2"
  45. }
  46. router1_create()
  47. {
  48. vrf_create "vrf-r1"
  49. ip link set dev $rp11 master vrf-r1
  50. ip link set dev $rp12 master vrf-r1
  51. ip link set dev $rp13 master vrf-r1
  52. ip link set dev vrf-r1 up
  53. ip link set dev $rp11 up
  54. ip link set dev $rp12 up
  55. ip link set dev $rp13 up
  56. ip address add 192.0.2.1/24 dev $rp11
  57. ip address add 2001:db8:1::1/64 dev $rp11
  58. ip address add 169.254.2.12/24 dev $rp12
  59. ip address add fe80:2::12/64 dev $rp12
  60. ip address add 169.254.3.13/24 dev $rp13
  61. ip address add fe80:3::13/64 dev $rp13
  62. ip route add 198.51.100.0/24 vrf vrf-r1 \
  63. nexthop via 169.254.2.22 dev $rp12 \
  64. nexthop via 169.254.3.23 dev $rp13
  65. ip route add 2001:db8:2::/64 vrf vrf-r1 \
  66. nexthop via fe80:2::22 dev $rp12 \
  67. nexthop via fe80:3::23 dev $rp13
  68. }
  69. router1_destroy()
  70. {
  71. ip route del 2001:db8:2::/64 vrf vrf-r1
  72. ip route del 198.51.100.0/24 vrf vrf-r1
  73. ip address del fe80:3::13/64 dev $rp13
  74. ip address del 169.254.3.13/24 dev $rp13
  75. ip address del fe80:2::12/64 dev $rp12
  76. ip address del 169.254.2.12/24 dev $rp12
  77. ip address del 2001:db8:1::1/64 dev $rp11
  78. ip address del 192.0.2.1/24 dev $rp11
  79. ip link set dev $rp13 down
  80. ip link set dev $rp12 down
  81. ip link set dev $rp11 down
  82. vrf_destroy "vrf-r1"
  83. }
  84. router2_create()
  85. {
  86. vrf_create "vrf-r2"
  87. ip link set dev $rp21 master vrf-r2
  88. ip link set dev $rp22 master vrf-r2
  89. ip link set dev $rp23 master vrf-r2
  90. ip link set dev vrf-r2 up
  91. ip link set dev $rp21 up
  92. ip link set dev $rp22 up
  93. ip link set dev $rp23 up
  94. ip address add 198.51.100.1/24 dev $rp21
  95. ip address add 2001:db8:2::1/64 dev $rp21
  96. ip address add 169.254.2.22/24 dev $rp22
  97. ip address add fe80:2::22/64 dev $rp22
  98. ip address add 169.254.3.23/24 dev $rp23
  99. ip address add fe80:3::23/64 dev $rp23
  100. ip route add 192.0.2.0/24 vrf vrf-r2 \
  101. nexthop via 169.254.2.12 dev $rp22 \
  102. nexthop via 169.254.3.13 dev $rp23
  103. ip route add 2001:db8:1::/64 vrf vrf-r2 \
  104. nexthop via fe80:2::12 dev $rp22 \
  105. nexthop via fe80:3::13 dev $rp23
  106. }
  107. router2_destroy()
  108. {
  109. ip route del 2001:db8:1::/64 vrf vrf-r2
  110. ip route del 192.0.2.0/24 vrf vrf-r2
  111. ip address del fe80:3::23/64 dev $rp23
  112. ip address del 169.254.3.23/24 dev $rp23
  113. ip address del fe80:2::22/64 dev $rp22
  114. ip address del 169.254.2.22/24 dev $rp22
  115. ip address del 2001:db8:2::1/64 dev $rp21
  116. ip address del 198.51.100.1/24 dev $rp21
  117. ip link set dev $rp23 down
  118. ip link set dev $rp22 down
  119. ip link set dev $rp21 down
  120. vrf_destroy "vrf-r2"
  121. }
  122. multipath4_test()
  123. {
  124. local desc="$1"
  125. local weight_rp12=$2
  126. local weight_rp13=$3
  127. local t0_rp12 t0_rp13 t1_rp12 t1_rp13
  128. local packets_rp12 packets_rp13
  129. # Transmit multiple flows from h1 to h2 and make sure they are
  130. # distributed between both multipath links (rp12 and rp13)
  131. # according to the configured weights.
  132. sysctl_set net.ipv4.fib_multipath_hash_policy 1
  133. ip route replace 198.51.100.0/24 vrf vrf-r1 \
  134. nexthop via 169.254.2.22 dev $rp12 weight $weight_rp12 \
  135. nexthop via 169.254.3.23 dev $rp13 weight $weight_rp13
  136. t0_rp12=$(link_stats_tx_packets_get $rp12)
  137. t0_rp13=$(link_stats_tx_packets_get $rp13)
  138. ip vrf exec vrf-h1 $MZ -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
  139. -d 1msec -t udp "sp=1024,dp=0-32768"
  140. t1_rp12=$(link_stats_tx_packets_get $rp12)
  141. t1_rp13=$(link_stats_tx_packets_get $rp13)
  142. let "packets_rp12 = $t1_rp12 - $t0_rp12"
  143. let "packets_rp13 = $t1_rp13 - $t0_rp13"
  144. multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
  145. # Restore settings.
  146. ip route replace 198.51.100.0/24 vrf vrf-r1 \
  147. nexthop via 169.254.2.22 dev $rp12 \
  148. nexthop via 169.254.3.23 dev $rp13
  149. sysctl_restore net.ipv4.fib_multipath_hash_policy
  150. }
  151. multipath6_l4_test()
  152. {
  153. local desc="$1"
  154. local weight_rp12=$2
  155. local weight_rp13=$3
  156. local t0_rp12 t0_rp13 t1_rp12 t1_rp13
  157. local packets_rp12 packets_rp13
  158. # Transmit multiple flows from h1 to h2 and make sure they are
  159. # distributed between both multipath links (rp12 and rp13)
  160. # according to the configured weights.
  161. sysctl_set net.ipv6.fib_multipath_hash_policy 1
  162. ip route replace 2001:db8:2::/64 vrf vrf-r1 \
  163. nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
  164. nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
  165. t0_rp12=$(link_stats_tx_packets_get $rp12)
  166. t0_rp13=$(link_stats_tx_packets_get $rp13)
  167. $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
  168. -d 1msec -t udp "sp=1024,dp=0-32768"
  169. t1_rp12=$(link_stats_tx_packets_get $rp12)
  170. t1_rp13=$(link_stats_tx_packets_get $rp13)
  171. let "packets_rp12 = $t1_rp12 - $t0_rp12"
  172. let "packets_rp13 = $t1_rp13 - $t0_rp13"
  173. multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
  174. ip route replace 2001:db8:2::/64 vrf vrf-r1 \
  175. nexthop via fe80:2::22 dev $rp12 \
  176. nexthop via fe80:3::23 dev $rp13
  177. sysctl_restore net.ipv6.fib_multipath_hash_policy
  178. }
  179. multipath6_test()
  180. {
  181. local desc="$1"
  182. local weight_rp12=$2
  183. local weight_rp13=$3
  184. local t0_rp12 t0_rp13 t1_rp12 t1_rp13
  185. local packets_rp12 packets_rp13
  186. ip route replace 2001:db8:2::/64 vrf vrf-r1 \
  187. nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \
  188. nexthop via fe80:3::23 dev $rp13 weight $weight_rp13
  189. t0_rp12=$(link_stats_tx_packets_get $rp12)
  190. t0_rp13=$(link_stats_tx_packets_get $rp13)
  191. # Generate 16384 echo requests, each with a random flow label.
  192. for _ in $(seq 1 16384); do
  193. ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q &> /dev/null
  194. done
  195. t1_rp12=$(link_stats_tx_packets_get $rp12)
  196. t1_rp13=$(link_stats_tx_packets_get $rp13)
  197. let "packets_rp12 = $t1_rp12 - $t0_rp12"
  198. let "packets_rp13 = $t1_rp13 - $t0_rp13"
  199. multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
  200. ip route replace 2001:db8:2::/64 vrf vrf-r1 \
  201. nexthop via fe80:2::22 dev $rp12 \
  202. nexthop via fe80:3::23 dev $rp13
  203. }
  204. multipath_test()
  205. {
  206. log_info "Running IPv4 multipath tests"
  207. multipath4_test "ECMP" 1 1
  208. multipath4_test "Weighted MP 2:1" 2 1
  209. multipath4_test "Weighted MP 11:45" 11 45
  210. log_info "Running IPv6 multipath tests"
  211. multipath6_test "ECMP" 1 1
  212. multipath6_test "Weighted MP 2:1" 2 1
  213. multipath6_test "Weighted MP 11:45" 11 45
  214. log_info "Running IPv6 L4 hash multipath tests"
  215. multipath6_l4_test "ECMP" 1 1
  216. multipath6_l4_test "Weighted MP 2:1" 2 1
  217. multipath6_l4_test "Weighted MP 11:45" 11 45
  218. }
  219. setup_prepare()
  220. {
  221. h1=${NETIFS[p1]}
  222. rp11=${NETIFS[p2]}
  223. rp12=${NETIFS[p3]}
  224. rp22=${NETIFS[p4]}
  225. rp13=${NETIFS[p5]}
  226. rp23=${NETIFS[p6]}
  227. rp21=${NETIFS[p7]}
  228. h2=${NETIFS[p8]}
  229. vrf_prepare
  230. h1_create
  231. h2_create
  232. router1_create
  233. router2_create
  234. forwarding_enable
  235. }
  236. cleanup()
  237. {
  238. pre_cleanup
  239. forwarding_restore
  240. router2_destroy
  241. router1_destroy
  242. h2_destroy
  243. h1_destroy
  244. vrf_cleanup
  245. }
  246. ping_ipv4()
  247. {
  248. ping_test $h1 198.51.100.2
  249. }
  250. ping_ipv6()
  251. {
  252. ping6_test $h1 2001:db8:2::2
  253. }
  254. trap cleanup EXIT
  255. setup_prepare
  256. setup_wait
  257. tests_run
  258. exit $EXIT_STATUS