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];