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