setup-integ.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/bin/bash
  2. set -ex
  3. if [[ $UID -ne 0 ]] # TODO: check for permissions instead (we can have CAP_NET_ADMIN without root)
  4. then
  5. sudo "$0" "$@"
  6. exit $?
  7. fi
  8. # Topology: with one or 3 netns
  9. #
  10. # * 3-netns, for relay operations
  11. # --------------------------------
  12. # | server (cdhcp_srv <---------) | Upper netns
  13. # -----------------------------|--
  14. # | (veth pair)
  15. # -----------------------------|---
  16. # | relay upper (cdhcp_relay_u <-) |
  17. # | | Relay netns
  18. # | relay lower (cdhcp_relay_d <-) |
  19. # -----------------------------|--
  20. # | (veth pair)
  21. # ------------------------------|--
  22. # | client (cdhcp_cli <---------) | Lower netns
  23. # ---------------------------------
  24. #
  25. # For 2-netns operation, remove the entire middle layer:
  26. #
  27. # --------------------------------
  28. # | server (cdhcp_srv <---------) | Upper netns
  29. # -----------------------------|--
  30. # | (veth pair)
  31. # ------------------------------|--
  32. # | client (cdhcp_cli <---------) | Lower netns
  33. # ---------------------------------
  34. #
  35. # Interface names are limited to 15 chars (IFNAMSIZ=16)
  36. if_server=cdhcp_srv
  37. if_relay_up=cdhcp_relay_u
  38. if_relay_down=cdhcp_relay_d
  39. if_client=cdhcp_cli
  40. netns_server=coredhcp-upper
  41. netns_relay=coredhcp-middle
  42. netns_client=coredhcp-lower
  43. netns_direct_server=coredhcp-direct-upper
  44. netns_direct_client=coredhcp-direct-lower
  45. ula_prefix=${ULA_PREFIX:-fd4f:6b37:542c:b643}
  46. all_ns=("$netns_server" "$netns_relay" "$netns_client" "$netns_direct_server" "$netns_direct_client")
  47. # Clean existing namespaces
  48. for netns in "${all_ns[@]}"; do
  49. ip netns delete "$netns" || true
  50. done
  51. [[ $1 == teardown ]] && exit
  52. # create namespaces
  53. for netns in "${all_ns[@]}"; do
  54. ip netns add "$netns"
  55. done
  56. # Create the links in one of the relevant netns, to ensure we don't pollute the main netns
  57. ip -n "$netns_client" link add "$if_client" type veth peer name "$if_relay_down"
  58. ip -n "$netns_client" link set "$if_relay_down" netns "$netns_relay"
  59. ip -n "$netns_server" link add "$if_server" type veth peer name "$if_relay_up"
  60. ip -n "$netns_server" link set "$if_relay_up" netns "$netns_relay"
  61. # configure networking on the veth interfaces
  62. ip -n "$netns_server" addr add "${ula_prefix}:a::1/80" dev "$if_server"
  63. ip -n "$netns_server" addr add "10.0.1.1/24" dev "$if_server"
  64. ip -n "$netns_server" link set "$if_server" up
  65. ip -n "$netns_client" addr add "${ula_prefix}:b::1/80" dev "$if_client"
  66. ip -n "$netns_client" addr add "10.0.2.1/24" dev "$if_client"
  67. ip -n "$netns_client" link set "$if_client" up
  68. ip -n "$netns_relay" addr add "${ula_prefix}:b::2/80" dev "$if_relay_down"
  69. ip -n "$netns_relay" addr add "${ula_prefix}:a::2/80" dev "$if_relay_up"
  70. ip -n "$netns_relay" addr add "10.0.2.2/24" dev "$if_relay_down"
  71. ip -n "$netns_relay" addr add "10.0.1.2/24" dev "$if_relay_up"
  72. ip -n "$netns_relay" link set "$if_relay_down" up
  73. ip -n "$netns_relay" link set "$if_relay_up" up
  74. # Now setup the direct-attach ns (with the same addresses as in the relay scenario)
  75. ip -n "$netns_direct_client" link add "$if_client" type veth peer name "$if_server"
  76. ip -n "$netns_direct_client" link set "$if_server" netns "$netns_direct_server"
  77. # Use the same addresses as the direct-attached version; with a larger subnet so they can link
  78. ip -n "$netns_direct_server" addr add "${ula_prefix}:a::1/64" dev "$if_server"
  79. ip -n "$netns_direct_server" addr add "10.0.1.1/16" dev "$if_server"
  80. ip -n "$netns_direct_server" link set "$if_server" up
  81. ip -n "$netns_direct_client" addr add "${ula_prefix}:b::1/64" dev "$if_client"
  82. ip -n "$netns_direct_client" addr add "10.0.2.1/16" dev "$if_client"
  83. ip -n "$netns_direct_client" link set "$if_client" up
  84. # show what we did
  85. set +x
  86. for netns in "${all_ns[@]}"; do
  87. echo "# Addresses in $netns:"
  88. ip -n "$netns" address list
  89. done