123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- From 91c0f3f6a9ecae3c9106bef8a8606fab0792dd28 Mon Sep 17 00:00:00 2001
- From: Peter Oh <[email protected]>
- 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 <[email protected]>
- ---
- 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;
|