router_scale.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ROUTER_NUM_NETIFS=4
  4. router_h1_create()
  5. {
  6. simple_if_init $h1 192.0.1.1/24
  7. ip route add 193.0.0.0/8 via 192.0.1.2 dev $h1
  8. }
  9. router_h1_destroy()
  10. {
  11. ip route del 193.0.0.0/8 via 192.0.1.2 dev $h1
  12. simple_if_fini $h1 192.0.1.1/24
  13. }
  14. router_h2_create()
  15. {
  16. simple_if_init $h2 192.0.2.1/24
  17. tc qdisc add dev $h2 handle ffff: ingress
  18. }
  19. router_h2_destroy()
  20. {
  21. tc qdisc del dev $h2 handle ffff: ingress
  22. simple_if_fini $h2 192.0.2.1/24
  23. }
  24. router_create()
  25. {
  26. ip link set dev $rp1 up
  27. ip link set dev $rp2 up
  28. ip address add 192.0.1.2/24 dev $rp1
  29. ip address add 192.0.2.2/24 dev $rp2
  30. }
  31. router_destroy()
  32. {
  33. ip address del 192.0.2.2/24 dev $rp2
  34. ip address del 192.0.1.2/24 dev $rp1
  35. ip link set dev $rp2 down
  36. ip link set dev $rp1 down
  37. }
  38. router_setup_prepare()
  39. {
  40. h1=${NETIFS[p1]}
  41. rp1=${NETIFS[p2]}
  42. rp2=${NETIFS[p3]}
  43. h2=${NETIFS[p4]}
  44. h1mac=$(mac_get $h1)
  45. rp1mac=$(mac_get $rp1)
  46. vrf_prepare
  47. router_h1_create
  48. router_h2_create
  49. router_create
  50. }
  51. router_offload_validate()
  52. {
  53. local route_count=$1
  54. local offloaded_count
  55. offloaded_count=$(ip route | grep -o 'offload' | wc -l)
  56. [[ $offloaded_count -ge $route_count ]]
  57. }
  58. router_routes_create()
  59. {
  60. local route_count=$1
  61. local count=0
  62. ROUTE_FILE="$(mktemp)"
  63. for i in {0..255}
  64. do
  65. for j in {0..255}
  66. do
  67. for k in {0..255}
  68. do
  69. if [[ $count -eq $route_count ]]; then
  70. break 3
  71. fi
  72. echo route add 193.${i}.${j}.${k}/32 via \
  73. 192.0.2.1 dev $rp2 >> $ROUTE_FILE
  74. ((count++))
  75. done
  76. done
  77. done
  78. ip -b $ROUTE_FILE &> /dev/null
  79. }
  80. router_routes_destroy()
  81. {
  82. if [[ -v ROUTE_FILE ]]; then
  83. rm -f $ROUTE_FILE
  84. fi
  85. }
  86. router_test()
  87. {
  88. local route_count=$1
  89. local should_fail=$2
  90. local count=0
  91. RET=0
  92. router_routes_create $route_count
  93. router_offload_validate $route_count
  94. check_err_fail $should_fail $? "Offload of $route_count routes"
  95. if [[ $RET -ne 0 ]] || [[ $should_fail -eq 1 ]]; then
  96. return
  97. fi
  98. tc filter add dev $h2 ingress protocol ip pref 1 flower \
  99. skip_sw dst_ip 193.0.0.0/8 action drop
  100. for i in {0..255}
  101. do
  102. for j in {0..255}
  103. do
  104. for k in {0..255}
  105. do
  106. if [[ $count -eq $route_count ]]; then
  107. break 3
  108. fi
  109. $MZ $h1 -c 1 -p 64 -a $h1mac -b $rp1mac \
  110. -A 192.0.1.1 -B 193.${i}.${j}.${k} \
  111. -t ip -q
  112. ((count++))
  113. done
  114. done
  115. done
  116. tc_check_packets "dev $h2 ingress" 1 $route_count
  117. check_err $? "Offload mismatch"
  118. tc filter del dev $h2 ingress protocol ip pref 1 flower \
  119. skip_sw dst_ip 193.0.0.0/8 action drop
  120. router_routes_destroy
  121. }
  122. router_cleanup()
  123. {
  124. pre_cleanup
  125. router_routes_destroy
  126. router_destroy
  127. router_h2_destroy
  128. router_h1_destroy
  129. vrf_cleanup
  130. }