diff options
author | sam <sam@FreeBSD.org> | 2008-04-20 20:37:21 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2008-04-20 20:37:21 +0000 |
commit | f481193ee59aca9435a3482d984bfb08608df56a (patch) | |
tree | f7b8568250777904a49cfd2118ba88164d8c111c | |
parent | d7668145d4f9b614366d70f9a87179256cedfd8b (diff) | |
download | FreeBSD-src-f481193ee59aca9435a3482d984bfb08608df56a.zip FreeBSD-src-f481193ee59aca9435a3482d984bfb08608df56a.tar.gz |
rc support for vaps
-rw-r--r-- | etc/defaults/rc.conf | 1 | ||||
-rw-r--r-- | etc/network.subr | 90 | ||||
-rw-r--r-- | etc/rc.d/hostapd | 1 | ||||
-rw-r--r-- | etc/rc.d/netif | 67 | ||||
-rw-r--r-- | etc/rc.d/wpa_supplicant | 26 |
5 files changed, 115 insertions, 70 deletions
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index 6d21e0f..9646ec7 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -184,6 +184,7 @@ ifconfig_lo0="inet 127.0.0.1" # default loopback device configuration. #ifconfig_lo0_alias0="inet 127.0.0.254 netmask 0xffffffff" # Sample alias entry. #ifconfig_ed0_ipx="ipx 0x00010010" # Sample IPX address family entry. #ifconfig_fxp0_name="net0" # Change interface name from fxp0 to net0. +#vaps_ath0="wlan0" # VAP interfaces for ath0 device #ipv4_addrs_fxp0="192.168.0.1/24 192.168.1.1-5/28" # example IPv4 address entry. # #autobridge_interfaces="bridge0" # List of bridges to check diff --git a/etc/network.subr b/etc/network.subr index c07b295..55bc94c 100644 --- a/etc/network.subr +++ b/etc/network.subr @@ -30,6 +30,56 @@ # Requires that rc.conf be loaded first. # +# ifn_start ifn +# Bring up and configure an interface. If some configuration is applied +# print the interface configuration. +# +ifn_start() +{ + local ifn cfg + ifn="$1" + cfg=1 + + [ -z "$ifn" ] && err 1 "ifn_start called without an interface" + + ifscript_up ${ifn} && cfg=0 + ifconfig_up ${ifn} && cfg=0 + ipv4_up ${ifn} && cfg=0 + ipx_up ${ifn} && cfg=0 + childif_create ${ifn} && cfg=0 + + if [ "$cfg" -eq 0 ]; then + ifconfig ${ifn} + fi + + return $cfg +} + +# ifn_start ifn +# Shutdown and de-configure an interface. If action is taken print the +# interface name. +# +ifn_stop() +{ + local ifn cfg + ifn="$1" + cfg=1 + + [ -z "$ifn" ] && return 1 + + ipx_down ${ifn} && cfg=0 + ipv4_down ${ifn} && cfg=0 + ifconfig_down ${ifn} && cfg=0 + ifscript_down ${ifn} && cfg=0 + childif_destroy ${ifn} && cfg=0 + + if [ "$cfg" -eq 0 ]; then + echo -n " ${ifn}" + fi + + return $cfg +} + # ifconfig_up if # Evaluate ifconfig(8) arguments for interface $if and # run ifconfig(8) with those arguments. It returns 0 if @@ -43,8 +93,8 @@ ifconfig_up() ifconfig_args=`ifconfig_getargs $1` if [ -n "${ifconfig_args}" ]; then - ifconfig $1 up ifconfig $1 ${ifconfig_args} + ifconfig $1 up _cfg=0 fi @@ -452,6 +502,44 @@ clone_down() debug "Destroyed clones: ${_list}" } +# Create and configure child interfaces. +# Return 0 if child interfaces are created. +# +childif_create() +{ + local cfg child child_vaps create_args ifn i + cfg=1 + + ifn=$1 + + # Create VAPs + child_vaps=`get_if_var $ifn vaps_IF` + for child in ${child_vaps}; do + create_args="wlandev $ifn `get_if_var $child vap_create_IF`" + if expr $child : 'wlan[0-9][0-9]*$' >/dev/null 2>&1; then + ifconfig $child create ${create_args} && cfg=0 + else + i=`ifconfig wlan create ${create_args}` + ifconfig $i name $child && cfg=0 + fi + ifn_start $child + done + + return +} + +# Destroy child interfaces. +# +childif_destroy() +{ + local cfg child child_vaps ifn + + child_vaps=`get_if_var $ifn vaps_IF` + for child in ${child_vaps}; do + ifconfig $child destroy && cfg=0 + done +} + # Create netgraph nodes. # ng_mkpeer() { diff --git a/etc/rc.d/hostapd b/etc/rc.d/hostapd index 0dc3971..5f8203e 100644 --- a/etc/rc.d/hostapd +++ b/etc/rc.d/hostapd @@ -18,6 +18,7 @@ pidfile="/var/run/${name}.pid" command_args="-P ${pidfile} -B ${conf_file}" required_files="${conf_file}" +required_modules="wlan_xauth wlan_wep wlan_tkip wlan_ccmp" extra_commands="reload" load_rc_config ${name} diff --git a/etc/rc.d/netif b/etc/rc.d/netif index 78cca61..8298da4 100644 --- a/etc/rc.d/netif +++ b/etc/rc.d/netif @@ -68,7 +68,7 @@ network_start() fi # Configure the interface(s). - network_common ifn_start verbose + network_common ifn_start if [ -f /etc/rc.d/ipfilter ] ; then # Resync ipfilter @@ -92,34 +92,31 @@ network_stop() echo '.' } -# network_common routine verbose +# network_common routine # Common configuration subroutine for network interfaces. This # routine takes all the preparatory steps needed for configuriing -# 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). +# an interface and then calls $routine. network_common() { - local _cooked_list _fail _func _verbose + local _cooked_list _fail _func _func= - _verbose= if [ -z "$1" ]; then err 1 "network_common(): No function name specified." else _func="$1" fi - [ -n "$2" ] && _verbose=yes # Set the scope of the command (all interfaces or just one). # _cooked_list= if [ -n "$cmdifn" ]; then - # Don't check that the interfaces exist. We need to run + # Don't check that the interface(s) exist. We need to run # the down code even when the interface doesn't exist to # kill off wpa_supplicant. + # XXXBED: is this really true or does wpa_supplicant die? + # if so, we should get rid of the devd entry _cooked_list="$cmdifn" else _cooked_list="`list_net_interfaces`" @@ -127,59 +124,13 @@ network_common() _fail= for ifn in ${_cooked_list}; do - if ${_func} ${ifn} ; then - eval showstat_$ifn=1 - else - _fail="$_fail $ifn" + if ! ${_func} ${ifn} $2; then + _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 - ipv4_up ${ifn} && cfg=0 - ipx_up ${ifn} && cfg=0 - - return $cfg -} - -ifn_stop() -{ - local ifn cfg - ifn="$1" - cfg=1 - - [ -z "$ifn" ] && return 1 - - ipx_down ${ifn} && cfg=0 - ipv4_down ${ifn} && cfg=0 - ifconfig_down ${ifn} && cfg=0 - ifscript_down ${ifn} && cfg=0 - - return $cfg -} - load_rc_config $name run_rc_command $* diff --git a/etc/rc.d/wpa_supplicant b/etc/rc.d/wpa_supplicant index 7e724f0..192ca96 100644 --- a/etc/rc.d/wpa_supplicant +++ b/etc/rc.d/wpa_supplicant @@ -30,18 +30,21 @@ is_wired_interface() test "$media" = "Ethernet" } -case ${ifn} in -ndis*) +is_ndis_interface() +{ + case `sysctl -n net.wlan.${1#wlan}.%parent 2>/dev/null` in + ndis*) true ;; + *) false ;; + esac +} + +if is_wired_interface ${ifn} ; then + driver="wired" +elif is_ndis_interface ${ifn} ; then driver="ndis" - ;; -*) - if is_wired_interface ${ifn} ; then - driver="wired" - else - driver="bsd" - fi - ;; -esac +else + driver="bsd" +fi load_rc_config $name @@ -50,5 +53,6 @@ conf_file=${wpa_supplicant_conf_file} pidfile="/var/run/${name}/${ifn}.pid" command_args="-B -i $ifn -c $conf_file -D $driver -P $pidfile" required_files=$conf_file +required_modules="wlan_wep wlan_tkip wlan_ccmp" run_rc_command "$1" |