summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2012-05-03 09:39:01 +0000
committerGabor Juhos <juhosg@openwrt.org>2012-05-03 09:39:01 +0000
commit60db046ef28501513c3a58e3b23a070fa0b9bcc4 (patch)
treecc013c25c642b64cd16de65a39b4204d7e2a0ab0
parent97697c332fd4a67878b0aa8af8a03d1b1ef7c298 (diff)
downloadmaster-31e0f0ae-60db046ef28501513c3a58e3b23a070fa0b9bcc4.tar.gz
master-31e0f0ae-60db046ef28501513c3a58e3b23a070fa0b9bcc4.tar.bz2
master-31e0f0ae-60db046ef28501513c3a58e3b23a070fa0b9bcc4.zip
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 <David.Woodhouse@intel.com> SVN-Revision: 31565
-rw-r--r--package/pptp/Makefile2
-rw-r--r--package/pptp/files/pptp.sh24
2 files changed, 12 insertions, 14 deletions
diff --git a/package/pptp/Makefile b/package/pptp/Makefile
index a6d213d387..748abde5a8 100644
--- a/package/pptp/Makefile
+++ b/package/pptp/Makefile
@@ -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
diff --git a/package/pptp/files/pptp.sh b/package/pptp/files/pptp.sh
index 19023e7ef4..b898769b66 100644
--- a/package/pptp/files/pptp.sh
+++ b/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() {
@@ -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