vxlan.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #!/bin/sh
  2. [ -n "$INCLUDE_ONLY" ] || {
  3. . /lib/functions.sh
  4. . /lib/functions/network.sh
  5. . ../netifd-proto.sh
  6. init_proto "$@"
  7. }
  8. proto_vxlan_setup_peer() {
  9. type bridge &> /dev/null || {
  10. proto_notify_error "$cfg" "MISSING_BRIDGE_COMMAND"
  11. exit
  12. }
  13. local peer_config="$1"
  14. local vxlan
  15. local lladdr
  16. local dst
  17. local src_vni
  18. local vni
  19. local port
  20. local via
  21. config_get vxlan "${peer_config}" "vxlan"
  22. config_get lladdr "${peer_config}" "lladdr"
  23. config_get dst "${peer_config}" "dst"
  24. config_get src_vni "${peer_config}" "src_vni"
  25. config_get vni "${peer_config}" "vni"
  26. config_get port "${peer_config}" "port"
  27. config_get via "${peer_config}" "via"
  28. [ "$cfg" = "$vxlan" ] || {
  29. # This peer section belongs to another device
  30. return
  31. }
  32. [ -n "${dst}" ] || {
  33. proto_notify_error "$cfg" "MISSING_PEER_ADDRESS"
  34. exit
  35. }
  36. bridge fdb append \
  37. ${lladdr:-00:00:00:00:00:00} \
  38. dev ${cfg} \
  39. dst ${dst} \
  40. ${src_vni:+src_vni $src_vni} \
  41. ${vni:+vni $vni} \
  42. ${port:+port $port} \
  43. ${via:+via $via}
  44. }
  45. vxlan_generic_setup() {
  46. local cfg="$1"
  47. local mode="$2"
  48. local local="$3"
  49. local remote="$4"
  50. local link="$cfg"
  51. local port vid ttl tos mtu macaddr zone rxcsum txcsum srcportmin srcportmax ageing maxaddress learning rsc proxy l2miss l3miss gbp
  52. json_get_vars port vid ttl tos mtu macaddr zone rxcsum txcsum srcportmin srcportmax ageing maxaddress learning rsc proxy l2miss l3miss gbp
  53. proto_init_update "$link" 1
  54. proto_add_tunnel
  55. json_add_string mode "$mode"
  56. [ -n "$tunlink" ] && json_add_string link "$tunlink"
  57. [ -n "$local" ] && json_add_string local "$local"
  58. [ -n "$remote" ] && json_add_string remote "$remote"
  59. [ -n "$ttl" ] && json_add_int ttl "$ttl"
  60. [ -n "$tos" ] && json_add_string tos "$tos"
  61. [ -n "$mtu" ] && json_add_int mtu "$mtu"
  62. json_add_object 'data'
  63. [ -n "$port" ] && json_add_int port "$port"
  64. [ -n "$vid" ] && json_add_int id "$vid"
  65. [ -n "$srcportmin" ] && json_add_int srcportmin "$srcportmin"
  66. [ -n "$srcportmax" ] && json_add_int srcportmax "$srcportmax"
  67. [ -n "$ageing" ] && json_add_int ageing "$ageing"
  68. [ -n "$maxaddress" ] && json_add_int maxaddress "$maxaddress"
  69. [ -n "$macaddr" ] && json_add_string macaddr "$macaddr"
  70. [ -n "$rxcsum" ] && json_add_boolean rxcsum "$rxcsum"
  71. [ -n "$txcsum" ] && json_add_boolean txcsum "$txcsum"
  72. [ -n "$learning" ] && json_add_boolean learning "$learning"
  73. [ -n "$rsc" ] && json_add_boolean rsc "$rsc"
  74. [ -n "$proxy" ] && json_add_boolean proxy "$proxy"
  75. [ -n "$l2miss" ] && json_add_boolean l2miss "$l2miss"
  76. [ -n "$l3miss" ] && json_add_boolean l3miss "$l3miss"
  77. [ -n "$gbp" ] && json_add_boolean gbp "$gbp"
  78. json_close_object
  79. proto_close_tunnel
  80. proto_add_data
  81. [ -n "$zone" ] && json_add_string zone "$zone"
  82. proto_close_data
  83. proto_send_update "$cfg"
  84. config_load network
  85. config_foreach proto_vxlan_setup_peer "vxlan_peer"
  86. }
  87. proto_vxlan_setup() {
  88. local cfg="$1"
  89. local ipaddr peeraddr
  90. json_get_vars ipaddr peeraddr tunlink
  91. ( proto_add_host_dependency "$cfg" '' "$tunlink" )
  92. case "$ipaddr" in
  93. "auto"|"")
  94. ipaddr="0.0.0.0"
  95. ;;
  96. esac
  97. vxlan_generic_setup "$cfg" 'vxlan' "$ipaddr" "$peeraddr"
  98. }
  99. proto_vxlan6_setup() {
  100. local cfg="$1"
  101. local ip6addr peer6addr
  102. json_get_vars ip6addr peer6addr tunlink
  103. ( proto_add_host_dependency "$cfg" '' "$tunlink" )
  104. case "$ip6addr" in
  105. "auto"|"")
  106. # ensure tunnel via ipv6
  107. ip6addr="::"
  108. ;;
  109. esac
  110. vxlan_generic_setup "$cfg" 'vxlan6' "$ip6addr" "$peer6addr"
  111. }
  112. proto_vxlan_teardown() {
  113. local cfg="$1"
  114. }
  115. proto_vxlan6_teardown() {
  116. local cfg="$1"
  117. }
  118. vxlan_generic_init_config() {
  119. no_device=1
  120. available=1
  121. proto_config_add_string "tunlink"
  122. proto_config_add_string "zone"
  123. proto_config_add_int "vid"
  124. proto_config_add_int "port"
  125. proto_config_add_int "ttl"
  126. proto_config_add_int "tos"
  127. proto_config_add_int "mtu"
  128. proto_config_add_int "srcportmin"
  129. proto_config_add_int "srcportmax"
  130. proto_config_add_int "ageing"
  131. proto_config_add_int "maxaddress"
  132. proto_config_add_boolean "rxcsum"
  133. proto_config_add_boolean "txcsum"
  134. proto_config_add_boolean "learning"
  135. proto_config_add_boolean "rsc"
  136. proto_config_add_boolean "proxy"
  137. proto_config_add_boolean "l2miss"
  138. proto_config_add_boolean "l3miss"
  139. proto_config_add_boolean "gbp"
  140. proto_config_add_string "macaddr"
  141. }
  142. proto_vxlan_init_config() {
  143. vxlan_generic_init_config
  144. proto_config_add_string "ipaddr"
  145. proto_config_add_string "peeraddr"
  146. }
  147. proto_vxlan6_init_config() {
  148. vxlan_generic_init_config
  149. proto_config_add_string "ip6addr"
  150. proto_config_add_string "peer6addr"
  151. }
  152. [ -n "$INCLUDE_ONLY" ] || {
  153. add_protocol vxlan
  154. add_protocol vxlan6
  155. }