]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: print capability info for DMG (60GHz band)
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Mon, 17 Dec 2012 11:31:36 +0000 (13:31 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 4 Jan 2013 15:47:07 +0000 (16:47 +0100)
On the DMG (Directed Multi-Gigabit) aka 60GHz band, capability info
defined by the 802.11ad spec differently from non-DMG one

Detect DMG band by frequency, spec says DMG if above 45 GHz;
parse and print accordingly

For the non-DMG capability info, add more bits as defined in the
IEEE802.11-2012

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
scan.c

diff --git a/scan.c b/scan.c
index 05bad0b09ad1892cf3cf33bc924d6da9bbc26a8f..2188166e8bde82819e7150266d9211a462b1de26 100644 (file)
--- a/scan.c
+++ b/scan.c
 #define WLAN_CAPABILITY_QOS            (1<<9)
 #define WLAN_CAPABILITY_SHORT_SLOT_TIME        (1<<10)
 #define WLAN_CAPABILITY_APSD           (1<<11)
+#define WLAN_CAPABILITY_RADIO_MEASURE  (1<<12)
 #define WLAN_CAPABILITY_DSSS_OFDM      (1<<13)
+#define WLAN_CAPABILITY_DEL_BACK       (1<<14)
+#define WLAN_CAPABILITY_IMM_BACK       (1<<15)
+/* DMG (60gHz) 802.11ad */
+/* type - bits 0..1 */
+#define WLAN_CAPABILITY_DMG_TYPE_MASK          (3<<0)
+
+#define WLAN_CAPABILITY_DMG_TYPE_IBSS          (1<<0) /* Tx by: STA */
+#define WLAN_CAPABILITY_DMG_TYPE_PBSS          (2<<0) /* Tx by: PCP */
+#define WLAN_CAPABILITY_DMG_TYPE_AP            (3<<0) /* Tx by: AP */
+
+#define WLAN_CAPABILITY_DMG_CBAP_ONLY          (1<<2)
+#define WLAN_CAPABILITY_DMG_CBAP_SOURCE                (1<<3)
+#define WLAN_CAPABILITY_DMG_PRIVACY            (1<<4)
+#define WLAN_CAPABILITY_DMG_ECPAC              (1<<5)
+
+#define WLAN_CAPABILITY_DMG_SPECTRUM_MGMT      (1<<8)
+#define WLAN_CAPABILITY_DMG_RADIO_MEASURE      (1<<12)
 
 static unsigned char ms_oui[3]         = { 0x00, 0x50, 0xf2 };
 static unsigned char ieee80211_oui[3]  = { 0x00, 0x0f, 0xac };
@@ -1216,6 +1234,70 @@ void print_ies(unsigned char *ie, int ielen, bool unknown,
        }
 }
 
+static void print_capa_dmg(__u16 capa)
+{
+       switch (capa & WLAN_CAPABILITY_DMG_TYPE_MASK) {
+       case WLAN_CAPABILITY_DMG_TYPE_AP:
+               printf(" DMG_ESS");
+               break;
+       case WLAN_CAPABILITY_DMG_TYPE_PBSS:
+               printf(" DMG_PCP");
+               break;
+       case WLAN_CAPABILITY_DMG_TYPE_IBSS:
+               printf(" DMG_IBSS");
+               break;
+       }
+
+       if (capa & WLAN_CAPABILITY_DMG_CBAP_ONLY)
+               printf(" CBAP_Only");
+       if (capa & WLAN_CAPABILITY_DMG_CBAP_SOURCE)
+               printf(" CBAP_Src");
+       if (capa & WLAN_CAPABILITY_DMG_PRIVACY)
+               printf(" Privacy");
+       if (capa & WLAN_CAPABILITY_DMG_ECPAC)
+               printf(" ECPAC");
+       if (capa & WLAN_CAPABILITY_DMG_SPECTRUM_MGMT)
+               printf(" SpectrumMgmt");
+       if (capa & WLAN_CAPABILITY_DMG_RADIO_MEASURE)
+               printf(" RadioMeasure");
+}
+
+static void print_capa_non_dmg(__u16 capa)
+{
+       if (capa & WLAN_CAPABILITY_ESS)
+               printf(" ESS");
+       if (capa & WLAN_CAPABILITY_IBSS)
+               printf(" IBSS");
+       if (capa & WLAN_CAPABILITY_CF_POLLABLE)
+               printf(" CfPollable");
+       if (capa & WLAN_CAPABILITY_CF_POLL_REQUEST)
+               printf(" CfPollReq");
+       if (capa & WLAN_CAPABILITY_PRIVACY)
+               printf(" Privacy");
+       if (capa & WLAN_CAPABILITY_SHORT_PREAMBLE)
+               printf(" ShortPreamble");
+       if (capa & WLAN_CAPABILITY_PBCC)
+               printf(" PBCC");
+       if (capa & WLAN_CAPABILITY_CHANNEL_AGILITY)
+               printf(" ChannelAgility");
+       if (capa & WLAN_CAPABILITY_SPECTRUM_MGMT)
+               printf(" SpectrumMgmt");
+       if (capa & WLAN_CAPABILITY_QOS)
+               printf(" QoS");
+       if (capa & WLAN_CAPABILITY_SHORT_SLOT_TIME)
+               printf(" ShortSlotTime");
+       if (capa & WLAN_CAPABILITY_APSD)
+               printf(" APSD");
+       if (capa & WLAN_CAPABILITY_RADIO_MEASURE)
+               printf(" RadioMeasure");
+       if (capa & WLAN_CAPABILITY_DSSS_OFDM)
+               printf(" DSSS-OFDM");
+       if (capa & WLAN_CAPABILITY_DEL_BACK)
+               printf(" DelayedBACK");
+       if (capa & WLAN_CAPABILITY_IMM_BACK)
+               printf(" ImmediateBACK");
+}
+
 static int print_bss_handler(struct nl_msg *msg, void *arg)
 {
        struct nlattr *tb[NL80211_ATTR_MAX + 1];
@@ -1237,6 +1319,7 @@ static int print_bss_handler(struct nl_msg *msg, void *arg)
        };
        struct scan_params *params = arg;
        int show = params->show_both_ie_sets ? 2 : 1;
+       bool is_dmg = false;
 
        nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
                  genlmsg_attrlen(gnlh, 0), NULL);
@@ -1285,37 +1368,22 @@ static int print_bss_handler(struct nl_msg *msg, void *arg)
                        tsf, tsf/1000/1000/60/60/24, (tsf/1000/1000/60/60) % 24,
                        (tsf/1000/1000/60) % 60, (tsf/1000/1000) % 60);
        }
-       if (bss[NL80211_BSS_FREQUENCY])
-               printf("\tfreq: %d\n",
-                       nla_get_u32(bss[NL80211_BSS_FREQUENCY]));
+       if (bss[NL80211_BSS_FREQUENCY]) {
+               int freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
+               printf("\tfreq: %d\n", freq);
+               if (freq > 45000)
+                       is_dmg = true;
+       }
        if (bss[NL80211_BSS_BEACON_INTERVAL])
                printf("\tbeacon interval: %d\n",
                        nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]));
        if (bss[NL80211_BSS_CAPABILITY]) {
                __u16 capa = nla_get_u16(bss[NL80211_BSS_CAPABILITY]);
                printf("\tcapability:");
-               if (capa & WLAN_CAPABILITY_ESS)
-                       printf(" ESS");
-               if (capa & WLAN_CAPABILITY_IBSS)
-                       printf(" IBSS");
-               if (capa & WLAN_CAPABILITY_PRIVACY)
-                       printf(" Privacy");
-               if (capa & WLAN_CAPABILITY_SHORT_PREAMBLE)
-                       printf(" ShortPreamble");
-               if (capa & WLAN_CAPABILITY_PBCC)
-                       printf(" PBCC");
-               if (capa & WLAN_CAPABILITY_CHANNEL_AGILITY)
-                       printf(" ChannelAgility");
-               if (capa & WLAN_CAPABILITY_SPECTRUM_MGMT)
-                       printf(" SpectrumMgmt");
-               if (capa & WLAN_CAPABILITY_QOS)
-                       printf(" QoS");
-               if (capa & WLAN_CAPABILITY_SHORT_SLOT_TIME)
-                       printf(" ShortSlotTime");
-               if (capa & WLAN_CAPABILITY_APSD)
-                       printf(" APSD");
-               if (capa & WLAN_CAPABILITY_DSSS_OFDM)
-                       printf(" DSSS-OFDM");
+               if (is_dmg)
+                       print_capa_dmg(capa);
+               else
+                       print_capa_non_dmg(capa);
                printf(" (0x%.4x)\n", capa);
        }
        if (bss[NL80211_BSS_SIGNAL_MBM]) {