d80211: getting wrong freq value if we did hardware scan
Subsystems (2)
PATCH 7/7 d80211: getting wrong freq value if we did hardware scan
In this patch we search all A-BAND available channels to get the right frequency value. this might not be the right thing to do in beacon parsing. Another approach is to have a static array of the maximum A-BAND channel number then we can map from channel to frequency fast. we can set the values of this array at run time.
This patch modify d80211 to fix getting wrong frequency value for scan implemented in hardware. With harware scan we might get beacon of a network that is on different channel that in local->conf.channel causing set freq to wrong value.
net/d80211/ieee80211_sta.c +26 -2
@@ -1543,8 +1543,6 @@ #endif bss->channel = channel; bss->freq = local->conf.freq;if (channel != local->conf.channel && - (local->conf.phymode ==MODE_IEEE80211G || - local->conf.phymode ==MODE_IEEE80211B ) && channel >=1 && channel <=14 ) {static const int freq_list[] = {2412 ,2417 ,2422 ,2427 ,2432 ,2437 ,2442 ,
@@ -1553,6 +1551,32 @@ #endif/* IEEE 802.11g/b mode can receive packets from neighboring * channels, so map the channel into frequency. */ bss->freq = freq_list[channel -1 ]; + +if (bss->hw_mode !=MODE_IEEE80211G && + bss->hw_mode !=MODE_IEEE80211B ) + bss->hw_mode =MODE_IEEE80211G ; + + }else if (channel != local->conf.channel ) { +int j, i; +int b_found =0 ; + +/* not a bg channel search in other mode */ +for (i =0 ; i < local->hw->num_modes; i++) { +struct ieee80211_hw_modes *mode = &local->hw->modes[i]; + +if ((mode->mode !=MODE_IEEE80211G ) && + (mode->mode !=MODE_IEEE80211B )){ +for (j =0 ; mode->num_channels; j++) +if (mode->channels[j].chan == channel) { + bss->freq = mode->channels[j].freq; + b_found =1 ; + bss->hw_mode = mode->mode; +break ; + } + } +if (b_found) +break ; + } } bss->timestamp = timestamp; bss->last_update = jiffies;
net/d80211/ieee80211_sta.c #endif · line 1546
Quoted 11 lines · mabbas
net/d80211/ieee80211_sta.c +0
-2@@ -1543,8 +1543,6 @@ #endif bss->channel = channel; bss->freq = local->conf.freq;if (channel != local->conf.channel && - (local->conf.phymode ==MODE_IEEE80211G || - local->conf.phymode ==MODE_IEEE80211B ) && channel >=1 && channel <=14 ) {
The patch doesn't look correct. As I already wrote, no hackish guessing of the phymode from channel numbers, please.
Are there any problems with just using rx_status->phymode instead of local->conf.phymode (other than "drivers don't set that field" as that can be easily fixed)?
Thanks,
Jiri
Signature · 2 lines
Jiri Benc SUSE Labs
Quoted 18 lines · Jiri Benc
net/d80211/ieee80211_sta.c #endif · line 1547
Quoted 12 lines · mabbas
net/d80211/ieee80211_sta.c +0
-2@@ -1543,8 +1543,6 @@ #endif bss->channel = channel; bss->freq = local->conf.freq;if (channel != local->conf.channel && - (local->conf.phymode ==MODE_IEEE80211G || - local->conf.phymode ==MODE_IEEE80211B ) && channel >=1 && channel <=14 ) {The patch doesn't look correct. As I already wrote, no hackish guessing of the phymode from channel numbers, please.
Quoted 4 lines
Are there any problems with just using
rx_status->phymodeinstead oflocal->conf.phymode(other than "drivers don't set that field" as that can be easily fixed)?
Excellent idea here I will fix this patch to use rx_status->phymode if set otherwise it will use the default algorithm already exist.
Quoted 5 lines
Thanks,
Jiri