From: Rafał Miłecki Date: Tue, 15 Aug 2017 08:36:17 +0000 (+0200) Subject: nl80211: support receiving split frequencies X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fiwinfo.git;a=commitdiff_plain;h=5c10efa2cbadf5a9690efc6fc4f62ceb6d4c664b 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 Acked-by: Jo-Philipp Wich --- diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c index db0fc42..0f9800b 100644 --- a/iwinfo_nl80211.c +++ b/iwinfo_nl80211.c @@ -2367,37 +2367,44 @@ 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); + nla_parse(bands, NL80211_BAND_ATTR_MAX, + nla_data(band), nla_len(band), NULL); - if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] || - freqs[NL80211_FREQUENCY_ATTR_DISABLED]) - continue; + 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); - e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]); - e->channel = nl80211_freq2channel(e->mhz); + if (!freqs[NL80211_FREQUENCY_ATTR_FREQ] || + freqs[NL80211_FREQUENCY_ATTR_DISABLED]) + continue; - e->restricted = ( - freqs[NL80211_FREQUENCY_ATTR_NO_IR] && - !freqs[NL80211_FREQUENCY_ATTR_RADAR] - ) ? 1 : 0; + e->mhz = nla_get_u32(freqs[NL80211_FREQUENCY_ATTR_FREQ]); + e->channel = nl80211_freq2channel(e->mhz); - e++; - arr->count++; + e->restricted = ( + freqs[NL80211_FREQUENCY_ATTR_NO_IR] && + !freqs[NL80211_FREQUENCY_ATTR_RADAR] + ) ? 1 : 0; + + e++; + arr->count++; + } + } } }