123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- From c05ace7510ead96e72b97ce47b33f7b5865d6d36 Mon Sep 17 00:00:00 2001
- From: Peter Oh <peter.oh@bowerswilkins.com>
- Date: Mon, 27 Aug 2018 14:28:38 -0700
- Subject: [PATCH 1/7] mesh: use setup completion callback to complete mesh join
- 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 not applied correct when mesh join
- is in process.
- Moreover 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 possiblity that completing mesh init fails, so add error
- handle codes.
- Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
- Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
- ---
- src/ap/hostapd.c | 11 ++++++++++-
- wpa_supplicant/mesh.c | 13 +++++++------
- 2 files changed, 17 insertions(+), 7 deletions(-)
- --- a/src/ap/hostapd.c
- +++ b/src/ap/hostapd.c
- @@ -423,6 +423,8 @@ static void hostapd_free_hapd_data(struc
- #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);
- @@ -2049,6 +2051,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)
- @@ -2192,7 +2201,7 @@ int hostapd_setup_interface(struct hosta
- 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;
- }
-
- --- a/wpa_supplicant/mesh.c
- +++ b/wpa_supplicant/mesh.c
- @@ -190,8 +190,9 @@ static int wpas_mesh_init_rsn(struct wpa
- }
-
-
- -static int wpas_mesh_complete(struct wpa_supplicant *wpa_s)
- +static void wpas_mesh_complete_cb(void *ctx)
- {
- + struct wpa_supplicant *wpa_s = ctx;
- struct hostapd_iface *ifmsh = wpa_s->ifmsh;
- struct wpa_driver_mesh_join_params *params = wpa_s->mesh_params;
- struct wpa_ssid *ssid = wpa_s->current_ssid;
- @@ -200,7 +201,7 @@ static int wpas_mesh_complete(struct wpa
- if (!params || !ssid || !ifmsh) {
- wpa_printf(MSG_ERROR, "mesh: %s called without active mesh",
- __func__);
- - return -1;
- + return;
- }
-
- if (ifmsh->mconf->security != MESH_CONF_SEC_NONE &&
- @@ -209,7 +210,7 @@ static int wpas_mesh_complete(struct wpa
- "mesh: RSN initialization failed - deinit mesh");
- wpa_supplicant_mesh_deinit(wpa_s);
- wpa_drv_leave_mesh(wpa_s);
- - return -1;
- + return;
- }
-
- if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) {
- @@ -235,8 +236,6 @@ static int wpas_mesh_complete(struct wpa
-
- if (!ret)
- wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
- -
- - return ret;
- }
-
-
- @@ -263,6 +262,7 @@ static int wpa_supplicant_mesh_init(stru
- if (!ifmsh)
- return -ENOMEM;
-
- + ifmsh->owner = wpa_s;
- ifmsh->drv_flags = wpa_s->drv_flags;
- ifmsh->num_bss = 1;
- ifmsh->bss = os_calloc(wpa_s->ifmsh->num_bss,
- @@ -280,6 +280,8 @@ static int wpa_supplicant_mesh_init(stru
- 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) {
- @@ -521,7 +523,6 @@ int wpa_supplicant_join_mesh(struct wpa_
- goto out;
- }
-
- - ret = wpas_mesh_complete(wpa_s);
- out:
- return ret;
- }
|