Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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)
+7 −7
Original line number Diff line number Diff line
@@ -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,