diff options
author | James Ketrenos <jketreno@linux.intel.com> | 2006-03-08 14:14:45 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2006-03-17 15:38:55 -0500 |
commit | f44349f2217d05e4575f24edc3c0e0022f5d448f (patch) | |
tree | 615c789b22164bf4afef198795b75c701936efd6 /net | |
parent | 7c567894480daef05bc13abdc4b9414541e245cb (diff) |
[PATCH] ieee80211: Don't update network statistics from off-channel packets.
This patch fixes a problem in the ieee80211 probe response and beacon
reception code that would use the packet statistics for a network even
if they were received on a channel other than that which the network
exists on.
This causes a problem in overlapping channels where, for example, a
strong AP on channel 2 could have its beacons received on channels 1 and
3, but at much lower signal levels. If scanning was done sequentially,
this means the beacon received on channel 3 would update the AP's signal
level as being much lower than it really is, which subsequently could
cause that AP to be passed over and an alternate AP selected.
Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/ieee80211/ieee80211_rx.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index 785d5a170a7f..a7f2a642a512 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c | |||
@@ -1345,7 +1345,19 @@ static void update_network(struct ieee80211_network *dst, | |||
1345 | ieee80211_network_reset(dst); | 1345 | ieee80211_network_reset(dst); |
1346 | dst->ibss_dfs = src->ibss_dfs; | 1346 | dst->ibss_dfs = src->ibss_dfs; |
1347 | 1347 | ||
1348 | memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); | 1348 | /* We only update the statistics if they were created by receiving |
1349 | * the network information on the actual channel the network is on. | ||
1350 | * | ||
1351 | * This keeps beacons received on neighbor channels from bringing | ||
1352 | * down the signal level of an AP. */ | ||
1353 | if (dst->channel == src->stats.received_channel) | ||
1354 | memcpy(&dst->stats, &src->stats, | ||
1355 | sizeof(struct ieee80211_rx_stats)); | ||
1356 | else | ||
1357 | IEEE80211_DEBUG_SCAN("Network " MAC_FMT " info received " | ||
1358 | "off channel (%d vs. %d)\n", MAC_ARG(src->bssid), | ||
1359 | dst->channel, src->stats.received_channel); | ||
1360 | |||
1349 | dst->capability = src->capability; | 1361 | dst->capability = src->capability; |
1350 | memcpy(dst->rates, src->rates, src->rates_len); | 1362 | memcpy(dst->rates, src->rates, src->rates_len); |
1351 | dst->rates_len = src->rates_len; | 1363 | dst->rates_len = src->rates_len; |