| From bff03826272360ead21439209cdba99e57c1e74d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 2 Jan 2024 21:35:31 +0200 |
| Subject: wifi: cfg80211: parse all ML elements in an ML probe response |
| |
| From: Benjamin Berg <benjamin.berg@intel.com> |
| |
| [ Upstream commit d18125b640309e925441ce49559be33867ae6b29 ] |
| |
| A probe response from a transmitting AP in an Multi-BSSID setup will |
| contain more than one Multi-Link element. Most likely, only one of these |
| elements contains per-STA profiles. |
| |
| Fixes: 2481b5da9c6b ("wifi: cfg80211: handle BSS data contained in ML probe responses") |
| Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> |
| Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> |
| Link: https://msgid.link/20240102213313.6635eb152735.I94289002d4a2f7b6b44dfa428344854e37b0b29c@changeid |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/wireless/scan.c | 40 ++++++++++++++++++++++++++-------------- |
| 1 file changed, 26 insertions(+), 14 deletions(-) |
| |
| diff --git a/net/wireless/scan.c b/net/wireless/scan.c |
| index 8cd3eef76f2b..0d6c3fc1238a 100644 |
| --- a/net/wireless/scan.c |
| +++ b/net/wireless/scan.c |
| @@ -2591,10 +2591,12 @@ cfg80211_tbtt_info_for_mld_ap(const u8 *ie, size_t ielen, u8 mld_id, u8 link_id, |
| return false; |
| } |
| |
| -static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy, |
| - struct cfg80211_inform_single_bss_data *tx_data, |
| - struct cfg80211_bss *source_bss, |
| - gfp_t gfp) |
| +static void |
| +cfg80211_parse_ml_elem_sta_data(struct wiphy *wiphy, |
| + struct cfg80211_inform_single_bss_data *tx_data, |
| + struct cfg80211_bss *source_bss, |
| + const struct element *elem, |
| + gfp_t gfp) |
| { |
| struct cfg80211_inform_single_bss_data data = { |
| .drv_data = tx_data->drv_data, |
| @@ -2603,7 +2605,6 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy, |
| .bss_source = BSS_SOURCE_STA_PROFILE, |
| }; |
| struct ieee80211_multi_link_elem *ml_elem; |
| - const struct element *elem; |
| struct cfg80211_mle *mle; |
| u16 control; |
| u8 *new_ie; |
| @@ -2613,15 +2614,7 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy, |
| const u8 *pos; |
| u8 i; |
| |
| - if (!source_bss) |
| - return; |
| - |
| - if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP) |
| - return; |
| - |
| - elem = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_MULTI_LINK, |
| - tx_data->ie, tx_data->ielen); |
| - if (!elem || !ieee80211_mle_size_ok(elem->data + 1, elem->datalen - 1)) |
| + if (!ieee80211_mle_size_ok(elem->data + 1, elem->datalen - 1)) |
| return; |
| |
| ml_elem = (void *)elem->data + 1; |
| @@ -2756,6 +2749,25 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy, |
| kfree(mle); |
| } |
| |
| +static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy, |
| + struct cfg80211_inform_single_bss_data *tx_data, |
| + struct cfg80211_bss *source_bss, |
| + gfp_t gfp) |
| +{ |
| + const struct element *elem; |
| + |
| + if (!source_bss) |
| + return; |
| + |
| + if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP) |
| + return; |
| + |
| + for_each_element_extid(elem, WLAN_EID_EXT_EHT_MULTI_LINK, |
| + tx_data->ie, tx_data->ielen) |
| + cfg80211_parse_ml_elem_sta_data(wiphy, tx_data, source_bss, |
| + elem, gfp); |
| +} |
| + |
| struct cfg80211_bss * |
| cfg80211_inform_bss_data(struct wiphy *wiphy, |
| struct cfg80211_inform_bss *data, |
| -- |
| 2.43.0 |
| |