mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-21 11:22:50 +00:00
Some checks failed
Build OpenWrt/uCentral images / build (cig_wf186h) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf186w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf188n) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf189) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf196) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-a1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-b1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap102) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap104) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap105) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap111) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap112) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_3) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xe) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (indio_um-305ax) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sercomm_ap72tip) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630c-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-211g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-id2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-od2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr5018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018-v4) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax820) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax840) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap640) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap650) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap655) (push) Has been cancelled
Build OpenWrt/uCentral images / trigger-testing (push) Has been cancelled
Build OpenWrt/uCentral images / create-x64_vm-ami (push) Has been cancelled
Signed-off-by: John Crispin <john@phrozen.org>
180 lines
5.3 KiB
Diff
180 lines
5.3 KiB
Diff
From 2fd102d3da593c194d8b22932e5ff7be7090ba66 Mon Sep 17 00:00:00 2001
|
|
From: Harshitha Prem <quic_hprem@quicinc.com>
|
|
Date: Wed, 1 Nov 2023 22:36:14 +0530
|
|
Subject: [PATCH 4/4] hostapd: handle ACS scan start request failure with error
|
|
code -EBUSY
|
|
|
|
Currently, if ACS scan request fails, states are cleared and returned.
|
|
However, in case of multi link opertion, there is a possibilty of getting
|
|
return value of -EBUSY. In this case, ACS can retry the scan request
|
|
after some time like HT-40 scan.
|
|
|
|
Hence, add changes to retry the scan after 5 seconds if -EBUSY is
|
|
returned. Max 15 re-attempts would be made post which no further attempts
|
|
would be made.
|
|
|
|
Signed-off-by: Harshitha Prem <quic_hprem@quicinc.com>
|
|
Co-developed-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
|
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
|
---
|
|
src/ap/acs.c | 61 ++++++++++++++++++++++++++++++++++++++----------
|
|
src/ap/acs.h | 3 +++
|
|
src/ap/hostapd.h | 1 +
|
|
3 files changed, 53 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/src/ap/acs.c b/src/ap/acs.c
|
|
index b0bb808ffd60..b516199da04a 100644
|
|
--- a/src/ap/acs.c
|
|
+++ b/src/ap/acs.c
|
|
@@ -12,6 +12,7 @@
|
|
|
|
#include "utils/common.h"
|
|
#include "utils/list.h"
|
|
+#include "utils/eloop.h"
|
|
#include "common/ieee802_11_defs.h"
|
|
#include "common/hw_features_common.h"
|
|
#include "common/wpa_ctrl.h"
|
|
@@ -295,7 +296,7 @@ static const struct bw_item *bw_desc[] = {
|
|
|
|
static int acs_request_scan(struct hostapd_iface *iface);
|
|
static int acs_survey_is_sufficient(struct freq_survey *survey);
|
|
-
|
|
+static void acs_scan_retry(void *eloop_data, void *user_data);
|
|
|
|
static void acs_clean_chan_surveys(struct hostapd_channel_data *chan)
|
|
{
|
|
@@ -341,6 +342,8 @@ void acs_cleanup(struct hostapd_iface *iface)
|
|
|
|
iface->chans_surveyed = 0;
|
|
iface->acs_num_completed_scans = 0;
|
|
+ iface->acs_num_retries = 0;
|
|
+ eloop_cancel_timeout(acs_scan_retry, iface, NULL);
|
|
}
|
|
|
|
|
|
@@ -1476,6 +1479,7 @@ static void acs_scan_complete(struct hostapd_iface *iface)
|
|
int err;
|
|
|
|
iface->scan_cb = NULL;
|
|
+ iface->acs_num_retries = 0;
|
|
|
|
wpa_printf(MSG_DEBUG, "ACS: Using survey based algorithm (acs_num_scans=%d)",
|
|
iface->conf->acs_num_scans);
|
|
@@ -1489,7 +1493,7 @@ static void acs_scan_complete(struct hostapd_iface *iface)
|
|
|
|
if (++iface->acs_num_completed_scans < iface->conf->acs_num_scans) {
|
|
err = acs_request_scan(iface);
|
|
- if (err) {
|
|
+ if (err && err != -EBUSY) {
|
|
wpa_printf(MSG_ERROR, "ACS: Failed to request scan");
|
|
goto fail;
|
|
}
|
|
@@ -1543,11 +1547,10 @@ static int * acs_request_scan_add_freqs(struct hostapd_iface *iface,
|
|
return freq;
|
|
}
|
|
|
|
-
|
|
static int acs_request_scan(struct hostapd_iface *iface)
|
|
{
|
|
struct wpa_driver_scan_params params;
|
|
- int i, *freq;
|
|
+ int i, *freq, ret;
|
|
int num_channels;
|
|
struct hostapd_hw_modes *mode;
|
|
|
|
@@ -1580,23 +1583,57 @@ static int acs_request_scan(struct hostapd_iface *iface)
|
|
return -1;
|
|
}
|
|
|
|
- iface->scan_cb = acs_scan_complete;
|
|
-
|
|
- wpa_printf(MSG_DEBUG, "ACS: Scanning %d / %d",
|
|
- iface->acs_num_completed_scans + 1,
|
|
- iface->conf->acs_num_scans);
|
|
+ if (!iface->acs_num_retries)
|
|
+ wpa_printf(MSG_DEBUG, "ACS: Scanning %d / %d",
|
|
+ iface->acs_num_completed_scans + 1,
|
|
+ iface->conf->acs_num_scans);
|
|
+ else
|
|
+ wpa_printf(MSG_DEBUG, "ACS: Re-try Scanning attempt %d (%d / %d)",
|
|
+ iface->acs_num_retries,
|
|
+ iface->acs_num_completed_scans + 1,
|
|
+ iface->conf->acs_num_scans);
|
|
+
|
|
+ ret = hostapd_driver_scan(iface->bss[0], ¶ms);
|
|
+ os_free(params.freqs);
|
|
|
|
- if (hostapd_driver_scan(iface->bss[0], ¶ms) < 0) {
|
|
+ if (ret == -EBUSY) {
|
|
+ iface->acs_num_retries++;
|
|
+ wpa_printf(MSG_ERROR, "Failed to request acs scan ret=%d (%s) - try to scan after %d seconds",
|
|
+ ret, strerror(-ret), ACS_SCAN_RETRY_INTERVAL);
|
|
+ eloop_cancel_timeout(acs_scan_retry, iface, NULL);
|
|
+ eloop_register_timeout(ACS_SCAN_RETRY_INTERVAL, 0,
|
|
+ acs_scan_retry, iface, NULL);
|
|
+ return 0;
|
|
+ } else if (ret < 0) {
|
|
wpa_printf(MSG_ERROR, "ACS: Failed to request initial scan");
|
|
acs_cleanup(iface);
|
|
- os_free(params.freqs);
|
|
return -1;
|
|
}
|
|
|
|
- os_free(params.freqs);
|
|
+ iface->scan_cb = acs_scan_complete;
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
+static void acs_scan_retry(void *eloop_data, void *user_data)
|
|
+{
|
|
+ struct hostapd_iface *iface = eloop_data;
|
|
+ int ret;
|
|
+
|
|
+ if (iface->acs_num_retries >= ACS_SCAN_RETRY_MAX_COUNT) {
|
|
+ wpa_printf(MSG_ERROR, "ACS: Failed to request initial scan (all re-attempts failed)");
|
|
+ goto acs_fail;
|
|
+ }
|
|
+
|
|
+ ret = acs_request_scan(iface);
|
|
+ if (!ret)
|
|
+ return;
|
|
+
|
|
+ wpa_printf(MSG_ERROR, "ACS: Failed to request re-try of initial scan");
|
|
+
|
|
+acs_fail:
|
|
+ acs_fail(iface);
|
|
+}
|
|
|
|
enum hostapd_chan_status acs_init(struct hostapd_iface *iface)
|
|
{
|
|
diff --git a/src/ap/acs.h b/src/ap/acs.h
|
|
index ec84f0ee97f3..1f6164805169 100644
|
|
--- a/src/ap/acs.h
|
|
+++ b/src/ap/acs.h
|
|
@@ -15,6 +15,9 @@
|
|
enum hostapd_chan_status acs_init(struct hostapd_iface *iface);
|
|
void acs_cleanup(struct hostapd_iface *iface);
|
|
|
|
+#define ACS_SCAN_RETRY_MAX_COUNT 15
|
|
+#define ACS_SCAN_RETRY_INTERVAL 5
|
|
+
|
|
#else /* CONFIG_ACS */
|
|
|
|
static inline enum hostapd_chan_status acs_init(struct hostapd_iface *iface)
|
|
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
|
|
index d26ce8c71314..1bc8852f856f 100644
|
|
--- a/src/ap/hostapd.h
|
|
+++ b/src/ap/hostapd.h
|
|
@@ -668,6 +668,7 @@ struct hostapd_iface {
|
|
|
|
#ifdef CONFIG_ACS
|
|
unsigned int acs_num_completed_scans;
|
|
+ unsigned int acs_num_retries;
|
|
#endif /* CONFIG_ACS */
|
|
|
|
void (*scan_cb)(struct hostapd_iface *iface);
|
|
--
|
|
2.17.1
|
|
|