diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-04-30 03:23:36 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-05-08 21:53:56 -0400 |
commit | ef9456a85dabe2222a4cb80fe8eef6361170c55d (patch) | |
tree | ee63bb53677f27f2de3db2c6801b78d5a8ce2a27 /net/wireless/scan.c | |
parent | ba89bf1961bb991a5c6415bd8408a8cb61ee46dc (diff) |
cfg80211: fix BSS comparison
Since the BSS table is organized in a RB tree, the BSSs need to be
comparable. This means that we must define a < and > operator to
the BSS object.
compare_ethr_addr isn't enough since it returns only a binary value.
Since Felix's
cfg80211: use compare_ether_addr on MAC addresses instead of memcmp
Because of the constant size and guaranteed 16 bit alignment, the inline
compare_ether_addr function is much cheaper than calling memcmp.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
The BSS table is corrupted: rb_find_bss can't find the bss.
As a result BSSes are duplicated in the BSS table, and we get stuck
while probing an AP before associating (in STA mode).
Change-Id: I85928756f4328028230832c1565ece7f412f3843
CC: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Acked-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless/scan.c')
-rw-r--r-- | net/wireless/scan.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 1442bb68a3f3..9dee87c0358c 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -378,7 +378,11 @@ static int cmp_bss_core(struct cfg80211_bss *a, | |||
378 | b->len_information_elements); | 378 | b->len_information_elements); |
379 | } | 379 | } |
380 | 380 | ||
381 | return compare_ether_addr(a->bssid, b->bssid); | 381 | /* |
382 | * we can't use compare_ether_addr here since we need a < > operator. | ||
383 | * The binary return value of compare_ether_addr isn't enough | ||
384 | */ | ||
385 | return memcmp(a->bssid, b->bssid, sizeof(a->bssid)); | ||
382 | } | 386 | } |
383 | 387 | ||
384 | static int cmp_bss(struct cfg80211_bss *a, | 388 | static int cmp_bss(struct cfg80211_bss *a, |