diff options
Diffstat (limited to 'net/tuntap.sh')
-rw-r--r-- | net/tuntap.sh | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/net/tuntap.sh b/net/tuntap.sh new file mode 100644 index 00000000..3174d812 --- /dev/null +++ b/net/tuntap.sh @@ -0,0 +1,83 @@ +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +tuntap_depend() +{ + before bridge interface macchanger +} + +_config_vars="$_config_vars tunctl" + +_is_tuntap() +{ + [ -n "$(export RC_SVCNAME="net.${IFACE}"; service_get_value tuntap)" ] +} + +tuntap_pre_start() +{ + local tuntap= + eval tuntap=\$tuntap_${IFVAR} + + [ -z "${tuntap}" ] && return 0 + + if [ ! -e /dev/net/tun ]; then + if ! modprobe tun; then + eerror "TUN/TAP support is not present in this kernel" + return 1 + fi + vebegin "Waiting for /dev/net/tun" + # /dev/net/tun can take it's time to appear + local timeout=10 + while [ ! -e /dev/net/tun -a ${timeout} -gt 0 ]; do + sleep 1 + timeout=$((${timeout} - 1)) + done + if [ ! -e /dev/net/tun ]; then + eerror "TUN/TAP support present but /dev/net/tun is not" + return 1 + fi + veend 0 + fi + + ebegin "Creating Tun/Tap interface ${IFACE}" + + # Set the base metric to 1000 + metric=1000 + + local o_opts= t_opts= do_openvpn=false do_tunctl=false + eval o_opts=\$openvpn_${IFVAR} + eval t_opts=\$tunctl_${IFVAR} + + if [ -n "${o_opts}" ] && type openvpn >/dev/null 2>&1; then + do_openvpn=true + elif [ -n "${t_opts}" ] && type tunctl >/dev/null 2>&1; then + do_tunctl=true + elif type openvpn >/dev/null 2>&1; then + do_openvpn=true + else + do_tunctl=true + fi + + if ${do_openvpn}; then + openvpn --mktun --dev-type "${tuntap}" --dev "${IFACE}" \ + ${o_opts} >/dev/null + else + tunctl ${t_opts} -t "${IFACE}" >/dev/null + fi + eend $? && _up && service_set_value tuntap "${tuntap}" +} + +tuntap_post_stop() +{ + _is_tuntap || return 0 + + ebegin "Destroying Tun/Tap interface ${IFACE}" + if type tunctl >/dev/null 2>&1; then + tunctl -d "${IFACE}" >/dev/null + else + openvpn --rmtun \ + --dev-type "$(service_get_value tuntap)" \ + --dev "${IFACE}" >/dev/null + fi + eend $? +} |