blob: a0f9de1a2d7955a0353f0ab5cc4a1b465e028dfd [file] [log] [blame]
developer1a173672023-12-21 14:49:33 +08001From 8ee7b5e713067c29aab2f7a4389cc806b545c5d8 Mon Sep 17 00:00:00 2001
developer6ce3b612023-03-02 20:22:29 +08002From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
3Date: Mon, 20 Feb 2023 14:55:49 +0800
developer1a173672023-12-21 14:49:33 +08004Subject: [PATCH 10/54] mtk: hostapd: Add DFS detection mode
developer6ce3b612023-03-02 20:22:29 +08005
6Add DFS detection mode for testing radar detection rate.
7If DFS detection mode is on, AP will not switch channels when receiving
8a radar signal.
9This detection mode also supports background chain.
10
11Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
12---
13 hostapd/config_file.c | 4 ++++
14 hostapd/ctrl_iface.c | 23 +++++++++++++++++++++++
15 src/ap/ap_config.h | 13 +++++++++++++
16 src/ap/dfs.c | 10 ++++++++++
17 4 files changed, 50 insertions(+)
18
19diff --git a/hostapd/config_file.c b/hostapd/config_file.c
developer1a173672023-12-21 14:49:33 +080020index f8560a721..50e299303 100644
developer6ce3b612023-03-02 20:22:29 +080021--- a/hostapd/config_file.c
22+++ b/hostapd/config_file.c
developerbd9fa1e2023-10-16 11:04:00 +080023@@ -4859,6 +4859,10 @@ static int hostapd_config_fill(struct hostapd_config *conf,
developer6ce3b612023-03-02 20:22:29 +080024 } else if (os_strcmp(buf, "ibf_enable") == 0) { /*ibf setting is per device*/
25 int val = atoi(pos);
26 conf->ibf_enable = !!val;
27+ } else if (os_strcmp(buf, "dfs_detect_mode") == 0) { /*bypass channel switch*/
28+ u8 en = strtol(pos, NULL, 10);
29+
30+ conf->dfs_detect_mode = en;
31 } else {
32 wpa_printf(MSG_ERROR,
33 "Line %d: unknown configuration item '%s'",
34diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
developer1a173672023-12-21 14:49:33 +080035index cf7cc3923..327533f80 100644
developer6ce3b612023-03-02 20:22:29 +080036--- a/hostapd/ctrl_iface.c
37+++ b/hostapd/ctrl_iface.c
developer1a173672023-12-21 14:49:33 +080038@@ -3573,6 +3573,26 @@ hostapd_ctrl_iface_get_ibf(struct hostapd_data *hapd, char *buf,
developer6ce3b612023-03-02 20:22:29 +080039 }
40
41
42+static int
43+hostapd_ctrl_iface_set_dfs_detect_mode(struct hostapd_data *hapd, char *value,
44+ char *buf, size_t buflen)
45+{
46+ u8 dfs_detect_mode;
47+
48+ if (!value)
49+ return -1;
50+
51+ dfs_detect_mode = strtol(value, NULL, 10);
52+ if (dfs_detect_mode > DFS_DETECT_MODE_MAX) {
53+ wpa_printf(MSG_ERROR, "Invalid value for dfs detect mode");
54+ return -1;
55+ }
56+ hapd->iconf->dfs_detect_mode = dfs_detect_mode;
57+
58+ return os_snprintf(buf, buflen, "OK\n");
59+}
60+
61+
62 static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
63 char *buf, char *reply,
64 int reply_size,
developer1a173672023-12-21 14:49:33 +080065@@ -4139,6 +4159,9 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
developerbb6ddff2023-03-08 17:22:32 +080066 reply_len = hostapd_ctrl_iface_get_mu(hapd, reply, reply_size);
developer6ce3b612023-03-02 20:22:29 +080067 } else if (os_strncmp(buf, "GET_IBF", 7) == 0) {
68 reply_len = hostapd_ctrl_iface_get_ibf(hapd, reply, reply_size);
69+ } else if (os_strncmp(buf, "DFS_DETECT_MODE ", 16) == 0) {
70+ reply_len = hostapd_ctrl_iface_set_dfs_detect_mode(hapd, buf + 16,
71+ reply, reply_size);
72 } else {
73 os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
74 reply_len = 16;
75diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
developer1a173672023-12-21 14:49:33 +080076index ffbc4fb4f..6576d791d 100644
developer6ce3b612023-03-02 20:22:29 +080077--- a/src/ap/ap_config.h
78+++ b/src/ap/ap_config.h
developerbd9fa1e2023-10-16 11:04:00 +080079@@ -1200,6 +1200,7 @@ struct hostapd_config {
developer6ce3b612023-03-02 20:22:29 +080080 int *edcca_threshold;
81 u8 three_wire_enable;
82 u8 ibf_enable;
83+ u8 dfs_detect_mode;
84 };
85
86 enum three_wire_mode {
developerbd9fa1e2023-10-16 11:04:00 +080087@@ -1214,6 +1215,18 @@ enum three_wire_mode {
developer6ce3b612023-03-02 20:22:29 +080088 NUM_THREE_WIRE_MODE - 1
89 };
90
91+enum dfs_mode {
92+ DFS_DETECT_MODE_DISABLE,
93+ DFS_DETECT_MODE_AP_ENABLE,
94+ DFS_DETECT_MODE_BACKGROUND_ENABLE,
95+ DFS_DETECT_MODE_ALL_ENABLE,
96+
97+ /* keep last */
98+ NUM_DFS_DETECT_MODE,
99+ DFS_DETECT_MODE_MAX =
100+ NUM_DFS_DETECT_MODE - 1
101+};
102+
103 enum edcca_mode {
104 EDCCA_MODE_FORCE_DISABLE = 0,
105 EDCCA_MODE_AUTO = 1,
106diff --git a/src/ap/dfs.c b/src/ap/dfs.c
developer1a173672023-12-21 14:49:33 +0800107index 29d268351..2e138e225 100644
developer6ce3b612023-03-02 20:22:29 +0800108--- a/src/ap/dfs.c
109+++ b/src/ap/dfs.c
developerbd9fa1e2023-10-16 11:04:00 +0800110@@ -1327,6 +1327,11 @@ hostapd_dfs_background_start_channel_switch(struct hostapd_iface *iface,
developer6ce3b612023-03-02 20:22:29 +0800111 __func__, iface->radar_background.cac_started ? "yes" : "no",
112 hostapd_csa_in_progress(iface) ? "yes" : "no");
113
114+ /* Skip channel switch when background dfs detect mode is on */
115+ if (iface->conf->dfs_detect_mode == DFS_DETECT_MODE_BACKGROUND_ENABLE ||
116+ iface->conf->dfs_detect_mode == DFS_DETECT_MODE_ALL_ENABLE)
117+ return 0;
118+
119 /* Check if CSA in progress */
120 if (hostapd_csa_in_progress(iface))
121 return 0;
developerbd9fa1e2023-10-16 11:04:00 +0800122@@ -1375,6 +1380,11 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
developer6ce3b612023-03-02 20:22:29 +0800123 __func__, iface->cac_started ? "yes" : "no",
124 hostapd_csa_in_progress(iface) ? "yes" : "no");
125
126+ /* Skip channel switch when dfs detect mode is on */
127+ if (iface->conf->dfs_detect_mode == DFS_DETECT_MODE_AP_ENABLE ||
128+ iface->conf->dfs_detect_mode == DFS_DETECT_MODE_ALL_ENABLE)
129+ return 0;
130+
131 /* Check if CSA in progress */
132 if (hostapd_csa_in_progress(iface))
133 return 0;
134--
developerbddc9db2023-09-11 13:34:36 +08001352.18.0
developer6ce3b612023-03-02 20:22:29 +0800136