On Monday 18 June 2007 01:47, Hong Liu wrote: > +static int is_duplicate_channel(struct ieee80211_channel *chan, > + struct iw_freq *freq, int count) > +{ > + int i; > + > + for (i = 0; i < count; i++, freq++) > + if (chan->chan == freq->i) > + return 1; > + > + return 0; > +} > + Currently, the only situation in which channels are duplicated is when there's an 11g mode registered. The scanning code in ieee80211_sta.c (ieee80211_sta_scan_work) checks for this specifically: (local->hw_modes & local->enabled_modes & (1 << MODE_IEEE80211G) && mode->mode == MODE_IEEE80211B) MODE_IEEE80211B is skipped if MODE_IEEE80211G is enabled. Modes should be skipped instead of channels. > +static void ieee80211_get_supp_channels(struct ieee80211_local *local, > + struct iw_range *range) > +{ > + struct ieee80211_hw_mode *mode = NULL; > + int c = 0, j; > + > + list_for_each_entry(mode, &local->modes_list, list) { > + for (j = 0; > + j < mode->num_channels && c < IW_MAX_FREQUENCIES; j++) { This looks somewhat awkward. How about something like: int j = 0; (check if this mode is disabled or duplicates channels here) while (j++ < mode->num_channels && c++ < IW_MAX_FREQUENCIES) { > + struct ieee80211_channel *chan = &mode->channels[j]; > + > + if (is_duplicate_channel(chan, range->freq, c)) > + continue; > + range->freq[c].i = chan->chan; > + range->freq[c].m = chan->freq * 100000; > + range->freq[c].e = 1; > + c++; > + } > + } > + range->num_channels = c; > + range->num_frequency = c; > +} > > static int ieee80211_ioctl_giwrange(struct net_device *dev, > struct iw_request_info *info, > @@ -1533,6 +1567,8 @@ static int ieee80211_ioctl_giwrange(struct net_device > *dev, range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | > IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; > > + ieee80211_get_supp_channels(local, range); > + Should be fine to just put all the logic here. No other code will use that function. -Michael Wu
Attachment:
pgpVcEWqVCR8h.pgp
Description: PGP signature