Commit 0a35d36d authored by Javier Cardona's avatar Javier Cardona Committed by John W. Linville

cfg80211: Use capability info to detect mesh beacons.

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: default avatarJavier Cardona <javier@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 915b5c50
...@@ -1002,6 +1002,11 @@ struct ieee80211_ht_info { ...@@ -1002,6 +1002,11 @@ struct ieee80211_ht_info {
#define WLAN_CAPABILITY_ESS (1<<0) #define WLAN_CAPABILITY_ESS (1<<0)
#define WLAN_CAPABILITY_IBSS (1<<1) #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_POLLABLE (1<<2)
#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) #define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
#define WLAN_CAPABILITY_PRIVACY (1<<4) #define WLAN_CAPABILITY_PRIVACY (1<<4)
......
...@@ -210,7 +210,7 @@ static bool is_mesh(struct cfg80211_bss *a, ...@@ -210,7 +210,7 @@ static bool is_mesh(struct cfg80211_bss *a,
{ {
const u8 *ie; const u8 *ie;
if (!is_zero_ether_addr(a->bssid)) if (!WLAN_CAPABILITY_IS_MBSS(a->capability))
return false; return false;
ie = cfg80211_find_ie(WLAN_EID_MESH_ID, ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
...@@ -248,11 +248,7 @@ static int cmp_bss(struct cfg80211_bss *a, ...@@ -248,11 +248,7 @@ static int cmp_bss(struct cfg80211_bss *a,
if (a->channel != b->channel) if (a->channel != b->channel)
return b->channel->center_freq - a->channel->center_freq; return b->channel->center_freq - a->channel->center_freq;
r = memcmp(a->bssid, b->bssid, ETH_ALEN); if (WLAN_CAPABILITY_IS_MBSS(a->capability | b->capability)) {
if (r)
return r;
if (is_zero_ether_addr(a->bssid)) {
r = cmp_ies(WLAN_EID_MESH_ID, r = cmp_ies(WLAN_EID_MESH_ID,
a->information_elements, a->information_elements,
a->len_information_elements, a->len_information_elements,
...@@ -267,6 +263,10 @@ static int cmp_bss(struct cfg80211_bss *a, ...@@ -267,6 +263,10 @@ static int cmp_bss(struct cfg80211_bss *a,
b->len_information_elements); b->len_information_elements);
} }
r = memcmp(a->bssid, b->bssid, ETH_ALEN);
if (r)
return r;
return cmp_ies(WLAN_EID_SSID, return cmp_ies(WLAN_EID_SSID,
a->information_elements, a->information_elements,
a->len_information_elements, a->len_information_elements,
...@@ -407,7 +407,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev, ...@@ -407,7 +407,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
res->ts = jiffies; res->ts = jiffies;
if (is_zero_ether_addr(res->pub.bssid)) { if (WLAN_CAPABILITY_IS_MBSS(res->pub.capability)) {
/* must be mesh, verify */ /* must be mesh, verify */
meshid = cfg80211_find_ie(WLAN_EID_MESH_ID, meshid = cfg80211_find_ie(WLAN_EID_MESH_ID,
res->pub.information_elements, res->pub.information_elements,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment