diff options
Diffstat (limited to 'net/mac80211/scan.c')
| -rw-r--r-- | net/mac80211/scan.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 645355e5f1bc..f9d5842601fa 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -9,7 +9,7 @@   * Copyright 2007, Michael Wu <flamingice@sourmilk.net>   * Copyright 2013-2015  Intel Mobile Communications GmbH   * Copyright 2016-2017  Intel Deutschland GmbH - * Copyright (C) 2018-2023 Intel Corporation + * Copyright (C) 2018-2024 Intel Corporation   */  #include <linux/if_arp.h> @@ -237,14 +237,18 @@ ieee80211_bss_info_update(struct ieee80211_local *local,  }  static bool ieee80211_scan_accept_presp(struct ieee80211_sub_if_data *sdata, +					struct ieee80211_channel *channel,  					u32 scan_flags, const u8 *da)  {  	if (!sdata)  		return false; -	/* accept broadcast for OCE */ -	if (scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP && -	    is_broadcast_ether_addr(da)) + +	/* accept broadcast on 6 GHz and for OCE */ +	if (is_broadcast_ether_addr(da) && +	    (channel->band == NL80211_BAND_6GHZ || +	     scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP))  		return true; +  	if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR)  		return true;  	return ether_addr_equal(da, sdata->vif.addr); @@ -293,6 +297,12 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)  		wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);  	} +	channel = ieee80211_get_channel_khz(local->hw.wiphy, +					    ieee80211_rx_status_to_khz(rx_status)); + +	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) +		return; +  	if (ieee80211_is_probe_resp(mgmt->frame_control)) {  		struct cfg80211_scan_request *scan_req;  		struct cfg80211_sched_scan_request *sched_scan_req; @@ -310,19 +320,15 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)  		/* ignore ProbeResp to foreign address or non-bcast (OCE)  		 * unless scanning with randomised address  		 */ -		if (!ieee80211_scan_accept_presp(sdata1, scan_req_flags, +		if (!ieee80211_scan_accept_presp(sdata1, channel, +						 scan_req_flags,  						 mgmt->da) && -		    !ieee80211_scan_accept_presp(sdata2, sched_scan_req_flags, +		    !ieee80211_scan_accept_presp(sdata2, channel, +						 sched_scan_req_flags,  						 mgmt->da))  			return;  	} -	channel = ieee80211_get_channel_khz(local->hw.wiphy, -					ieee80211_rx_status_to_khz(rx_status)); - -	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) -		return; -  	bss = ieee80211_bss_info_update(local, rx_status,  					mgmt, skb->len,  					channel);  | 
