summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2024-02-01 17:01:22 +0100
committeriwlwifi publisher <>2024-04-17 12:44:12 +0000
commitde7b499f846f2a24501ca383afb0ea8e707f6214 (patch)
tree8633502f35247d9d327d6849279f3f46a05e2990
parent44b1694f392f3b3fa7d3cad515a94f8972299bb1 (diff)
downloadbackport-iwlwifi-de7b499f846f2a24501ca383afb0ea8e707f6214.tar.gz
wifi: cfg80211: clean up cfg80211_inform_bss_frame_data()
Make cfg80211_inform_bss_frame_data() call the existing cfg80211_inform_bss_data() after parsing the frame in the appropriate way, so we have less code duplication. This required introducing a new CFG80211_BSS_FTYPE_S1G_BEACON, but that can be used by other drivers as well. type=cleanup ticket=none Change-Id: Ib7d88d126eec50c64763251a78cb432bb5df14df Signed-off-by: Johannes Berg <johannes.berg@intel.com> Reviewed-on: https://gerritwcs.ir.intel.com/c/iwlwifi-stack-dev/+/92486 tested: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM> Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> x-iwlwifi-stack-dev: 7ca79bf3a45bb696c66ca28912123081fe9219ef
-rw-r--r--include/net/cfg80211.h2
-rw-r--r--net/wireless/scan.c71
-rw-r--r--versions2
3 files changed, 35 insertions, 40 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 64b06ae84c..f8ea18d537 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -7188,11 +7188,13 @@ size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
* from a beacon or probe response
* @CFG80211_BSS_FTYPE_BEACON: data comes from a beacon
* @CFG80211_BSS_FTYPE_PRESP: data comes from a probe response
+ * @CFG80211_BSS_FTYPE_S1G_BEACON: data comes from an S1G beacon
*/
enum cfg80211_bss_frame_type {
CFG80211_BSS_FTYPE_UNKNOWN,
CFG80211_BSS_FTYPE_BEACON,
CFG80211_BSS_FTYPE_PRESP,
+ CFG80211_BSS_FTYPE_S1G_BEACON,
};
/**
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 888a47c868..fef2f0edb1 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -2213,6 +2213,7 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
switch (data->ftype) {
case CFG80211_BSS_FTYPE_BEACON:
+ case CFG80211_BSS_FTYPE_S1G_BEACON:
ies->from_beacon = true;
fallthrough;
case CFG80211_BSS_FTYPE_UNKNOWN:
@@ -3057,6 +3058,10 @@ cfg80211_inform_bss_data(struct wiphy *wiphy,
if (!res)
return NULL;
+ /* don't do any further MBSSID/ML handling for S1G */
+ if (ftype == CFG80211_BSS_FTYPE_S1G_BEACON)
+ return res;
+
cfg80211_parse_mbssid_data(wiphy, &inform_data, res, gfp);
cfg80211_parse_ml_sta_data(wiphy, &inform_data, res, gfp);
@@ -3071,17 +3076,16 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
struct ieee80211_mgmt *mgmt, size_t len,
gfp_t gfp)
{
- struct cfg80211_inform_single_bss_data inform_data = {
- .drv_data = data,
- .use_for = data->restrict_use ?
- data->use_for :
- NL80211_BSS_USE_FOR_ALL,
- .cannot_use_reasons = data->cannot_use_reasons,
- };
size_t min_hdr_len = offsetof(struct ieee80211_mgmt,
u.probe_resp.variable);
struct ieee80211_ext *ext = NULL;
- struct cfg80211_bss *res;
+ enum cfg80211_bss_frame_type ftype;
+ u16 beacon_interval;
+ const u8 *bssid;
+ u16 capability;
+ const u8 *ie;
+ size_t ielen;
+ u64 tsf;
if (WARN_ON(!mgmt))
return NULL;
@@ -3105,56 +3109,45 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
if (WARN_ON(len < min_hdr_len))
return NULL;
- inform_data.ielen = len - min_hdr_len;
- inform_data.ie = mgmt->u.probe_resp.variable;
+ ielen = len - min_hdr_len;
+ ie = mgmt->u.probe_resp.variable;
if (ext) {
const struct ieee80211_s1g_bcn_compat_ie *compat;
const struct element *elem;
if (ieee80211_is_s1g_short_beacon(mgmt->frame_control))
- inform_data.ie = ext->u.s1g_short_beacon.variable;
+ ie = ext->u.s1g_short_beacon.variable;
else
- inform_data.ie = ext->u.s1g_beacon.variable;
+ ie = ext->u.s1g_beacon.variable;
- elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT,
- inform_data.ie, inform_data.ielen);
+ elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT, ie, ielen);
if (!elem)
return NULL;
if (elem->datalen < sizeof(*compat))
return NULL;
compat = (void *)elem->data;
- memcpy(inform_data.bssid, ext->u.s1g_beacon.sa, ETH_ALEN);
- inform_data.capability = le16_to_cpu(compat->compat_info);
- inform_data.beacon_interval = le16_to_cpu(compat->beacon_int);
+ bssid = ext->u.s1g_beacon.sa;
+ capability = le16_to_cpu(compat->compat_info);
+ beacon_interval = le16_to_cpu(compat->beacon_int);
} else {
- memcpy(inform_data.bssid, mgmt->bssid, ETH_ALEN);
- inform_data.beacon_interval =
- le16_to_cpu(mgmt->u.probe_resp.beacon_int);
- inform_data.capability =
- le16_to_cpu(mgmt->u.probe_resp.capab_info);
+ bssid = mgmt->bssid;
+ beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
+ capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
}
- inform_data.tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
+ tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
if (ieee80211_is_probe_resp(mgmt->frame_control))
- inform_data.ftype = CFG80211_BSS_FTYPE_PRESP;
+ ftype = CFG80211_BSS_FTYPE_PRESP;
+ else if (ext)
+ ftype = CFG80211_BSS_FTYPE_S1G_BEACON;
else
- inform_data.ftype = CFG80211_BSS_FTYPE_BEACON;
-
- res = cfg80211_inform_single_bss_data(wiphy, &inform_data, gfp);
- if (!res)
- return NULL;
-
- /* don't do any further MBSSID/ML handling for S1G */
- if (ext)
- return res;
-
- /* process each non-transmitting bss */
- cfg80211_parse_mbssid_data(wiphy, &inform_data, res, gfp);
+ ftype = CFG80211_BSS_FTYPE_BEACON;
- cfg80211_parse_ml_sta_data(wiphy, &inform_data, res, gfp);
-
- return res;
+ return cfg80211_inform_bss_data(wiphy, data, ftype,
+ bssid, tsf, capability,
+ beacon_interval, ie, ielen,
+ gfp);
}
EXPORT_SYMBOL(cfg80211_inform_bss_frame_data);
diff --git a/versions b/versions
index 273566ca5f..472b54cb5a 100644
--- a/versions
+++ b/versions
@@ -2,4 +2,4 @@ BACKPORTS_VERSION="(see git)"
BACKPORTED_KERNEL_VERSION="(see git)"
BACKPORTED_KERNEL_NAME="iwlwifi"
BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__
-BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:11871:72c9d312"
+BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:11872:7ca79bf3"