hostapd: ubus: add DFS channels support during CSA

Add options to trigger CSA with DFS channels, without
this patch ubus request was rejected:
ubus call hostapd.wlan0 switch_chan '{"freq":5260,"bcn_count":10}'
Command failed: Operation not supported

Fixes: WIFI-13385

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
This commit is contained in:
Marek Kwaczynski
2024-04-11 08:20:05 +02:00
committed by John Crispin
parent 1ca8f18b9d
commit 4b5eeb48cc

View File

@@ -0,0 +1,54 @@
Index: hostapd-2021-02-20-59e9794c/src/ap/ubus.c
===================================================================
--- hostapd-2021-02-20-59e9794c.orig/src/ap/ubus.c
+++ hostapd-2021-02-20-59e9794c/src/ap/ubus.c
@@ -25,6 +25,7 @@
#include "airtime_policy.h"
#include "hw_features.h"
#include "radius_client.h"
+#include "dfs.h"
static struct ubus_context *ctx;
static struct blob_buf b;
@@ -857,6 +858,7 @@ hostapd_switch_chan(struct ubus_context
u8 seg0 = 0, seg1 = 0;
int ret = UBUS_STATUS_OK;
int i;
+ int dfs_range = 0;
blobmsg_parse(csa_policy, __CSA_MAX, tb, blob_data(msg), blob_len(msg));
@@ -912,6 +914,17 @@ hostapd_switch_chan(struct ubus_context
break;
}
+ if (css.freq_params.center_freq1)
+ dfs_range += hostapd_is_dfs_overlap(
+ hapd->iface, chwidth, css.freq_params.center_freq1);
+ else
+ dfs_range += hostapd_is_dfs_overlap(
+ hapd->iface, chwidth, css.freq_params.freq);
+
+ if (css.freq_params.center_freq2)
+ dfs_range += hostapd_is_dfs_overlap(
+ hapd->iface, chwidth, css.freq_params.center_freq2);
+
hostapd_set_freq_params(&css.freq_params, iconf->hw_mode,
css.freq_params.freq,
css.freq_params.channel, iconf->enable_edmg,
@@ -925,6 +938,15 @@ hostapd_switch_chan(struct ubus_context
mode ? &mode->he_capab[IEEE80211_MODE_AP] :
NULL);
+ if (dfs_range) {
+ /* Perform CAC and switch channel */
+ freq_params = malloc(sizeof(*freq_params));
+ memcpy(freq_params, &css.freq_params, sizeof(*freq_params));
+ eloop_register_timeout(0, 1, switch_chan_fallback_cb,
+ hapd->iface, freq_params);
+ return 0;
+ }
+
for (i = 0; i < hapd->iface->num_bss; i++) {
struct hostapd_data *bss = hapd->iface->bss[i];