vxlan: allow for dynamic source ip selection (FS#3426)
authorJohannes Kimmel <fff@bareminimum.eu>
Mon, 14 Dec 2020 23:31:52 +0000 (00:31 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Thu, 31 Dec 2020 10:53:21 +0000 (11:53 +0100)
By setting 'auto', the zero address or the empty string as source
address (option ipaddr, option ip6addr), vxlan will choose one
dynamically. This helps in setups where a wan ip or prefix changes.

This corresponse to setting up an vxlan tunnel with:

proto vxlan6:
    # ip link add vx0 type vxlan id ID local :: ...
proto vxlan:
    # ip link add vx0 type vxlan id ID local 0.0.0.0 ...

While it is possible to not specify a source ip at all, the kernel will
default to setting up a ipv4 tunnel. The kernel will take any hint from
source and peer ips to figure out, what tunnel type to use. To make sure
we setup an ipv6 tunnel for proto vxlan6, this workaround is needed.

This will not change the behaviour of currently working configurations.
However this will allow former broken configurations, namely those not
specifying both a source address and tunnel interface, to setup a
tunnel interface. Previously those configurations weren't reporting an
error and were stueck in a setup loop like in Bug FS#3426.

This change lifts the currently very strict behaviour and should fix the
following bug:

Fixes: FS#3426
Ref: https://bugs.openwrt.org/index.php?do=details&task_id=3426

Signed-off-by: Johannes Kimmel <fff@bareminimum.eu>
package/network/config/vxlan/Makefile
package/network/config/vxlan/files/vxlan.sh

index 0b4d6713f9e1cfcad9f4c94272f8dc9192b7f3b4..97972d6d85bddc56d1575088d3966ae6899f06da 100644 (file)
@@ -1,7 +1,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=vxlan
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 PKG_LICENSE:=GPL-2.0
 
 include $(INCLUDE_DIR)/package.mk
index 5c1c484c47f7fb48f1cb705b200d589df77a60f6..a087c4a3ce2ca42a6b8d43b2254d0ea7379c0936 100755 (executable)
@@ -114,18 +114,11 @@ proto_vxlan_setup() {
 
        ( proto_add_host_dependency "$cfg" '' "$tunlink" )
 
-       [ -z "$ipaddr" ] && {
-               local wanif="$tunlink"
-               if [ -z "$wanif" ] && ! network_find_wan wanif; then
-                       proto_notify_error "$cfg" "NO_WAN_LINK"
-                       exit
-               fi
-
-               if ! network_get_ipaddr ipaddr "$wanif"; then
-                       proto_notify_error "$cfg" "NO_WAN_LINK"
-                       exit
-               fi
-       }
+       case "$ipaddr" in
+               "auto"|"")
+                       ipaddr="0.0.0.0"
+                       ;;
+       esac
 
        vxlan_generic_setup "$cfg" 'vxlan' "$ipaddr" "$peeraddr"
 }
@@ -138,18 +131,12 @@ proto_vxlan6_setup() {
 
        ( proto_add_host_dependency "$cfg" '' "$tunlink" )
 
-       [ -z "$ip6addr" ] && {
-               local wanif="$tunlink"
-               if [ -z "$wanif" ] && ! network_find_wan6 wanif; then
-                       proto_notify_error "$cfg" "NO_WAN_LINK"
-                       exit
-               fi
-
-               if ! network_get_ipaddr6 ip6addr "$wanif"; then
-                       proto_notify_error "$cfg" "NO_WAN_LINK"
-                       exit
-               fi
-       }
+       case "$ip6addr" in
+               "auto"|"")
+                       # ensure tunnel via ipv6
+                       ip6addr="::"
+                       ;;
+       esac
 
        vxlan_generic_setup "$cfg" 'vxlan6' "$ip6addr" "$peer6addr"
 }