@ -1,8 +1,129 @@
#!/bin/sh
append DRIVERS "mac80211"
mac80211_hostapd_setup_base( ) {
local phy = " $1 "
local ifname = " $2 "
cfgfile = " /var/run/hostapd- $phy .conf "
config_get device " $vif " device
config_get country " $device " country
config_get hwmode " $device " hwmode
config_get channel " $device " channel
[ -n " $channel " -a -z " $hwmode " ] && wifi_fixup_hwmode " $device "
[ " $channel " = auto ] && channel =
[ -n " $hwmode " ] && {
config_get hwmode_11n " $device " hwmode_11n
[ -n " $hwmode_11n " ] && {
hwmode = " $hwmode_11n "
append base_cfg "ieee80211n=1" " $N "
config_get htmode " $device " htmode
config_get ht_capab_list " $device " ht_capab
case " $htmode " in
HT20| HT40+| HT40-) ht_capab = " [ $htmode ] " ; ;
*) ht_capab = ; ;
esac
for cap in $ht_capab_list ; do
ht_capab = " $ht_capab [ $cap ] "
done
[ -n " $ht_capab " ] && append base_cfg " ht_capab= $ht_capab " " $N "
}
}
cat > " $cfgfile " <<EOF
ctrl_interface = /var/run/hostapd-$phy
driver = nl80211
wmm_enabled = 1
wmm_ac_bk_cwmin = 4
wmm_ac_bk_cwmax = 10
wmm_ac_bk_aifs = 7
wmm_ac_bk_txop_limit = 0
wmm_ac_bk_acm = 0
wmm_ac_be_aifs = 3
wmm_ac_be_cwmin = 4
wmm_ac_be_cwmax = 10
wmm_ac_be_txop_limit = 0
wmm_ac_be_acm = 0
wmm_ac_vi_aifs = 2
wmm_ac_vi_cwmin = 3
wmm_ac_vi_cwmax = 4
wmm_ac_vi_txop_limit = 94
wmm_ac_vi_acm = 0
wmm_ac_vo_aifs = 2
wmm_ac_vo_cwmin = 2
wmm_ac_vo_cwmax = 3
wmm_ac_vo_txop_limit = 47
wmm_ac_vo_acm = 0
tx_queue_data3_aifs = 7
tx_queue_data3_cwmin = 15
tx_queue_data3_cwmax = 1023
tx_queue_data3_burst = 0
tx_queue_data2_aifs = 3
tx_queue_data2_cwmin = 15
tx_queue_data2_cwmax = 63
tx_queue_data2_burst = 0
tx_queue_data1_aifs = 1
tx_queue_data1_cwmin = 7
tx_queue_data1_cwmax = 15
tx_queue_data1_burst = 3.0
tx_queue_data0_aifs = 1
tx_queue_data0_cwmin = 3
tx_queue_data0_cwmax = 7
tx_queue_data0_burst = 1.5
${ hwmode : +hw_mode= $hwmode }
${ channel : +channel= $channel }
${ country : +country_code= $country }
$base_cfg
EOF
}
mac80211_hostapd_setup_bss( ) {
local phy = " $1 "
local vif = " $2 "
hostapd_cfg =
cfgfile = " /var/run/hostapd- $phy .conf "
config_get ifname " $vif " ifname
if [ -f " $cfgfile " ] ; then
append hostapd_cfg " bss= $ifname " " $N "
else
mac80211_hostapd_setup_base " $phy " " $ifname "
append hostapd_cfg " interface= $ifname " " $N "
fi
local net_cfg bridge
net_cfg = " $( find_net_config " $vif " ) "
[ -z " $net_cfg " ] || bridge = " $( bridge_interface " $net_cfg " ) "
config_set " $vif " bridge " $bridge "
hostapd_set_bss_options hostapd_cfg " $vif "
config_get_bool wds " $vif " wds 0
[ " $wds " -gt 0 ] && append hostapd_cfg "wds_sta=1" " $N "
config_get macaddr " $vif " macaddr
config_get_bool hidden " $vif " hidden 0
cat >> /var/run/hostapd-$phy .conf <<EOF
$hostapd_cfg
bssid = $macaddr
ignore_broadcast_ssid = $hidden
EOF
}
mac80211_start_vif( ) {
local vif = " $1 "
local ifname = " $2 "
local net_cfg
net_cfg = " $( find_net_config " $vif " ) "
[ -z " $net_cfg " ] || start_net " $ifname " " $net_cfg "
set_wifi_up " $vif " " $ifname "
}
find_mac80211_phy( ) {
config_get device " $1 "
local device = " $1 "
local macaddr = " $( config_get " $device " macaddr | tr 'A-Z' 'a-z' ) "
config_get phy " $device " phy
@ -53,7 +174,7 @@ disable_mac80211() (
# kill all running hostapd and wpa_supplicant processes that
# are running on atheros/mac80211 vifs
for pid in ` pidof hostapd wpa_supplicant` ; do
grep wlan /proc/$pid /cmdline >/dev/null && \
grep " $phy " /proc/$pid /cmdline >/dev/null && \
kill $pid
done
@ -82,6 +203,7 @@ enable_mac80211() {
config_get phy " $device " phy
local i = 0
local macidx = 0
local apidx = 0
fixed = ""
[ -n " $country " ] && iw reg set " $country "
@ -110,7 +232,6 @@ enable_mac80211() {
config_get enc " $vif " encryption
config_get mode " $vif " mode
config_get ssid " $vif " ssid
config_get_bool wds " $vif " wds 0
# It is far easier to delete and create the desired interface
case " $mode " in
@ -120,7 +241,8 @@ enable_mac80211() {
ap)
# Hostapd will handle recreating the interface and
# it's accompanying monitor
iw phy " $phy " interface add " $ifname " type managed
apidx = " $(( $apidx + 1 )) "
[ " $apidx " -gt 1 ] || iw phy " $phy " interface add " $ifname " type managed
; ;
mesh)
config_get mesh_id " $vif " mesh_id
@ -131,6 +253,7 @@ enable_mac80211() {
; ;
sta)
local wdsflag
config_get_bool wds " $vif " wds 0
[ " $wds " -gt 0 ] && wdsflag = "4addr on"
iw phy " $phy " interface add " $ifname " type managed $wdsflag
config_get_bool powersave " $vif " powersave 0
@ -156,13 +279,8 @@ enable_mac80211() {
vif_mac = " $( printf %02x $(( 0 x$mac_1 + $offset )) ) : $mac_2 "
macidx = " $(( $macidx + 1 )) "
}
ifconfig " $ifname " hw ether " $vif_mac "
# We attempt to set teh channel for all interfaces, although
# mac80211 may not support it or the driver might not yet
[ -n " $fixed " -a -n " $channel " ] && iw dev " $ifname " set channel " $channel "
local key keystring
[ " $mode " = "ap" ] || ifconfig " $ifname " hw ether " $vif_mac "
config_set " $vif " macaddr " $vif_mac "
# Valid values are:
# wpa / wep / none
@ -180,6 +298,13 @@ enable_mac80211() {
# wep + keymgmt = 'NONE' -> wpa_supplicant will be
# configured to handle the wep connection
if [ ! " $mode " = "ap" ] ; then
# We attempt to set the channel for all interfaces, although
# mac80211 may not support it or the driver might not yet
# for ap mode this is handled by hostapd
[ -n " $fixed " -a -n " $channel " ] && iw dev " $ifname " set channel " $channel "
local key keystring
case " $enc " in
*wep*)
config_get keymgmt " $vif " keymgmt
@ -229,26 +354,9 @@ enable_mac80211() {
ifconfig " $ifname " up
local net_cfg bridge
net_cfg = " $( find_net_config " $vif " ) "
[ -z " $net_cfg " ] || {
bridge = " $( bridge_interface " $net_cfg " ) "
config_set " $vif " bridge " $bridge "
start_net " $ifname " " $net_cfg "
}
[ " $mode " = "ap" ] || mac80211_start_vif " $vif " " $ifname "
set_wifi_up " $vif " " $ifname "
case " $mode " in
ap)
if eval "type hostapd_setup_vif" 2>/dev/null >/dev/null; then
hostapd_setup_vif " $vif " nl80211 || {
echo " enable_mac80211( $device ): Failed to set up wpa for interface $ifname " >& 2
# make sure this wifi interface won't accidentally stay open without encryption
ifconfig " $ifname " down
continue
}
fi
; ;
adhoc)
config_get bssid " $vif " bssid
iw dev " $ifname " ibss join " $ssid " $freq ${ fixed : +fixed-freq } $bssid
@ -290,6 +398,30 @@ enable_mac80211() {
; ;
esac
done
local start_hostapd =
rm -f /var/run/hostapd-$phy .conf
for vif in $vifs ; do
config_get mode " $vif " mode
[ " $mode " = "ap" ] || continue
mac80211_hostapd_setup_bss " $phy " " $vif "
start_hostapd = 1
done
[ -n " $start_hostapd " ] || return
hostapd -P /var/run/wifi-$phy .pid -B /var/run/hostapd-$phy .conf || {
echo " Failed to start hostapd for $phy "
return
}
sleep 2
for vif in $vifs ; do
config_get mode " $vif " mode
config_get ifname " $vif " ifname
[ " $mode " = "ap" ] || continue
mac80211_start_vif " $vif " " $ifname "
done
}
@ -325,9 +457,10 @@ detect_mac80211() {
ht_capab = "" ;
[ " $ht_cap " -gt 0 ] && {
mode_11n = "n"
append ht_capab " option htmode HT20" " $N "
list = " list ht_capab"
[ " $(( $ht_cap & 1 )) " -eq 1 ] && append ht_capab " $list LDPC " " $N "
[ " $(( $ht_cap & 2 )) " -eq 2 ] && append ht_capab " $list HT40- " " $N "
[ " $(( $ht_cap & 32 )) " -eq 32 ] && append ht_capab " $list SHORT-GI-20 " " $N "
[ " $(( $ht_cap & 64 )) " -eq 64 ] && append ht_capab " $list SHORT-GI-40 " " $N "
[ " $(( $ht_cap & 4096 )) " -eq 4096 ] && append ht_capab " $list DSSS_CCK-40 " " $N "
@ -340,9 +473,9 @@ config wifi-device radio$devidx
option channel ${ channel }
option macaddr $( cat /sys/class/ieee80211/${ dev } /macaddress)
option hwmode 11${ mode_11n } ${ mode_band }
$ht_capab
# REMOVE THIS LINE TO ENABLE WIFI:
option disabled 1
$ht_capab
config wifi-iface
option device radio$devidx