X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/256a5ee7f7eb4f1c19a4be09ad64e5ade573828d..e3bd6b245abb37a08f7fe7b20832b90bd7f09d52:/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 6ee643565..a3cf4d75e 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,26 @@ disable_atheros() ( enable_atheros() { local device="$1" + + config_get regdomain "$device" regdomain + [ -n "$regdomain" ] && echo "$regdomain" > /proc/sys/dev/$device/regdomain + + config_get country "$device" country + [ -z "$country" ] && country="0" + echo "$country" > /proc/sys/dev/$device/countrycode + + config_get_bool outdoor "$device" outdoor "0" + echo "$outdoor" > /proc/sys/dev/$device/outdoor + 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,25 +107,25 @@ 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" pureg "$pureg" [ "$first" = 1 ] && { + iwpriv "$ifname" mode "$hwmode" iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null } @@ -161,7 +169,7 @@ enable_atheros() { esac case "$mode" in - adhoc|ahdemo) + sta|adhoc|ahdemo) config_get addr "$vif" bssid [ -z "$addr" ] || { iwconfig "$ifname" ap "$addr" @@ -215,9 +223,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%%.*}" @@ -254,9 +259,15 @@ enable_atheros() { config_get_bool turbo "$vif" turbo [ -n "$turbo" ] && iwpriv "$ifname" turbo "$turbo" + config_get_bool beacon_power "$vif" beacon_power + [ -n "$beacon_power" ] && iwpriv "$ifname" beacon_pwr "$beacon_power" + 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 @@ -281,6 +292,7 @@ enable_atheros() { esac ifconfig "$ifname" up + local net_cfg bridge net_cfg="$(find_net_config "$vif")" [ -z "$net_cfg" ] || { @@ -291,6 +303,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