summaryrefslogtreecommitdiffstats
path: root/package/madwifi/files/lib/wifi/madwifi.sh
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
}