source: trunk/package/broadcom-wl/files/lib/wifi/broadcom.sh @ 21809

Last change on this file since 21809 was 21809, checked in by nbd, 6 years ago

Add a new kernel-version independent broadcom binary driver for brcm47xx (contributed by NewMedia-NET)
This will allow us to get rid of brcm-2.4 soon.
[ ... and there was much rejoicing ]

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