MLD STA: Add support for SAE external authentication offload to userspace

Enable MLO for SAE authentication when the driver indicates the AP MLD
address in an external authentication request. The MAC address of the
interface on which the external authentication request received will be
used as the own MLD address.

This commit does below for enabling MLO during external SAE
authentication:
- Use MLD addresses for SAE authentication.
- Add Basic Multi-Link element with the own MLD address in SAE
  Authentication frames.
- Send SAE Authentication frames with the source address as the own MLD
  address, destination address and BSSID as the AP MLD address to the
  driver.
- Validate the MLD address indicated by the AP in SAE Authentication
  frames against the AP MLD address indicated in external authentication
  request.
- Store the PMKSA with the AP MLD address after completing SAE
  authentication.

Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
This commit is contained in:
Veerendranath Jakkam 2022-10-19 19:44:06 +05:30 committed by Jouni Malinen
parent 575712450a
commit c91852044d
4 changed files with 134 additions and 18 deletions

View file

@ -2730,6 +2730,7 @@ enum wpa_drv_update_connect_params_mask {
* the real status code for failures. Used only for the request interface
* from user space to the driver.
* @pmkid: Generated PMKID as part of external auth exchange (e.g., SAE).
* @mld_addr: AP's MLD address or %NULL if MLO is not used
*/
struct external_auth {
enum {
@ -2742,6 +2743,7 @@ struct external_auth {
unsigned int key_mgmt_suite;
u16 status;
const u8 *pmkid;
const u8 *mld_addr;
};
#define WPAS_MAX_PASN_PEERS 10

View file

@ -3116,6 +3116,7 @@ static void nl80211_external_auth(struct wpa_driver_nl80211_data *drv,
{
union wpa_event_data event;
enum nl80211_external_auth_action act;
char mld_addr[50];
if (!tb[NL80211_ATTR_AKM_SUITES] ||
!tb[NL80211_ATTR_EXTERNAL_AUTH_ACTION] ||
@ -3146,10 +3147,21 @@ static void nl80211_external_auth(struct wpa_driver_nl80211_data *drv,
event.external_auth.bssid = nla_data(tb[NL80211_ATTR_BSSID]);
mld_addr[0] = '\0';
if (tb[NL80211_ATTR_MLD_ADDR]) {
event.external_auth.mld_addr =
nla_data(tb[NL80211_ATTR_MLD_ADDR]);
os_snprintf(mld_addr, sizeof(mld_addr), ", MLD ADDR: " MACSTR,
MAC2STR(event.external_auth.mld_addr));
}
wpa_printf(MSG_DEBUG,
"nl80211: External auth action: %u, AKM: 0x%x",
"nl80211: External auth action: %u, AKM: 0x%x, SSID: %s, BSSID: " MACSTR "%s",
event.external_auth.action,
event.external_auth.key_mgmt_suite);
event.external_auth.key_mgmt_suite,
wpa_ssid_txt(event.external_auth.ssid,
event.external_auth.ssid_len),
MAC2STR(event.external_auth.bssid), mld_addr);
wpa_supplicant_event(drv->ctx, EVENT_EXTERNAL_AUTH, &event);
}