Skip to contentSkip to conversation

d80211: getting wrong freq value if we did hardware scan

PATCH Applied mabbas 2 participants 3 messages Aug 28, 2006 – Sep 21, 2006

Subsystems (2)
lore
Share & tools
lore

mabbas

author
#0 lore raw

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
index a933d92..374193e 100644
@@ -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;
#1 lore raw

net/d80211/ieee80211_sta.c #endif · line 1546

Quoted 11 lines · mabbas
net/d80211/ieee80211_sta.c +0 -2
index a933d92..374193e 100644
@@ -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
author
#2 lore raw
Quoted 18 lines · Jiri Benc

net/d80211/ieee80211_sta.c #endif · line 1547

Quoted 12 lines · mabbas
net/d80211/ieee80211_sta.c +0 -2
index a933d92..374193e 100644
@@ -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->phymode instead of local->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