
'nas' must be shutdown independently for each 'wl' device to properly support devices with multiple radios. Do the shutdown when the device is disabled instead of when it is brought up. Signed-off-by: Nathan Hintz <nlhintz@hotmail.com> SVN-Revision: 38753
430 lines
9.4 KiB
Bash
430 lines
9.4 KiB
Bash
append DRIVERS "broadcom"
|
|
|
|
scan_broadcom() {
|
|
local device="$1"
|
|
local wds
|
|
local adhoc sta apmode mon disabled
|
|
local adhoc_if sta_if ap_if mon_if
|
|
local _c=0
|
|
|
|
config_get vifs "$device" vifs
|
|
for vif in $vifs; do
|
|
config_get_bool disabled "$vif" disabled 0
|
|
[ $disabled -eq 0 ] || continue
|
|
|
|
config_get mode "$vif" mode
|
|
_c=$(($_c + 1))
|
|
case "$mode" in
|
|
adhoc)
|
|
adhoc=1
|
|
adhoc_if="$vif"
|
|
;;
|
|
sta)
|
|
sta=1
|
|
sta_if="$vif"
|
|
;;
|
|
ap)
|
|
apmode=1
|
|
ap_if="${ap_if:+$ap_if }$vif"
|
|
;;
|
|
wds)
|
|
config_get addr "$vif" bssid
|
|
[ -z "$addr" ] || {
|
|
addr=$(echo "$addr" | tr 'A-F' 'a-f')
|
|
append wds "$addr"
|
|
}
|
|
;;
|
|
monitor)
|
|
mon=1
|
|
mon_if="$vif"
|
|
;;
|
|
*) echo "$device($vif): Invalid mode";;
|
|
esac
|
|
done
|
|
config_set "$device" wds "$wds"
|
|
|
|
local _c=
|
|
for vif in ${adhoc_if:-$sta_if $ap_if $mon_if}; do
|
|
config_set "$vif" ifname "${device}${_c:+-$_c}"
|
|
_c=$((${_c:-0} + 1))
|
|
done
|
|
config_set "$device" vifs "${adhoc_if:-$sta_if $ap_if $mon_if}"
|
|
|
|
ifdown="down"
|
|
for vif in 0 1 2 3; do
|
|
append ifdown "vif $vif" "$N"
|
|
append ifdown "enabled 0" "$N"
|
|
done
|
|
|
|
ap=1
|
|
infra=1
|
|
if [ "$_c" -gt 1 ]; then
|
|
mssid=1
|
|
else
|
|
mssid=
|
|
fi
|
|
apsta=0
|
|
radio=1
|
|
monitor=0
|
|
case "$adhoc:$sta:$apmode:$mon" in
|
|
1*)
|
|
ap=0
|
|
mssid=
|
|
infra=0
|
|
;;
|
|
:1:1:)
|
|
apsta=1
|
|
wet=1
|
|
;;
|
|
:1::)
|
|
wet=1
|
|
ap=0
|
|
mssid=
|
|
;;
|
|
:::1)
|
|
wet=1
|
|
ap=0
|
|
mssid=
|
|
monitor=1
|
|
;;
|
|
::)
|
|
radio=0
|
|
;;
|
|
esac
|
|
}
|
|
|
|
disable_broadcom() {
|
|
local device="$1"
|
|
set_wifi_down "$device"
|
|
wlc ifname "$device" down
|
|
wlc ifname "$device" bssid `wlc ifname "$device" default_bssid`
|
|
(
|
|
include /lib/network
|
|
|
|
local pid_file=/var/run/nas.$device.pid
|
|
[ -e $pid_file ] && start-stop-daemon -K -q -s SIGKILL -p $pid_file && rm $pid_file
|
|
|
|
# make sure the interfaces are down and removed from all bridges
|
|
for dev in $device ${device}-1 ${device}-2 ${device}-3; do
|
|
ifconfig "$dev" down 2>/dev/null >/dev/null && {
|
|
unbridge "$dev"
|
|
}
|
|
done
|
|
)
|
|
true
|
|
}
|
|
|
|
enable_broadcom() {
|
|
local device="$1"
|
|
local _c
|
|
config_get channel "$device" channel
|
|
config_get country "$device" country
|
|
config_get maxassoc "$device" maxassoc
|
|
config_get wds "$device" wds
|
|
config_get vifs "$device" vifs
|
|
config_get distance "$device" distance
|
|
config_get slottime "$device" slottime
|
|
config_get rxantenna "$device" rxantenna
|
|
config_get txantenna "$device" txantenna
|
|
config_get_bool frameburst "$device" frameburst
|
|
config_get macfilter "$device" macfilter
|
|
config_get maclist "$device" maclist
|
|
config_get macaddr "$device" macaddr
|
|
config_get txpower "$device" txpower
|
|
config_get frag "$device" frag
|
|
config_get rts "$device" rts
|
|
config_get hwmode "$device" hwmode
|
|
config_get htmode "$device" htmode
|
|
local vif_pre_up vif_post_up vif_do_up vif_txpower
|
|
local doth=0
|
|
local wmm=1
|
|
|
|
_c=0
|
|
nas="$(which nas)"
|
|
nas_cmd=
|
|
if_up=
|
|
|
|
[ -z "$slottime" ] && {
|
|
[ -n "$distance" ] && {
|
|
# slottime = 9 + (distance / 150) + (distance % 150 ? 1 : 0)
|
|
slottime="$((9 + ($distance / 150) + 1 - (150 - ($distance % 150)) / 150 ))"
|
|
}
|
|
} || {
|
|
slottime="${slottime:--1}"
|
|
}
|
|
|
|
case "$macfilter" in
|
|
allow|2)
|
|
macfilter=2;
|
|
;;
|
|
deny|1)
|
|
macfilter=1;
|
|
;;
|
|
disable|none|0)
|
|
macfilter=0;
|
|
;;
|
|
esac
|
|
|
|
[ ${channel:-0} -ge 1 -a ${channel:-0} -le 14 ] && band=2
|
|
[ ${channel:-0} -ge 36 ] && band=1
|
|
|
|
case "$hwmode" in
|
|
*na) nmode=1; nreqd=0;;
|
|
*a) nmode=0;;
|
|
*ng) gmode=1; nmode=1; nreqd=0;;
|
|
*n) nmode=1; nreqd=1;;
|
|
*b) gmode=0; nmode=0;;
|
|
*bg) gmode=1; nmode=0;;
|
|
*g) gmode=2; nmode=0;;
|
|
*gst) gmode=4; nmode=0;;
|
|
*lrs) gmode=5; nmode=0;;
|
|
*) case "$band" in
|
|
2) gmode=1; nmode=1; nreqd=0;;
|
|
1) nmode=1; nreqd=0;;
|
|
*) gmode=1; nmode=1; nreqd=0;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Use 'nmode' for N-Phy only
|
|
[ "$(wlc ifname $device phytype)" = 4 ] || nmode=
|
|
|
|
# Use 'chanspec' instead of 'channel' for 'N' modes (See bcmwifi.h)
|
|
[ ${nmode:-0} -ne 0 -a -n "$band" ] && {
|
|
case "$htmode" in
|
|
HT40-) chanspec=$(printf 0x%x%x%02x $band 0xe $(($channel - 2))); channel=;;
|
|
HT40+) chanspec=$(printf 0x%x%x%02x $band 0xd $(($channel + 2))); channel=;;
|
|
HT20) chanspec=$(printf 0x%x%x%02x $band 0xb $channel); channel=;;
|
|
*) ;;
|
|
esac
|
|
}
|
|
|
|
for vif in $vifs; do
|
|
config_get vif_txpower "$vif" txpower
|
|
|
|
config_get mode "$vif" mode
|
|
append vif_pre_up "vif $_c" "$N"
|
|
append vif_post_up "vif $_c" "$N"
|
|
append vif_do_up "vif $_c" "$N"
|
|
|
|
config_get_bool wmm "$vif" wmm "$wmm"
|
|
config_get_bool doth "$vif" doth "$doth"
|
|
|
|
[ "$mode" = "sta" ] || {
|
|
config_get_bool hidden "$vif" hidden 0
|
|
append vif_pre_up "closed $hidden" "$N"
|
|
config_get_bool isolate "$vif" isolate 0
|
|
append vif_pre_up "ap_isolate $isolate" "$N"
|
|
}
|
|
|
|
wsec_r=0
|
|
eap_r=0
|
|
wsec=0
|
|
auth=0
|
|
nasopts=
|
|
config_get enc "$vif" encryption
|
|
case "$enc" in
|
|
*wep*)
|
|
wsec_r=1
|
|
wsec=1
|
|
defkey=1
|
|
config_get key "$vif" key
|
|
case "$enc" in
|
|
*shared*) append vif_do_up "wepauth 1" "$N";;
|
|
*) append vif_do_up "wepauth 0" "$N";;
|
|
esac
|
|
case "$key" in
|
|
[1234])
|
|
defkey="$key"
|
|
for knr in 1 2 3 4; do
|
|
config_get k "$vif" key$knr
|
|
[ -n "$k" ] || continue
|
|
[ "$defkey" = "$knr" ] && def="=" || def=""
|
|
append vif_do_up "wepkey $def$knr,$k" "$N"
|
|
done
|
|
;;
|
|
"");;
|
|
*) append vif_do_up "wepkey =1,$key" "$N";;
|
|
esac
|
|
;;
|
|
*psk*)
|
|
wsec_r=1
|
|
config_get key "$vif" key
|
|
|
|
# psk version + default cipher
|
|
case "$enc" in
|
|
*mixed*|*psk+psk2*) auth=132; wsec=6;;
|
|
*psk2*) auth=128; wsec=4;;
|
|
*) auth=4; wsec=2;;
|
|
esac
|
|
|
|
# cipher override
|
|
case "$enc" in
|
|
*tkip+aes*|*tkip+ccmp*|*aes+tkip*|*ccmp+tkip*) wsec=6;;
|
|
*aes*|*ccmp*) wsec=4;;
|
|
*tkip*) wsec=2;;
|
|
esac
|
|
|
|
# group rekey interval
|
|
config_get rekey "$vif" wpa_group_rekey
|
|
|
|
eval "${vif}_key=\"\$key\""
|
|
nasopts="-k \"\$${vif}_key\"${rekey:+ -g $rekey}"
|
|
;;
|
|
*wpa*)
|
|
wsec_r=1
|
|
eap_r=1
|
|
config_get auth_server "$vif" auth_server
|
|
[ -z "$auth_server" ] && config_get auth_server "$vif" server
|
|
config_get auth_port "$vif" auth_port
|
|
[ -z "$auth_port" ] && config_get auth_port "$vif" port
|
|
config_get auth_secret "$vif" auth_secret
|
|
[ -z "$auth_secret" ] && config_get auth_secret "$vif" key
|
|
|
|
# wpa version + default cipher
|
|
case "$enc" in
|
|
*mixed*|*wpa+wpa2*) auth=66; wsec=6;;
|
|
*wpa2*) auth=64; wsec=4;;
|
|
*) auth=2; wsec=2;;
|
|
esac
|
|
|
|
# cipher override
|
|
case "$enc" in
|
|
*tkip+aes*|*tkip+ccmp*|*aes+tkip*|*ccmp+tkip*) wsec=6;;
|
|
*aes*|*ccmp*) wsec=4;;
|
|
*tkip*) wsec=2;;
|
|
esac
|
|
|
|
# group rekey interval
|
|
config_get rekey "$vif" wpa_group_rekey
|
|
|
|
eval "${vif}_key=\"\$auth_secret\""
|
|
nasopts="-r \"\$${vif}_key\" -h $auth_server -p ${auth_port:-1812}${rekey:+ -g $rekey}"
|
|
;;
|
|
esac
|
|
append vif_do_up "wsec $wsec" "$N"
|
|
append vif_do_up "wpa_auth $auth" "$N"
|
|
append vif_do_up "wsec_restrict $wsec_r" "$N"
|
|
append vif_do_up "eap_restrict $eap_r" "$N"
|
|
|
|
config_get ssid "$vif" ssid
|
|
append vif_post_up "vlan_mode 0" "$N"
|
|
append vif_post_up "ssid $ssid" "$N"
|
|
append vif_do_up "ssid $ssid" "$N"
|
|
|
|
[ "$mode" = "monitor" ] && {
|
|
append vif_post_up "monitor $monitor" "$N"
|
|
}
|
|
|
|
[ "$mode" = "adhoc" ] && {
|
|
config_get bssid "$vif" bssid
|
|
[ -n "$bssid" ] && {
|
|
append vif_pre_up "bssid $bssid" "$N"
|
|
append vif_pre_up "ibss_merge 0" "$N"
|
|
} || {
|
|
append vif_pre_up "ibss_merge 1" "$N"
|
|
}
|
|
}
|
|
|
|
append vif_post_up "enabled 1" "$N"
|
|
|
|
config_get ifname "$vif" ifname
|
|
#append if_up "ifconfig $ifname up" ";$N"
|
|
|
|
local net_cfg
|
|
net_cfg="$(find_net_config "$vif")"
|
|
[ -z "$net_cfg" ] || {
|
|
append if_up "set_wifi_up '$vif' '$ifname'" ";$N"
|
|
append if_up "start_net '$ifname' '$net_cfg'" ";$N"
|
|
}
|
|
[ -z "$nas" -o -z "$nasopts" ] || {
|
|
eval "${vif}_ssid=\"\$ssid\""
|
|
nas_mode="-A"
|
|
[ "$mode" = "sta" ] && nas_mode="-S"
|
|
[ -z "$nas_cmd" ] && {
|
|
local pid_file=/var/run/nas.$device.pid
|
|
nas_cmd="start-stop-daemon -S -b -p $pid_file -x $nas -- -P $pid_file -H 34954"
|
|
}
|
|
append nas_cmd "-i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 -F $nasopts"
|
|
}
|
|
_c=$(($_c + 1))
|
|
done
|
|
wlc ifname "$device" stdin <<EOF
|
|
$ifdown
|
|
|
|
${nmode:+band ${band:-0}}
|
|
${nmode:+nmode $nmode}
|
|
${nmode:+${nreqd:+nreqd $nreqd}}
|
|
${gmode:+gmode $gmode}
|
|
apsta $apsta
|
|
ap $ap
|
|
${mssid:+mssid $mssid}
|
|
infra $infra
|
|
${wet:+wet 1}
|
|
802.11d 0
|
|
802.11h ${doth:-0}
|
|
wme ${wmm:-1}
|
|
rxant ${rxantenna:-3}
|
|
txant ${txantenna:-3}
|
|
fragthresh ${frag:-2346}
|
|
rtsthresh ${rts:-2347}
|
|
monitor ${monitor:-0}
|
|
|
|
radio ${radio:-1}
|
|
macfilter ${macfilter:-0}
|
|
maclist ${maclist:-none}
|
|
wds none
|
|
${wds:+wds $wds}
|
|
country ${country:-US}
|
|
${channel:+channel $channel}
|
|
${chanspec:+chanspec $chanspec}
|
|
maxassoc ${maxassoc:-128}
|
|
slottime ${slottime:--1}
|
|
${frameburst:+frameburst $frameburst}
|
|
|
|
$vif_pre_up
|
|
up
|
|
$vif_post_up
|
|
EOF
|
|
eval "$if_up"
|
|
wlc ifname "$device" stdin <<EOF
|
|
$vif_do_up
|
|
EOF
|
|
|
|
# use vif_txpower (from last wifi-iface) instead of txpower (from
|
|
# wifi-device) if the latter does not exist
|
|
txpower=${txpower:-$vif_txpower}
|
|
[ -z "$txpower" ] || iwconfig $device txpower ${txpower}dBm
|
|
|
|
eval "$nas_cmd"
|
|
}
|
|
|
|
|
|
detect_broadcom() {
|
|
local i=-1
|
|
|
|
while grep -qs "^ *wl$((++i)):" /proc/net/dev; do
|
|
local channel
|
|
|
|
config_get type wl${i} type
|
|
[ "$type" = broadcom ] && continue
|
|
channel=`wlc ifname wl${i} channel`
|
|
cat <<EOF
|
|
config wifi-device wl${i}
|
|
option type broadcom
|
|
option channel ${channel:-11}
|
|
|
|
# REMOVE THIS LINE TO ENABLE WIFI:
|
|
option disabled 1
|
|
|
|
config wifi-iface
|
|
option device wl${i}
|
|
option network lan
|
|
option mode ap
|
|
option ssid OpenWrt${i#0}
|
|
option encryption none
|
|
|
|
EOF
|
|
done
|
|
}
|