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:
jow 2012-07-01 10:38:45 +00:00
parent dc7300620e
commit b5cf975c7c
3 changed files with 97 additions and 96 deletions

View File

@ -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))

View File

@ -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
}

View File

@ -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