[PATCH 07/12] MLD STA: Add support to configure keys with MLO link ID param

Peer, Ilan ilan.peer at intel.com
Tue Sep 13 00:35:43 PDT 2022



> -----Original Message-----
> From: Hostap <hostap-bounces at lists.infradead.org> On Behalf Of
> Veerendranath Jakkam
> Sent: Thursday, August 25, 2022 08:53
> To: hostap at lists.infradead.org
> Cc: quic_vjakkam at quicinc.com
> Subject: [PATCH 07/12] MLD STA: Add support to configure keys with MLO
> link ID param
> 
> Add APIs to specify link ID for set key operations for MLO connection.
> 
> Signed-off-by: Veerendranath Jakkam <quic_vjakkam at quicinc.com>
> ---
>  src/ap/ap_drv_ops.c          |  1 +
>  src/drivers/driver.h         |  6 ++++++
>  src/drivers/driver_nl80211.c | 15 +++++++++++++++
>  src/rsn_supp/wpa.h           |  4 ++++
>  src/rsn_supp/wpa_i.h         | 12 ++++++++++++
>  wpa_supplicant/driver_i.h    | 24 ++++++++++++++++++------
>  wpa_supplicant/wpas_glue.c   | 16 ++++++++++++++++
>  7 files changed, 72 insertions(+), 6 deletions(-)
> 
> diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index
> 87c3b9006..2102a2898 100644
> --- a/src/ap/ap_drv_ops.c
> +++ b/src/ap/ap_drv_ops.c
> @@ -716,6 +716,7 @@ int hostapd_drv_set_key(const char *ifname, struct
> hostapd_data *hapd,
>  	params.key_len = key_len;
>  	params.vlan_id = vlan_id;
>  	params.key_flag = key_flag;
> +	params.link_id = -1;
> 
>  	return hapd->driver->set_key(hapd->drv_priv, &params);  } diff --git
> a/src/drivers/driver.h b/src/drivers/driver.h index 3602224b6..9a2d9bbc2
> 100644
> --- a/src/drivers/driver.h
> +++ b/src/drivers/driver.h
> @@ -1772,6 +1772,12 @@ struct wpa_driver_set_key_params {
>  	 * %KEY_FLAG_RX_TX
>  	 *  RX/TX key. */
>  	enum key_flag key_flag;
> +
> +	/**
> +	 * link_id - MLO link ID
> +	 *
> +	 * set to valid link ID (0-14) when applicable, otherwise -1 */
> +	int link_id;
>  };
> 
>  enum wpa_driver_if_type {
> diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index
> a4675eb1d..af9d53b45 100644
> --- a/src/drivers/driver_nl80211.c
> +++ b/src/drivers/driver_nl80211.c
> @@ -3343,6 +3343,7 @@ static int wpa_driver_nl80211_set_key(struct
> i802_bss *bss,
>  	size_t key_len = params->key_len;
>  	int vlan_id = params->vlan_id;
>  	enum key_flag key_flag = params->key_flag;
> +	int link_id = params->link_id;
> 
>  	/* Ignore for P2P Device */
>  	if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) @@ -3479,6
> +3480,13 @@ static int wpa_driver_nl80211_set_key(struct i802_bss *bss,
>  			goto fail;
>  	}
> 
> +	if (link_id != -1) {
> +		wpa_printf(MSG_DEBUG, "nl80211: Link ID %d",
> +			   link_id);
> +		if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
> +			goto fail;
> +	}
> +
>  	ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
>  	if ((ret == -ENOENT || ret == -ENOLINK) && alg == WPA_ALG_NONE)
>  		ret = 0;
> @@ -3541,6 +3549,13 @@ static int wpa_driver_nl80211_set_key(struct
> i802_bss *bss,
>  			goto fail;
>  	}
> 
> +	if (link_id != -1) {
> +		wpa_printf(MSG_DEBUG, "nl80211: set_key default - Link ID
> %d",
> +			   link_id);
> +		if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
> +			goto fail;
> +	}
> +
>  	ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
>  	if (ret)
>  		wpa_printf(MSG_DEBUG,
> diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h index
> a56802b0a..ecfcf277f 100644
> --- a/src/rsn_supp/wpa.h
> +++ b/src/rsn_supp/wpa.h
> @@ -33,6 +33,10 @@ struct wpa_sm_ctx {
>  		       const u8 *addr, int key_idx, int set_tx,
>  		       const u8 *seq, size_t seq_len,
>  		       const u8 *key, size_t key_len, enum key_flag key_flag);
> +	int (*mlo_set_key)(void *ctx, u8 link_id, enum wpa_alg alg,
> +			   const u8 *addr, int key_idx, int set_tx,
> +			   const u8 *seq, size_t seq_len, const u8 *key,
> +			   size_t key_len, enum key_flag key_flag);

Did you consider extending the existing set_key callback? Seems more straightforward.
 
> 
> +static int wpa_supplicant_mlo_set_key(void *_wpa_s, u8 link_id,
> +				      enum wpa_alg alg, const u8 *addr,
> +				      int key_idx, int set_tx, const u8 *seq,
> +				      size_t seq_len, const u8 *key,
> +				      size_t key_len, enum key_flag key_flag) {
> +	struct wpa_supplicant *wpa_s = _wpa_s;
> +	if (alg == WPA_ALG_TKIP && key_idx == 0 && key_len == 32) {
> +		/* Clear the MIC error counter when setting a new PTK. */
> +		wpa_s->mic_errors_seen = 0;
> +	}

I do not think that TKIP is an allowed cipher suite with MLD (at least I hope it isn't ...).

Regards,

Ilan.



More information about the Hostap mailing list