blob: 31d19513b5a1f558281f17e1545b98db04e7ee2e [file] [log] [blame]
developer617abbd2024-04-23 14:50:01 +08001From a7adff7d782e329e9f8b1063f78616757f944d51 Mon Sep 17 00:00:00 2001
2From: MeiChia Chiu <meichia.chiu@mediatek.com>
3Date: Wed, 22 Nov 2023 21:41:34 +0800
4Subject: [PATCH 073/104] mtk: hostapd: add no_beacon vendor command for cert
5
6Add the vendor command to disable/enable beacon
7
8[Usage]
9hostapd_cli -i <interface> no_beacon <value>
10 <value>
11 0: enable beacon
12 1: disable beacon
13
14Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
15---
16 hostapd/ctrl_iface.c | 21 +++++++++++++++++++
17 hostapd/hostapd_cli.c | 7 +++++++
18 src/ap/ap_drv_ops.c | 8 ++++++++
19 src/ap/ap_drv_ops.h | 1 +
20 src/common/mtk_vendor.h | 12 +++++++++++
21 src/drivers/driver.h | 7 +++++++
22 src/drivers/driver_nl80211.c | 34 +++++++++++++++++++++++++++++++
23 src/drivers/driver_nl80211.h | 1 +
24 src/drivers/driver_nl80211_capa.c | 3 +++
25 9 files changed, 94 insertions(+)
26
27diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
28index c9b53c64e..0fded7ed4 100644
29--- a/hostapd/ctrl_iface.c
30+++ b/hostapd/ctrl_iface.c
31@@ -4862,6 +4862,24 @@ hostapd_ctrl_iface_get_pp(struct hostapd_data *hapd, char *cmd, char *buf,
32 }
33 }
34
35+static int
36+hostapd_ctrl_iface_disable_beacon(struct hostapd_data *hapd, char *value,
37+ char *buf, size_t buflen)
38+{
39+ int disable_beacon = atoi(value);
40+
41+ if (disable_beacon < 0) {
42+ wpa_printf(MSG_ERROR, "Invalid value for beacon ctrl");
43+ return -1;
44+ }
45+
46+ if (hostapd_drv_beacon_ctrl(hapd, !disable_beacon) == 0)
47+ return os_snprintf(buf, buflen, "OK\n");
48+ else
49+ return -1;
50+
51+}
52+
53 static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
54 char *buf, char *reply,
55 int reply_size,
56@@ -5512,6 +5530,9 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
57 } else if (os_strncmp(buf, "SET_BACKGROUND_RADAR_MODE", 25) == 0) {
58 reply_len = hostapd_ctrl_iface_set_background_radar_mode(hapd, buf + 25,
59 reply, reply_size);
60+ } else if (os_strncmp(buf, "NO_BEACON ", 10) == 0) {
61+ reply_len = hostapd_ctrl_iface_disable_beacon(hapd, buf + 10, reply,
62+ reply_size);
63 } else {
64 os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
65 reply_len = 16;
66diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c
67index e0b175386..7e4485cb8 100644
68--- a/hostapd/hostapd_cli.c
69+++ b/hostapd/hostapd_cli.c
70@@ -1464,6 +1464,11 @@ static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
71 return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
72 }
73
74+static int hostapd_cli_cmd_disable_beacon(struct wpa_ctrl *ctrl, int argc,
75+ char *argv[])
76+{
77+ return hostapd_cli_cmd(ctrl, "NO_BEACON", 1, argc, argv);
78+}
79
80 #ifdef CONFIG_DPP
81
82@@ -1871,6 +1876,8 @@ static const struct hostapd_cli_cmd hostapd_cli_commands[] = {
83 "<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
84 { "get_mu", hostapd_cli_cmd_get_mu, NULL,
85 " = show mu onoff value in 0-15 bitmap"},
86+ { "no_beacon", hostapd_cli_cmd_disable_beacon, NULL,
87+ "<value> 0: Enable beacon, 1: Disable beacon"},
88 #ifdef CONFIG_DPP
89 { "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
90 "report a scanned DPP URI from a QR Code" },
91diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
92index c71cfe1bd..d6bd157d8 100644
93--- a/src/ap/ap_drv_ops.c
94+++ b/src/ap/ap_drv_ops.c
95@@ -1388,3 +1388,11 @@ int hostapd_drv_pp_mode_set(struct hostapd_data *hapd)
96 return hapd->driver->pp_mode_set(hapd->drv_priv,
97 hapd->iconf->pp_mode);
98 }
99+
100+int hostapd_drv_beacon_ctrl(struct hostapd_data *hapd, u8 beacon_mode)
101+{
102+ if (!hapd->driver || !hapd->driver->beacon_ctrl)
103+ return 0;
104+ return hapd->driver->beacon_ctrl(hapd->drv_priv, beacon_mode);
105+}
106+
107diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
108index ef61001e5..78e5c8d5a 100644
109--- a/src/ap/ap_drv_ops.h
110+++ b/src/ap/ap_drv_ops.h
111@@ -170,6 +170,7 @@ int hostapd_drv_amnt_set(struct hostapd_data *hapd, u8 amnt_idx, u8 *amnt_sta_ma
112 int hostapd_drv_amnt_dump(struct hostapd_data *hapd, u8 amnt_idx, u8 *amnt_dump_buf);
113 int hostapd_drv_background_radar_mode(struct hostapd_data *hapd);
114 int hostapd_drv_pp_mode_set(struct hostapd_data *hapd);
115+int hostapd_drv_beacon_ctrl(struct hostapd_data *hapd, u8 beacon_mode);
116
117 #include "drivers/driver.h"
118
119diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
120index 6275c141d..5531802b8 100644
121--- a/src/common/mtk_vendor.h
122+++ b/src/common/mtk_vendor.h
123@@ -18,6 +18,7 @@ enum mtk_nl80211_vendor_subcmds {
124 MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
125 MTK_NL80211_VENDOR_SUBCMD_BACKGROUND_RADAR_CTRL = 0xcb,
126 MTK_NL80211_VENDOR_SUBCMD_PP_CTRL = 0xcc,
127+ MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL = 0xcd,
128 };
129
130 enum mtk_vendor_attr_edcca_ctrl {
131@@ -268,6 +269,17 @@ enum mtk_vendor_attr_pp_ctrl {
132 NUM_MTK_VENDOR_ATTRS_PP_CTRL - 1
133 };
134
135+enum mtk_vendor_attr_beacon_ctrl {
136+ MTK_VENDOR_ATTR_BEACON_CTRL_UNSPEC,
137+
138+ MTK_VENDOR_ATTR_BEACON_CTRL_MODE,
139+
140+ /* keep last */
141+ NUM_MTK_VENDOR_ATTRS_BEACON_CTRL,
142+ MTK_VENDOR_ATTR_BEACON_CTRL_MAX =
143+ NUM_MTK_VENDOR_ATTRS_BEACON_CTRL - 1
144+};
145+
146 #define CSI_MAX_COUNT 256
147 #define ETH_ALEN 6
148
149diff --git a/src/drivers/driver.h b/src/drivers/driver.h
150index be0e89ba3..332a51c55 100644
151--- a/src/drivers/driver.h
152+++ b/src/drivers/driver.h
153@@ -5243,6 +5243,13 @@ struct wpa_driver_ops {
154 int (*mu_ctrl)(void *priv, u8 mode, void *config);
155 int (*mu_dump)(void *priv, u8 *mu_onoff);
156
157+ /**
158+ * beacon_ctrl - ctrl on off for beacon
159+ * @priv: Private driver interface data
160+ *
161+ */
162+ int (*beacon_ctrl)(void *priv, u8 beacon_mode);
163+
164 /**
165 * three_wire_ctrl - set three_wire_ctrl mode
166 * @priv: Private driver interface data
167diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
168index b47ab07ea..e588e7538 100644
169--- a/src/drivers/driver_nl80211.c
170+++ b/src/drivers/driver_nl80211.c
171@@ -14111,6 +14111,39 @@ static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
172
173 return ret;
174 }
175+static int nl80211_beacon_ctrl(void *priv, u8 beacon_mode)
176+{
177+ struct i802_bss *bss = priv;
178+ struct wpa_driver_nl80211_data *drv = bss->drv;
179+ struct nl_msg *msg;
180+ struct nlattr *data;
181+ int ret;
182+
183+ if (!drv->mtk_beacon_ctrl_vendor_cmd_avail) {
184+ wpa_printf(MSG_ERROR,
185+ "nl80211: Driver does not support setting beacon control");
186+ return 0;
187+ }
188+
189+ if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
190+ nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
191+ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL) ||
192+ !(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
193+ nla_put_u8(msg, MTK_VENDOR_ATTR_BEACON_CTRL_MODE, beacon_mode)) {
194+ nlmsg_free(msg);
195+ return -ENOBUFS;
196+ }
197+
198+ nla_nest_end(msg, data);
199+
200+ ret = send_and_recv_cmd(drv, msg);
201+
202+ if (ret)
203+ wpa_printf(MSG_ERROR, "Failed to set beacon_ctrl. ret=%d (%s)", ret, strerror(-ret));
204+
205+ return ret;
206+}
207+
208 #endif /* CONFIG_IEEE80211AX */
209
210
211@@ -15281,6 +15314,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
212 .set_4addr_mode = nl80211_set_4addr_mode,
213 .mu_ctrl = nl80211_mu_ctrl,
214 .mu_dump = nl80211_mu_dump,
215+ .beacon_ctrl = nl80211_beacon_ctrl,
216 #ifdef CONFIG_DPP
217 .dpp_listen = nl80211_dpp_listen,
218 #endif /* CONFIG_DPP */
219diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
220index 707bb7fe4..9866c221c 100644
221--- a/src/drivers/driver_nl80211.h
222+++ b/src/drivers/driver_nl80211.h
223@@ -210,6 +210,7 @@ struct wpa_driver_nl80211_data {
224 unsigned int mtk_amnt_vendor_cmd_avail:1;
225 unsigned int mtk_background_radar_vendor_cmd_avail:1;
226 unsigned int mtk_pp_vendor_cmd_avail:1;
227+ unsigned int mtk_beacon_ctrl_vendor_cmd_avail:1;
228
229 u32 ignore_next_local_disconnect;
230 u32 ignore_next_local_deauth;
231diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
232index ba3c0817b..f3e3d52e2 100644
233--- a/src/drivers/driver_nl80211_capa.c
234+++ b/src/drivers/driver_nl80211_capa.c
235@@ -1170,6 +1170,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
236 case MTK_NL80211_VENDOR_SUBCMD_PP_CTRL:
237 drv->mtk_pp_vendor_cmd_avail = 1;
238 break;
239+ case MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL :
240+ drv->mtk_beacon_ctrl_vendor_cmd_avail = 1;
241+ break;
242 }
243 }
244
245--
2462.39.2
247