From 3db732ed503bf7ef47c59cee5511e30e5bd60860 Mon Sep 17 00:00:00 2001 From: oblique Date: Wed, 1 Oct 2014 12:04:57 +0300 Subject: [PATCH] Get the current channel with 'iw dev wlanN link' With older versions of iw we can not get the channel that we are currently associated with. So we cannot detect if we have to fallback to that channel. Because of this, hostapd exits with the following errors: Failed to set beacon parameters Interface initialization failed ap0: interface state UNINITIALIZED->DISABLED ap0: AP-DISABLED ap0: Unable to setup interface. hostapd_free_hapd_data: Interface ap0 wasn't started A solution is to get the frequency from 'iw dev wlanN link' and convert it to the channel number. Fix #50 --- create_ap | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/create_ap b/create_ap index 2e434e6..d236953 100755 --- a/create_ap +++ b/create_ap @@ -162,6 +162,24 @@ can_transmit_to_channel() { fi } +# taken from iw/util.c +ieee80211_frequency_to_channel() { + FREQ=$1 + if [[ $FREQ -eq 2484 ]]; then + echo 14 + elif [[ $FREQ -lt 2484 ]]; then + echo $(( ($FREQ - 2407) / 5 )) + elif [[ $FREQ -ge 4910 && $FREQ -le 4980 ]]; then + echo $(( ($FREQ - 4000) / 5 )) + elif [[ $FREQ -le 45000 ]]; then + echo $(( ($FREQ - 5000) / 5 )) + elif [[ $FREQ -ge 58320 && $FREQ -le 64800 ]]; then + echo $(( ($FREQ - 56160) / 2160 )) + else + echo 0 + fi +} + is_wifi_connected() { if [[ $USE_IWCONFIG -eq 0 ]]; then iw dev "$1" link 2>&1 | grep -E '^Connected to' > /dev/null 2>&1 && return 0 @@ -674,11 +692,14 @@ if [[ $NO_VIRT -eq 0 ]]; then echo "DONE" fi - WIFI_IFACE_CHANNEL=$(iw dev ${WIFI_IFACE} info | grep channel | awk '{print $2}') - - if [[ -n $WIFI_IFACE_CHANNEL && $WIFI_IFACE_CHANNEL -ne $CHANNEL ]]; then - echo "hostapd will fail to use channel $CHANNEL because $WIFI_IFACE is already set to channel $WIFI_IFACE_CHANNEL, fallback to channel $WIFI_IFACE_CHANNEL." - CHANNEL=$WIFI_IFACE_CHANNEL + if is_wifi_connected ${WIFI_IFACE}; then + WIFI_IFACE_FREQ=$(iw dev ${WIFI_IFACE} link | grep -i freq | awk '{print $2}') + WIFI_IFACE_CHANNEL=$(ieee80211_frequency_to_channel ${WIFI_IFACE_FREQ}) + echo "${WIFI_IFACE} is already set at channel ${WIFI_IFACE_CHANNEL} (${WIFI_IFACE_FREQ} MHz)" + if [[ $WIFI_IFACE_CHANNEL -ne $CHANNEL ]]; then + echo "We can not set to channel ${CHANNEL}, fallback to channel ${WIFI_IFACE_CHANNEL}" + CHANNEL=$WIFI_IFACE_CHANNEL + fi fi VIRTDIEMSG="Maybe your WiFi adapter does not fully support virtual interfaces.