return 0
)
-
+get_freq() {
+ local phy="$1"
+ local chan="$2"
+ iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep MHz | awk '{print $2}'
+}
enable_mac80211() {
local device="$1"
config_get channel "$device" channel
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" "${fixed:+$channel}")"
wifi_fixup_hwmode "$device" "g"
for vif in $vifs; do
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
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
;;
esac
# We attempt to set teh channel for all interfaces, although
# mac80211 may not support it or the driver might not yet
- iw dev "$ifname" set channel "$channel"
+ [ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel"
local key keystring
}
fi
;;
- sta|mesh|adhoc)
- # Fixup... sometimes you have to scan to get beaconing going
- iw dev "$ifname" scan &> /dev/null
+ adhoc)
+ config_get bssid "$vif" bssid
+ iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid
+ ;;
+ sta|mesh)
+ 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 || {
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
}
fi
;;
+ *)
+ iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid
+ ;;
esac
;;
[ -n "$type" ] || break
devidx=$(($devidx + 1))
done
+ mode_11n=""
+ mode_band="g"
+ 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"
cat <<EOF
config wifi-device wifi$devidx
option type mac80211
option channel 5
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