mac80211: select channel 36 by default on 5GHz only devices
[openwrt.git] / package / mac80211 / files / lib / wifi / mac80211.sh
index 1a8272a..591d978 100644 (file)
@@ -68,8 +68,8 @@ disable_mac80211() (
 )
 get_freq() {
        local phy="$1"
-       local channel="$2"
-       iw "$phy" info | grep -E -m1 "(\* ${channel:-....} MHz${channel:+|\\[$channel\\]})" | grep MHz | awk '{print $2}'
+       local chan="$2"
+       iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep MHz | awk '{print $2}'
 }
 enable_mac80211() {
        local device="$1"
@@ -79,9 +79,15 @@ enable_mac80211() {
        find_mac80211_phy "$device" || return 0
        config_get phy "$device" phy
        local i=0
+       fixed=""
 
+       [ "$channel" = "auto" -o "$channel" = "0" ] || {
+               fixed=1
+       }
+
+       export channel fixed
        # convert channel to frequency
-       local freq="$(get_freq "$phy" "$channel")"
+       local freq="$(get_freq "$phy" "${fixed:+$channel}")"
 
        wifi_fixup_hwmode "$device" "g"
        for vif in $vifs; do
@@ -98,6 +104,7 @@ enable_mac80211() {
                config_get enc "$vif" encryption
                config_get mode "$vif" mode
                config_get ssid "$vif" ssid
+               config_get_bool wds "$vif" wds 0
 
                # It is far easier to delete and create the desired interface
                case "$mode" in
@@ -117,7 +124,12 @@ enable_mac80211() {
                                iw phy "$phy" interface add "$ifname" type monitor
                        ;;
                        sta)
-                               iw phy "$phy" interface add "$ifname" type managed
+                               local wdsflag
+                               [ "$wds" -gt 0 ] && wdsflag="wds on"
+                               iw phy "$phy" interface add "$ifname" type managed $wdsflag
+                               config_get_bool powersave "$vif" powersave 0
+                               [ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
+                               iwconfig "$ifname" power "$powersave"
                        ;;
                esac
 
@@ -141,7 +153,7 @@ enable_mac80211() {
 
                # We attempt to set teh channel for all interfaces, although
                # mac80211 may not support it or the driver might not yet
-               [ -z "$channel" ] || iw dev "$ifname" set channel "$channel" 
+               [ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel"
 
                local key keystring
 
@@ -222,16 +234,15 @@ enable_mac80211() {
                        ;;
                        adhoc)
                                config_get bssid "$vif" bssid
-                               iw dev "$ifname" ibss join "$ssid" ${freq:+$freq fixed-freq} $bssid
+                               iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid
                        ;;
                        sta|mesh)
-                               # Fixup... sometimes you have to scan to get beaconing going
-                               iw dev "$ifname" scan &> /dev/null
+                               config_get bssid "$vif" bssid
                                case "$enc" in                                                                                           
                                        wep)
                                                if [ -e "$keymgmt" ]; then
                                                        [ -n "$keystring" ] &&
-                                                               iw dev "$ifname" connect "$ssid" key "$keystring"
+                                                               iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key "$keystring"
                                                else
                                                        if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
                                                                wpa_supplicant_setup_vif "$vif" wext || {
@@ -243,7 +254,8 @@ enable_mac80211() {
                                                        fi
                                                fi
                                        ;;
-                                       wpa)
+                                       wpa*|psk*)
+                                               config_get key "$vif" key
                                                if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
                                                        wpa_supplicant_setup_vif "$vif" wext || {
                                                                echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
@@ -253,6 +265,9 @@ enable_mac80211() {
                                                        }
                                                fi
                                        ;;
+                                       *)
+                                               iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid
+                                       ;;
                                esac
 
                        ;;
@@ -285,17 +300,32 @@ detect_mac80211() {
                done
                mode_11n=""
                mode_band="g"
-               iw phy "$dev" info | grep -q 'HT cap' && mode_11n="n"
-               iw phy "$dev" info | grep -q '2412 MHz' || mode_band="a"
+               channel="5"
+               ht_cap=0
+               for cap in $(iw phy "$dev" info | grep 'HT capabilities' | cut -d: -f2); do
+                       ht_cap="$(($ht_cap | $cap))"
+               done
+               ht_capab="";
+               [ "$ht_cap" -gt 0 ] && {
+                       mode_11n="n"
+                       list="  list ht_capab"
+                       [ "$(($ht_cap & 2))" -eq 1 ] && append ht_capab "$list  LDPC" "$N"
+                       [ "$(($ht_cap & 2))" -eq 2 ] && append ht_capab "$list  HT40-" "$N"
+                       [ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list        SHORT-GI-20" "$N"
+                       [ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list        SHORT-GI-40" "$N"
+                       [ "$(($ht_cap & 4096))" -eq 4096 ] && append ht_capab "$list    DSSS_CCK-40" "$N"
+               }
+               iw phy "$dev" info | grep -q '2412 MHz' || mode_band="a"; channel="36"
 
                cat <<EOF
 config wifi-device  wifi$devidx
        option type     mac80211
-       option channel  5
+       option channel  ${channel}
        option macaddr  $(cat /sys/class/ieee80211/${dev}/macaddress)
        option hwmode   11${mode_11n}${mode_band}
        # REMOVE THIS LINE TO ENABLE WIFI:
        option disabled 1
+$ht_capab
 
 config wifi-iface
        option device   wifi$devidx