#!/bin/sh
|
|
|
|
[ -x /usr/sbin/xl2tpd ] || exit 0
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
. /lib/functions.sh
|
|
. ../netifd-proto.sh
|
|
init_proto "$@"
|
|
}
|
|
|
|
proto_l2tp_init_config() {
|
|
proto_config_add_string "username"
|
|
proto_config_add_string "password"
|
|
proto_config_add_string "keepalive"
|
|
proto_config_add_string "pppd_options"
|
|
proto_config_add_boolean "ipv6"
|
|
proto_config_add_int "mtu"
|
|
proto_config_add_int "checkup_interval"
|
|
proto_config_add_string "server"
|
|
available=1
|
|
no_device=1
|
|
no_proto_task=1
|
|
teardown_on_l3_link_down=1
|
|
}
|
|
|
|
proto_l2tp_setup() {
|
|
local interface="$1"
|
|
local optfile="/tmp/l2tp/options.${interface}"
|
|
local ip serv_addr server host
|
|
|
|
json_get_var server server
|
|
host="${server%:*}"
|
|
for ip in $(resolveip -t 5 "$host"); do
|
|
( proto_add_host_dependency "$interface" "$ip" )
|
|
serv_addr=1
|
|
done
|
|
[ -n "$serv_addr" ] || {
|
|
echo "Could not resolve server address" >&2
|
|
sleep 5
|
|
proto_setup_failed "$interface"
|
|
exit 1
|
|
}
|
|
|
|
# Start and wait for xl2tpd
|
|
if [ ! -p /var/run/xl2tpd/l2tp-control -o -z "$(pidof xl2tpd)" ]; then
|
|
/etc/init.d/xl2tpd restart
|
|
|
|
local wait_timeout=0
|
|
while [ ! -p /var/run/xl2tpd/l2tp-control ]; do
|
|
wait_timeout=$(($wait_timeout + 1))
|
|
[ "$wait_timeout" -gt 5 ] && {
|
|
echo "Cannot find xl2tpd control file." >&2
|
|
proto_setup_failed "$interface"
|
|
exit 1
|
|
}
|
|
sleep 1
|
|
done
|
|
fi
|
|
|
|
local ipv6 keepalive username password pppd_options mtu
|
|
json_get_vars ipv6 keepalive username password pppd_options mtu
|
|
[ "$ipv6" = 1 ] || ipv6=""
|
|
|
|
local interval="${keepalive##*[, ]}"
|
|
[ "$interval" != "$keepalive" ] || interval=5
|
|
|
|
keepalive="${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}}"
|
|
username="${username:+user \"$username\" password \"$password\"}"
|
|
ipv6="${ipv6:++ipv6}"
|
|
mtu="${mtu:+mtu $mtu mru $mtu}"
|
|
|
|
mkdir -p /tmp/l2tp
|
|
cat <<EOF >"$optfile"
|
|
usepeerdns
|
|
nodefaultroute
|
|
ipparam "$interface"
|
|
ifname "l2tp-$interface"
|
|
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
|
|
# Don't wait for LCP term responses; exit immediately when killed.
|
|
lcp-max-terminate 0
|
|
$keepalive
|
|
$username
|
|
$ipv6
|
|
$mtu
|
|
$pppd_options
|
|
EOF
|
|
|
|
xl2tpd-control add-lac l2tp-${interface} pppoptfile=${optfile} lns=${server} || {
|
|
echo "xl2tpd-control: Add l2tp-$interface failed" >&2
|
|
proto_setup_failed "$interface"
|
|
exit 1
|
|
}
|
|
xl2tpd-control connect-lac l2tp-${interface} || {
|
|
echo "xl2tpd-control: Connect l2tp-$interface failed" >&2
|
|
proto_setup_failed "$interface"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
proto_l2tp_teardown() {
|
|
local interface="$1"
|
|
local optfile="/tmp/l2tp/options.${interface}"
|
|
|
|
rm -f ${optfile}
|
|
if [ -p /var/run/xl2tpd/l2tp-control ]; then
|
|
xl2tpd-control remove-lac l2tp-${interface} || {
|
|
echo "xl2tpd-control: Remove l2tp-$interface failed" >&2
|
|
}
|
|
fi
|
|
# Wait for interface to go down
|
|
while [ -d /sys/class/net/l2tp-${interface} ]; do
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
add_protocol l2tp
|
|
}
|