nl80211: support receiving split frequencies

In order to get more details about each frequency we will need to set
NL80211_ATTR_SPLIT_WIPHY_DUMP in the future. This will result in our
callback being called multiple times. Modify it to support such a
scenario:
1) Start putting new frequencies after the last set one
2) Make sure that attribute is set before iterating it

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Acked-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Rafał Miłecki 2017-08-15 10:36:17 +02:00
parent 335967c6c2
commit 5c10efa2cb

View file

@ -2367,37 +2367,44 @@ static int nl80211_get_freqlist_cb(struct nl_msg *msg, void *arg)
int bands_remain, freqs_remain; int bands_remain, freqs_remain;
struct nl80211_array_buf *arr = arg; 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 **attr = nl80211_parse(msg);
struct nlattr *bands[NL80211_BAND_ATTR_MAX + 1]; struct nlattr *bands[NL80211_BAND_ATTR_MAX + 1];
struct nlattr *freqs[NL80211_FREQUENCY_ATTR_MAX + 1]; struct nlattr *freqs[NL80211_FREQUENCY_ATTR_MAX + 1];
struct nlattr *band, *freq; struct nlattr *band, *freq;
nla_for_each_nested(band, attr[NL80211_ATTR_WIPHY_BANDS], bands_remain) e = arr->buf;
{ e += arr->count;
nla_parse(bands, NL80211_BAND_ATTR_MAX,
nla_data(band), nla_len(band), NULL);
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_parse(bands, NL80211_BAND_ATTR_MAX,
nla_data(freq), nla_len(freq), NULL); nla_data(band), nla_len(band), NULL);
if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] || if (bands[NL80211_BAND_ATTR_FREQS]) {
freqs[NL80211_FREQUENCY_ATTR_DISABLED]) nla_for_each_nested(freq, bands[NL80211_BAND_ATTR_FREQS], freqs_remain)
continue; {
nla_parse(freqs, NL80211_FREQUENCY_ATTR_MAX,
nla_data(freq), nla_len(freq), NULL);
e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]); if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] ||
e->channel = nl80211_freq2channel(e->mhz); freqs[NL80211_FREQUENCY_ATTR_DISABLED])
continue;
e->restricted = ( e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]);
freqs[NL80211_FREQUENCY_ATTR_NO_IR] && e->channel = nl80211_freq2channel(e->mhz);
!freqs[NL80211_FREQUENCY_ATTR_RADAR]
) ? 1 : 0;
e++; e->restricted = (
arr->count++; freqs[NL80211_FREQUENCY_ATTR_NO_IR] &&
!freqs[NL80211_FREQUENCY_ATTR_RADAR]
) ? 1 : 0;
e++;
arr->count++;
}
}
} }
} }