/etc/config/wireless support for madwifi (work in progress)
authorMike Baker <mbm@openwrt.org>
Thu, 23 Nov 2006 18:27:22 +0000 (18:27 +0000)
committerMike Baker <mbm@openwrt.org>
Thu, 23 Nov 2006 18:27:22 +0000 (18:27 +0000)
SVN-Revision: 5630

package/madwifi/files/lib/wifi/madwifi.sh [new file with mode: 0755]

diff --git a/package/madwifi/files/lib/wifi/madwifi.sh b/package/madwifi/files/lib/wifi/madwifi.sh
new file mode 100755 (executable)
index 0000000..569c96e
--- /dev/null
@@ -0,0 +1,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
+}
+