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

Last change on this file since 6039 was 6039, checked in by nbd, 10 years ago

fix a typo

  • Property svn:executable set to *
File size: 4.0 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 "$device" mode
96                        pureg=0
97                        case "$mode" in
98                                *b) mode=11b;;
99                                *bg) mode=11g;;
100                                *g) mode=11g; pureg=1;;
101                                *a) mode=11a;;
102                                *) mode=11g;;
103                        esac
104                        iwconfig "$ifname" channel 0
105                        iwpriv "$ifname" mode "$mode"
106                        iwpriv "$ifname" pureg "$pureg"
107                        iwconfig "$ifname" channel "$channel"
108                }
109
110                config_get wds "$vif" wds
111                case "$wds" in
112                        1|on|enabled) wds=1;;
113                        *) wds=0;;
114                esac
115                iwpriv "$ifname" wds "$wds"
116
117                wpa=
118                case "$enc" in
119                        WEP|wep)
120                                for idx in 1 2 3 4; do
121                                        config_get key "$vif" "key${idx}"
122                                        iwconfig "$ifname" enc "[$idx]" "${key:-off}"
123                                done
124                                config_get key "$vif" key
125                                iwconfig "$ifname" enc "[${key:-1}]"
126                        ;;
127                esac
128
129                case "$mode" in
130                        wds)
131                                config_get addr "$vif" bssid
132                                iwpriv "$ifname" wds_add "$addr"
133                        ;;
134                        *)
135                                config_get ssid "$vif" ssid
136                        ;;
137                esac
138                ifconfig "$ifname" up
139               
140                local net_cfg bridge
141                net_cfg="$(find_net_config "$vif")"
142                [ -z "$net_cfg" ] || {
143                        bridge="$(bridge_interface "$net_cfg")"
144                        config_set "$vif" bridge "$bridge"
145                        start_net "$ifname" "$net_cfg"
146                }
147                iwconfig "$ifname" essid "$ssid"
148                case "$mode" in
149                        ap)
150                                hostapd_setup_vif "$vif" madwifi || {
151                                        echo "enable_atheros($device): Failed to set up wpa for interface $ifname" >&2
152                                        # make sure this wifi interface won't accidentally stay open without encryption
153                                        ifconfig "$ifname" down
154                                        wlanconfig "$ifname" destroy
155                                        continue
156                                }
157                        ;;
158                        wds|sta)
159                                # FIXME: implement wpa_supplicant calls here
160                        ;;
161                esac
162                first=0
163        done
164}
165
166
167detect_atheros() {
168        cd /proc/sys/dev
169        [ -d ath ] || return
170        for dev in wifi*; do
171                config_get type "$dev" type
172                [ "$type" = atheros ] && return
173                cat <<EOF
174config wifi-device  $dev
175        option type     atheros
176        option channel  5
177
178config wifi-iface
179        option device   $dev
180#       option network  lan
181        option mode     ap
182        option ssid     OpenWrt
183        option hidden   0
184        option encryption none
185
186EOF
187        done
188}
189
Note: See TracBrowser for help on using the repository browser.