Browse Source

Fix pptp handling of routes to server.

The existing code is fairly broken. It assumes you're using Legacy IP, and
it assumes that the server is reachable via your default route. Via the
first default route in the 'route -n' output, in fact, regardless of metric.

Fix all those problems by using 'ip route get' to really find the *current*
route to the server, and install a host-specific route to match.

Signed-off-by: David Woodhouse <[email protected]>

SVN-Revision: 31565
Gabor Juhos 13 years ago
parent
commit
60db046ef2
2 changed files with 12 additions and 14 deletions
  1. 1 1
      package/pptp/Makefile
  2. 11 13
      package/pptp/files/pptp.sh

+ 1 - 1
package/pptp/Makefile

@@ -23,7 +23,7 @@ define Package/pptp
   TITLE:=PPTP client
   TITLE:=PPTP client
   MAINTAINER:=Jo-Philipp Wich <[email protected]>
   MAINTAINER:=Jo-Philipp Wich <[email protected]>
   URL:=http://pptpclient.sourceforge.net/
   URL:=http://pptpclient.sourceforge.net/
-  DEPENDS:=+ppp +kmod-gre +resolveip
+  DEPENDS:=+ppp +kmod-gre +resolveip +ip
 endef
 endef
 
 
 define Package/pptp/description
 define Package/pptp/description

+ 11 - 13
package/pptp/files/pptp.sh

@@ -1,5 +1,6 @@
-find_gw() {
-	route -n | awk '$1 == "0.0.0.0" { print $2; exit }'
+find_route() {
+	ip route get $1 | sed -e 's/ /\n/g' | \
+            sed -ne '1p;/via/{N;p};/dev/{N;p};/src/{N;p};/mtu/{N;p}'
 }
 }
 
 
 scan_pptp() {
 scan_pptp() {
@@ -9,7 +10,7 @@ scan_pptp() {
 stop_interface_pptp() {
 stop_interface_pptp() {
 	stop_interface_ppp "$1"
 	stop_interface_ppp "$1"
 	for ip in $(uci_get_state network "$1" serv_addrs); do
 	for ip in $(uci_get_state network "$1" serv_addrs); do
-		route del -host "$ip" 2>/dev/null
+		ip route del "$ip" 2>/dev/null
 	done
 	done
 }
 }
 
 
@@ -36,16 +37,13 @@ setup_interface_pptp() {
 	done
 	done
 	sleep 1
 	sleep 1
 
 
-	local gw="$(find_gw)"
-	[ -n "$gw" ] && {
-		local serv_addrs=""
-		for ip in $(resolveip -4 -t 3 "$server"); do
-			append serv_addrs "$ip"
-			route delete -host "$ip" 2>/dev/null
-			route add -host "$ip" gw "$gw"
-		done
-		uci_toggle_state network "$config" serv_addrs "$serv_addrs"
-	}
+	local serv_addrs=""
+	for ip in $(resolveip -t 3 "${server}"); do
+		append serv_addrs "$ip"
+		ip route replace $(find_route $ip)
+	done
+	uci_toggle_state network "$config" serv_addrs "$serv_addrs"
+}
 
 
 	# fix up the netmask
 	# fix up the netmask
 	config_get netmask "$config" netmask
 	config_get netmask "$config" netmask