packages/net/xl2tpd: netifd support
This integrates xl2tpd suppport into netifd, based on what I saw for ppp and pptp. I also changed the init script so that it makes sure that all modules needed for kernel-mode l2tp support are loaded at the time that xl2tpd is started, as otherwise xl2tpd falls back into using user-mode l2tp. Signed-off-by: Daniel Golle <dgolle@allnet.de> git-svn-id: svn://svn.openwrt.org/openwrt/packages@32563 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
dc7300620e
commit
b5cf975c7c
@ -61,8 +61,8 @@ define Package/xl2tpd/install
|
||||
$(INSTALL_DIR) $(1)/etc/ppp
|
||||
$(INSTALL_DATA) ./files/options.xl2tpd $(1)/etc/ppp/
|
||||
|
||||
$(INSTALL_DIR) $(1)/lib/network
|
||||
$(INSTALL_DATA) ./files/l2tp.sh $(1)/lib/network
|
||||
$(INSTALL_DIR) $(1)/lib/netifd/proto
|
||||
$(INSTALL_BIN) ./files/l2tp.sh $(1)/lib/netifd/proto
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,xl2tpd))
|
||||
|
@ -1,124 +1,115 @@
|
||||
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}'
|
||||
#!/bin/sh
|
||||
|
||||
[ -x /usr/sbin/xl2tpd ] || exit 0
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
scan_l2tp() {
|
||||
config_set "$1" device "l2tp-$1"
|
||||
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 "defaultroute"
|
||||
proto_config_add_boolean "peerdns"
|
||||
proto_config_add_boolean "ipv6"
|
||||
proto_config_add_int "mtu"
|
||||
proto_config_add_string "server"
|
||||
available=1
|
||||
no_device=1
|
||||
}
|
||||
|
||||
stop_interface_l2tp() {
|
||||
proto_l2tp_setup() {
|
||||
local config="$1"
|
||||
local lock="/var/lock/l2tp-${config}"
|
||||
local optfile="/tmp/l2tp/options.${config}"
|
||||
local l2tpcontrol=/var/run/xl2tpd/l2tp-control
|
||||
|
||||
lock "$lock"
|
||||
|
||||
[ -p ${l2tpcontrol} ] && echo "r l2tp-${config}" > ${l2tpcontrol}
|
||||
rm -f ${optfile}
|
||||
|
||||
for ip in $(uci_get_state network "$1" serv_addrs); do
|
||||
ip route del "$ip" 2>/dev/null
|
||||
done
|
||||
|
||||
lock -u "$lock"
|
||||
}
|
||||
|
||||
setup_interface_l2tp() {
|
||||
local config="$2"
|
||||
local lock="/var/lock/l2tp-${config}"
|
||||
local iface="$2"
|
||||
local optfile="/tmp/l2tp/options.${config}"
|
||||
|
||||
lock "$lock"
|
||||
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
|
||||
}
|
||||
|
||||
if [ ! -p /var/run/xl2tpd/l2tp-control ]; then
|
||||
/etc/init.d/xl2tpd start
|
||||
/etc/init.d/xl2tpd start
|
||||
fi
|
||||
|
||||
local device
|
||||
config_get device "$config" device "l2tp-$config"
|
||||
|
||||
local server
|
||||
config_get server "$config" server
|
||||
json_get_vars ipv6 peerdns defaultroute demand keepalive username password pppd_options
|
||||
[ "$ipv6" = 1 ] || ipv6=""
|
||||
[ "$peerdns" = 0 ] && peerdns="" || peerdns="1"
|
||||
if [ "$defaultroute" = 1 ]; then
|
||||
defaultroute="defaultroute replacedefaultroute";
|
||||
else
|
||||
defaultroute="nodefaultroute"
|
||||
fi
|
||||
if [ "${demand:-0}" -gt 0 ]; then
|
||||
demand="precompiled-active-filter /etc/ppp/filter demand idle $demand"
|
||||
else
|
||||
demand="persist"
|
||||
fi
|
||||
|
||||
local username
|
||||
config_get username "$config" username
|
||||
|
||||
local password
|
||||
config_get password "$config" password
|
||||
|
||||
local keepalive
|
||||
config_get keepalive "$config" keepalive
|
||||
|
||||
local pppd_options
|
||||
config_get pppd_options "$config" pppd_options
|
||||
|
||||
local defaultroute
|
||||
config_get_bool defaultroute "$config" defaultroute 1
|
||||
[ "$defaultroute" -eq 1 ] && \
|
||||
defaultroute="defaultroute replacedefaultroute" || defaultroute="nodefaultroute"
|
||||
[ -n "$mtu" ] || json_get_var mtu mtu
|
||||
|
||||
local interval="${keepalive##*[, ]}"
|
||||
[ "$interval" != "$keepalive" ] || interval=5
|
||||
|
||||
local dns
|
||||
config_get dns "$config" dns
|
||||
|
||||
local has_dns=0
|
||||
local peer_default=1
|
||||
[ -n "$dns" ] && {
|
||||
has_dns=1
|
||||
peer_default=0
|
||||
}
|
||||
|
||||
local peerdns
|
||||
config_get_bool peerdns "$config" peerdns $peer_default
|
||||
|
||||
[ "$peerdns" -eq 1 ] && {
|
||||
peerdns="usepeerdns"
|
||||
} || {
|
||||
peerdns=""
|
||||
add_dns "$config" $dns
|
||||
}
|
||||
|
||||
local ipv6
|
||||
config_get ipv6 "$config" ipv6 1
|
||||
[ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6=""
|
||||
|
||||
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
|
||||
|
||||
mkdir -p /tmp/l2tp
|
||||
|
||||
echo ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}} > "${optfile}"
|
||||
echo "$peerdns" >> "${optfile}"
|
||||
echo "${peerdns:+usepeerdns}" >> "${optfile}"
|
||||
echo "$defaultroute" >> "${optfile}"
|
||||
echo "${username:+user \"$username\" password \"$password\"}" >> "${optfile}"
|
||||
echo "ipparam \"$config\"" >> "${optfile}"
|
||||
echo "ifname \"l2tp-$config\"" >> "${optfile}"
|
||||
echo "ip-up-script /lib/netifd/ppp-up" >> "${optfile}"
|
||||
echo "ipv6-up-script /lib/netifd/ppp-up" >> "${optfile}"
|
||||
echo "ip-down-script /lib/netifd/ppp-down" >> "${optfile}"
|
||||
echo "ipv6-down-script /lib/netifd/ppp-down" >> "${optfile}"
|
||||
# Don't wait for LCP term responses; exit immediately when killed.
|
||||
echo "lcp-max-terminate 0" >> "${optfile}"
|
||||
echo "${ipv6} ${pppd_options}" >> "${optfile}"
|
||||
echo "${mtu:+mtu $mtu mru $mtu}" >> "${optfile}"
|
||||
|
||||
xl2tpd-control remove l2tp-${config}
|
||||
# Wait and ensure pppd has died.
|
||||
while [ -d /sys/class/net/l2tp-${config} ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
xl2tpd-control add l2tp-${config} pppoptfile=${optfile} lns=${server} redial=yes redial timeout=20
|
||||
xl2tpd-control connect l2tp-${config}
|
||||
|
||||
lock -u "${lock}"
|
||||
}
|
||||
|
||||
proto_l2tp_teardown() {
|
||||
local interface="$1"
|
||||
local optfile="/tmp/l2tp/options.${interface}"
|
||||
|
||||
case "$ERROR" in
|
||||
11|19)
|
||||
proto_notify_error "$interface" AUTH_FAILED
|
||||
proto_block_restart "$interface"
|
||||
;;
|
||||
2)
|
||||
proto_notify_error "$interface" INVALID_OPTIONS
|
||||
proto_block_restart "$interface"
|
||||
;;
|
||||
esac
|
||||
|
||||
xl2tpd-control disconnect l2tp-${interface}
|
||||
# Wait for interface to go down
|
||||
while [ -d /sys/class/net/l2tp-${interface} ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
xl2tpd-control remove l2tp-${interface}
|
||||
rm -f ${optfile}
|
||||
}
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
add_protocol l2tp
|
||||
}
|
||||
|
@ -8,6 +8,16 @@ RUN_D=/var/run
|
||||
PID_F=$RUN_D/$BIN.pid
|
||||
|
||||
start() {
|
||||
# make sure kernel modules are loaded before starting xl2tpd, otherwise
|
||||
# kernel-mode l2tp support won't work
|
||||
local load
|
||||
for module in slhc ppp_generic ppp_async pppox l2tp_core l2tp_netlink l2tp_ppp ; do
|
||||
grep -q "$module" /proc/modules && continue
|
||||
/sbin/insmod $module 2>&- >&-
|
||||
load=1
|
||||
done
|
||||
[ "$load" = "1" ] && sleep 1
|
||||
|
||||
mkdir -p $RUN_D/$BIN
|
||||
[ -f $DEFAULT ] && . $DEFAULT
|
||||
$BIN $OPTIONS
|
||||
|
Loading…
x
Reference in New Issue
Block a user