Skip to content

Commit

Permalink
wifi: mac80211: accept broadcast probe responses on 6 GHz
Browse files Browse the repository at this point in the history
[ Upstream commit 62a6183 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
jmberg-intel authored and gregkh committed Mar 1, 2024
1 parent 415f8e9 commit c9da889
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions net/mac80211/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -222,14 +222,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);
Expand Down Expand Up @@ -278,6 +282,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;
Expand All @@ -295,19 +305,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);
Expand Down

0 comments on commit c9da889

Please sign in to comment.