diff options
author | Daniel Golle <daniel@makrotopia.org> | 2018-04-12 13:07:22 +0200 |
---|---|---|
committer | Daniel Golle <daniel@makrotopia.org> | 2018-04-13 03:27:01 +0200 |
commit | d88934aa5aa9b61ec66a6f7ae0fb61d1ef889884 (patch) | |
tree | aa77211ec0f1b6add8ea048d789fb1061f9089b5 /package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch | |
parent | b28e995fc736a78adda9e3c554653c795bd408b0 (diff) | |
download | mtk-20170518-d88934aa5aa9b61ec66a6f7ae0fb61d1ef889884.zip mtk-20170518-d88934aa5aa9b61ec66a6f7ae0fb61d1ef889884.tar.gz mtk-20170518-d88934aa5aa9b61ec66a6f7ae0fb61d1ef889884.tar.bz2 |
hostapd: update to git snapshot of 2018-04-09
And import patchset to allow 802.11s mesh on DFS channels, see also
http://lists.infradead.org/pipermail/hostap/2018-April/038418.html
Fix sae_password for encryption mesh (sent upstream as well).
Also refreshed existing patches and fixed 463-add-mcast_rate-to-11s.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Diffstat (limited to 'package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch')
-rw-r--r-- | package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch b/package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch new file mode 100644 index 0000000..7671d1e --- /dev/null +++ b/package/network/services/hostapd/patches/0101-mesh-factor-out-mesh-join-function.patch @@ -0,0 +1,219 @@ +From 91c0f3f6a9ecae3c9106bef8a8606fab0792dd28 Mon Sep 17 00:00:00 2001 +From: Peter Oh <peter.oh@bowerswilkins.com> +Date: Thu, 12 Apr 2018 02:48:58 -0700 +Subject: [PATCH 01/15] 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 | 120 ++++++++++++++++-------------- + wpa_supplicant/mesh.h | 1 + + wpa_supplicant/wpa_supplicant_i.h | 1 + + 3 files changed, 68 insertions(+), 54 deletions(-) + +--- a/wpa_supplicant/mesh.c ++++ b/wpa_supplicant/mesh.c +@@ -25,6 +25,7 @@ + #include "mesh_mpm.h" + #include "mesh_rsn.h" + #include "mesh.h" ++#include "drivers/driver_nl80211.h" + + + static void wpa_supplicant_mesh_deinit(struct wpa_supplicant *wpa_s) +@@ -359,13 +360,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; + } +@@ -376,22 +412,22 @@ int wpa_supplicant_join_mesh(struct wpa_ + wpa_s->group_cipher = WPA_CIPHER_NONE; + wpa_s->mgmt_group_cipher = 0; + +- os_memset(¶ms, 0, sizeof(params)); +- params.meshid = ssid->ssid; +- params.meshid_len = ssid->ssid_len; +- ibss_mesh_setup_freq(wpa_s, ssid, ¶ms.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, ¶ms->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; + } +@@ -405,67 +441,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, ¶ms.freq)) { ++ wpa_s->mesh_params = params; ++ if (wpa_supplicant_mesh_init(wpa_s, ssid, ¶ms->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, ¶ms); +- 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; |