diff --git a/package/madwifi/files/lib/wifi/madwifi.sh b/package/madwifi/files/lib/wifi/madwifi.sh new file mode 100755 index 0000000000..569c96e710 --- /dev/null +++ b/package/madwifi/files/lib/wifi/madwifi.sh @@ -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 <