[PATCH v2 02/15] mesh: factor out rsn initialization

Daniel Golle daniel at makrotopia.org
Thu Apr 12 16:00:49 PDT 2018


Hi Peter,
Hi Jouni,
Hi Masashi,

while testing I realized that in order to get mesh-mode work with only
sae_password set, I needed to make changes as shown below. It's not a
bug introduced by your code because you only refactored it. Should it
be fixed before or after your series was applied?

On Thu, Apr 12, 2018 at 02:48:59AM -0700, peter.oh at bowerswilkins.com wrote:
> From: Peter Oh <peter.oh at bowerswilkins.com>
> 
> RSN initialization can be used in different phases
> if mesh initialization and mesh join don't happen
> in sequence such as DFS CAC is done in between,
> hence factor it out to help convering the case.
> 
> Signed-off-by: Peter Oh <peter.oh at bowerswilkins.com>
> ---
>  wpa_supplicant/mesh.c | 73 +++++++++++++++++++++++++++++++--------------------
>  wpa_supplicant/mesh.h |  1 +
>  2 files changed, 45 insertions(+), 29 deletions(-)
> 
> diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
> index f2f417dca..8e0d5ebff 100644
> --- a/wpa_supplicant/mesh.c
> +++ b/wpa_supplicant/mesh.c
> @@ -147,6 +147,48 @@ static void wpas_mesh_copy_groups(struct hostapd_data *bss,
>  			  groups_size);
>  }
>  
> +int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
> +{
> +	struct hostapd_iface *ifmsh = wpa_s->ifmsh;
> +	struct mesh_conf *mconf = wpa_s->ifmsh->mconf;
> +	struct wpa_ssid *ssid = wpa_s->current_ssid;
> +	struct hostapd_data *bss = ifmsh->bss[0];
> +	static int default_groups[] = { 19, 20, 21, 25, 26, -1 };
> +	size_t len;
> +
> +	if (mconf->security != MESH_CONF_SEC_NONE) {
> +		if (ssid->passphrase == NULL) {

sae_password has to be handled here...

> +			wpa_printf(MSG_ERROR,
> +				   "mesh: Passphrase for SAE not configured");
> +			return -1;
> +		}
> +
> +		bss->conf->wpa = ssid->proto;
> +		bss->conf->wpa_key_mgmt = ssid->key_mgmt;
> +
> +		if (wpa_s->conf->sae_groups &&
> +		    wpa_s->conf->sae_groups[0] > 0) {
> +			wpas_mesh_copy_groups(bss, wpa_s);
> +		} else {
> +			bss->conf->sae_groups =
> +				os_memdup(default_groups,
> +					  sizeof(default_groups));
> +			if (!bss->conf->sae_groups)
> +				return -1;
> +		}
> +
> +		len = os_strlen(ssid->passphrase);
and here

> +		bss->conf->ssid.wpa_passphrase =
> +			dup_binstr(ssid->passphrase, len);

as well.


> +
> +		wpa_s->mesh_rsn = mesh_rsn_auth_init(wpa_s, mconf);
> +		if (!wpa_s->mesh_rsn)
> +			return -1;
> +	}
> +
> +	return 0;
> +}
> +

Hence, once your series is applied, I reckon we should add this on top:

>From 30c1693f42326d4f927e76120492bc9593b8f739 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel at makrotopia.org>
Date: Fri, 13 Apr 2018 00:42:10 +0200
Subject: [PATCH] mesh: properly handle sae_password

The recently introduced sae_password parameter is only handled properly
in wpa_supplicant/sme.c while wpa_supplicant/mesh.c assumed that
ssid->passphrase exclusively holds the secret.
Import the logic from sme.c to mesh.c to allow having only sae_password
set which otherwise throws this error:
AP-ENABLED
mesh: Passphrase for SAE not configured
Init RSN failed. Deinit mesh...
wlan1: interface state ENABLED->DISABLED
AP-DISABLED
Segmentation fault

Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
 wpa_supplicant/mesh.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
index 22dec4822..0bf87245d 100644
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
@@ -154,10 +154,14 @@ int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
 	struct wpa_ssid *ssid = wpa_s->current_ssid;
 	struct hostapd_data *bss = ifmsh->bss[0];
 	static int default_groups[] = { 19, 20, 21, 25, 26, -1 };
+	const char *password;
 	size_t len;
 
 	if (mconf->security != MESH_CONF_SEC_NONE) {
-		if (ssid->passphrase == NULL) {
+		password = ssid->sae_password;
+		if (!password)
+			password = ssid->passphrase;
+		if (!password) {
 			wpa_printf(MSG_ERROR,
 				   "mesh: Passphrase for SAE not configured");
 			return -1;
@@ -177,9 +181,9 @@ int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
 				return -1;
 		}
 
-		len = os_strlen(ssid->passphrase);
+		len = os_strlen(password);
 		bss->conf->ssid.wpa_passphrase =
-			dup_binstr(ssid->passphrase, len);
+			dup_binstr(password, len);
 
 		wpa_s->mesh_rsn = mesh_rsn_auth_init(wpa_s, mconf);
 		if (!wpa_s->mesh_rsn)
-- 
2.17.0


Cheers


Daniel



More information about the Hostap mailing list