Browse Source

6in4: - support to automatically determine the local endpoint address from the current IPv4 default gateway - support updating the tunnel endpoint for he.net

SVN-Revision: 21612
Jo-Philipp Wich 15 years ago
parent
commit
0bd7c65447
3 changed files with 86 additions and 16 deletions
  1. 3 1
      package/6in4/Makefile
  2. 44 0
      package/6in4/files/6in4.hotplug
  3. 39 15
      package/6in4/files/6in4.sh

+ 3 - 1
package/6in4/Makefile

@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=6in4
-PKG_VERSION:=1
+PKG_VERSION:=2
 PKG_RELEASE:=1
 
 include $(INCLUDE_DIR)/package.mk
@@ -36,6 +36,8 @@ endef
 define Package/6in4/install
 	$(INSTALL_DIR) $(1)/lib/network
 	$(INSTALL_DATA) ./files/6in4.sh $(1)/lib/network/6in4.sh
+	$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+	$(INSTALL_DATA) ./files/6in4.hotplug $(1)/etc/hotplug.d/iface/90-6in4
 endef
 
 $(eval $(call BuildPackage,6in4))

+ 44 - 0
package/6in4/files/6in4.hotplug

@@ -0,0 +1,44 @@
+#!/bin/sh
+
+if [ "$ACTION" = ifup ]; then
+	. /etc/functions.sh
+
+	include /lib/network
+	scan_interfaces
+
+	update_tunnel() {
+		local cfg="$1"
+
+		local proto
+		config_get proto "$cfg" proto
+		[ "$proto" = 6in4 ] || return 0
+
+		local wandev
+		config_get wandev "$cfg" wan_device
+		[ "$wandev" = "$DEVICE" ] || return 0
+
+		local oldip
+		local wanip=$(find_6in4_wanip "$wandev")
+		config_get oldip "$cfg" ipaddr
+
+		[ -n "$wanip" ] && [ "$oldip" != "$wanip" ] && {
+			local tunnelid
+			config_get tunnelid "$cfg" tunnelid
+
+			local username
+			config_get username "$cfg" username
+
+			local password
+			config_get password "$cfg" password
+
+			[ -n "$tunnelid" ] && [ -n "$username" ] && [ -n "$password" ] && {
+				password="$(echo -n "$password" | md5sum)"; password="${password%% *}"
+				uci_set_state network "$cfg" ipaddr "$wanip"
+
+				( wget -qO/dev/null "http://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=AUTO&user_id=$username&pass=$password&tunnel_id=$tunnelid" && ifup "$cfg" )&
+			}
+		}
+	}
+
+	config_foreach update_tunnel interface
+fi

+ 39 - 15
package/6in4/files/6in4.sh

@@ -1,6 +1,16 @@
 # 6in4.sh - IPv6-in-IPv4 tunnel backend
 # Copyright (c) 2010 OpenWrt.org
 
+find_6in4_wanif() {
+	local if=$(ip -4 r l e 0/0); if="${if#default via * dev }"; if="${if%% *}"
+	[ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if"
+}
+
+find_6in4_wanip() {
+	local ip=$(ip -4 a s dev "$1"); ip="${ip#*inet }"
+	echo "${ip%%/[0-9]* brd *}"
+}
+
 # Hook into scan_interfaces() to synthesize a .device option
 # This is needed for /sbin/ifup to properly dispatch control
 # to setup_interface_6in4() even if no .ifname is set in
@@ -36,26 +46,40 @@ setup_interface_6in4() {
 	local defaultroute
 	config_get_bool defaultroute "$cfg" defaultroute 1
 
+	# If local4 is unset, guess local IPv4 address from the
+	# interface used by the default route.
+	[ -z "$local4" ] && {
+		local wanif=$(find_6in4_wanif)
+		[ -n "$wanif" ] && {
+			local4=$(find_6in4_wanip "$wanif")
+			uci_set_state network "$cfg" wan_device "$wanif"
+		}
+	}
 
-	# creating the tunnel below will trigger a net subsystem event
-	# prevent it from touching or iface by disabling .auto here
-	uci_set_state network "$cfg" ifname $link
-	uci_set_state network "$cfg" auto 0
+	[ -n "$local4" ] && {
+		# creating the tunnel below will trigger a net subsystem event
+		# prevent it from touching or iface by disabling .auto here
+		uci_set_state network "$cfg" ifname $link
+		uci_set_state network "$cfg" auto 0
 
-	ip tunnel add $link mode sit remote $remote4 local $local4 ttl 255
-	ip link set $link up
-	ip link set mtu ${mtu:-1280} dev $link
-	ip tunnel change $link ttl ${ttl:-64}
-	ip addr add $local6 dev $link
+		ip tunnel add $link mode sit remote $remote4 local $local4 ttl 255
+		ip link set $link up
+		ip link set mtu ${mtu:-1280} dev $link
+		ip tunnel change $link ttl ${ttl:-64}
+		ip addr add $local6 dev $link
 
-	uci_set_state network "$cfg" ip6addr $local6
+		uci_set_state network "$cfg" ipaddr $local4
+		uci_set_state network "$cfg" ip6addr $local6
 
-	[ "$defaultroute" = 1 ] && {
-		ip -6 route add ::/0 dev $link
-		uci_set_state network "$cfg" defaultroute 1
-	}
+		[ "$defaultroute" = 1 ] && {
+			ip -6 route add ::/0 dev $link
+			uci_set_state network "$cfg" defaultroute 1
+		}
 
-	env -i ACTION="ifup" INTERFACE="$cfg" DEVICE="$link" PROTO=6in4 /sbin/hotplug-call "iface" &
+		env -i ACTION="ifup" INTERFACE="$cfg" DEVICE="$link" PROTO=6in4 /sbin/hotplug-call "iface" &
+	} || {
+		echo "Cannot determine local IPv4 address for 6in4 tunnel $cfg - skipping"
+	}
 }
 
 stop_interface_6in4() {