nl80211: store info about freq being not available for some bandwidths
[project/iwinfo.git] / iwinfo_nl80211.c
index db0fc42efc2be19d4c0e3d0481a31b7bd83db0ee..6bc131819adf89211a1fb08f18f0049a7df5f515 100644 (file)
@@ -2367,37 +2367,57 @@ static int nl80211_get_freqlist_cb(struct nl_msg *msg, void *arg)
        int bands_remain, freqs_remain;
 
        struct nl80211_array_buf *arr = arg;
-       struct iwinfo_freqlist_entry *e = arr->buf;
+       struct iwinfo_freqlist_entry *e;
 
        struct nlattr **attr = nl80211_parse(msg);
        struct nlattr *bands[NL80211_BAND_ATTR_MAX + 1];
        struct nlattr *freqs[NL80211_FREQUENCY_ATTR_MAX + 1];
        struct nlattr *band, *freq;
 
-       nla_for_each_nested(band, attr[NL80211_ATTR_WIPHY_BANDS], bands_remain)
-       {
-               nla_parse(bands, NL80211_BAND_ATTR_MAX,
-                         nla_data(band), nla_len(band), NULL);
+       e = arr->buf;
+       e += arr->count;
 
-               nla_for_each_nested(freq, bands[NL80211_BAND_ATTR_FREQS], freqs_remain)
+       if (attr[NL80211_ATTR_WIPHY_BANDS]) {
+               nla_for_each_nested(band, attr[NL80211_ATTR_WIPHY_BANDS], bands_remain)
                {
-                       nla_parse(freqs, NL80211_FREQUENCY_ATTR_MAX,
-                                 nla_data(freq), nla_len(freq), NULL);
-
-                       if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] ||
-                           freqs[NL80211_FREQUENCY_ATTR_DISABLED])
-                               continue;
-
-                       e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]);
-                       e->channel = nl80211_freq2channel(e->mhz);
-
-                       e->restricted = (
-                               freqs[NL80211_FREQUENCY_ATTR_NO_IR] &&
-                               !freqs[NL80211_FREQUENCY_ATTR_RADAR]
-                       ) ? 1 : 0;
+                       nla_parse(bands, NL80211_BAND_ATTR_MAX,
+                                 nla_data(band), nla_len(band), NULL);
 
-                       e++;
-                       arr->count++;
+                       if (bands[NL80211_BAND_ATTR_FREQS]) {
+                               nla_for_each_nested(freq, bands[NL80211_BAND_ATTR_FREQS], freqs_remain)
+                               {
+                                       nla_parse(freqs, NL80211_FREQUENCY_ATTR_MAX,
+                                                 nla_data(freq), nla_len(freq), NULL);
+
+                                       if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] ||
+                                           freqs[NL80211_FREQUENCY_ATTR_DISABLED])
+                                               continue;
+
+                                       e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]);
+                                       e->channel = nl80211_freq2channel(e->mhz);
+
+                                       e->restricted = (
+                                               freqs[NL80211_FREQUENCY_ATTR_NO_IR] &&
+                                               !freqs[NL80211_FREQUENCY_ATTR_RADAR]
+                                       ) ? 1 : 0;
+
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_HT40_MINUS])
+                                               e->flags |= IWINFO_FREQ_NO_HT40MINUS;
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_HT40_PLUS])
+                                               e->flags |= IWINFO_FREQ_NO_HT40PLUS;
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_80MHZ])
+                                               e->flags |= IWINFO_FREQ_NO_80MHZ;
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_160MHZ])
+                                               e->flags |= IWINFO_FREQ_NO_160MHZ;
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_20MHZ])
+                                               e->flags |= IWINFO_FREQ_NO_20MHZ;
+                                       if (freqs[NL80211_FREQUENCY_ATTR_NO_10MHZ])
+                                               e->flags |= IWINFO_FREQ_NO_10MHZ;
+
+                                       e++;
+                                       arr->count++;
+                               }
+                       }
                }
        }