Skip to content

Commit

Permalink
hostapd: ubus: add DFS channels support during CSA
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mkwacz authored and blogic committed Apr 12, 2024
1 parent 1ca8f18 commit 4b5eeb4
Showing 1 changed file with 54 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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];

0 comments on commit 4b5eeb4

Please sign in to comment.