hostapd: add "force" parameter for channel switch
This will restart the interface in case the CSA fails and can be used to force the device on a DFS channel (including full CAC) Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
99a22d48f2
commit
9ec5f5f230
1 changed files with 21 additions and 1 deletions
|
@ -744,6 +744,7 @@ enum {
|
||||||
CSA_VHT,
|
CSA_VHT,
|
||||||
CSA_HE,
|
CSA_HE,
|
||||||
CSA_BLOCK_TX,
|
CSA_BLOCK_TX,
|
||||||
|
CSA_FORCE,
|
||||||
__CSA_MAX
|
__CSA_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -758,8 +759,18 @@ static const struct blobmsg_policy csa_policy[__CSA_MAX] = {
|
||||||
[CSA_VHT] = { "vht", BLOBMSG_TYPE_BOOL },
|
[CSA_VHT] = { "vht", BLOBMSG_TYPE_BOOL },
|
||||||
[CSA_HE] = { "he", BLOBMSG_TYPE_BOOL },
|
[CSA_HE] = { "he", BLOBMSG_TYPE_BOOL },
|
||||||
[CSA_BLOCK_TX] = { "block_tx", BLOBMSG_TYPE_BOOL },
|
[CSA_BLOCK_TX] = { "block_tx", BLOBMSG_TYPE_BOOL },
|
||||||
|
[CSA_FORCE] = { "force", BLOBMSG_TYPE_BOOL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void switch_chan_fallback_cb(void *eloop_data, void *user_ctx)
|
||||||
|
{
|
||||||
|
struct hostapd_iface *iface = eloop_data;
|
||||||
|
struct hostapd_freq_params *freq_params = user_ctx;
|
||||||
|
|
||||||
|
hostapd_switch_channel_fallback(iface, freq_params);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NEED_AP_MLME
|
#ifdef NEED_AP_MLME
|
||||||
static int
|
static int
|
||||||
hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj,
|
hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
@ -769,6 +780,7 @@ hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct blob_attr *tb[__CSA_MAX];
|
struct blob_attr *tb[__CSA_MAX];
|
||||||
struct hostapd_data *hapd = get_hapd_from_object(obj);
|
struct hostapd_data *hapd = get_hapd_from_object(obj);
|
||||||
struct hostapd_config *iconf = hapd->iface->conf;
|
struct hostapd_config *iconf = hapd->iface->conf;
|
||||||
|
struct hostapd_freq_params *freq_params;
|
||||||
struct csa_settings css = {
|
struct csa_settings css = {
|
||||||
.freq_params = {
|
.freq_params = {
|
||||||
.ht_enabled = iconf->ieee80211n,
|
.ht_enabled = iconf->ieee80211n,
|
||||||
|
@ -825,7 +837,15 @@ hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
ret = UBUS_STATUS_NOT_SUPPORTED;
|
ret = UBUS_STATUS_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
if (!ret || !tb[CSA_FORCE] || !blobmsg_get_bool(tb[CSA_FORCE]))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
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;
|
||||||
#undef SET_CSA_SETTING
|
#undef SET_CSA_SETTING
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue