Message ID | 20220722115632.620681-7-alvin@pqrs.dk (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | brcmfmac: fixes from Cypress/Infineon | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
Alvin Šipraga <alvin@pqrs.dk> writes: > From: Syed Rafiuddeen <syed.rafiuddeen@cypress.com> > > cfg80211 layer on DUT STA is disconnecting ongoing connection attempt after > receiving association response, because cfg80211 layer does not have valid > AP bss information. On association response event, brcmfmac communicates > the AP bss information to cfg80211 layer, but SSID seem to be empty in AP > bss information, and cfg80211 layer prints kernel warning and then > disconnects the ongoing connection attempt. > > SSID is empty in SSID IE, but 'bi->SSID' contains a valid SSID, so > updating the SSID for hidden AP while informing its bss information > to cfg80211 layer. > > Signed-off-by: Syed Rafiuddeen <syed.rafiuddeen@infineon.com> > Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com> > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com> > Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk> Infineon now submitted the same patch, I'll continue the review there: https://patchwork.kernel.org/project/linux-wireless/patch/20220914033620.12742-5-ian.lin@infineon.com/
Alvin Šipraga <alvin@pqrs.dk> writes: > From: Syed Rafiuddeen <syed.rafiuddeen@cypress.com> > > cfg80211 layer on DUT STA is disconnecting ongoing connection attempt after > receiving association response, because cfg80211 layer does not have valid > AP bss information. On association response event, brcmfmac communicates > the AP bss information to cfg80211 layer, but SSID seem to be empty in AP > bss information, and cfg80211 layer prints kernel warning and then > disconnects the ongoing connection attempt. > > SSID is empty in SSID IE, but 'bi->SSID' contains a valid SSID, so > updating the SSID for hidden AP while informing its bss information > to cfg80211 layer. > > Signed-off-by: Syed Rafiuddeen <syed.rafiuddeen@infineon.com> Syed's email address in From and s-o-b doesn't match. > @@ -3018,6 +3019,12 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg, > notify_ielen = le32_to_cpu(bi->ie_length); > bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100; > > + ssid = brcmf_parse_tlvs(notify_ie, notify_ielen, WLAN_EID_SSID); > + if (ssid && ssid->data[0] == '\0' && ssid->len == bi->SSID_len) { > + /* Update SSID for hidden AP */ > + memcpy((u8 *)ssid->data, bi->SSID, bi->SSID_len); > + } memcpy() takes a void pointer so the cast is not needed.
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 6ef574d69755..d6127b855060 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -2989,6 +2989,7 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg, u8 *notify_ie; size_t notify_ielen; struct cfg80211_inform_bss bss_data = {}; + const struct brcmf_tlv *ssid = NULL; if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { bphy_err(drvr, "Bss info is larger than buffer. Discarding\n"); @@ -3018,6 +3019,12 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg, notify_ielen = le32_to_cpu(bi->ie_length); bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100; + ssid = brcmf_parse_tlvs(notify_ie, notify_ielen, WLAN_EID_SSID); + if (ssid && ssid->data[0] == '\0' && ssid->len == bi->SSID_len) { + /* Update SSID for hidden AP */ + memcpy((u8 *)ssid->data, bi->SSID, bi->SSID_len); + } + brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID); brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq); brcmf_dbg(CONN, "Capability: %X\n", notify_capability);