blob: 569c96e710c247195a26f5b48fde425217ac028f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
#!/bin/sh
set -x
append DRIVERS "atheros"
scan_atheros() {
local device="$1"
local wds
local adhoc sta ap
config_get vifs "$device" vifs
for vif in $vifs; do
config_get ifname "$vif" ifname
config_set "$vif" ifname "${ifname:-ath}"
config_get mode "$vif" mode
case "$mode" in
adhoc|sta|ap)
append $mode "$vif"
;;
wds)
config_get addr "$vif" bssid
${addr:+append wds "$addr"}
;;
*) echo "$device($vif): Invalid mode, ignored."; continue;;
esac
done
case "${adhoc:+1}:${sta:+}:${ap+1}" in
# valid mode combinations
1::);;
:1:1)config_set "$device" nosbeacon 1;; # AP+STA, can't use beacon timers for STA
:1:);;
::1);;
:::);;
*) echo "$device: Invalid mode combination in config"; return 1;;
esac
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }"
[ -z "$adhoc" ] && config_set "$device" wds "$wdsifs"
}
disable_atheros() (
local device="$1"
include /lib/network
cd /proc/sys/net
for dev in *; do
grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && {
ifconfig "$dev" down
unbridge "$dev"
wlanconfig $dev destroy
}
done
)
enable_atheros() {
config_get channel "$device" channel
config_get wds "$device" wds
config_get vifs "$device" vifs
for vif in $vifs; do
nosbeacon=
config_get ifname "$vif" ifname
config_get enc "$vif" encryption
config_get mode "$vif" mode
[ "$mode" = sta ] && config_get nosbeacon "$device" nosbeacon
config_get ifname "$vif" ifname
ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
config_set "$vif" ifname "$ifname"
[ $? -ne 0 ] && {
echo "enable_atheros($device): Failed to set up vif $ifname" >&2
continue
}
wpa=
case "$enc" in
WEP|wep)
for idx in 1 2 3 4; do
config_get key "$vif" "key${idx}"
iwconfig "$ifname" enc "[$idx]" "${key:-off}"
done
config_get key "$vif" key
iwconfig "$ifname" enc "$key"
;;
esac
case "$mode" in
ap)
local hostapd_cfg=
case "$enc" in
*psk*|*PSK*)
# FIXME: wpa
;;
*wpa*|*WPA*)
# FIXME: add wpa+radius here
;;
esac
;;
sta)
# FIXME: implement wpa_supplicant calls here
;;
esac
config_get ssid "$vif" ssid
append if_up "iwconfig $ifname essid $ssid channel $channel" ";$N"
append if_up "sleep 1" ";$N"
append if_up "ifconfig $ifname up" ";$N"
local net_cfg bridge
net_cfg="$(find_net_config "$vif")"
[ -z "$net_cfg" ] || {
bridge="$(bridge_interface "$net_cfg")"
append if_up "start_net '$ifname' '$net_cfg'" ";$N"
}
# TODO: start hostapd
done
#killall -KILL $hostapd >&- 2>&-
eval "$if_up"
}
detect_atheros() {
cd /proc/sys/dev
[ -d ath ] || return
for dev in wifi*; do
config_get type "$dev" type
[ "$type" = atheros ] && return
cat <<EOF
config wifi-device $dev
option type atheros
option channel 5
config wifi-iface
option device $dev
option mode ap
option ssid OpenWrt
option hidden 0
option encryption none
EOF
done
}
|