bc356cef82
Port Debians adaptive LCP echo patch to pppd, make it configurable with UCI and enable it by default. When adaptive LCP echo is enabled, LCP echo requests are only sent if the link is idle, this avoids the common situation where a congested PPP link (e.g. during torrenting) is falsely detected as disconnected because the LCP replies are not received in time. Also bump the copyright year in the Makefile, remove a redundant maintainer entry and fix the shell processing of the keepalive option when the two- value syntax is used. Signed-off-by: Jo-Philipp Wich <jow@openwrt.org> SVN-Revision: 43143
227 lines
4.9 KiB
Bash
Executable file
227 lines
4.9 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
[ -x /usr/sbin/pppd ] || exit 0
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
. /lib/functions.sh
|
|
. ../netifd-proto.sh
|
|
init_proto "$@"
|
|
}
|
|
|
|
ppp_generic_init_config() {
|
|
proto_config_add_string username
|
|
proto_config_add_string password
|
|
proto_config_add_string keepalive
|
|
proto_config_add_boolean keepalive_adaptive
|
|
proto_config_add_int demand
|
|
proto_config_add_string pppd_options
|
|
proto_config_add_string 'connect:file'
|
|
proto_config_add_string 'disconnect:file'
|
|
proto_config_add_string ipv6
|
|
proto_config_add_boolean authfail
|
|
proto_config_add_int mtu
|
|
proto_config_add_string pppname
|
|
}
|
|
|
|
ppp_generic_setup() {
|
|
local config="$1"; shift
|
|
|
|
json_get_vars ipv6 demand keepalive keepalive_adaptive username password pppd_options pppname
|
|
if [ "$ipv6" = 0 ]; then
|
|
ipv6=""
|
|
elif [ -z "$ipv6" -o "$ipv6" = auto ]; then
|
|
ipv6=1
|
|
proto_export "AUTOIPV6=1"
|
|
fi
|
|
|
|
if [ "${demand:-0}" -gt 0 ]; then
|
|
demand="precompiled-active-filter /etc/ppp/filter demand idle $demand"
|
|
else
|
|
demand="persist"
|
|
fi
|
|
[ -n "$mtu" ] || json_get_var mtu mtu
|
|
[ -n "$pppname" ] || pppname="${proto:-ppp}-$config"
|
|
|
|
local lcp_failure="${keepalive%%[, ]*}"
|
|
local lcp_interval="${keepalive##*[, ]}"
|
|
local lcp_adaptive="lcp-echo-adaptive"
|
|
[ "${lcp_failure:-0}" -lt 1 ] && lcp_failure=""
|
|
[ "$lcp_interval" != "$keepalive" ] || lcp_interval=5
|
|
[ "${keepalive_adaptive:-1}" -lt 1 ] && lcp_adaptive=""
|
|
[ -n "$connect" ] || json_get_var connect connect
|
|
[ -n "$disconnect" ] || json_get_var disconnect disconnect
|
|
|
|
proto_run_command "$config" /usr/sbin/pppd \
|
|
nodetach ipparam "$config" \
|
|
ifname "$pppname" \
|
|
${lcp_failure:+lcp-echo-interval $lcp_interval lcp-echo-failure $lcp_failure $lcp_adaptive} \
|
|
${ipv6:++ipv6} \
|
|
nodefaultroute \
|
|
usepeerdns \
|
|
$demand maxfail 1 \
|
|
${username:+user "$username" password "$password"} \
|
|
${connect:+connect "$connect"} \
|
|
${disconnect:+disconnect "$disconnect"} \
|
|
ip-up-script /lib/netifd/ppp-up \
|
|
ipv6-up-script /lib/netifd/ppp-up \
|
|
ip-down-script /lib/netifd/ppp-down \
|
|
ipv6-down-script /lib/netifd/ppp-down \
|
|
${mtu:+mtu $mtu mru $mtu} \
|
|
"$@" $pppd_options
|
|
}
|
|
|
|
ppp_generic_teardown() {
|
|
local interface="$1"
|
|
|
|
case "$ERROR" in
|
|
11|19)
|
|
proto_notify_error "$interface" AUTH_FAILED
|
|
json_get_var authfail authfail
|
|
if [ "${authfail:-0}" -gt 0 ]; then
|
|
proto_block_restart "$interface"
|
|
fi
|
|
;;
|
|
2)
|
|
proto_notify_error "$interface" INVALID_OPTIONS
|
|
proto_block_restart "$interface"
|
|
;;
|
|
esac
|
|
proto_kill_command "$interface"
|
|
}
|
|
|
|
# PPP on serial device
|
|
|
|
proto_ppp_init_config() {
|
|
proto_config_add_string "device"
|
|
ppp_generic_init_config
|
|
no_device=1
|
|
available=1
|
|
}
|
|
|
|
proto_ppp_setup() {
|
|
local config="$1"
|
|
|
|
json_get_var device device
|
|
ppp_generic_setup "$config" "$device"
|
|
}
|
|
|
|
proto_ppp_teardown() {
|
|
ppp_generic_teardown "$@"
|
|
}
|
|
|
|
proto_pppoe_init_config() {
|
|
ppp_generic_init_config
|
|
proto_config_add_string "ac"
|
|
proto_config_add_string "service"
|
|
}
|
|
|
|
proto_pppoe_setup() {
|
|
local config="$1"
|
|
local iface="$2"
|
|
|
|
for module in slhc ppp_generic pppox pppoe; do
|
|
/sbin/insmod $module 2>&- >&-
|
|
done
|
|
|
|
json_get_var mtu mtu
|
|
mtu="${mtu:-1492}"
|
|
|
|
json_get_var ac ac
|
|
json_get_var service service
|
|
|
|
ppp_generic_setup "$config" \
|
|
plugin rp-pppoe.so \
|
|
${ac:+rp_pppoe_ac "$ac"} \
|
|
${service:+rp_pppoe_service "$service"} \
|
|
"nic-$iface"
|
|
}
|
|
|
|
proto_pppoe_teardown() {
|
|
ppp_generic_teardown "$@"
|
|
}
|
|
|
|
proto_pppoa_init_config() {
|
|
ppp_generic_init_config
|
|
proto_config_add_int "atmdev"
|
|
proto_config_add_int "vci"
|
|
proto_config_add_int "vpi"
|
|
proto_config_add_string "encaps"
|
|
no_device=1
|
|
available=1
|
|
}
|
|
|
|
proto_pppoa_setup() {
|
|
local config="$1"
|
|
local iface="$2"
|
|
|
|
for module in slhc ppp_generic pppox pppoatm; do
|
|
/sbin/insmod $module 2>&- >&-
|
|
done
|
|
|
|
json_get_vars atmdev vci vpi encaps
|
|
|
|
case "$encaps" in
|
|
1|vc) encaps="vc-encaps" ;;
|
|
*) encaps="llc-encaps" ;;
|
|
esac
|
|
|
|
ppp_generic_setup "$config" \
|
|
plugin pppoatm.so \
|
|
${atmdev:+$atmdev.}${vpi:-8}.${vci:-35} \
|
|
${encaps}
|
|
}
|
|
|
|
proto_pppoa_teardown() {
|
|
ppp_generic_teardown "$@"
|
|
}
|
|
|
|
proto_pptp_init_config() {
|
|
ppp_generic_init_config
|
|
proto_config_add_string "server"
|
|
available=1
|
|
no_device=1
|
|
}
|
|
|
|
proto_pptp_setup() {
|
|
local config="$1"
|
|
local iface="$2"
|
|
|
|
local ip serv_addr server
|
|
json_get_var server server && {
|
|
for ip in $(resolveip -t 5 "$server"); do
|
|
( proto_add_host_dependency "$config" "$ip" )
|
|
serv_addr=1
|
|
done
|
|
}
|
|
[ -n "$serv_addr" ] || {
|
|
echo "Could not resolve server address"
|
|
sleep 5
|
|
proto_setup_failed "$config"
|
|
exit 1
|
|
}
|
|
|
|
local load
|
|
for module in slhc ppp_generic ppp_async ppp_mppe ip_gre gre pptp; do
|
|
grep -q "^$module " /proc/modules && continue
|
|
/sbin/insmod $module 2>&- >&-
|
|
load=1
|
|
done
|
|
[ "$load" = "1" ] && sleep 1
|
|
|
|
ppp_generic_setup "$config" \
|
|
plugin pptp.so \
|
|
pptp_server $server \
|
|
file /etc/ppp/options.pptp
|
|
}
|
|
|
|
proto_pptp_teardown() {
|
|
ppp_generic_teardown "$@"
|
|
}
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
add_protocol ppp
|
|
[ -f /usr/lib/pppd/*/rp-pppoe.so ] && add_protocol pppoe
|
|
[ -f /usr/lib/pppd/*/pppoatm.so ] && add_protocol pppoa
|
|
[ -f /usr/lib/pppd/*/pptp.so ] && add_protocol pptp
|
|
}
|
|
|