]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
mesh: Use setup completion callback to complete mesh join
authorPeter Oh <peter.oh@bowerswilkins.com>
Tue, 30 Jun 2020 12:18:56 +0000 (14:18 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 30 Nov 2020 09:57:37 +0000 (11:57 +0200)
Mesh join function is the last function to be called during mesh join
process, but it's been called a bit earlier than it's supposed to be, so
that some mesh parameter values such as VHT capabilities were not
applied correct when mesh join is in process. Moreover, the current
design of mesh join that is called directly after mesh initialization
isn't suitable for DFS channels to use, since mesh join process should
be paused until DFS CAC is done and resumed after it's done.

The callback will be called by hostapd_setup_interface_complete_sync().
There is a possibility that completing mesh init fails, so add error
handling codes for that.

Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
src/ap/hostapd.c
wpa_supplicant/mesh.c

index b37f49f9a8ecac0cb0f2cda2d0fe46a8b1a116cd..38212305e6bdfd899bf870e1cb61c81d69163b2e 100644 (file)
@@ -434,6 +434,8 @@ static void hostapd_free_hapd_data(struct hostapd_data *hapd)
 #ifdef CONFIG_MESH
        wpabuf_free(hapd->mesh_pending_auth);
        hapd->mesh_pending_auth = NULL;
+       /* handling setup failure is already done */
+       hapd->setup_complete_cb = NULL;
 #endif /* CONFIG_MESH */
 
        hostapd_clean_rrm(hapd);
@@ -2156,6 +2158,13 @@ dfs_offload:
        if (hapd->setup_complete_cb)
                hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
 
+#ifdef CONFIG_MESH
+       if (delay_apply_cfg && !iface->mconf) {
+               wpa_printf(MSG_ERROR, "Error while completing mesh init");
+               goto fail;
+       }
+#endif /* CONFIG_MESH */
+
        wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
                   iface->bss[0]->conf->iface);
        if (iface->interfaces && iface->interfaces->terminate_on_error > 0)
@@ -2299,7 +2308,7 @@ int hostapd_setup_interface(struct hostapd_iface *iface)
        ret = setup_interface(iface);
        if (ret) {
                wpa_printf(MSG_ERROR, "%s: Unable to setup interface.",
-                          iface->bss[0]->conf->iface);
+                          iface->conf ? iface->conf->bss[0]->iface : "N/A");
                return -1;
        }
 
index 558d87ae2283ccfc0fe78e527913d719cf6c626a..66f8311f1143e19683541b9e4fc4e05424e61070 100644 (file)
@@ -244,6 +244,14 @@ static int wpas_mesh_complete(struct wpa_supplicant *wpa_s)
 }
 
 
+static void wpas_mesh_complete_cb(void *arg)
+{
+       struct wpa_supplicant *wpa_s = arg;
+
+       wpas_mesh_complete(wpa_s);
+}
+
+
 static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
                                    struct wpa_ssid *ssid,
                                    struct hostapd_freq_params *freq)
@@ -267,6 +275,7 @@ static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
        if (!ifmsh)
                return -ENOMEM;
 
+       ifmsh->owner = wpa_s;
        ifmsh->drv_flags = wpa_s->drv_flags;
        ifmsh->drv_flags2 = wpa_s->drv_flags2;
        ifmsh->num_bss = 1;
@@ -285,6 +294,8 @@ static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
        bss->drv_priv = wpa_s->drv_priv;
        bss->iface = ifmsh;
        bss->mesh_sta_free_cb = mesh_mpm_free_sta;
+       bss->setup_complete_cb = wpas_mesh_complete_cb;
+       bss->setup_complete_cb_ctx = wpa_s;
        frequency = ssid->frequency;
        if (frequency != freq->freq &&
            frequency == freq->freq + freq->sec_channel_offset * 20) {
@@ -525,7 +536,6 @@ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s,
                goto out;
        }
 
-       ret = wpas_mesh_complete(wpa_s);
 out:
        return ret;
 }