On Tue, Nov 7, 2023 at 1:06 AM Hector Martin <marcan@xxxxxxxxx> wrote: > > Using the WSEC command instead of sae_password seems to be the supported > mechanism on newer firmware, and also how the brcmdhd driver does it. > > According to user reports [1], the sae_password codepath doesn't actually > work on machines with Cypress chips anyway, so no harm in removing it. > > This makes WPA3 work with iwd, or with wpa_supplicant pending a support > patchset [2]. > > [1] https://rachelbythebay.com/w/2023/11/06/wpa3/ > [2] http://lists.infradead.org/pipermail/hostap/2023-July/041653.html > > Signed-off-by: Hector Martin <marcan@xxxxxxxxx> > --- > .../broadcom/brcm80211/brcmfmac/cfg80211.c | 46 +++++++++------------- > .../broadcom/brcm80211/brcmfmac/fwil_types.h | 2 +- > 2 files changed, 20 insertions(+), 28 deletions(-) > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > index 2a90bb24ba77..138af70a33b8 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > @@ -1687,52 +1687,44 @@ static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e) > return reason; > } > > -static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len) > +static int brcmf_set_wsec(struct brcmf_if *ifp, const u8 *key, u16 key_len, u16 flags) > { > struct brcmf_pub *drvr = ifp->drvr; > struct brcmf_wsec_pmk_le pmk; > int err; > > + if (key_len > sizeof(pmk.key)) { > + bphy_err(drvr, "key must be less than %zu bytes\n", > + sizeof(pmk.key)); > + return -EINVAL; > + } > + > memset(&pmk, 0, sizeof(pmk)); > > - /* pass pmk directly */ > - pmk.key_len = cpu_to_le16(pmk_len); > - pmk.flags = cpu_to_le16(0); > - memcpy(pmk.key, pmk_data, pmk_len); > + /* pass key material directly */ > + pmk.key_len = cpu_to_le16(key_len); > + pmk.flags = cpu_to_le16(flags); > + memcpy(pmk.key, key, key_len); > > - /* store psk in firmware */ > + /* store key material in firmware */ > err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK, > &pmk, sizeof(pmk)); > if (err < 0) > bphy_err(drvr, "failed to change PSK in firmware (len=%u)\n", > - pmk_len); > + key_len); > > return err; > } > > +static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len) > +{ > + return brcmf_set_wsec(ifp, pmk_data, pmk_len, 0); > +} > + > static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data, > u16 pwd_len) > { > - struct brcmf_pub *drvr = ifp->drvr; > - struct brcmf_wsec_sae_pwd_le sae_pwd; > - int err; > - > - if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) { > - bphy_err(drvr, "sae_password must be less than %d\n", > - BRCMF_WSEC_MAX_SAE_PASSWORD_LEN); > - return -EINVAL; > - } > - > - sae_pwd.key_len = cpu_to_le16(pwd_len); > - memcpy(sae_pwd.key, pwd_data, pwd_len); > - > - err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd, > - sizeof(sae_pwd)); > - if (err < 0) > - bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n", > - pwd_len); > - > - return err; > + return brcmf_set_wsec(ifp, pwd_data, pwd_len, BRCMF_WSEC_PASSPHRASE); > } > > static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason, > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h > index 611d1a6aabb9..b68c46caabe8 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h > @@ -584,7 +584,7 @@ struct brcmf_wsec_key_le { > struct brcmf_wsec_pmk_le { > __le16 key_len; > __le16 flags; > - u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1]; > + u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN]; > }; > > /** > > --- > base-commit: ffc253263a1375a65fa6c9f62a893e9767fbebfa > change-id: 20231107-brcmfmac-wpa3-9e5f66e8be34 > > Best regards, > -- > Hector Martin <marcan@xxxxxxxxx> > > Looks good to me. Reviewed-by: Neal Gompa <neal@xxxxxxxxx> -- 真実はいつも一つ!/ Always, there's only one truth!