client mode fixes for broadcom wl
[openwrt/openwrt.git] / package / broadcom-wl / files / lib / wifi / broadcom.sh
1 append DRIVERS "broadcom"
2
3 scan_broadcom() {
4 local device="$1"
5 local wds
6 local adhoc sta apmode
7 local adhoc_if sta_if ap_if
8
9 config_get vifs "$device" vifs
10 for vif in $vifs; do
11 config_get mode "$vif" mode
12 case "$mode" in
13 adhoc)
14 adhoc=1
15 adhoc_if="$vif"
16 ;;
17 sta)
18 sta=1
19 sta_if="$vif"
20 ;;
21 ap)
22 apmode=1
23 ap_if="${ap_if:+$ap_if }$vif"
24 ;;
25 wds)
26 config_get addr "$vif" bssid
27 [ -z "$addr" ] || append wds "$addr"
28 ;;
29 *) echo "$device($vif): Invalid mode";;
30 esac
31 done
32 config_set "$device" wds "$wds"
33
34 local _c=
35 for vif in ${adhoc_if:-$sta_if $ap_if}; do
36 config_set "$vif" ifname "wl0${_c:+.$_c}"
37 _c=$((${_c:-0} + 1))
38 done
39
40 ifdown="down"
41 for vif in 0 1 2 3; do
42 append ifdown "vif $vif" "$N"
43 append ifdown "enabled 0" "$N"
44 done
45
46 ap=1
47 infra=1
48 mssid=1
49 apsta=0
50 radio=1
51 case "$adhoc:$sta:$apmode" in
52 1*)
53 ap=0
54 mssid=0
55 infra=0
56 ;;
57 :1:1)
58 apsta=1
59 wet=1
60 ;;
61 :1:)
62 wet=1
63 ap=0
64 mssid=0
65 ;;
66 ::)
67 radio=0
68 ;;
69 esac
70 }
71
72 disable_broadcom() {
73 wlc down
74 (
75 include /lib/network
76
77 # make sure the interfaces are down and removed from all bridges
78 for dev in wl0 wl0.1 wl0.2 wl0.3; do
79 ifconfig "$dev" down 2>/dev/null >/dev/null && {
80 unbridge "$dev"
81 }
82 done
83 )
84 true
85 }
86
87 enable_broadcom() {
88 local _c
89 config_get channel "$device" channel
90 config_get country "$device" country
91 config_get maxassoc "$device" maxassoc
92 config_get wds "$device" wds
93
94 _c=0
95 nas="$(which nas)"
96 nas_cmd=
97 if_up=
98 for vif in ${adhoc_if:-$sta_if $ap_if}; do
99 append vif_pre_up "vif $_c" "$N"
100 append vif_post_up "vif $_c" "$N"
101
102 [ "$vif" = "$sta_if" ] || {
103 config_get_bool hidden "$vif" hidden 1
104 append vif_pre_up "closed $hidden" "$N"
105 config_get_bool isolate "$vif" isolate
106 append vif_pre_up "ap_isolate $hidden" "$N"
107 }
108
109 wsec_r=0
110 eap_r=0
111 wsec=0
112 auth=0
113 nasopts=
114 config_get enc "$vif" encryption
115 case "$enc" in
116 WEP|wep)
117 wsec_r=1
118 ;;
119 *psk*|*PSK*)
120 wsec_r=1
121 config_get key "$vif" key
122 case "$enc" in
123 wpa2*|WPA2*|PSK2*|psk2*) auth=128; wsec=4;;
124 *) auth=4; crypto=2;;
125 esac
126 eval "${vif}_key=\"\$key\""
127 nasopts="-k \"\$${vif}_key\""
128 ;;
129 *wpa*|*WPA*)
130 wsec_r=1
131 eap_r=1
132 config_get key "$vif" key
133 config_get server "$vif" server
134 config_get port "$vif" port
135 case "$enc" in
136 wpa2*|WPA2*) auth=64; wsec=4;;
137 *) auth=2; crypto=2;;
138 esac
139 eval "${vif}_key=\"\$key\""
140 nasopts="-r \"\$${vif}_key\" -h $server -p $port"
141 ;;
142 esac
143 append vif_post_up "wsec $wsec" "$N"
144 append vif_post_up "wpa_auth $auth" "$N"
145 append vif_post_up "wsec_restrict $wsec_r" "$N"
146 append vif_post_up "eap_restrict $eap_r" "$N"
147
148 config_get ssid "$vif" ssid
149 append vif_post_up "vlan_mode 0"
150 append vif_post_up "ssid $ssid" "$N"
151 append vif_post_up "enabled 1" "$N"
152
153 config_get ifname "$vif" ifname
154 append if_up "ifconfig $ifname up" ";$N"
155 net_cfg="$(find_net_config "$vif")"
156 [ -z "$net_cfg" ] || {
157 bridge="$(bridge_interface "$net_cfg")"
158 append if_up "start_net '$ifname' '$net_cfg'" ";$N"
159 }
160 [ -z "$nasopts" ] || {
161 eval "${vif}_ssid=\"\$ssid\""
162 mode="-A"
163 [ "$vif" = "$sta_if" ] && mode="-S"
164 [ -z "$nas" ] || nas_cmd="${nas_cmd:+$nas_cmd$N}$nas -P /var/run/nas.$ifname.pid -H 34954 ${bridge:+ -l $bridge} -i $ifname $mode -m $auth -w $crypto -s \"\$${vif}_ssid\" -g 3600 $nasopts &"
165 }
166 _c=$(($_c + 1))
167 done
168 killall -KILL nas >&- 2>&-
169 wlc stdin <<EOF
170 $ifdown
171
172 ap $ap
173 mssid $mssid
174 apsta $apsta
175 infra $infra
176 ${wet:+wet 1}
177
178 radio ${radio:-1}
179 macfilter 0
180 maclist none
181 wds ${wds:-none}
182 channel ${channel:-0}
183 country ${country:-IL0}
184 maxassoc ${maxassoc:-128}
185
186 $vif_pre_up
187 up
188 $vif_post_up
189 EOF
190 eval "$if_up"
191 eval "$nas_cmd"
192 }
193
194
195 detect_broadcom() {
196 [ -f /proc/net/wl0 ] || return
197 config_get type wl0 type
198 [ "$type" = broadcom ] && return
199 cat <<EOF
200 config wifi-device wl0
201 option type broadcom
202 option channel 5
203
204 config wifi-iface
205 option device wl0
206 option mode ap
207 option ssid OpenWrt
208 option hidden 0
209 option encryption none
210
211 EOF
212 }