openwrt/package/pptp/files/pptp.sh
Gabor Juhos 60db046ef2 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
2012-05-03 09:39:01 +00:00

59 lines
1.3 KiB
Bash

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() {
config_set "$1" device "pptp-$1"
}
stop_interface_pptp() {
stop_interface_ppp "$1"
for ip in $(uci_get_state network "$1" serv_addrs); do
ip route del "$ip" 2>/dev/null
done
}
coldplug_interface_pptp() {
setup_interface_pptp "pptp-$1" "$1"
}
setup_interface_pptp() {
local config="$2"
local ifname
local device
config_get device "$config" device
local server
config_get server "$config" server
local buffering
config_get_bool buffering "$config" buffering 1
[ "$buffering" == 0 ] && buffering="--nobuffer" || buffering=
for module in slhc ppp_generic ppp_async ip_gre; do
/sbin/insmod $module 2>&- >&-
done
sleep 1
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
[ -z "$netmask" -o -z "$device" ] || ifconfig $device netmask $netmask
config_get mtu "$config" mtu
mtu=${mtu:-1452}
start_pppd "$config" \
pty "/usr/sbin/pptp $server --loglevel 0 --nolaunchpppd $buffering" \
file /etc/ppp/options.pptp \
mtu $mtu mru $mtu
}