summaryrefslogtreecommitdiffstats
path: root/net/mac80211/ieee80211_i.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2022-06-29 13:29:05 +0200
committerJohannes Berg <johannes.berg@intel.com>2022-07-15 11:43:17 +0200
commit38c6aa29d4558c55a1d2b4010cc588716e212f89 (patch)
tree7f8997e0e72baafdeeede9f4c369643ba3c33239 /net/mac80211/ieee80211_i.h
parentwifi: mac80211: move tdls_chan_switch_prohibited to link data (diff)
downloadlinux-38c6aa29d4558c55a1d2b4010cc588716e212f89.tar.xz
linux-38c6aa29d4558c55a1d2b4010cc588716e212f89.zip
wifi: mac80211: fix multi-BSSID element parsing
When parsing a frame containing a multi-BSSID element, we need to know both the transmitted and non-transmitted BSSID so we can parse it correctly. Unfortunately, in quite a number of cases, we got this wrong and were passing the wrong BSSID or useless information: * the mgmt->bssid from a frame is only the transmitted BSSID if the frame is a beacon * passing just one of the parameters as non-NULL isn't useful and ignored In those case where we need to parse for a specific BSS we always have a BSS structure pointer, representing the BSS we need, whether transmitted or not. Thus, pass that pointer to the parsing function instead of the two BSSIDs. Also fix two bugs: * we need to re-parse all the elements for the other BSS when iterating the non-transmitted BSSes in scan * we need to parse for the correct BSS when setting up the channel data in client code Fixes: 78ac51f81532 ("mac80211: support multi-bssid") Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r--net/mac80211/ieee80211_i.h22
1 files changed, 8 insertions, 14 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index a8211ced719e..dc38f57fcdc9 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -2147,10 +2147,9 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
* @filter: bitmap of element IDs to filter out while calculating
* the element CRC
* @crc: CRC starting value
- * @transmitter_bssid: transmitter BSSID to parse the multi-BSSID
- * element
- * @bss_bssid: BSSID of the BSS we want to obtain elements for
- * when parsing the multi-BSSID element
+ * @bss: the BSS to parse this as, for multi-BSSID cases this can
+ * represent a non-transmitting BSS in which case the data
+ * for that non-transmitting BSS is returned
*/
struct ieee80211_elems_parse_params {
const u8 *start;
@@ -2158,8 +2157,7 @@ struct ieee80211_elems_parse_params {
bool action;
u64 filter;
u32 crc;
- const u8 *transmitter_bssid;
- const u8 *bss_bssid;
+ struct cfg80211_bss *bss;
};
struct ieee802_11_elems *
@@ -2168,8 +2166,7 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params);
static inline struct ieee802_11_elems *
ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
u64 filter, u32 crc,
- const u8 *transmitter_bssid,
- const u8 *bss_bssid)
+ struct cfg80211_bss *bss)
{
struct ieee80211_elems_parse_params params = {
.start = start,
@@ -2177,8 +2174,7 @@ ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
.action = action,
.filter = filter,
.crc = crc,
- .transmitter_bssid = transmitter_bssid,
- .bss_bssid = bss_bssid,
+ .bss = bss,
};
return ieee802_11_parse_elems_full(&params);
@@ -2186,11 +2182,9 @@ ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
static inline struct ieee802_11_elems *
ieee802_11_parse_elems(const u8 *start, size_t len, bool action,
- const u8 *transmitter_bssid,
- const u8 *bss_bssid)
+ struct cfg80211_bss *bss)
{
- return ieee802_11_parse_elems_crc(start, len, action, 0, 0,
- transmitter_bssid, bss_bssid);
+ return ieee802_11_parse_elems_crc(start, len, action, 0, 0, bss);
}