mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 02:15:57 +00:00
wifi: mac80211: accept broadcast probe responses on 6 GHz
On the 6 GHz band, probe responses are sent as broadcast to optimise medium usage. However, without OCE configuration we weren't accepting them, which is wrong, even if wpa_s is by default enabling OCE. Accept them without the OCE config as well. Link: https://msgid.link/20240129200907.5a89c2821897.I92e9dfa0f9b350bc7f37dd4bb38031d156d78d8a@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
c042600c17
commit
62a6183c13
@ -9,7 +9,7 @@
|
|||||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
||||||
* Copyright 2016-2017 Intel Deutschland GmbH
|
* Copyright 2016-2017 Intel Deutschland GmbH
|
||||||
* Copyright (C) 2018-2023 Intel Corporation
|
* Copyright (C) 2018-2024 Intel Corporation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/if_arp.h>
|
#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,
|
static bool ieee80211_scan_accept_presp(struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct ieee80211_channel *channel,
|
||||||
u32 scan_flags, const u8 *da)
|
u32 scan_flags, const u8 *da)
|
||||||
{
|
{
|
||||||
if (!sdata)
|
if (!sdata)
|
||||||
return false;
|
return false;
|
||||||
/* accept broadcast for OCE */
|
|
||||||
if (scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP &&
|
/* accept broadcast on 6 GHz and for OCE */
|
||||||
is_broadcast_ether_addr(da))
|
if (is_broadcast_ether_addr(da) &&
|
||||||
|
(channel->band == NL80211_BAND_6GHZ ||
|
||||||
|
scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
|
if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
|
||||||
return true;
|
return true;
|
||||||
return ether_addr_equal(da, sdata->vif.addr);
|
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);
|
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)) {
|
if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||||
struct cfg80211_scan_request *scan_req;
|
struct cfg80211_scan_request *scan_req;
|
||||||
struct cfg80211_sched_scan_request *sched_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)
|
/* ignore ProbeResp to foreign address or non-bcast (OCE)
|
||||||
* unless scanning with randomised address
|
* 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) &&
|
mgmt->da) &&
|
||||||
!ieee80211_scan_accept_presp(sdata2, sched_scan_req_flags,
|
!ieee80211_scan_accept_presp(sdata2, channel,
|
||||||
|
sched_scan_req_flags,
|
||||||
mgmt->da))
|
mgmt->da))
|
||||||
return;
|
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,
|
bss = ieee80211_bss_info_update(local, rx_status,
|
||||||
mgmt, skb->len,
|
mgmt, skb->len,
|
||||||
channel);
|
channel);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user