X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/ef1ad461049d19b31056d9015daacc41fae9cb36..c9b10f2eb14ea64cf300438131ca05a02ce18069:/package/madwifi/files/lib/wifi/madwifi.sh diff --git a/package/madwifi/files/lib/wifi/madwifi.sh b/package/madwifi/files/lib/wifi/madwifi.sh index b6ba46562..52086f04b 100755 --- a/package/madwifi/files/lib/wifi/madwifi.sh +++ b/package/madwifi/files/lib/wifi/madwifi.sh @@ -31,7 +31,7 @@ scan_atheros() { esac done - case "${adhoc:+1}:${sta:+1}:${ap+1}" in + case "${adhoc:+1}:${sta:+1}:${ap:+1}" in # valid mode combinations 1::) wds="";; 1::1);; @@ -42,7 +42,7 @@ scan_atheros() { *) echo "$device: Invalid mode combination in config"; return 1;; esac - config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }${monitor:+$monitor}" + config_set "$device" vifs "${sta:+$sta }${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${wds:+$wds }${monitor:+$monitor}" } @@ -50,18 +50,14 @@ disable_atheros() ( local device="$1" set_wifi_down "$device" - # kill all running hostapd and wpa_supplicant processes that - # are running on atheros vifs - for pid in `pidof hostapd wpa_supplicant`; do - grep ath /proc/$pid/cmdline >/dev/null && \ - kill $pid - done include /lib/network cd /proc/sys/net for dev in *; do grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && { - ifconfig "$dev" down + [ -f "/var/run/wifi-${dev}.pid" ] && + kill "$(cat "/var/run/wifi-${dev}.pid")" + ifconfig "$dev" down unbridge "$dev" wlanconfig "$dev" destroy } @@ -71,14 +67,24 @@ disable_atheros() ( enable_atheros() { local device="$1" + # Can only set the country code to one setting for the entire system. The last country code is the one that will be applied. + config_get country "$device" country + [ -z "$country" ] && country="0" + local cc="0" + [ -e /proc/sys/dev/$device/countrycode ] && cc="$(cat /proc/sys/dev/$device/countrycode)" + if [ ! "$cc" = "$country" ] ; then + rmmod ath_pci + insmod ath_pci countrycode=$country + fi config_get channel "$device" channel config_get vifs "$device" vifs + config_get txpower "$device" txpower [ auto = "$channel" ] && channel=0 local first=1 for vif in $vifs; do - local start_hostapd + local start_hostapd vif_txpower nosbeacon= config_get ifname "$vif" ifname config_get enc "$vif" encryption @@ -99,22 +105,22 @@ enable_atheros() { config_set "$vif" ifname "$ifname" # only need to change freq band and channel on the first vif - config_get agmode "$device" agmode - [ -z "$agmode" ] && config_get agmode "$device" mode + config_get hwmode "$device" hwmode + [ -z "$hwmode" ] && config_get hwmode "$device" mode pureg=0 - case "$agmode" in - *b) agmode=11b;; - *bg) agmode=11g;; - *g) agmode=11g; pureg=1;; - *gdt) agmode=11gdt;; - *a) agmode=11a;; - *adt) agmode=11adt;; - *ast) agmode=11ast;; - *fh) agmode=fh;; - *) agmode=auto;; + case "$hwmode" in + *b) hwmode=11b;; + *bg) hwmode=11g;; + *g) hwmode=11g; pureg=1;; + *gdt) hwmode=11gdt;; + *a) hwmode=11a;; + *adt) hwmode=11adt;; + *ast) hwmode=11ast;; + *fh) hwmode=fh;; + *) hwmode=auto;; esac - iwpriv "$ifname" mode "$agmode" + iwpriv "$ifname" mode "$hwmode" iwpriv "$ifname" pureg "$pureg" [ "$first" = 1 ] && { @@ -177,12 +183,11 @@ enable_atheros() { config_get antrx "$device" rxantenna config_get anttx "$device" txantenna config_get_bool softled "$device" softled 1 - config_get_bool gpioctl "$device" gpioctl devname="$(cat /proc/sys/dev/$device/dev_name)" antgpio= case "$devname" in - NanoStation2) antgpio=wlan; [ -n "$gpioctl" ] && gpioctl=0;; + NanoStation2) antgpio=7;; NanoStation5) antgpio=1;; esac if [ -n "$antgpio" ]; then @@ -198,20 +203,12 @@ enable_atheros() { [ -x "$(which gpioctl 2>/dev/null)" ] || antenna= case "$antenna" in horizontal|vertical|auto) - if [ "$gpioctl" = "0" ]; then - echo 1 >/sys/class/leds/$antgpio/brightness 2>&1 - else - gpioctl "dirout" "$antgpio" >/dev/null 2>&1 - gpioctl "set" "$antgpio" >/dev/null 2>&1 - fi + gpioctl "dirout" "$antgpio" >/dev/null 2>&1 + gpioctl "set" "$antgpio" >/dev/null 2>&1 ;; external) - if [ "$gpioctl" = "0" ]; then - echo 0 >/sys/class/leds/$antgpio/brightness - else - gpioctl "dirout" "$antgpio" >/dev/null 2>&1 - gpioctl "clear" "$antgpio" >/dev/null 2>&1 - fi + gpioctl "dirout" "$antgpio" >/dev/null 2>&1 + gpioctl "clear" "$antgpio" >/dev/null 2>&1 ;; esac fi @@ -224,9 +221,6 @@ enable_atheros() { config_get distance "$device" distance [ -n "$distance" ] && athctrl -i "$device" -d "$distance" >&- - config_get txpwr "$vif" txpower - [ -n "$txpwr" ] && iwconfig "$ifname" txpower "${txpwr%%.*}" - config_get rate "$vif" rate [ -n "$rate" ] && iwconfig "$ifname" rate "${rate%%.*}" @@ -266,6 +260,9 @@ enable_atheros() { config_get_bool doth "$vif" doth 0 [ -n "$doth" ] && iwpriv "$ifname" doth "$doth" + config_get_bool probereq "$vif" probereq + [ -n "$probereq" ] && iwpriv "$ifname" probereq "$probereq" + config_get maclist "$vif" maclist [ -n "$maclist" ] && { # flush MAC list @@ -290,6 +287,7 @@ enable_atheros() { esac ifconfig "$ifname" up + local net_cfg bridge net_cfg="$(find_net_config "$vif")" [ -z "$net_cfg" ] || { @@ -300,6 +298,17 @@ enable_atheros() { [ -n "$ssid" ] && iwconfig "$ifname" essid on iwconfig "$ifname" essid "$ssid" set_wifi_up "$vif" "$ifname" + + # TXPower settings only work if device is up already + # while atheros hardware theoretically is capable of per-vif (even per-packet) txpower + # adjustment it does not work with the current atheros hal/madwifi driver + + config_get vif_txpower "$vif" txpower + # use vif_txpower (from wifi-iface) instead of txpower (from wifi-device) if + # the latter doesn't exist + txpower="${txpower:-$vif_txpower}" + [ -z "$txpower" ] || iwconfig "$ifname" txpower "${txpower%%.*}" + case "$mode" in ap) config_get_bool isolate "$vif" isolate 0