[v8,14/16] mesh: fix channel switch error during CAC
diff mbox series

Message ID fcbe607446de39124d8196059fe788ae3d68917e.1535403927.git.peter.oh@bowerswilkins.com
State Changes Requested
Headers show
Series
  • mesh: enable DFS channels in mesh mode
Related show

Commit Message

Peter Oh Aug. 27, 2018, 9:28 p.m. UTC
From: Peter Oh <peter.oh@bowerswilkins.com>

Mesh interface has used its channel parameters that configured
during its initialization even after channel switched due to
DFS radar detection during CAC which caused channel switch error.
This change fixes the error by updating its channel parameters
when channel's been changed from initial one.

Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
---
 wpa_supplicant/mesh.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Jouni Malinen Jan. 3, 2019, 1:35 p.m. UTC | #1
On Mon, Aug 27, 2018 at 02:28:47PM -0700, peter.oh@bowerswilkins.com wrote:
> Mesh interface has used its channel parameters that configured
> during its initialization even after channel switched due to
> DFS radar detection during CAC which caused channel switch error.
> This change fixes the error by updating its channel parameters
> when channel's been changed from initial one.

> diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
> @@ -199,10 +200,35 @@ static int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
>  static void wpas_mesh_complete_cb(void *ctx)
>  {
>  	struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)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;
>  	int ret = 0;
>  
> +	/*
> +	 * inspect if channel's been changed since initialized.
> +	 * i.e. DFS radar detection
> +	 */
> +	if (ifmsh->freq != params->freq.freq) {
> +		wpa_s->assoc_freq = ifmsh->freq;
> +		ssid->frequency = ifmsh->freq;

This changing of ssid->frequency does not feel like the correct thing to
do here. wpa_supplicant should not be changing the network profile
parameters on its own.
Peter Oh May 15, 2019, 9:01 p.m. UTC | #2
On 01/03/2019 05:35 AM, Jouni Malinen wrote:
> On Mon, Aug 27, 2018 at 02:28:47PM -0700, peter.oh@bowerswilkins.com wrote:
>> Mesh interface has used its channel parameters that configured
>> during its initialization even after channel switched due to
>> DFS radar detection during CAC which caused channel switch error.
>> This change fixes the error by updating its channel parameters
>> when channel's been changed from initial one.
>> diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
>> @@ -199,10 +200,35 @@ static int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
>>   static void wpas_mesh_complete_cb(void *ctx)
>>   {
>>   	struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)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;
>>   	int ret = 0;
>>   
>> +	/*
>> +	 * inspect if channel's been changed since initialized.
>> +	 * i.e. DFS radar detection
>> +	 */
>> +	if (ifmsh->freq != params->freq.freq) {
>> +		wpa_s->assoc_freq = ifmsh->freq;
>> +		ssid->frequency = ifmsh->freq;
> This changing of ssid->frequency does not feel like the correct thing to
> do here. wpa_supplicant should not be changing the network profile
> parameters on its own.
Agree and I'll drop this patch from the next series since it's an 
optional change.
I may come back with right change once initial DFS check-in is done.

Thanks,
Peter

Patch
diff mbox series

diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
index cdaafd7..a714c15 100644
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
@@ -13,6 +13,7 @@ 
 #include "utils/uuid.h"
 #include "common/ieee802_11_defs.h"
 #include "common/wpa_ctrl.h"
+#include "common/hw_features_common.h"
 #include "ap/sta_info.h"
 #include "ap/hostapd.h"
 #include "ap/ieee802_11.h"
@@ -199,10 +200,35 @@  static int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s)
 static void wpas_mesh_complete_cb(void *ctx)
 {
 	struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)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;
 	int ret = 0;
 
+	/*
+	 * inspect if channel's been changed since initialized.
+	 * i.e. DFS radar detection
+	 */
+	if (ifmsh->freq != params->freq.freq) {
+		wpa_s->assoc_freq = ifmsh->freq;
+		ssid->frequency = ifmsh->freq;
+		if (hostapd_set_freq_params(&params->freq,
+				ifmsh->conf->hw_mode,
+				ifmsh->freq,
+				ifmsh->conf->channel,
+				ifmsh->conf->ieee80211n,
+				ifmsh->conf->ieee80211ac,
+				ifmsh->conf->secondary_channel,
+				ifmsh->conf->vht_oper_chwidth,
+				ifmsh->conf->vht_oper_centr_freq_seg0_idx,
+				ifmsh->conf->vht_oper_centr_freq_seg1_idx,
+				ifmsh->conf->vht_capab)) {
+			wpa_printf(MSG_ERROR, "Error updating mesh frequency params.");
+			wpa_supplicant_mesh_deinit(wpa_s);
+			return;
+		}
+	}
+
 	if (wpas_mesh_init_rsn(wpa_s)) {
 		wpa_printf(MSG_ERROR, "Init RSN failed. Deinit mesh...");
 		wpa_supplicant_mesh_deinit(wpa_s);