Message ID | 20170815083619.30333-1-zajec5@gmail.com |
---|---|
State | Accepted |
Delegated to: | Rafał Miłecki |
Headers | show |
On 08/15/2017 10:36 AM, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > 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> > --- > iwinfo_nl80211.c | 45 ++++++++++++++++++++++++++------------------- > 1 file changed, 26 insertions(+), 19 deletions(-) > > diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c > index db0fc42..f9b13dd 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++; > + } > + } > } > } > >
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c index db0fc42..f9b13dd 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++; + } + } } }