diff mbox series

[02/12] MLD STA: set MLO connection info to wpa_sm

Message ID 20220825055311.3327147-3-quic_vjakkam@quicinc.com
State Changes Requested
Headers show
Series MLD STA: Add support for four-way handshake and SAE external authentication | expand

Commit Message

Veerendranath Jakkam Aug. 25, 2022, 5:53 a.m. UTC
Update MLO connection info such as valid links, AP MLD address and other
link information to wpa_sm.

Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
---
 src/rsn_supp/wpa.c      | 23 +++++++++++++++++++++++
 src/rsn_supp/wpa.h      | 11 +++++++++++
 src/rsn_supp/wpa_i.h    |  7 +++++++
 wpa_supplicant/events.c | 18 ++++++++++++++++++
 4 files changed, 59 insertions(+)

Comments

Peer, Ilan Sept. 13, 2022, 7:11 a.m. UTC | #1
> -----Original Message-----
> From: Hostap <hostap-bounces@lists.infradead.org> On Behalf Of
> Veerendranath Jakkam
> Sent: Thursday, August 25, 2022 08:53
> To: hostap@lists.infradead.org
> Cc: quic_vjakkam@quicinc.com
> Subject: [PATCH 02/12] MLD STA: set MLO connection info to wpa_sm
> 
> Update MLO connection info such as valid links, AP MLD address and other
> link information to wpa_sm.
> 
> Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
> ---
>  src/rsn_supp/wpa.c      | 23 +++++++++++++++++++++++
>  src/rsn_supp/wpa.h      | 11 +++++++++++
>  src/rsn_supp/wpa_i.h    |  7 +++++++
>  wpa_supplicant/events.c | 18 ++++++++++++++++++
>  4 files changed, 59 insertions(+)
> 
> diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c index
> cf9b21039..a28d49225 100644
> --- a/src/rsn_supp/wpa.c
> +++ b/src/rsn_supp/wpa.c
> @@ -3277,6 +3277,29 @@ void wpa_sm_set_config(struct wpa_sm *sm,
> struct rsn_supp_config *config)  }
> 
> 
> +void wpa_sm_set_ml_params(struct wpa_sm *sm, const u8
> *ap_mld_addr,
> +			  u16 valid_links, const u8 (*link_addr)[ETH_ALEN],
> +			  const u8 (*link_bssid)[ETH_ALEN])

Better use 'const u8 *link_bssid[ETH_ALEN]. I think it would be clearer.

> +{
> +	int i;
> +
> +	if (!sm)
> +		return;
> +
> +	sm->valid_links = valid_links;
> +	if (!valid_links)
> +		return;
> +
> +	os_memcpy(sm->ap_mld_addr, ap_mld_addr, ETH_ALEN);
> +	for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
> +		if (!(valid_links & BIT(i)))
> +			continue;
> +
> +		os_memcpy(sm->links[i].addr, link_addr[i], ETH_ALEN);
> +		os_memcpy(sm->links[i].bssid, link_bssid[i], ETH_ALEN);
> +	}

You could already configure here the corresponding RSN and RSNXE elements for the links as they should be already be known
before the association. 

In addition, this needs to track negotiated links vs. setup links, as it is possible for the MLD AP to reject some of the links, in which case
It would still need to add the MLO Link KDEs for all negotiated links, but the MLO GTK/IGTK/BIGTK KDEs only for the setup links. See section 35.3.5.1 in Draft P802.11be_D2.0 for the definition of a "setup link".

Regards,

Ilan.
diff mbox series

Patch

diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
index cf9b21039..a28d49225 100644
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
@@ -3277,6 +3277,29 @@  void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config)
 }
 
 
+void wpa_sm_set_ml_params(struct wpa_sm *sm, const u8 *ap_mld_addr,
+			  u16 valid_links, const u8 (*link_addr)[ETH_ALEN],
+			  const u8 (*link_bssid)[ETH_ALEN])
+{
+	int i;
+
+	if (!sm)
+		return;
+
+	sm->valid_links = valid_links;
+	if (!valid_links)
+		return;
+
+	os_memcpy(sm->ap_mld_addr, ap_mld_addr, ETH_ALEN);
+	for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
+		if (!(valid_links & BIT(i)))
+			continue;
+
+		os_memcpy(sm->links[i].addr, link_addr[i], ETH_ALEN);
+		os_memcpy(sm->links[i].bssid, link_bssid[i], ETH_ALEN);
+	}
+}
+
 /**
  * wpa_sm_set_own_addr - Set own MAC address
  * @sm: Pointer to WPA state machine data from wpa_sm_init()
diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h
index be70f4156..e6eef0c99 100644
--- a/src/rsn_supp/wpa.h
+++ b/src/rsn_supp/wpa.h
@@ -153,6 +153,9 @@  void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
+void wpa_sm_set_ml_params(struct wpa_sm *sm, const u8 *ap_mld_addr,
+			  u16 valid_links, const u8 (*link_addr)[ETH_ALEN],
+			  const u8 (*link_bssid)[ETH_ALEN]);
 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
 		       const char *bridge_ifname);
 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
@@ -266,6 +269,14 @@  static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
 {
 }
 
+static inline void wpa_sm_set_ml_params(struct wpa_sm *sm,
+					const u8 *ap_mld_addr,
+					u16 valid_links,
+					const u8 (*link_addr)[ETH_ALEN],
+					const u8 (*link_bssid)[ETH_ALEN])
+{
+}
+
 static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
 				     const char *bridge_ifname)
 {
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
index fabd6cb26..62b85cb2e 100644
--- a/src/rsn_supp/wpa_i.h
+++ b/src/rsn_supp/wpa_i.h
@@ -218,6 +218,13 @@  struct wpa_sm {
 	struct wpabuf *dpp_z;
 	int dpp_pfs;
 #endif /* CONFIG_DPP2 */
+
+	u16 valid_links;
+	u8 ap_mld_addr[ETH_ALEN];
+	struct {
+		u8 addr[ETH_ALEN];
+		u8 bssid[ETH_ALEN];
+	} links[MAX_NUM_MLD_LINKS];
 };
 
 
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 0db2e8dd8..db4de316f 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -3387,6 +3387,23 @@  static int wpa_drv_get_mlo_info(struct wpa_supplicant *wpa_s)
 	return 0;
 }
 
+static void wpa_sm_update_ml_params(struct wpa_supplicant *wpa_s)
+{
+	int i;
+	u8 link_addr[MAX_NUM_MLD_LINKS][ETH_ALEN];
+	u8 link_bssid[MAX_NUM_MLD_LINKS][ETH_ALEN];
+
+	for (i = 0; i < MAX_NUM_MLD_LINKS && wpa_s->valid_links; i++) {
+		if (!(wpa_s->valid_links & BIT(i)))
+			continue;
+
+		os_memcpy(link_addr[i], wpa_s->links[i].addr, ETH_ALEN);
+		os_memcpy(link_bssid[i], wpa_s->links[i].bssid, ETH_ALEN);
+	}
+
+	wpa_sm_set_ml_params(wpa_s->wpa, wpa_s->ap_mld_addr, wpa_s->valid_links,
+			     link_addr, link_bssid);
+}
 
 static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
 				       union wpa_event_data *data)
@@ -3512,6 +3529,7 @@  static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
 		wpa_supplicant_scard_init(wpa_s, wpa_s->current_ssid);
 	}
 	wpa_sm_notify_assoc(wpa_s->wpa, bssid);
+	wpa_sm_update_ml_params(wpa_s);
 	if (wpa_s->l2)
 		l2_packet_notify_auth_start(wpa_s->l2);