1#!/bin/sh 2# 3# Copyright (c) 2003 The FreeBSD Project. All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR 15# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17# IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, 18# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24# 25# $FreeBSD$ 26# 27 28# PROVIDE: netif 29# REQUIRE: FILESYSTEMS iovctl serial sysctl 30# REQUIRE: hostid 31# KEYWORD: nojailvnet 32 33. /etc/rc.subr 34. /etc/network.subr 35 36name="netif" 37desc="Network interface setup" 38rcvar="${name}_enable" 39start_cmd="netif_start" 40stop_cmd="netif_stop" 41wlanup_cmd="wlan_up" 42wlandown_cmd="wlan_down" 43cloneup_cmd="clone_up" 44clonedown_cmd="clone_down" 45clear_cmd="doclear" 46vnetup_cmd="vnet_up" 47vnetdown_cmd="vnet_down" 48extra_commands="cloneup clonedown clear vnetup vnetdown" 49cmdifn= 50 51set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces 52set_rcvar_obsolete ipv6_prefer 53 54netif_start() 55{ 56 local _if 57 58 # Set the list of interfaces to work on. 59 # 60 cmdifn=$* 61 62 if [ -z "$cmdifn" ]; then 63 # 64 # We're operating as a general network start routine. 65 # 66 67 # disable SIGINT (Ctrl-c) when running at startup 68 trap : 2 69 fi 70 71 # Create IEEE802.11 interface 72 wlan_up $cmdifn 73 74 # Create cloned interfaces 75 clone_up $cmdifn 76 77 # Rename interfaces. 78 ifnet_rename $cmdifn 79 80 # Configure the interface(s). 81 netif_common ifn_start $cmdifn 82 83 if [ -f /etc/rc.d/ipfilter ] ; then 84 # Resync ipfilter 85 /etc/rc.d/ipfilter quietresync 86 fi 87 if [ -f /etc/rc.d/bridge -a -n "$cmdifn" ] ; then 88 /etc/rc.d/bridge start $cmdifn 89 fi 90 if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then 91 for _if in $cmdifn; do 92 /etc/rc.d/routing static any $_if 93 done 94 fi 95} 96 97netif_stop() 98{ 99 _clone_down=1 100 _wlan_down=1 101 netif_stop0 $* 102} 103 104doclear() 105{ 106 _clone_down= 107 _wlan_down= 108 netif_stop0 $* 109} 110 111netif_stop0() 112{ 113 local _if 114 115 # Set the list of interfaces to work on. 116 # 117 cmdifn=$* 118 119 # Deconfigure the interface(s) 120 netif_common ifn_stop $cmdifn 121 122 # Destroy wlan interfaces 123 if [ -n "$_wlan_down" ]; then 124 wlan_down $cmdifn 125 fi 126 127 # Destroy cloned interfaces 128 if [ -n "$_clone_down" ]; then 129 clone_down $cmdifn 130 fi 131 132 if [ -f /etc/rc.d/routing -a -n "$cmdifn" ] ; then 133 for _if in $cmdifn; do 134 /etc/rc.d/routing stop any $_if 135 done 136 fi 137} 138 139vnet_up() 140{ 141 cmdifn=$* 142 143 netif_common ifn_vnetup $cmdifn 144} 145 146vnet_down() 147{ 148 cmdifn=$* 149 150 netif_common ifn_vnetdown $cmdifn 151} 152 153# netif_common routine 154# Common configuration subroutine for network interfaces. This 155# routine takes all the preparatory steps needed for configuriing 156# an interface and then calls $routine. 157netif_common() 158{ 159 local _cooked_list _tmp_list _fail _func _ok _str _cmdifn 160 161 _func= 162 163 if [ -z "$1" ]; then 164 err 1 "netif_common(): No function name specified." 165 else 166 _func="$1" 167 shift 168 fi 169 170 # Set the scope of the command (all interfaces or just one). 171 # 172 _cooked_list= 173 _tmp_list= 174 _cmdifn=$* 175 if [ -n "$_cmdifn" ]; then 176 # Don't check that the interface(s) exist. We need to run 177 # the down code even when the interface doesn't exist to 178 # kill off wpa_supplicant. 179 # XXXBED: is this really true or does wpa_supplicant die? 180 # if so, we should get rid of the devd entry 181 _cooked_list="$_cmdifn" 182 else 183 _cooked_list="`list_net_interfaces`" 184 fi 185 186 # Expand epair[0-9] to epair[0-9][ab]. 187 for ifn in $_cooked_list; do 188 case ${ifn#epair} in 189 [0-9]*[ab]) ;; # Skip epair[0-9]*[ab]. 190 [0-9]*) 191 for _str in $_cooked_list; do 192 case $_str in 193 $ifn) _tmp_list="$_tmp_list ${ifn}a ${ifn}b" ;; 194 *) _tmp_list="$_tmp_list ${ifn}" ;; 195 esac 196 done 197 _cooked_list=${_tmp_list# } 198 ;; 199 esac 200 done 201 202 _dadwait= 203 _fail= 204 _ok= 205 for ifn in ${_cooked_list# }; do 206 # Skip if ifn does not exist. 207 case $_func in 208 ifn_stop) 209 if ! ${IFCONFIG_CMD} $ifn > /dev/null 2>&1; then 210 warn "$ifn does not exist. Skipped." 211 _fail="${_fail} ${ifn}" 212 continue 213 fi 214 ;; 215 esac 216 if ${_func} ${ifn} $2; then 217 _ok="${_ok} ${ifn}" 218 if ipv6if ${ifn}; then 219 _dadwait=1 220 fi 221 else 222 _fail="${_fail} ${ifn}" 223 fi 224 done 225 226 # inet6 address configuration needs sleep for DAD. 227 case ${_func}:${_dadwait} in 228 ifn_start:1|ifn_vnetup:1|ifn_vnetdown:1) 229 sleep `${SYSCTL_N} net.inet6.ip6.dad_count` 230 sleep 1 231 ;; 232 esac 233 234 _str= 235 if [ -n "${_ok}" ]; then 236 case ${_func} in 237 ifn_start) 238 _str='Starting' 239 ;; 240 ifn_stop) 241 _str='Stopping' 242 ;; 243 ifn_vnetup) 244 _str='Moving' 245 ;; 246 ifn_vnetdown) 247 _str='Reclaiming' 248 ;; 249 esac 250 echo "${_str} Network:${_ok}." 251 case ${_func} in 252 ifn_vnetup) 253 # Clear _ok not to do "ifconfig $ifn" 254 # because $ifn is no longer in the current vnet. 255 _ok= 256 ;; 257 esac 258 if check_startmsgs; then 259 for ifn in ${_ok}; do 260 /sbin/ifconfig ${ifn} 261 done 262 fi 263 fi 264 265 debug "The following interfaces were not configured: $_fail" 266} 267 268# Load the old "network" config file also for compatibility. 269# This is needed for mfsBSD at least. 270load_rc_config network 271load_rc_config $name 272run_rc_command $* 273