aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch')
-rw-r--r--package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch211
1 files changed, 211 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch b/package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch
new file mode 100644
index 0000000000..72c3c75ae9
--- /dev/null
+++ b/package/network/services/hostapd/patches/001-mesh-factor-out-mesh-join-function.patch
@@ -0,0 +1,211 @@
+From 032e70833de4b251fc4a159b2cc4ef28d0f1df0d Mon Sep 17 00:00:00 2001
+From: Peter Oh <peter.oh@bowerswilkins.com>
+Date: Tue, 17 Apr 2018 21:54:58 -0700
+Subject: [PATCH 01/16] mesh: factor out mesh join function
+
+mesh join function consitss of 2 parts which are preparing
+configurations and sending join event to driver.
+Since physical mesh join event could happen either right
+after mesh configuration is done or after CAC is done
+in case of DFS channel is used, factor out the function
+into 2 parts to reduce redundant calls.
+
+Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
+---
+ wpa_supplicant/mesh.c | 119 ++++++++++++++++--------------
+ wpa_supplicant/mesh.h | 1 +
+ wpa_supplicant/wpa_supplicant_i.h | 1 +
+ 3 files changed, 67 insertions(+), 54 deletions(-)
+
+--- a/wpa_supplicant/mesh.c
++++ b/wpa_supplicant/mesh.c
+@@ -364,13 +364,48 @@ void wpa_supplicant_mesh_add_scan_ie(str
+ }
+
+
++void wpas_join_mesh(struct wpa_supplicant *wpa_s)
++{
++ struct wpa_driver_mesh_join_params *params = wpa_s->mesh_params;
++ struct wpa_ssid *ssid = wpa_s->current_ssid;
++ int ret = 0;
++
++ if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) {
++ wpa_s->pairwise_cipher = wpa_s->mesh_rsn->pairwise_cipher;
++ wpa_s->group_cipher = wpa_s->mesh_rsn->group_cipher;
++ wpa_s->mgmt_group_cipher = wpa_s->mesh_rsn->mgmt_group_cipher;
++ }
++
++ if (wpa_s->ifmsh) {
++ params->ies = wpa_s->ifmsh->mconf->rsn_ie;
++ params->ie_len = wpa_s->ifmsh->mconf->rsn_ie_len;
++ params->basic_rates = wpa_s->ifmsh->basic_rates;
++ params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE;
++ params->conf.ht_opmode = wpa_s->ifmsh->bss[0]->iface->ht_op_mode;
++ }
++
++ ret = wpa_drv_join_mesh(wpa_s, params);
++ if (ret)
++ wpa_msg(wpa_s, MSG_ERROR, "mesh join error=%d\n", ret);
++
++ /* hostapd sets the interface down until we associate */
++ wpa_drv_set_operstate(wpa_s, 1);
++
++ if (!ret)
++ wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
++
++ return;
++}
++
++
+ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid)
+ {
+- struct wpa_driver_mesh_join_params params;
++ struct wpa_driver_mesh_join_params *params =
++ os_zalloc(sizeof(struct wpa_driver_mesh_join_params));
+ int ret = 0;
+
+- if (!ssid || !ssid->ssid || !ssid->ssid_len || !ssid->frequency) {
++ if (!ssid || !ssid->ssid || !ssid->ssid_len || !ssid->frequency || !params) {
+ ret = -ENOENT;
+ goto out;
+ }
+@@ -381,22 +416,22 @@ int wpa_supplicant_join_mesh(struct wpa_
+ wpa_s->group_cipher = WPA_CIPHER_NONE;
+ wpa_s->mgmt_group_cipher = 0;
+
+- os_memset(&params, 0, sizeof(params));
+- params.meshid = ssid->ssid;
+- params.meshid_len = ssid->ssid_len;
+- ibss_mesh_setup_freq(wpa_s, ssid, &params.freq);
+- wpa_s->mesh_ht_enabled = !!params.freq.ht_enabled;
+- wpa_s->mesh_vht_enabled = !!params.freq.vht_enabled;
+- if (params.freq.ht_enabled && params.freq.sec_channel_offset)
+- ssid->ht40 = params.freq.sec_channel_offset;
++ params->meshid = ssid->ssid;
++ params->meshid_len = ssid->ssid_len;
++ ibss_mesh_setup_freq(wpa_s, ssid, &params->freq);
++ wpa_s->mesh_ht_enabled = !!params->freq.ht_enabled;
++ wpa_s->mesh_vht_enabled = !!params->freq.vht_enabled;
++ if (params->freq.ht_enabled && params->freq.sec_channel_offset)
++ ssid->ht40 = params->freq.sec_channel_offset;
++
+ if (wpa_s->mesh_vht_enabled) {
+ ssid->vht = 1;
+- switch (params.freq.bandwidth) {
++ switch (params->freq.bandwidth) {
+ case 80:
+- if (params.freq.center_freq2) {
++ if (params->freq.center_freq2) {
+ ssid->max_oper_chwidth = VHT_CHANWIDTH_80P80MHZ;
+ ssid->vht_center_freq2 =
+- params.freq.center_freq2;
++ params->freq.center_freq2;
+ } else {
+ ssid->max_oper_chwidth = VHT_CHANWIDTH_80MHZ;
+ }
+@@ -410,67 +445,43 @@ int wpa_supplicant_join_mesh(struct wpa_
+ }
+ }
+ if (ssid->beacon_int > 0)
+- params.beacon_int = ssid->beacon_int;
++ params->beacon_int = ssid->beacon_int;
+ else if (wpa_s->conf->beacon_int > 0)
+- params.beacon_int = wpa_s->conf->beacon_int;
++ params->beacon_int = wpa_s->conf->beacon_int;
+ if (ssid->dtim_period > 0)
+- params.dtim_period = ssid->dtim_period;
++ params->dtim_period = ssid->dtim_period;
+ else if (wpa_s->conf->dtim_period > 0)
+- params.dtim_period = wpa_s->conf->dtim_period;
+- params.conf.max_peer_links = wpa_s->conf->max_peer_links;
++ params->dtim_period = wpa_s->conf->dtim_period;
++ params->conf.max_peer_links = wpa_s->conf->max_peer_links;
+ if (ssid->mesh_rssi_threshold < DEFAULT_MESH_RSSI_THRESHOLD) {
+- params.conf.rssi_threshold = ssid->mesh_rssi_threshold;
+- params.conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD;
++ params->conf.rssi_threshold = ssid->mesh_rssi_threshold;
++ params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD;
+ }
+
+ if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) {
+- params.flags |= WPA_DRIVER_MESH_FLAG_SAE_AUTH;
+- params.flags |= WPA_DRIVER_MESH_FLAG_AMPE;
++ params->flags |= WPA_DRIVER_MESH_FLAG_SAE_AUTH;
++ params->flags |= WPA_DRIVER_MESH_FLAG_AMPE;
+ wpa_s->conf->user_mpm = 1;
+ }
+
+ if (wpa_s->conf->user_mpm) {
+- params.flags |= WPA_DRIVER_MESH_FLAG_USER_MPM;
+- params.conf.auto_plinks = 0;
++ params->flags |= WPA_DRIVER_MESH_FLAG_USER_MPM;
++ params->conf.auto_plinks = 0;
+ } else {
+- params.flags |= WPA_DRIVER_MESH_FLAG_DRIVER_MPM;
+- params.conf.auto_plinks = 1;
++ params->flags |= WPA_DRIVER_MESH_FLAG_DRIVER_MPM;
++ params->conf.auto_plinks = 1;
+ }
+- params.conf.peer_link_timeout = wpa_s->conf->mesh_max_inactivity;
++ params->conf.peer_link_timeout = wpa_s->conf->mesh_max_inactivity;
+
+- if (wpa_supplicant_mesh_init(wpa_s, ssid, &params.freq)) {
++ 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);
+ ret = -1;
+ goto out;
+ }
+
+- if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) {
+- wpa_s->pairwise_cipher = wpa_s->mesh_rsn->pairwise_cipher;
+- wpa_s->group_cipher = wpa_s->mesh_rsn->group_cipher;
+- wpa_s->mgmt_group_cipher = wpa_s->mesh_rsn->mgmt_group_cipher;
+- }
+-
+- if (wpa_s->ifmsh) {
+- params.ies = wpa_s->ifmsh->mconf->rsn_ie;
+- params.ie_len = wpa_s->ifmsh->mconf->rsn_ie_len;
+- params.basic_rates = wpa_s->ifmsh->basic_rates;
+- params.conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE;
+- params.conf.ht_opmode = wpa_s->ifmsh->bss[0]->iface->ht_op_mode;
+- }
+-
+- wpa_msg(wpa_s, MSG_INFO, "joining mesh %s",
+- wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
+- ret = wpa_drv_join_mesh(wpa_s, &params);
+- if (ret)
+- wpa_msg(wpa_s, MSG_ERROR, "mesh join error=%d", ret);
+-
+- /* hostapd sets the interface down until we associate */
+- wpa_drv_set_operstate(wpa_s, 1);
+-
+- if (!ret)
+- wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
+-
++ wpas_join_mesh(wpa_s);
+ out:
+ return ret;
+ }
+--- a/wpa_supplicant/mesh.h
++++ b/wpa_supplicant/mesh.h
+@@ -21,6 +21,7 @@ int wpas_mesh_add_interface(struct wpa_s
+ int wpas_mesh_peer_remove(struct wpa_supplicant *wpa_s, const u8 *addr);
+ int wpas_mesh_peer_add(struct wpa_supplicant *wpa_s, const u8 *addr,
+ int duration);
++void wpas_join_mesh(struct wpa_supplicant *wpa_s);
+
+ #ifdef CONFIG_MESH
+
+--- a/wpa_supplicant/wpa_supplicant_i.h
++++ b/wpa_supplicant/wpa_supplicant_i.h
+@@ -810,6 +810,7 @@ struct wpa_supplicant {
+ unsigned int mesh_if_created:1;
+ unsigned int mesh_ht_enabled:1;
+ unsigned int mesh_vht_enabled:1;
++ struct wpa_driver_mesh_join_params *mesh_params;
+ #ifdef CONFIG_PMKSA_CACHE_EXTERNAL
+ /* struct external_pmksa_cache::list */
+ struct dl_list mesh_external_pmksa_cache;