#!/bin/sh # # Copyright (c) 2003 The FreeBSD Project. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # $FreeBSD: src/etc/rc.d/netif,v 1.2 2003/06/29 05:34:41 mtm Exp $ # $DragonFly: src/etc/rc.d/netif,v 1.8 2008/07/06 23:56:32 thomas Exp $ # # PROVIDE: netif # REQUIRE: atm1 ipfilter mountcritlocal serial sppp sysctl tty . /etc/rc.subr . /etc/network.subr name="network" start_cmd="network_start" stop_cmd="network_stop" cloneup_cmd="clone_up" clonedown_cmd="clone_down" extra_commands="cloneup clonedown" _cmdifn= network_start() { # Set the list of interfaces to work on. # _cmdifn=$* if [ -z "$_cmdifn" ]; then # # We're operating as a general network start routine. # # Create cloned interfaces clone_up # Create IPv6<-->IPv4 tunnels gif_up # Rename interfaces. ifnet_rename fi # Configure the interface(s). network_common ifn_start verbose # Give our interfaces a little time to come up # before we start pounding them. In particular, dhclient # and named can get mightily confused. sleep 2 # Resync ipfilter /etc/rc.d/ipfilter resync } network_stop() { # Set the list of interfaces to work on. # _cmdifn=$* echo -n "Stopping network:" # Deconfigure the interface(s) network_common ifn_stop echo '.' } # network_common routine verbose # Common configuration subroutine for network interfaces. This # routine takes all the preparatory steps needed for configuring # an interface and then calls $routine. If $verbose is specified, # it will call ifconfig(8) to show, in long format, the configured # interfaces. If $verbose is not given, it will simply output the # configured interface(s). network_common() { _func= _verbose= if [ -z "$1" ]; then err 1 "network_common(): No function name specified." else _func="$1" fi [ -n "$2" ] && _verbose=yes # Get a list of network interfaces. _ifn_list="`list_net_interfaces`" # Set the scope of the command (all interfaces or just one). # _cooked_list= if [ -n "$_cmdifn" ]; then for i in $_cmdifn ; do eval _if=\"`expr "$_ifn_list" : ".*\(${i}\).*"`\" if [ -z "$_if" ]; then err 1 "No such network interface: $i" fi _cooked_list="$_cooked_list $_if" done else _cooked_list="$_ifn_list" fi for ifn in ${_cooked_list}; do if ${_func} ${ifn} ; then eval showstat_$ifn=1 else _fail="$_fail $ifn" fi done # Display interfaces configured by this script # for ifn in ${_cooked_list}; do eval showstat=\$showstat_${ifn} if [ ! -z ${showstat} ]; then if [ -n "$_verbose" ]; then ifconfig ${ifn} else echo -n " ${ifn}" fi fi done debug "The following interfaces were not configured: $_fail" } ifn_start() { local ifn cfg ifn="$1" cfg=1 [ -z "$ifn" ] && return 1 ifscript_up ${ifn} && cfg=0 ifconfig_up ${ifn} && cfg=0 ifalias_up ${ifn} && cfg=0 ipx_up ${ifn} && cfg=0 childif_create ${ifn} && cfg=0 return $cfg } ifn_stop() { local ifn cfg ifn="$1" cfg=1 [ -z "$ifn" ] && return 1 ipx_down ${ifn} && cfg=0 ifalias_down ${ifn} && cfg=0 ifconfig_down ${ifn} && cfg=0 ifscript_down ${ifn} && cfg=0 childif_destroy ${ifn} && cfg=0 return $cfg } # get_if_var if var [default] # Return the value of the pseudo-hash corresponding to $if where # $var is a string containg the sub-string "IF" which will be # replaced with $if after the characters defined in _punct are # replaced with '_'. If the variable is unset, replace it with # $default if given. get_if_var() { local _if _punct _var _default prefix suffix if [ $# -ne 2 -a $# -ne 3 ]; then err 3 'USAGE: get_if_var name var [default]' fi _if=$1 _punct=". - / +" for _punct_c in $_punct; do _if=`ltr ${_if} ${_punct_c} '_'` done _var=$2 _default=$3 prefix=${_var%%IF*} suffix=${_var##*IF} eval echo \${${prefix}${_if}${suffix}-${_default}} } # childif_create # Create and configure child interfaces. Return 0 if child # interfaces are created. # childif_create() { local cfg child child_vlans child_wlans create_args debug_flags ifn i cfg=1 ifn=$1 # Create wireless interfaces child_wlans=`get_if_var $ifn wlans_IF` for child in ${child_wlans}; do create_args="wlandev $ifn `get_if_var $child create_args_IF`" debug_flags="`get_if_var $child wlandebug_IF`" if expr $child : 'wlan[0-9][0-9]*$' >/dev/null 2>&1; then ifconfig $child create ${create_args} && cfg=0 if [ -n "${debug_flags}" ]; then wlandebug -i $child ${debug_flags} fi else i=`ifconfig wlan create ${create_args}` if [ -n "${debug_flags}" ]; then wlandebug -i $i ${debug_flags} fi ifconfig $i name $child && cfg=0 fi ifn_start $child done return ${cfg} } # childif_destroy # Destroy child interfaces. # childif_destroy() { local cfg child child_vlans child_wlans ifn cfg=1 child_wlans=`get_if_var $ifn wlans_IF` for child in ${child_wlans}; do if ! `ifconfig -n $child > /dev/null 2>&1`; then continue fi ifn_stop $child ifconfig $child destroy && cfg=0 done return ${cfg} } load_rc_config $name run_rc_command $*