From 4fca99b1dc1635bb9770dd3ddf270b8e19022802 Mon Sep 17 00:00:00 2001
From: Vasilis Tsiligiannis <acinonyx@openwrt.gr>
Date: Mon, 14 Mar 2011 23:48:25 +0000
Subject: hostap-driver: Add support for multiple interfaces

SVN-Revision: 26162
---
 package/hostap-driver/files/lib/wifi/hostap.sh | 118 ++++++++++++++++++-------
 1 file changed, 87 insertions(+), 31 deletions(-)

(limited to 'package/hostap-driver/files/lib/wifi')

diff --git a/package/hostap-driver/files/lib/wifi/hostap.sh b/package/hostap-driver/files/lib/wifi/hostap.sh
index d5afc04..8ad378b 100755
--- a/package/hostap-driver/files/lib/wifi/hostap.sh
+++ b/package/hostap-driver/files/lib/wifi/hostap.sh
@@ -1,11 +1,41 @@
 #!/bin/sh
 append DRIVERS "prism2"
 
+find_prism2_phy() {
+	local device="$1"
+
+	local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
+	config_get phy "$device" phy
+	[ -z "$phy" -a -n "$macaddr" ] && {
+		cd /proc/net/hostap
+		for phy in $(ls -d wlan* 2>&-); do
+			[ "$macaddr" = "$(cat /sys/class/net/${phy}/address)" ] || continue
+			config_set "$device" phy "$phy"
+			break
+		done
+		config_get phy "$device" phy
+	}
+	[ -n "$phy" -a -d "/proc/net/hostap/$phy" ] || {
+		echo "phy for wifi device $1 not found"
+		return 1
+	}
+	[ -z "$macaddr" ] && {
+		config_set "$device" macaddr "$(cat /sys/class/net/${phy}/address)"
+	}
+	return 0
+}
+
 scan_prism2() {
 	local device="$1"
 	local mainvif
 	local wds
-	
+
+	[ ${device%[0-9]} = "wlan" ] && config_set "$device" phy "$device" || find_prism2_phy "$device" || {
+		config_unset "$device" vifs
+		return 0
+	}
+	config_get phy "$device" phy
+
 	config_get vifs "$device" vifs
 	local _c=0
 	for vif in $vifs; do
@@ -15,13 +45,13 @@ scan_prism2() {
 				# Only one vif is allowed on AP, station, Ad-hoc or monitor mode
 				[ -z "$mainvif" ] && {
 					mainvif="$vif"
-					config_set "$vif" ifname "$device"
+					config_set "$vif" ifname "$phy"
 				}
 			;;
 			wds)
 				config_get ssid "$vif" ssid
 				[ -z "$ssid" ] && continue
-				config_set "$vif" ifname "${device}wds${_c}"
+				config_set "$vif" ifname "${phy}wds${_c}"
 				_c=$(($_c + 1))
 				addr="$ssid"
 				${addr:+append wds "$vif"}
@@ -34,25 +64,31 @@ scan_prism2() {
 
 disable_prism2() (
 	local device="$1"
-	
+
+	find_prism2_phy "$device" || return 0
+	config_get phy "$device" phy
+
 	set_wifi_down "$device"
 
 	include /lib/network
-	while read line < /proc/net/hostap/${device}/wds; do
+	while read line < /proc/net/hostap/${phy}/wds; do
 		set $line
 		[ -f "/var/run/wifi-${1}.pid" ] &&
 			kill "$(cat "/var/run/wifi-${1}.pid")"
 		ifconfig "$1" down
 		unbridge "$1"
-		iwpriv "$device" wds_del "$2"
+		iwpriv "$phy" wds_del "$2"
 	done
-	unbridge "$device"
+	unbridge "$phy"
 	return 0
 )
 
 enable_prism2() {
 	local device="$1"
 
+	find_prism2_phy "$device" || return 0
+	config_get phy "$device" phy
+
 	config_get rxantenna "$device" rxantenna
 	config_get txantenna "$device" txantenna
 	config_get_bool diversity "$device" diversity
@@ -60,14 +96,14 @@ enable_prism2() {
 		rxantenna="1"
 		txantenna="1"
 	}
-	[ -n "$rxantenna" ] && iwpriv $device antsel_rx "$rxantenna"
-	[ -n "$txantenna" ] && iwpriv $device antsel_tx "$txantenna"
+	[ -n "$rxantenna" ] && iwpriv "$phy" antsel_rx "$rxantenna"
+	[ -n "$txantenna" ] && iwpriv "$phy" antsel_tx "$txantenna"
 
 	config_get channel "$device" channel
-	[ -n "$channel" ] && iwconfig "$device" channel "$channel" >/dev/null 2>/dev/null
+	[ -n "$channel" ] && iwconfig "$phy" channel "$channel" >/dev/null 2>/dev/null
 
 	config_get txpower "$device" txpower
-	[ -n "$txpower" ] && iwconfig "$device" txpower "${txpower%%.*}"
+	[ -n "$txpower" ] && iwconfig "$phy" txpower "${txpower%%.*}"
 
 	config_get vifs "$device" vifs
 	local first=1
@@ -76,57 +112,57 @@ enable_prism2() {
 		config_get ssid "$vif" ssid
 		config_get mode "$vif" mode
 
-		[ "$mode" = "wds" ] || iwconfig "$device" essid -- "$ssid"
+		[ "$mode" = "wds" ] || iwconfig "$phy" essid -- "$ssid"
 
 		case "$mode" in
 			sta)
-				iwconfig "$device" mode managed
+				iwconfig "$phy" mode managed
 				config_get addr "$device" bssid
 				[ -z "$addr" ] || { 
-					iwconfig "$device" ap "$addr"
+					iwconfig "$phy" ap "$addr"
 				}
 			;;
-			ap) iwconfig "$device" mode master;;
-			wds) iwpriv "$device" wds_add "$ssid";;
-			*) iwconfig "$device" mode "$mode";;
+			ap) iwconfig "$phy" mode master;;
+			wds) iwpriv "$phy" wds_add "$ssid";;
+			*) iwconfig "$phy" mode "$mode";;
 		esac
 
 		[ "$first" = 1 ] && {
 			config_get rate "$vif" rate
-			[ -n "$rate" ] && iwconfig "$device" rate "${rate%%.*}"
+			[ -n "$rate" ] && iwconfig "$phy" rate "${rate%%.*}"
 
 			config_get_bool hidden "$vif" hidden 0
-			iwpriv "$device" enh_sec "$hidden"
+			iwpriv "$phy" enh_sec "$hidden"
 
 			config_get frag "$vif" frag
-			[ -n "$frag" ] && iwconfig "$device" frag "${frag%%.*}"
+			[ -n "$frag" ] && iwconfig "$phy" frag "${frag%%.*}"
 
 			config_get rts "$vif" rts
-			[ -n "$rts" ] && iwconfig "$device" rts "${rts%%.*}"
+			[ -n "$rts" ] && iwconfig "$phy" rts "${rts%%.*}"
 
 			config_get maclist "$vif" maclist
 			[ -n "$maclist" ] && {
 				# flush MAC list
-				iwpriv "$device" maccmd 3
+				iwpriv "$phy" maccmd 3
 				for mac in $maclist; do
-					iwpriv "$device" addmac "$mac"
+					iwpriv "$phy" addmac "$mac"
 				done
 			}
 			config_get macpolicy "$vif" macpolicy
 			case "$macpolicy" in
 				allow)
-					iwpriv $device maccmd 2
+					iwpriv "$phy" maccmd 2
 				;;
 				deny)
-					iwpriv $device maccmd 1
+					iwpriv "$phy" maccmd 1
 				;;
 				*)
 					# default deny policy if mac list exists
-					[ -n "$maclist" ] && iwpriv $device maccmd 1
+					[ -n "$maclist" ] && iwpriv "$phy" maccmd 1
 				;;
 			esac
 			# kick all stations if we have policy explicitly set
-			[ -n "$macpolicy" ] && iwpriv $device maccmd 4
+			[ -n "$macpolicy" ] && iwpriv "$phy" maccmd 4
 		}
 
 		config_get enc "$vif" encryption
@@ -184,27 +220,47 @@ enable_prism2() {
 
 }
 
+check_device() {
+	[ ${1%[0-9]} = "wlan" ] && config_set "$1" phy "$1"
+	config_get phy "$1" phy
+	[ -z "$phy" ] && {
+		find_prism2_phy "$1" >/dev/null || return 0
+		config_get phy "$1" phy
+	}
+	[ "$phy" = "$dev" ] && found=1
+}
+
 detect_prism2() {
+	devidx=0
+	config_load wireless
+	while :; do
+		config_get type "radio$devidx" type
+		[ -n "$type" ] || break
+		devidx=$(($devidx + 1))
+	done
 	cd /proc/net/hostap
 	[ -d wlan* ] || return
 	for dev in $(ls -d wlan* 2>&-); do
-		config_get type "$dev" type
-		[ "$type" = prism2 ] && continue
+		found=0
+		config_foreach check_device wifi-device
+		[ "$found" -gt 0 ] && continue
 		cat <<EOF
 
-config wifi-device $dev
+config wifi-device radio$devidx
 	option type	prism2
 	option channel  11
+	option macaddr	$(cat /sys/class/net/${dev}/address)
 
 	# REMOVE THIS LINE TO ENABLE WIFI:
 	option disabled 1
 
 config wifi-iface
-	option device	$dev
+	option device	radio$devidx
 	option network	lan
 	option mode	ap
 	option ssid	OpenWrt
 	option encryption none
 EOF
+	devidx=$(($devidx + 1))
 	done
 }
-- 
cgit v1.1