diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2021-10-22 10:20:54 -0700 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2021-10-22 10:20:56 -0700 | 
| commit | 24f7cf9b851ee9c395225481308af4ab5065e20a (patch) | |
| tree | 423a777bb0ac1ff1a69d6d158bae766bf82a3405 /net/wireless/scan.c | |
| parent | 07591ebec3cf2d6b78cb9b51a5a6f3ca731ec375 (diff) | |
| parent | f9d366d420af4ce8719c59e60853573c02831f61 (diff) | |
Merge tag 'mac80211-next-for-net-next-2021-10-21' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says:
====================
Quite a few changes:
 * the applicable eth_hw_addr_set() and const hw_addr changes
 * various code cleanups/refactorings
 * stack usage reductions across the wireless stack
 * some unstructured find_ie() -> structured find_element()
   changes
 * a few more pieces of multi-BSSID support
 * some 6 GHz regulatory support
 * 6 GHz support in hwsim, for testing userspace code
 * Light Communications (LC, 802.11bb) early band definitions
   to be able to add a first driver soon
* tag 'mac80211-next-for-net-next-2021-10-21' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next: (35 commits)
  cfg80211: fix kernel-doc for MBSSID EMA
  mac80211: Prevent AP probing during suspend
  nl80211: Add LC placeholder band definition to nl80211_band
  ...
====================
Link: https://lore.kernel.org/r/20211021154953.134849-1-johannes@sipsolutions.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/wireless/scan.c')
| -rw-r--r-- | net/wireless/scan.c | 59 | 
1 files changed, 35 insertions, 24 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 11c68b159324..e4f79b23f7f6 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -383,7 +383,7 @@ static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,  		   const u8 *ssid, size_t ssid_len)  {  	const struct cfg80211_bss_ies *ies; -	const u8 *ssidie; +	const struct element *ssid_elem;  	if (bssid && !ether_addr_equal(a->bssid, bssid))  		return false; @@ -394,12 +394,12 @@ static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,  	ies = rcu_access_pointer(a->ies);  	if (!ies)  		return false; -	ssidie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len); -	if (!ssidie) +	ssid_elem = cfg80211_find_elem(WLAN_EID_SSID, ies->data, ies->len); +	if (!ssid_elem)  		return false; -	if (ssidie[1] != ssid_len) +	if (ssid_elem->datalen != ssid_len)  		return false; -	return memcmp(ssidie + 2, ssid, ssid_len) == 0; +	return memcmp(ssid_elem->data, ssid, ssid_len) == 0;  }  static int @@ -1791,25 +1791,13 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,  	return NULL;  } -/* - * Update RX channel information based on the available frame payload - * information. This is mainly for the 2.4 GHz band where frames can be received - * from neighboring channels and the Beacon frames use the DSSS Parameter Set - * element to indicate the current (transmitting) channel, but this might also - * be needed on other bands if RX frequency does not match with the actual - * operating channel of a BSS. - */ -static struct ieee80211_channel * -cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, -			 struct ieee80211_channel *channel, -			 enum nl80211_bss_scan_width scan_width) +int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen, +				    enum nl80211_band band)  {  	const u8 *tmp; -	u32 freq;  	int channel_number = -1; -	struct ieee80211_channel *alt_channel; -	if (channel->band == NL80211_BAND_S1GHZ) { +	if (band == NL80211_BAND_S1GHZ) {  		tmp = cfg80211_find_ie(WLAN_EID_S1G_OPERATION, ie, ielen);  		if (tmp && tmp[1] >= sizeof(struct ieee80211_s1g_oper_ie)) {  			struct ieee80211_s1g_oper_ie *s1gop = (void *)(tmp + 2); @@ -1830,6 +1818,29 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,  		}  	} +	return channel_number; +} +EXPORT_SYMBOL(cfg80211_get_ies_channel_number); + +/* + * Update RX channel information based on the available frame payload + * information. This is mainly for the 2.4 GHz band where frames can be received + * from neighboring channels and the Beacon frames use the DSSS Parameter Set + * element to indicate the current (transmitting) channel, but this might also + * be needed on other bands if RX frequency does not match with the actual + * operating channel of a BSS. + */ +static struct ieee80211_channel * +cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, +			 struct ieee80211_channel *channel, +			 enum nl80211_bss_scan_width scan_width) +{ +	u32 freq; +	int channel_number; +	struct ieee80211_channel *alt_channel; + +	channel_number = cfg80211_get_ies_channel_number(ie, ielen, channel->band); +  	if (channel_number < 0) {  		/* No channel information in frame payload */  		return channel; @@ -2072,12 +2083,12 @@ static void cfg80211_parse_mbssid_data(struct wiphy *wiphy,  	if (!non_tx_data)  		return; -	if (!cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen)) +	if (!cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID, ie, ielen))  		return;  	if (!wiphy->support_mbssid)  		return;  	if (wiphy->support_only_he_mbssid && -	    !cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen)) +	    !cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen))  		return;  	new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp); @@ -2444,10 +2455,10 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,  	res = cfg80211_inform_single_bss_frame_data(wiphy, data, mgmt,  						    len, gfp);  	if (!res || !wiphy->support_mbssid || -	    !cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen)) +	    !cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID, ie, ielen))  		return res;  	if (wiphy->support_only_he_mbssid && -	    !cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen)) +	    !cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen))  		return res;  	non_tx_data.tx_bss = res;  | 
