source: branches/backfire/package/broadcom-wl/files/lib/wifi/broadcom.sh @ 29138

Last change on this file since 29138 was 29138, checked in by jow, 4 years ago

[backfire] broadcom-wl: backport r29136

  • Property svn:eol-style set to native
File size: 8.2 KB
Line 
1append DRIVERS "broadcom"
2
3scan_broadcom() {
4        local device="$1"
5        local wds
6        local adhoc sta apmode mon disabled
7        local adhoc_if sta_if ap_if mon_if
8        local _c=0
9
10        config_get vifs "$device" vifs
11        for vif in $vifs; do
12                config_get_bool disabled "$vif" disabled 0
13                [ $disabled -eq 0 ] || continue
14
15                config_get mode "$vif" mode
16                _c=$(($_c + 1))
17                case "$mode" in
18                        adhoc)
19                                adhoc=1
20                                adhoc_if="$vif"
21                        ;;
22                        sta)
23                                sta=1
24                                sta_if="$vif"
25                        ;;
26                        ap)
27                                apmode=1
28                                ap_if="${ap_if:+$ap_if }$vif"
29                        ;;
30                        wds)
31                                config_get addr "$vif" bssid
32                                [ -z "$addr" ] || {
33                                        addr=$(echo "$addr" | tr 'A-F' 'a-f')
34                                        append wds "$addr"
35                                }
36                        ;;
37                        monitor)
38                                mon=1
39                                mon_if="$vif"
40                        ;;
41                        *) echo "$device($vif): Invalid mode";;
42                esac
43        done
44        config_set "$device" wds "$wds"
45
46        local _c=
47        for vif in ${adhoc_if:-$sta_if $ap_if $mon_if}; do
48                config_set "$vif" ifname "${device}${_c:+.$_c}"
49                _c=$((${_c:-0} + 1))
50        done
51        config_set "$device" vifs "${adhoc_if:-$sta_if $ap_if $mon_if}"
52
53        ifdown="down"
54        for vif in 0 1 2 3; do
55                append ifdown "vif $vif" "$N"
56                append ifdown "enabled 0" "$N"
57        done
58
59        ap=1
60        infra=1
61        if [ "$_c" -gt 1 ]; then
62                mssid=1
63        else
64                mssid=
65        fi
66        apsta=0
67        radio=1
68        monitor=0
69        passive=0
70        case "$adhoc:$sta:$apmode:$mon" in
71                1*)
72                        ap=0
73                        mssid=
74                        infra=0
75                ;;
76                :1:1:)
77                        apsta=1
78                        wet=1
79                ;;
80                :1::)
81                        wet=1
82                        ap=0
83                        mssid=
84                ;;
85                :::1)
86                        wet=1
87                        ap=0
88                        mssid=
89                        monitor=1
90                        passive=1
91                ;;
92                ::)
93                        radio=0
94                ;;
95        esac
96}
97
98disable_broadcom() {
99        local device="$1"
100        set_wifi_down "$device"
101        wlc ifname "$device" down
102        (
103                include /lib/network
104
105                # make sure the interfaces are down and removed from all bridges
106                for dev in $device ${device}.1 ${device}.2 ${device}.3; do
107                        ifconfig "$dev" down 2>/dev/null >/dev/null && {
108                                unbridge "$dev"
109                        }
110                done
111        )
112        true
113}
114
115enable_broadcom() {
116        local device="$1"
117        local _c
118        config_get channel "$device" channel
119        config_get country "$device" country
120        config_get maxassoc "$device" maxassoc
121        config_get wds "$device" wds
122        config_get vifs "$device" vifs
123        config_get distance "$device" distance
124        config_get slottime "$device" slottime
125        config_get rxantenna "$device" rxantenna
126        config_get txantenna "$device" txantenna
127        config_get_bool frameburst "$device" frameburst
128        config_get macfilter "$device" macfilter
129        config_get maclist "$device" maclist
130        config_get macaddr "$device" macaddr
131        config_get txpower "$device" txpower
132        config_get frag "$device" frag
133        config_get rts "$device" rts
134        config_get hwmode "$device" hwmode
135        local vif_pre_up vif_post_up vif_do_up vif_txpower
136        local doth=0
137        local wmm=0
138
139        _c=0
140        nas="$(which nas)"
141        [ -n "$nas" ] && nas="start-stop-daemon -S -b -x $nas -- "
142        nas_cmd=
143        if_up=
144
145        [ -z "$slottime" ] && {
146                [ -n "$distance" ] && {
147                        # slottime = 9 + (distance / 150) + (distance % 150 ? 1 : 0)
148                        slottime="$((9 + ($distance / 150) + 1 - (150 - ($distance % 150)) / 150 ))"
149                }
150        } || {
151                slottime="${slottime:--1}"
152        }
153
154        case "$macfilter" in
155                allow|2)
156                        macfilter=2;
157                ;;
158                deny|1)
159                        macfilter=1;
160                ;;
161                disable|none|0)
162                        macfilter=0;
163                ;;
164        esac
165
166        case "$hwmode" in
167                *b)   hwmode=0;;
168                *bg)  hwmode=1;;
169                *g)   hwmode=2;;
170                *gst) hwmode=4;;
171                *lrs) hwmode=5;;
172                *)    hwmode=1;;
173        esac
174
175        for vif in $vifs; do
176                config_get vif_txpower "$vif" txpower
177
178                config_get mode "$vif" mode
179                append vif_pre_up "vif $_c" "$N"
180                append vif_post_up "vif $_c" "$N"
181                append vif_do_up "vif $_c" "$N"
182
183                config_get_bool wmm "$vif" wmm "$wmm"
184                config_get_bool doth "$vif" doth "$doth"
185
186                [ "$mode" = "sta" ] || {
187                        config_get_bool hidden "$vif" hidden 0
188                        append vif_pre_up "closed $hidden" "$N"
189                        config_get_bool isolate "$vif" isolate 0
190                        append vif_pre_up "ap_isolate $isolate" "$N"
191                }
192
193                wsec_r=0
194                eap_r=0
195                wsec=0
196                auth=0
197                nasopts=
198                config_get enc "$vif" encryption
199                case "$enc" in
200                        *WEP*|*wep*)
201                                wsec_r=1
202                                wsec=1
203                                defkey=1
204                                config_get key "$vif" key
205                                case "$enc" in
206                                        *shared*) append vif_do_up "wepauth 1" "$N";;
207                                        *) append vif_do_up "wepauth 0" "$N";;
208                                esac
209                                case "$key" in
210                                        [1234])
211                                                defkey="$key"
212                                                for knr in 1 2 3 4; do
213                                                        config_get k "$vif" key$knr
214                                                        [ -n "$k" ] || continue
215                                                        [ "$defkey" = "$knr" ] && def="=" || def=""
216                                                        append vif_do_up "wepkey $def$knr,$k" "$N"
217                                                done
218                                        ;;
219                                        "");;
220                                        *) append vif_do_up "wepkey =1,$key" "$N";;
221                                esac
222                        ;;
223                        *psk*|*PSK*)
224                                wsec_r=1
225                                config_get key "$vif" key
226                                case "$enc" in
227                                        wpa*+wpa2*|WPA*+WPA2*|*psk+*psk2|*PSK+*PSK2) auth=132; wsec=6;;
228                                        wpa2*|WPA2*|*PSK2|*psk2) auth=128; wsec=4;;
229                                        *aes|*AES) auth=4; wsec=4;;
230                                        *) auth=4; wsec=2;;
231                                esac
232                                # group rekey interval
233                                config_get rekey "$vif" wpa_group_rekey
234
235                                eval "${vif}_key=\"\$key\""
236                                nasopts="-k \"\$${vif}_key\"${rekey:+ -g $rekey}"
237                        ;;
238                        *wpa*|*WPA*)
239                                wsec_r=1
240                                eap_r=1
241                                config_get auth_server "$vif" auth_server
242                                [ -z "$auth_server" ] && config_get auth_server "$vif" server
243                                config_get auth_port "$vif" auth_port
244                                [ -z "$auth_port" ] && config_get auth_port "$vif" port
245                                config_get auth_secret "$vif" auth_secret
246                                [ -z "$auth_secret" ] && config_get auth_secret "$vif" key
247
248                                # wpa version + default cipher
249                                case "$enc" in
250                                        wpa*+wpa2*|WPA*+WPA2*) auth=66; wsec=6;;
251                                        wpa2*|WPA2*) auth=64; wsec=4;;
252                                        *) auth=2; wsec=2;;
253                                esac
254                                # group rekey interval
255                                config_get rekey "$vif" wpa_group_rekey
256
257                                eval "${vif}_key=\"\$auth_secret\""
258                                nasopts="-r \"\$${vif}_key\" -h $auth_server -p ${auth_port:-1812}${rekey:+ -g $rekey}"
259                        ;;
260                esac
261                append vif_do_up "wsec $wsec" "$N"
262                append vif_do_up "wpa_auth $auth" "$N"
263                append vif_do_up "wsec_restrict $wsec_r" "$N"
264                append vif_do_up "eap_restrict $eap_r" "$N"
265
266                config_get ssid "$vif" ssid
267                append vif_post_up "vlan_mode 0" "$N"
268                append vif_post_up "ssid $ssid" "$N"
269                append vif_do_up "ssid $ssid" "$N"
270
271                [ "$mode" = "monitor" ] && {
272                        append vif_post_up "monitor $monitor" "$N"
273                        append vif_post_up "passive $passive" "$N"
274                }
275
276                [ "$mode" = "adhoc" ] && {
277                        config_get bssid "$vif" bssid
278                        [ -n "$bssid" ] && {
279                                append vif_pre_up "des_bssid $bssid" "$N"
280                                append vif_pre_up "allow_mode 1" "$N"
281                        }
282                } || append vif_pre_up "allow_mode 0" "$N"
283
284                append vif_post_up "enabled 1" "$N"
285
286                config_get ifname "$vif" ifname
287                #append if_up "ifconfig $ifname up" ";$N"
288
289                local net_cfg bridge
290                net_cfg="$(find_net_config "$vif")"
291                [ -z "$net_cfg" ] || {
292                        bridge="$(bridge_interface "$net_cfg")"
293                        append if_up "set_wifi_up '$vif' '$ifname'" ";$N"
294                        append if_up "start_net '$ifname' '$net_cfg' \$(wlc ifname '$ifname' bssid)" ";$N"
295                }
296                [ -z "$nasopts" ] || {
297                        eval "${vif}_ssid=\"\$ssid\""
298                        nas_mode="-A"
299                        use_nas=1
300                        [ "$mode" = "sta" ] && {
301                                nas_mode="-S"
302                                [ -z "$bridge" ] || {
303                                        append vif_post_up "supplicant 1" "$N"
304                                        append vif_post_up "passphrase $key" "$N"
305
306                                        use_nas=0
307                                }
308                        }
309                        [ -z "$nas" -o "$use_nas" = "0" ] || nas_cmd="${nas_cmd:+$nas_cmd$N}$nas -P /var/run/nas.$ifname.pid -H 34954 ${bridge:+ -l $bridge} -i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 $nasopts &"
310                }
311                _c=$(($_c + 1))
312        done
313        killall -KILL nas >&- 2>&-
314        wlc ifname "$device" stdin <<EOF
315$ifdown
316
317gmode ${hwmode:-1}
318apsta $apsta
319ap $ap
320${mssid:+mssid $mssid}
321infra $infra
322${wet:+wet 1}
323802.11d 0
324802.11h ${doth:-0}
325wme ${wmm:-0}
326rxant ${rxantenna:-3}
327txant ${txantenna:-3}
328fragthresh ${frag:-2346}
329rtsthresh ${rts:-2347}
330monitor ${monitor:-0}
331passive ${passive:-0}
332
333radio ${radio:-1}
334macfilter ${macfilter:-0}
335maclist ${maclist:-none}
336wds none
337${wds:+wds $wds}
338country ${country:-IL0}
339${channel:+channel $channel}
340maxassoc ${maxassoc:-128}
341slottime ${slottime:--1}
342${frameburst:+frameburst $frameburst}
343
344$vif_pre_up
345up
346$vif_post_up
347EOF
348        eval "$if_up"
349        wlc ifname "$device" stdin <<EOF
350$vif_do_up
351EOF
352
353        # use vif_txpower (from last wifi-iface) instead of txpower (from
354        # wifi-device) if the latter does not exist
355        txpower=${txpower:-$vif_txpower}
356        [ -z "$txpower" ] || iwconfig $device txpower ${txpower}dBm
357
358        eval "$nas_cmd"
359}
360
361
362detect_broadcom() {
363        local i=-1
364
365        while [ -f /proc/net/wl$((++i)) ]; do
366                config_get type wl${i} type
367                [ "$type" = broadcom ] && continue
368                cat <<EOF
369config wifi-device  wl${i}
370        option type     broadcom
371        option channel  11
372
373        # REMOVE THIS LINE TO ENABLE WIFI:
374        option disabled 1
375
376config wifi-iface
377        option device   wl${i}
378        option network  lan
379        option mode     ap
380        option ssid     OpenWrt${i#0}
381        option encryption none
382
383EOF
384        done
385}
Note: See TracBrowser for help on using the repository browser.