Use a common frequency to channel conversion function
authorJouni Malinen <j@w1.fi>
Sat, 27 Apr 2013 18:27:15 +0000 (21:27 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 27 Apr 2013 19:11:51 +0000 (22:11 +0300)
Signed-hostap: Jouni Malinen <j@w1.fi>

src/common/ieee802_11_common.c
src/common/ieee802_11_common.h
src/drivers/driver_nl80211.c
wpa_supplicant/ap.c
wpa_supplicant/sme.c

index 98fadda..407b066 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * IEEE 802.11 Common routines
- * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -9,6 +9,7 @@
 #include "includes.h"
 
 #include "common.h"
+#include "defs.h"
 #include "ieee802_11_defs.h"
 #include "ieee802_11_common.h"
 
@@ -486,3 +487,28 @@ int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
 
        return 0;
 }
+
+
+enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel)
+{
+       enum hostapd_hw_mode mode = NUM_HOSTAPD_MODES;
+
+       if (freq >= 2412 && freq <= 2472) {
+               mode = HOSTAPD_MODE_IEEE80211G;
+               *channel = (freq - 2407) / 5;
+       } else if (freq == 2484) {
+               mode = HOSTAPD_MODE_IEEE80211B;
+               *channel = 14;
+       } else if (freq >= 4900 && freq < 5000) {
+               mode = HOSTAPD_MODE_IEEE80211A;
+               *channel = (freq - 4000) / 5;
+       } else if (freq >= 5000 && freq < 5900) {
+               mode = HOSTAPD_MODE_IEEE80211A;
+               *channel = (freq - 5000) / 5;
+       } else if (freq >= 56160 + 2160 * 1 && freq <= 56160 + 2160 * 4) {
+               mode = HOSTAPD_MODE_IEEE80211AD;
+               *channel = (freq - 56160) / 2160;
+       }
+
+       return mode;
+}
index 55fa49d..7f59cf2 100644 (file)
@@ -99,5 +99,6 @@ struct hostapd_wmm_ac_params {
 
 int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
                          const char *name, const char *val);
+enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel);
 
 #endif /* IEEE802_11_COMMON_H */
index dd16e34..1c2f943 100644 (file)
@@ -5103,35 +5103,11 @@ static void phy_info_freq(struct hostapd_hw_modes *mode,
                          struct hostapd_channel_data *chan,
                          struct nlattr *tb_freq[])
 {
-       enum hostapd_hw_mode m;
-
+       u8 channel;
        chan->freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
        chan->flag = 0;
-
-       if (chan->freq < 4000)
-               m = HOSTAPD_MODE_IEEE80211B;
-       else if (chan->freq > 50000)
-               m = HOSTAPD_MODE_IEEE80211AD;
-       else
-               m = HOSTAPD_MODE_IEEE80211A;
-
-       switch (m) {
-       case HOSTAPD_MODE_IEEE80211AD:
-               chan->chan = (chan->freq - 56160) / 2160;
-               break;
-       case HOSTAPD_MODE_IEEE80211A:
-               chan->chan = chan->freq / 5 - 1000;
-               break;
-       case HOSTAPD_MODE_IEEE80211B:
-       case HOSTAPD_MODE_IEEE80211G:
-               if (chan->freq == 2484)
-                       chan->chan = 14;
-               else
-                       chan->chan = (chan->freq - 2407) / 5;
-               break;
-       default:
-               break;
-       }
+       if (ieee80211_freq_to_chan(chan->freq, &channel) != NUM_HOSTAPD_MODES)
+               chan->chan = channel;
 
        if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
                chan->flag |= HOSTAPD_CHAN_DISABLED;
index 4033492..d9e1f82 100644 (file)
@@ -55,21 +55,14 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
                /* default channel 11 */
                conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
                conf->channel = 11;
-       } else if (ssid->frequency >= 2412 && ssid->frequency <= 2472) {
-               conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
-               conf->channel = (ssid->frequency - 2407) / 5;
-       } else if ((ssid->frequency >= 5180 && ssid->frequency <= 5240) ||
-                  (ssid->frequency >= 5745 && ssid->frequency <= 5825)) {
-               conf->hw_mode = HOSTAPD_MODE_IEEE80211A;
-               conf->channel = (ssid->frequency - 5000) / 5;
-       } else if (ssid->frequency >= 56160 + 2160 * 1 &&
-                  ssid->frequency <= 56160 + 2160 * 4) {
-               conf->hw_mode = HOSTAPD_MODE_IEEE80211AD;
-               conf->channel = (ssid->frequency - 56160) / 2160;
        } else {
-               wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
-                          ssid->frequency);
-               return -1;
+               conf->hw_mode = ieee80211_freq_to_chan(ssid->frequency,
+                                                      &conf->channel);
+               if (conf->hw_mode == NUM_HOSTAPD_MODES) {
+                       wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: "
+                                  "%d MHz", ssid->frequency);
+                       return -1;
+               }
        }
 
        /* TODO: enable HT40 if driver supports it;
index 4c78161..982e124 100644 (file)
@@ -942,39 +942,6 @@ static void sme_send_2040_bss_coex(struct wpa_supplicant *wpa_s,
 }
 
 
-/**
- * enum wpas_band - Frequency band
- * @WPAS_BAND_2GHZ: 2.4 GHz ISM band
- * @WPAS_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
- */
-enum wpas_band {
-       WPAS_BAND_2GHZ,
-       WPAS_BAND_5GHZ,
-       WPAS_BAND_INVALID
-};
-
-/**
- * freq_to_channel - Convert frequency into channel info
- * @channel: Buffer for returning channel number
- * Returns: Band (2 or 5 GHz)
- */
-static enum wpas_band freq_to_channel(int freq, u8 *channel)
-{
-       enum wpas_band band = (freq <= 2484) ? WPAS_BAND_2GHZ : WPAS_BAND_5GHZ;
-       u8 chan = 0;
-
-       if (freq >= 2412 && freq <= 2472)
-               chan = (freq - 2407) / 5;
-       else if (freq == 2484)
-               chan = 14;
-       else if (freq >= 5180 && freq <= 5805)
-               chan = (freq - 5000) / 5;
-
-       *channel = chan;
-       return band;
-}
-
-
 int sme_proc_obss_scan(struct wpa_supplicant *wpa_s)
 {
        struct wpa_bss *bss;
@@ -1011,7 +978,10 @@ int sme_proc_obss_scan(struct wpa_supplicant *wpa_s)
 
        dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
                /* Skip other band bss */
-               if (freq_to_channel(bss->freq, &channel) != WPAS_BAND_2GHZ)
+               enum hostapd_hw_mode mode;
+               mode = ieee80211_freq_to_chan(bss->freq, &channel);
+               if (mode != HOSTAPD_MODE_IEEE80211G &&
+                   mode != HOSTAPD_MODE_IEEE80211B)
                        continue;
 
                ie = wpa_bss_get_ie(bss, WLAN_EID_HT_CAP);