cfg80211: Use capability info to detect mesh beacons.
authorJavier Cardona <javier@cozybit.com>
Wed, 4 May 2011 17:24:56 +0000 (10:24 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 11 May 2011 18:37:48 +0000 (14:37 -0400)
Mesh beacons no longer use all-zeroes BSSID.  Beacon frames for MBSS,
infrastructure BSS, or IBSS are differentiated by the Capability
Information field in the Beacon frame.  A mesh STA sets the ESS and IBSS
subfields to 0 in transmitted Beacon or Probe Response management
frames.

Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/ieee80211.h
net/wireless/scan.c

index ee1c96a866ccd62c9edda0fae4e26ee562d28413..d527fb7bd67a6185c4a9d3f149667f3b337555da 100644 (file)
@@ -1002,6 +1002,11 @@ struct ieee80211_ht_info {
 
 #define WLAN_CAPABILITY_ESS            (1<<0)
 #define WLAN_CAPABILITY_IBSS           (1<<1)
+
+/* A mesh STA sets the ESS and IBSS capability bits to zero */
+#define WLAN_CAPABILITY_IS_MBSS(cap)   \
+       (!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
+
 #define WLAN_CAPABILITY_CF_POLLABLE    (1<<2)
 #define WLAN_CAPABILITY_CF_POLL_REQUEST        (1<<3)
 #define WLAN_CAPABILITY_PRIVACY                (1<<4)
index fbf6f33ae4d0558c68d71efc418db67cedfc8796..62e542a2b1922340cb912b7a361e5df533b517c7 100644 (file)
@@ -210,7 +210,7 @@ static bool is_mesh(struct cfg80211_bss *a,
 {
        const u8 *ie;
 
-       if (!is_zero_ether_addr(a->bssid))
+       if (!WLAN_CAPABILITY_IS_MBSS(a->capability))
                return false;
 
        ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
@@ -248,11 +248,7 @@ static int cmp_bss(struct cfg80211_bss *a,
        if (a->channel != b->channel)
                return b->channel->center_freq - a->channel->center_freq;
 
-       r = memcmp(a->bssid, b->bssid, ETH_ALEN);
-       if (r)
-               return r;
-
-       if (is_zero_ether_addr(a->bssid)) {
+       if (WLAN_CAPABILITY_IS_MBSS(a->capability | b->capability)) {
                r = cmp_ies(WLAN_EID_MESH_ID,
                            a->information_elements,
                            a->len_information_elements,
@@ -267,6 +263,10 @@ static int cmp_bss(struct cfg80211_bss *a,
                               b->len_information_elements);
        }
 
+       r = memcmp(a->bssid, b->bssid, ETH_ALEN);
+       if (r)
+               return r;
+
        return cmp_ies(WLAN_EID_SSID,
                       a->information_elements,
                       a->len_information_elements,
@@ -407,7 +407,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
 
        res->ts = jiffies;
 
-       if (is_zero_ether_addr(res->pub.bssid)) {
+       if (WLAN_CAPABILITY_IS_MBSS(res->pub.capability)) {
                /* must be mesh, verify */
                meshid = cfg80211_find_ie(WLAN_EID_MESH_ID,
                                          res->pub.information_elements,