#!/bin/sh # # This file is part of the FreeWRT project. FreeWRT is copyrighted # material, please see the LICENCE file in the top-level directory # or at http://www.freewrt.org/licence for details. # # Christian Fischer # CFG_DOWN_IFUP_CHECK_OFF=1 CFG_STOP_PRINTING_OFF=1 iface_type() { # HACK: use iface name only, no idea how to get the list of existing tuntap ifaces # from system if check_iface_name || \ [ "${IF_TUNTAP:-""}" != "" ] || \ [ "${IF_TUNTAP_USER:-""}" != "" ] then return 0 fi return 1 } check_iface_name() { echo $IFACE | grep -q "^tun\|^tap[0-9][1-9]*$" } check_kernel_support() { [ -e /dev/net/tun ] && return insmod tun >/dev/null 2>&1 ; sleep 1 [ -e /dev/net/tun ] && return err="Your kernel lacks tuntap support" return 1 } check_openvpn_support() { [ -x "$(which openvpn)" ] && return err="openvpn executable not found" return 1 } check_tunctl_support() { [ -x "$(which tunctl)" ] && return err="tunctl executable not found" return 1 } openvpn_create() { openvpn --mktun --dev $IFACE >/dev/null 2>&1 && return err="Creating openvpn tuntap $IFACE failed" return 1 } tunctl_create() { tunctl -u ${IF_TUNTAP_USER:-0} -t $IFACE >/dev/null 2>&1 && return err="Creating tuntap $IFACE failed" return 1 } openvpn_destroy() { openvpn --rmtun --dev $IFACE >/dev/null 2>&1 && return err="Destroying openvpn tuntap $IFACE failed" return 1 } tunctl_destroy() { tunctl -d "${IFACE}" >/dev/null 2>&1 && return err="Destroying tuntap $IFACE failed" return 1 } tuntap_create() { eval $fncreate } tuntap_destroy() { eval $fndestroy } set_methods() { if [ "${IF_TUNTAP:-""}" = "openvpn" ] then check_openvpn_support || return 1 fncreate="openvpn_create" fndestroy="openvpn_destroy" else check_tunctl_support || return 1 fncreate="tunctl_create" fndestroy="tunctl_destroy" fi return 0 } if_preup() { check_iface_name || { mcreate mstate 1 merr "Tuntap name $IFACE is not supported, use tun* or tap* instead" return 1 } if ! check_kernel_support then mcreate mstate 1 merr $err fi if ! set_methods then mcreate mstate 1 merr $err fi if iface_exists then mdestroy tuntap_destroy mstate $? || { merr $err return 1 } fi mcreate tuntap_create mstate $? || { merr $err return 1 } } if_down() { mstop check_iface_name || { mdestroy mstate 1 merr "Tuntap name $IFACE is not supported, use tun* or tap* instead" return 1 } if ! set_methods then mdestroy mstate 1 merr $err fi if ! is_up then mdestroy tuntap_destroy mstate $? || merr $err builtin exit 1 fi mdown } if_postdown() { is_up && { mstate 1 return 1 } mstate 0 if ! set_methods then mdestroy mstate 1 merr $err fi mdestroy tuntap_destroy mstate $? || { merr $err return 1 } } # vim:ts=4