source: branches/backfire/package/hostap-driver/files/lib/wifi/hostap.sh @ 28320

Last change on this file since 28320 was 28320, checked in by acinonyx, 5 years ago

[backfire] backport: "[package] hostap-driver: introduce "disabled" option for wifi-iface section to shutdown single networks on a radio"

  • Property svn:executable set to *
File size: 4.9 KB
Line 
1#!/bin/sh
2append DRIVERS "prism2"
3
4scan_prism2() {
5        local device="$1"
6        local mainvif
7        local wds
8       
9        config_get vifs "$device" vifs
10        local _c=0
11        for vif in $vifs; do
12                config_get_bool disabled "$vif" disabled 0
13                [ $disabled = 0 ] || continue
14
15                config_get mode "$vif" mode
16                case "$mode" in
17                        adhoc|sta|ap|monitor)
18                                # Only one vif is allowed on AP, station, Ad-hoc or monitor mode
19                                [ -z "$mainvif" ] && {
20                                        mainvif="$vif"
21                                        config_set "$vif" ifname "$device"
22                                }
23                        ;;
24                        wds)
25                                config_get ssid "$vif" ssid
26                                [ -z "$ssid" ] && continue
27                                config_set "$vif" ifname "${device}wds${_c}"
28                                _c=$(($_c + 1))
29                                addr="$ssid"
30                                ${addr:+append wds "$vif"}
31                        ;;
32                        *) echo "$device($vif): Invalid mode, ignored."; continue;;
33                esac
34        done
35        config_set "$device" vifs "${mainvif:+$mainvif }${wds:+$wds}"
36}
37
38disable_prism2() (
39        local device="$1"
40       
41        set_wifi_down "$device"
42
43        include /lib/network
44        while read line < /proc/net/hostap/${device}/wds; do
45                set $line
46                [ -f "/var/run/wifi-${1}.pid" ] &&
47                        kill "$(cat "/var/run/wifi-${1}.pid")"
48                ifconfig "$1" down
49                unbridge "$1"
50                iwpriv "$device" wds_del "$2"
51        done
52        unbridge "$device"
53        return 0
54)
55
56enable_prism2() {
57        local device="$1"
58
59        config_get rxantenna "$device" rxantenna
60        config_get txantenna "$device" txantenna
61        config_get_bool diversity "$device" diversity
62        [ -n "$diversity" ] && {
63                rxantenna="1"
64                txantenna="1"
65        }
66        [ -n "$rxantenna" ] && iwpriv $device antsel_rx "$rxantenna"
67        [ -n "$txantenna" ] && iwpriv $device antsel_tx "$txantenna"
68
69        config_get channel "$device" channel
70        [ -n "$channel" ] && iwconfig "$device" channel "$channel" >/dev/null 2>/dev/null
71
72        config_get txpower "$device" txpower
73        [ -n "$txpower" ] && iwconfig "$device" txpower "${txpower%%.*}"
74
75        config_get vifs "$device" vifs
76        local first=1
77        for vif in $vifs; do
78                config_get ifname "$vif" ifname
79                config_get ssid "$vif" ssid
80                config_get mode "$vif" mode
81
82                [ "$mode" = "wds" ] || iwconfig "$device" essid -- "$ssid"
83
84                case "$mode" in
85                        sta)
86                                iwconfig "$device" mode managed
87                                config_get addr "$device" bssid
88                                [ -z "$addr" ] || { 
89                                        iwconfig "$device" ap "$addr"
90                                }
91                        ;;
92                        ap) iwconfig "$device" mode master;;
93                        wds) iwpriv "$device" wds_add "$ssid";;
94                        *) iwconfig "$device" mode "$mode";;
95                esac
96
97                [ "$first" = 1 ] && {
98                        config_get rate "$vif" rate
99                        [ -n "$rate" ] && iwconfig "$device" rate "${rate%%.*}"
100
101                        config_get_bool hidden "$vif" hidden 0
102                        iwpriv "$device" enh_sec "$hidden"
103
104                        config_get frag "$vif" frag
105                        [ -n "$frag" ] && iwconfig "$device" frag "${frag%%.*}"
106
107                        config_get rts "$vif" rts
108                        [ -n "$rts" ] && iwconfig "$device" rts "${rts%%.*}"
109
110                        config_get maclist "$vif" maclist
111                        [ -n "$maclist" ] && {
112                                # flush MAC list
113                                iwpriv "$device" maccmd 3
114                                for mac in $maclist; do
115                                        iwpriv "$device" addmac "$mac"
116                                done
117                        }
118                        config_get macpolicy "$vif" macpolicy
119                        case "$macpolicy" in
120                                allow)
121                                        iwpriv $device maccmd 2
122                                ;;
123                                deny)
124                                        iwpriv $device maccmd 1
125                                ;;
126                                *)
127                                        # default deny policy if mac list exists
128                                        [ -n "$maclist" ] && iwpriv $device maccmd 1
129                                ;;
130                        esac
131                        # kick all stations if we have policy explicitly set
132                        [ -n "$macpolicy" ] && iwpriv $device maccmd 4
133                }
134
135                config_get enc "$vif" encryption
136                case "$enc" in
137                        WEP|wep)
138                                for idx in 1 2 3 4; do
139                                        config_get key "$vif" "key${idx}"
140                                        iwconfig "$ifname" enc "[$idx]" "${key:-off}"
141                                done
142                                config_get key "$vif" key
143                                key="${key:-1}"
144                                case "$key" in
145                                        [1234]) iwconfig "$ifname" enc "[$key]";;
146                                        *) iwconfig "$ifname" enc "$key";;
147                                esac
148                        ;;
149                        psk*|wpa*)
150                                start_hostapd=1
151                                config_get key "$vif" key
152                        ;;
153                esac
154
155                local net_cfg bridge
156                net_cfg="$(find_net_config "$vif")"
157                [ -z "$net_cfg" ] || {
158                        bridge="$(bridge_interface "$net_cfg")"
159                        config_set "$vif" bridge "$bridge"
160                        start_net "$ifname" "$net_cfg"
161                }
162                set_wifi_up "$vif" "$ifname"
163
164                case "$mode" in
165                        ap)
166                                if [ -n "$start_hostapd" ] && eval "type hostapd_setup_vif" 2>/dev/null >/dev/null; then
167                                        hostapd_setup_vif "$vif" hostap || {
168                                                echo "enable_prism2($device): Failed to set up hostapd for interface $ifname" >&2
169                                                # make sure this wifi interface won't accidentally stay open without encryption
170                                                ifconfig "$ifname" down
171                                                continue
172                                        }
173                                fi
174                        ;;
175                        wds|sta)
176                                if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
177                                        wpa_supplicant_setup_vif "$vif" hostap || {
178                                                echo "enable_prism2($device): Failed to set up wpa_supplicant for interface $ifname" >&2
179                                                ifconfig "$ifname" down
180                                                continue
181                                        }
182                                fi
183                        ;;
184                esac
185                first=0
186        done
187
188}
189
190detect_prism2() {
191        cd /proc/net/hostap
192        [ -d wlan* ] || return
193        for dev in $(ls -d wlan* 2>&-); do
194                config_get type "$dev" type
195                [ "$type" = prism2 ] && continue
196                cat <<EOF
197
198config wifi-device $dev
199        option type     prism2
200        option channel  6
201
202        # REMOVE THIS LINE TO ENABLE WIFI:
203        option disabled 1
204
205config wifi-iface
206        option device   $dev
207        option network  lan
208        option mode     ap
209        option ssid     OpenWrt
210        option encryption none
211EOF
212        done
213}
Note: See TracBrowser for help on using the repository browser.