source: trunk/package/madwifi/files/lib/wifi/madwifi.sh @ 6501

Last change on this file since 6501 was 6501, checked in by pavlov, 10 years ago

same propset here as changeset:6500

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.1 KB
Line 
1#!/bin/sh
2append DRIVERS "atheros"
3
4scan_atheros() {
5        local device="$1"
6        local wds
7        local adhoc sta ap
8       
9        config_get vifs "$device" vifs
10        for vif in $vifs; do
11       
12                config_get ifname "$vif" ifname
13                config_set "$vif" ifname "${ifname:-ath}"
14               
15                config_get mode "$vif" mode
16                case "$mode" in
17                        adhoc|sta|ap)
18                                append $mode "$vif"
19                        ;;
20                        wds)
21                                config_get addr "$vif" bssid
22                                config_get ssid "$vif" ssid
23                                [ -z "$addr" -a -n "$ssid" ] && {
24                                        config_set "$vif" wds 1
25                                        config_set "$vif" mode sta
26                                        mode="sta"
27                                        addr="$ssid"
28                                }
29                                ${addr:+append $mode "$vif"}
30                        ;;
31                        *) echo "$device($vif): Invalid mode, ignored."; continue;;
32                esac
33        done
34
35        case "${adhoc:+1}:${sta:+1}:${ap+1}" in
36                # valid mode combinations
37                1::) wds="";;
38                :1:1)config_set "$device" nosbeacon 1;; # AP+STA, can't use beacon timers for STA
39                :1:);;
40                ::1);;
41                ::);;
42                *) echo "$device: Invalid mode combination in config"; return 1;;
43        esac
44
45        config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${wds:+$wds }"
46}
47
48
49disable_atheros() (
50        local device="$1"
51
52        # kill all running hostapd and wpa_supplicant processes that
53        # are running on atheros vifs
54        for pid in `pidof hostapd wpa_supplicant`; do
55                grep ath /proc/$pid/cmdline >/dev/null && \
56                        kill $pid
57        done
58       
59        include /lib/network
60        cd /proc/sys/net
61        for dev in *; do
62                grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && {
63                        ifconfig "$dev" down
64                        unbridge "$dev"
65                        wlanconfig "$dev" destroy
66                }
67        done
68        return 0
69)
70
71enable_atheros() {
72        config_get channel "$device" channel
73        config_get vifs "$device" vifs
74       
75        disable_atheros "$device"
76        local first=1
77        for vif in $vifs; do
78                nosbeacon=
79                config_get ifname "$vif" ifname
80                config_get enc "$vif" encryption
81                config_get mode "$vif" mode
82               
83                [ "$mode" = sta ] && config_get nosbeacon "$device" nosbeacon
84               
85                config_get ifname "$vif" ifname
86                ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
87                [ $? -ne 0 ] && {
88                        echo "enable_atheros($device): Failed to set up $mode vif $ifname" >&2
89                        continue
90                }
91                config_set "$vif" ifname "$ifname"
92
93                [ "$first" = 1 ] && {
94                        # only need to change freq band and channel on the first vif
95                        config_get agmode "$device" mode
96                        pureg=0
97                        case "$agmode" in
98                                *b) agmode=11b;;
99                                *bg) agmode=11g;;
100                                *g) agmode=11g; pureg=1;;
101                                *a) agmode=11a;;
102                                *) agmode=11g;;
103                        esac
104                        iwconfig "$ifname" channel 0
105                        iwpriv "$ifname" mode "$agmode"
106                        iwpriv "$ifname" pureg "$pureg"
107                        iwconfig "$ifname" channel "$channel"
108                }
109       
110                config_get_bool hidden "$vif" hidden
111                iwpriv "$ifname" hide_ssid "$hidden"
112
113                config_get wds "$vif" wds
114                case "$wds" in
115                        1|on|enabled) wds=1;;
116                        *) wds=0;;
117                esac
118                iwpriv "$ifname" wds "$wds"
119
120                wpa=
121                case "$enc" in
122                        WEP|wep)
123                                for idx in 1 2 3 4; do
124                                        config_get key "$vif" "key${idx}"
125                                        iwconfig "$ifname" enc "[$idx]" "${key:-off}"
126                                done
127                                config_get key "$vif" key
128                                iwconfig "$ifname" enc "${key:-1}"
129                        ;;
130                esac
131
132                case "$mode" in
133                        wds)
134                                config_get addr "$vif" bssid
135                                iwpriv "$ifname" wds_add "$addr"
136                        ;;
137                        *)
138                                config_get ssid "$vif" ssid
139                        ;;
140                esac
141                ifconfig "$ifname" up
142               
143                local net_cfg bridge
144                net_cfg="$(find_net_config "$vif")"
145                [ -z "$net_cfg" ] || {
146                        bridge="$(bridge_interface "$net_cfg")"
147                        config_set "$vif" bridge "$bridge"
148                        start_net "$ifname" "$net_cfg"
149                }
150                iwconfig "$ifname" essid "$ssid"
151                case "$mode" in
152                        ap)
153                                hostapd_setup_vif "$vif" madwifi || {
154                                        echo "enable_atheros($device): Failed to set up wpa for interface $ifname" >&2
155                                        # make sure this wifi interface won't accidentally stay open without encryption
156                                        ifconfig "$ifname" down
157                                        wlanconfig "$ifname" destroy
158                                        continue
159                                }
160                        ;;
161                        wds|sta)
162                                # FIXME: implement wpa_supplicant calls here
163                        ;;
164                esac
165                first=0
166        done
167}
168
169
170detect_atheros() {
171        cd /proc/sys/dev
172        [ -d ath ] || return
173        for dev in wifi*; do
174                config_get type "$dev" type
175                [ "$type" = atheros ] && return
176                cat <<EOF
177config wifi-device  $dev
178        option type     atheros
179        option channel  5
180
181config wifi-iface
182        option device   $dev
183#       option network  lan
184        option mode     ap
185        option ssid     OpenWrt
186        option hidden   0
187        option encryption none
188
189EOF
190        done
191}
192
Note: See TracBrowser for help on using the repository browser.