Fix pptp handling of routes to server.
authorGabor Juhos <juhosg@openwrt.org>
Thu, 3 May 2012 09:39:01 +0000 (09:39 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 3 May 2012 09:39:01 +0000 (09:39 +0000)
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 <David.Woodhouse@intel.com>
SVN-Revision: 31565

package/pptp/Makefile
package/pptp/files/pptp.sh

index a6d213d387e85571bd2739a08e860b8b46f0726a..748abde5a83dbcf781f7b638b08422f7c7676cac 100644 (file)
@@ -23,7 +23,7 @@ define Package/pptp
   TITLE:=PPTP client
   MAINTAINER:=Jo-Philipp Wich <xm@subsignal.org>
   URL:=http://pptpclient.sourceforge.net/
-  DEPENDS:=+ppp +kmod-gre +resolveip
+  DEPENDS:=+ppp +kmod-gre +resolveip +ip
 endef
 
 define Package/pptp/description
index 19023e7ef45ac1c0a807654d6c1d497e5ed69f24..b898769b660e425f37a3c9d5b5d2e7f3a74e54e4 100644 (file)
@@ -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() {
@@ -9,7 +10,7 @@ scan_pptp() {
 stop_interface_pptp() {
        stop_interface_ppp "$1"
        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
 }
 
@@ -36,16 +37,13 @@ setup_interface_pptp() {
        done
        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
        config_get netmask "$config" netmask