From 2021ca0a02ef8b473058853e96451a8f388ba1e4 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 2 Sep 2023 19:19:56 +0200 Subject: [PATCH] hostapd: reset center_seg0_idx for 2.4 GHz Fixes 40 MHz channel bandwidth on 2.4 GHz AP+STA Signed-off-by: Felix Fietkau --- package/network/services/hostapd/src/src/ap/ucode.c | 9 +++++++-- package/network/services/hostapd/src/src/utils/ucode.c | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/package/network/services/hostapd/src/src/ap/ucode.c b/package/network/services/hostapd/src/src/ap/ucode.c index 33160561d4..f0b4ce4eb8 100644 --- a/package/network/services/hostapd/src/src/ap/ucode.c +++ b/package/network/services/hostapd/src/src/ap/ucode.c @@ -333,10 +333,15 @@ uc_hostapd_iface_start(uc_vm_t *vm, size_t nargs) conf->channel = intval; if ((intval = ucv_int64_get(ucv_object_get(info, "sec_channel", NULL))) && !errno) conf->secondary_channel = intval; - if ((intval = ucv_int64_get(ucv_object_get(info, "center_seg0_idx", NULL))) && !errno) + + intval = ucv_int64_get(ucv_object_get(info, "center_seg0_idx", NULL)); + if (!errno) hostapd_set_oper_centr_freq_seg0_idx(conf, intval); - if ((intval = ucv_int64_get(ucv_object_get(info, "center_seg1_idx", NULL))) && !errno) + + intval = ucv_int64_get(ucv_object_get(info, "center_seg1_idx", NULL)); + if (!errno) hostapd_set_oper_centr_freq_seg1_idx(conf, intval); + intval = ucv_int64_get(ucv_object_get(info, "oper_chwidth", NULL)); if (!errno) hostapd_set_oper_chwidth(conf, intval); diff --git a/package/network/services/hostapd/src/src/utils/ucode.c b/package/network/services/hostapd/src/src/utils/ucode.c index 44169f0bf0..896ef46e1f 100644 --- a/package/network/services/hostapd/src/src/utils/ucode.c +++ b/package/network/services/hostapd/src/src/utils/ucode.c @@ -129,7 +129,10 @@ uc_value_t *uc_wpa_freq_info(uc_vm_t *vm, size_t nargs) tmp_channel &= ~((8 << width) - 1); center_idx = tmp_channel + center_ofs + (4 << width) - 1; - ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(center_idx)); + if (freq_val < 3000) + ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(0)); + else + ucv_object_add(ret, "center_seg0_idx", ucv_int64_new(center_idx)); center_idx = (center_idx - channel) * 5 + freq_val; ucv_object_add(ret, "center_freq1", ucv_int64_new(center_idx));