utils: Derive phy type by frequency and bandwidth
authorDavid Spinadel <david.spinadel@intel.com>
Mon, 15 Feb 2016 14:53:40 +0000 (16:53 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 22 Feb 2016 17:53:04 +0000 (19:53 +0200)
Add a function to derive phy type from frequency and bandwidth
as defined in IEEE Std 802.11ac-2013 Annex C (dot11PHYType).

Signed-off-by: David Spinadel <david.spinadel@intel.com>
src/common/ieee802_11_common.c
src/common/ieee802_11_common.h
src/common/ieee802_11_defs.h

index 932cb09..8649d54 100644 (file)
@@ -1211,6 +1211,41 @@ const struct oper_class_map global_op_class[] = {
        { -1, 0, 0, 0, 0, BW20, NO_P2P_SUPP }
 };
 
+
+static enum phy_type ieee80211_phy_type_by_freq(int freq)
+{
+       enum hostapd_hw_mode hw_mode;
+       u8 channel;
+
+       hw_mode = ieee80211_freq_to_chan(freq, &channel);
+
+       switch (hw_mode) {
+       case HOSTAPD_MODE_IEEE80211A:
+               return PHY_TYPE_OFDM;
+       case HOSTAPD_MODE_IEEE80211B:
+               return PHY_TYPE_HRDSSS;
+       case HOSTAPD_MODE_IEEE80211G:
+               return PHY_TYPE_ERP;
+       case HOSTAPD_MODE_IEEE80211AD:
+               return PHY_TYPE_DMG;
+       default:
+               return PHY_TYPE_UNSPECIFIED;
+       };
+}
+
+
+/* ieee80211_get_phy_type - Derive the phy type by freq and bandwidth */
+enum phy_type ieee80211_get_phy_type(int freq, int ht, int vht)
+{
+       if (vht)
+               return PHY_TYPE_VHT;
+       if (ht)
+               return PHY_TYPE_HT;
+
+       return ieee80211_phy_type_by_freq(freq);
+}
+
+
 size_t global_op_class_size = ARRAY_SIZE(global_op_class);
 
 
index 2ca7abb..0163d8b 100644 (file)
@@ -120,6 +120,7 @@ enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
                                                   int sec_channel, int vht,
                                                   u8 *op_class, u8 *channel);
 int ieee80211_is_dfs(int freq);
+enum phy_type ieee80211_get_phy_type(int freq, int ht, int vht);
 
 int supp_rates_11b_only(struct ieee802_11_elems *elems);
 int mb_ies_info_by_ies(struct mb_ies_info *info, const u8 *ies_buf,
index 994d23f..befdac3 100644 (file)
@@ -1520,4 +1520,18 @@ enum fst_action {
        FST_ACTION_ON_CHANNEL_TUNNEL = 5,
 };
 
+/* IEEE Std 802.11ac-2013, Annex C - dot11PHYType */
+enum phy_type {
+       PHY_TYPE_UNSPECIFIED = 0,
+       PHY_TYPE_FHSS = 1,
+       PHY_TYPE_DSSS = 2,
+       PHY_TYPE_IRBASEBAND = 3,
+       PHY_TYPE_OFDM = 4,
+       PHY_TYPE_HRDSSS = 5,
+       PHY_TYPE_ERP = 6,
+       PHY_TYPE_HT = 7,
+       PHY_TYPE_DMG = 8,
+       PHY_TYPE_VHT = 9,
+};
+
 #endif /* IEEE802_11_DEFS_H */