hostap-driver: Add support for multiple interfaces
authorVasilis Tsiligiannis <acinonyx@openwrt.gr>
Mon, 14 Mar 2011 23:48:25 +0000 (23:48 +0000)
committerVasilis Tsiligiannis <acinonyx@openwrt.gr>
Mon, 14 Mar 2011 23:48:25 +0000 (23:48 +0000)
SVN-Revision: 26162

package/hostap-driver/Makefile
package/hostap-driver/files/lib/wifi/hostap.sh

index 8a70ad8df94c31a0736d3646ac338559174517d2..d08fd9c0a5fdfa2e64d27005e2dfb3d8e804bbd3 100644 (file)
@@ -1,5 +1,5 @@
 # 
-# Copyright (C) 2006 OpenWrt.org
+# Copyright (C) 2006-2011 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=hostap-driver
 PKG_VERSION:=0.4.9
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://hostap.epitest.fi/releases/
index d5afc0457871276f51d8f21f6b2ae6de43a25b17..8ad378bee4c69c490c2bdf783719b7086feb7476 100755 (executable)
@@ -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
 }