]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
mesh: Fix for mesh init/deinit
authorMarkus Theil <markus.theil@tu-ilmenau.de>
Tue, 30 Jun 2020 12:19:02 +0000 (14:19 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 30 Nov 2020 22:23:15 +0000 (00:23 +0200)
Send mesh group started notification after join completion
callback is called.

Implement outstanding TODO, to leave the mesh network on deinit.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
wpa_supplicant/mesh.c
wpa_supplicant/mesh.h
wpa_supplicant/wpa_supplicant.c

index 19813aa0df549b71b64c861e2f060581676480e3..1acc8f965134ed7a2d59654cab0e444667f9d803 100644 (file)
 
 static void wpa_supplicant_mesh_deinit(struct wpa_supplicant *wpa_s)
 {
-       wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
+       wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh, true);
        wpa_s->ifmsh = NULL;
        wpa_s->current_ssid = NULL;
        os_free(wpa_s->mesh_rsn);
        wpa_s->mesh_rsn = NULL;
        os_free(wpa_s->mesh_params);
        wpa_s->mesh_params = NULL;
-       /* TODO: leave mesh (stop beacon). This will happen on link down
-        * anyway, so it's not urgent */
+       wpa_supplicant_leave_mesh(wpa_s, false);
 }
 
 
 void wpa_supplicant_mesh_iface_deinit(struct wpa_supplicant *wpa_s,
-                                     struct hostapd_iface *ifmsh)
+                                     struct hostapd_iface *ifmsh,
+                                     bool also_clear_hostapd)
 {
        if (!ifmsh)
                return;
@@ -64,8 +64,10 @@ void wpa_supplicant_mesh_iface_deinit(struct wpa_supplicant *wpa_s,
        }
 
        /* take care of shared data */
-       hostapd_interface_deinit(ifmsh);
-       hostapd_interface_free(ifmsh);
+       if (also_clear_hostapd) {
+               hostapd_interface_deinit(ifmsh);
+               hostapd_interface_free(ifmsh);
+       }
 }
 
 
@@ -249,8 +251,7 @@ static int wpas_mesh_complete(struct wpa_supplicant *wpa_s)
            wpas_mesh_init_rsn(wpa_s)) {
                wpa_printf(MSG_ERROR,
                           "mesh: RSN initialization failed - deinit mesh");
-               wpa_supplicant_mesh_deinit(wpa_s);
-               wpa_drv_leave_mesh(wpa_s);
+               wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh, false);
                return -1;
        }
 
@@ -275,9 +276,15 @@ static int wpas_mesh_complete(struct wpa_supplicant *wpa_s)
        /* hostapd sets the interface down until we associate */
        wpa_drv_set_operstate(wpa_s, 1);
 
-       if (!ret)
+       if (!ret) {
                wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
 
+               wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_STARTED "ssid=\"%s\" id=%d",
+                       wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
+                       ssid->id);
+               wpas_notify_mesh_group_started(wpa_s, ssid);
+       }
+
        return ret;
 }
 
@@ -571,7 +578,7 @@ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s,
        wpa_s->mesh_params = params;
        if (wpa_supplicant_mesh_init(wpa_s, ssid, &params->freq)) {
                wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh");
-               wpa_drv_leave_mesh(wpa_s);
+               wpa_supplicant_leave_mesh(wpa_s, true);
                ret = -1;
                goto out;
        }
@@ -581,14 +588,15 @@ out:
 }
 
 
-int wpa_supplicant_leave_mesh(struct wpa_supplicant *wpa_s)
+int wpa_supplicant_leave_mesh(struct wpa_supplicant *wpa_s, bool need_deinit)
 {
        int ret = 0;
 
        wpa_msg(wpa_s, MSG_INFO, "leaving mesh");
 
        /* Need to send peering close messages first */
-       wpa_supplicant_mesh_deinit(wpa_s);
+       if (need_deinit)
+               wpa_supplicant_mesh_deinit(wpa_s);
 
        ret = wpa_drv_leave_mesh(wpa_s);
        if (ret)
index 7317083c99cd866dbb1aad69d1494bbcc3399cf2..a429e5e27358cf1635675f503ced58f002145498 100644 (file)
 
 int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s,
                             struct wpa_ssid *ssid);
-int wpa_supplicant_leave_mesh(struct wpa_supplicant *wpa_s);
+int wpa_supplicant_leave_mesh(struct wpa_supplicant *wpa_s,
+                             bool need_deinit);
 void wpa_supplicant_mesh_iface_deinit(struct wpa_supplicant *wpa_s,
-                                     struct hostapd_iface *ifmsh);
+                                     struct hostapd_iface *ifmsh,
+                                     bool also_clear_hostapd);
 int wpas_mesh_scan_result_text(const u8 *ies, size_t ies_len, char *buf,
                               char *end);
 int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname,
index 5cf45b4ffacaf642a625b620d994734cd783cc6e..ddd43e5d2694f2647000d33ece7d06e552f7fe71 100644 (file)
@@ -2249,10 +2249,6 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
                        return;
                }
                wpa_s->current_bss = bss;
-               wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_STARTED "ssid=\"%s\" id=%d",
-                       wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
-                       ssid->id);
-               wpas_notify_mesh_group_started(wpa_s, ssid);
 #else /* CONFIG_MESH */
                wpa_msg(wpa_s, MSG_ERROR,
                        "mesh mode support not included in the build");
@@ -3990,7 +3986,7 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
                        wpa_s->ifname);
                wpas_notify_mesh_group_removed(wpa_s, mconf->meshid,
                                               mconf->meshid_len, reason_code);
-               wpa_supplicant_leave_mesh(wpa_s);
+               wpa_supplicant_leave_mesh(wpa_s, true);
        }
 #endif /* CONFIG_MESH */
 
@@ -6717,7 +6713,7 @@ static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
 
 #ifdef CONFIG_MESH
        if (wpa_s->ifmsh) {
-               wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
+               wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh, true);
                wpa_s->ifmsh = NULL;
        }
 #endif /* CONFIG_MESH */