mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 01:22:25 +00:00
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:
committed by
John Crispin
parent
f4254b1611
commit
b1474acf2f
@@ -0,0 +1,50 @@
|
||||
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,2 +25,3 @@
|
||||
#include "airtime_policy.h"
|
||||
+#include "dfs.h"
|
||||
#include "hw_features.h"
|
||||
@@ -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,0 +1,50 @@
|
||||
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,2 +25,3 @@
|
||||
#include "airtime_policy.h"
|
||||
+#include "dfs.h"
|
||||
#include "hw_features.h"
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user