client mode fixes for broadcom wl
[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 }