blob: e99e2a351913eded98ec3b6ecc3c04d0f7f64294 [file] [log] [blame]
developerebda9012024-02-22 13:42:45 +08001From e621aacd1eb69668a8e9176b4cd09125394d2fb8 Mon Sep 17 00:00:00 2001
2From: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
3Date: Wed, 24 Jan 2024 15:15:26 +0800
4Subject: [PATCH] hostapd: mtk: 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---
14 hostapd/ctrl_iface.c | 18 +++++++++++++++++
15 hostapd/hostapd_cli.c | 7 +++++++
16 src/ap/ap_drv_ops.c | 7 +++++++
17 src/ap/ap_drv_ops.h | 1 +
18 src/common/mtk_vendor.h | 12 +++++++++++
19 src/drivers/driver.h | 7 +++++++
20 src/drivers/driver_nl80211.c | 33 +++++++++++++++++++++++++++++++
21 src/drivers/driver_nl80211.h | 1 +
22 src/drivers/driver_nl80211_capa.c | 3 +++
23 9 files changed, 89 insertions(+)
24
25diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
26index bacf14c..c662417 100644
27--- a/hostapd/ctrl_iface.c
28+++ b/hostapd/ctrl_iface.c
29@@ -4034,6 +4034,22 @@ hostapd_ctrl_iface_set_offchan_ctrl(struct hostapd_data *hapd, char *cmd,
30 return os_snprintf(buf, buflen, "OK\n");
31 }
32
33+static int
34+hostapd_ctrl_iface_disable_beacon(struct hostapd_data *hapd, char *value,
35+ char *buf, size_t buflen)
36+{
37+ int disable_beacon = atoi(value);
38+
39+ if (disable_beacon < 0) {
40+ wpa_printf(MSG_ERROR, "Invalid value for beacon ctrl");
41+ return -1;
42+ }
43+
44+ if (hostapd_drv_beacon_ctrl(hapd, !disable_beacon) == 0)
45+ return os_snprintf(buf, buflen, "OK\n");
46+ else
47+ return -1;
48+}
49
50 static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
51 char *buf, char *reply,
52@@ -4615,6 +4631,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
53 reply, reply_size);
54 } else if (os_strncmp(buf, "SET_OFFCHAN_CTRL", 16) == 0) {
55 reply_len = hostapd_ctrl_iface_set_offchan_ctrl(hapd, buf + 16, reply, reply_size);
56+ } else if (os_strncmp(buf, "NO_BEACON ", 10) == 0) {
57+ reply_len = hostapd_ctrl_iface_disable_beacon(hapd, buf + 10, reply, reply_size);
58 } else {
59 os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
60 reply_len = 16;
61diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c
62index 0c4a176..60e963a 100644
63--- a/hostapd/hostapd_cli.c
64+++ b/hostapd/hostapd_cli.c
65@@ -1393,6 +1393,11 @@ static int hostapd_cli_cmd_get_mu(struct wpa_ctrl *ctrl, int argc,
66 return hostapd_cli_cmd(ctrl, "GET_MU", 0, NULL, NULL);
67 }
68
69+static int hostapd_cli_cmd_disable_beacon(struct wpa_ctrl *ctrl, int argc,
70+ char *argv[])
71+{
72+ return hostapd_cli_cmd(ctrl, "NO_BEACON", 1, argc, argv);
73+}
74
75 #ifdef CONFIG_DPP
76
77@@ -1762,6 +1767,8 @@ static const struct hostapd_cli_cmd hostapd_cli_commands[] = {
78 "<value> [0-15] bitmap- UL MU-MIMO(bit3), DL MU-MIMO(bit2), UL OFDMA(bit1), DL OFDMA(bit0)"},
79 { "get_mu", hostapd_cli_cmd_get_mu, NULL,
80 " = show mu onoff value in 0-15 bitmap"},
81+ { "no_beacon", hostapd_cli_cmd_disable_beacon, NULL,
82+ "<value> 0: Enable beacon, 1: Disable beacon"},
83 #ifdef CONFIG_DPP
84 { "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
85 "report a scanned DPP URI from a QR Code" },
86diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
87index a060f5c..b1f7c92 100644
88--- a/src/ap/ap_drv_ops.c
89+++ b/src/ap/ap_drv_ops.c
90@@ -1143,3 +1143,10 @@ int hostapd_drv_amnt_dump(struct hostapd_data *hapd, u8 amnt_idx, u8 *amnt_dump_
91 return 0;
92 return hapd->driver->amnt_dump(hapd->drv_priv, amnt_idx, amnt_dump_buf);
93 }
94+
95+int hostapd_drv_beacon_ctrl(struct hostapd_data *hapd, u8 beacon_mode)
96+{
97+ if (!hapd->driver || !hapd->driver->beacon_ctrl)
98+ return 0;
99+ return hapd->driver->beacon_ctrl(hapd->drv_priv, beacon_mode);
100+}
101diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
102index 5f11a57..c5fdb00 100644
103--- a/src/ap/ap_drv_ops.h
104+++ b/src/ap/ap_drv_ops.h
105@@ -158,6 +158,7 @@ int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type);
106
107 int hostapd_drv_amnt_set(struct hostapd_data *hapd, u8 amnt_idx, u8 *amnt_sta_mac);
108 int hostapd_drv_amnt_dump(struct hostapd_data *hapd, u8 amnt_idx, u8 *amnt_dump_buf);
109+int hostapd_drv_beacon_ctrl(struct hostapd_data *hapd, u8 beacon_mode);
110
111 #include "drivers/driver.h"
112
113diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
114index 21e735f..c7ed8e8 100644
115--- a/src/common/mtk_vendor.h
116+++ b/src/common/mtk_vendor.h
117@@ -16,6 +16,7 @@ enum mtk_nl80211_vendor_subcmds {
118 MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8,
119 MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
120 MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
121+ MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL = 0xcd,
122 MTK_NL80211_VENDOR_SUBCMD_TXPOWER_CTRL = 0xce,
123 };
124
125@@ -253,6 +254,17 @@ enum mtk_vendor_attr_txpower_ctrl {
126 NUM_MTK_VENDOR_ATTRS_TXPOWER_CTRL - 1
127 };
128
129+enum mtk_vendor_attr_beacon_ctrl {
130+ MTK_VENDOR_ATTR_BEACON_CTRL_UNSPEC,
131+
132+ MTK_VENDOR_ATTR_BEACON_CTRL_MODE,
133+
134+ /* keep last */
135+ NUM_MTK_VENDOR_ATTRS_BEACON_CTRL,
136+ MTK_VENDOR_ATTR_BEACON_CTRL_MAX =
137+ NUM_MTK_VENDOR_ATTRS_BEACON_CTRL - 1
138+};
139+
140 #define CSI_MAX_COUNT 256
141 #define ETH_ALEN 6
142
143diff --git a/src/drivers/driver.h b/src/drivers/driver.h
144index 0e3934e..f420464 100644
145--- a/src/drivers/driver.h
146+++ b/src/drivers/driver.h
147@@ -4749,6 +4749,13 @@ struct wpa_driver_ops {
148 int (*mu_ctrl)(void *priv, u8 mode, u8 val);
149 int (*mu_dump)(void *priv, u8 *mu_onoff);
150
151+ /**
152+ * beacon_ctrl - ctrl on off for beacon
153+ * @priv: Private driver interface data
154+ *
155+ */
156+ int (*beacon_ctrl)(void *priv, u8 beacon_mode);
157+
158 /**
159 * three_wire_ctrl - set three_wire_ctrl mode
160 * @priv: Private driver interface data
161diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
162index c8720bb..a1ce671 100644
163--- a/src/drivers/driver_nl80211.c
164+++ b/src/drivers/driver_nl80211.c
165@@ -12565,6 +12565,38 @@ static int nl80211_mu_dump(void *priv, u8 *mu_onoff)
166 }
167 #endif /* CONFIG_IEEE80211AX */
168
169+static int nl80211_beacon_ctrl(void *priv, u8 beacon_mode)
170+{
171+ struct i802_bss *bss = priv;
172+ struct wpa_driver_nl80211_data *drv = bss->drv;
173+ struct nl_msg *msg;
174+ struct nlattr *data;
175+ int ret;
176+
177+ if (!drv->mtk_beacon_ctrl_vendor_cmd_avail) {
178+ wpa_printf(MSG_ERROR,
179+ "nl80211: Driver does not support setting beacon control");
180+ return 0;
181+ }
182+
183+ if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
184+ nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) ||
185+ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL) ||
186+ !(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
187+ nla_put_u8(msg, MTK_VENDOR_ATTR_BEACON_CTRL_MODE, beacon_mode)) {
188+ nlmsg_free(msg);
189+ return -ENOBUFS;
190+ }
191+
192+ nla_nest_end(msg, data);
193+
194+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
195+
196+ if (ret)
197+ wpa_printf(MSG_ERROR, "Failed to set beacon_ctrl. ret=%d (%s)", ret, strerror(-ret));
198+
199+ return ret;
200+}
201
202 #ifdef CONFIG_DPP
203 static int nl80211_dpp_listen(void *priv, bool enable)
204@@ -13586,6 +13618,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
205 .set_4addr_mode = nl80211_set_4addr_mode,
206 .mu_ctrl = nl80211_mu_ctrl,
207 .mu_dump = nl80211_mu_dump,
208+ .beacon_ctrl = nl80211_beacon_ctrl,
209 #ifdef CONFIG_DPP
210 .dpp_listen = nl80211_dpp_listen,
211 #endif /* CONFIG_DPP */
212diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
213index 640fdc5..53cf2be 100644
214--- a/src/drivers/driver_nl80211.h
215+++ b/src/drivers/driver_nl80211.h
216@@ -190,6 +190,7 @@ struct wpa_driver_nl80211_data {
217 unsigned int mtk_rfeatures_vendor_cmd_avail:1;
218 unsigned int mtk_amnt_vendor_cmd_avail:1;
219 unsigned int mtk_txpower_vendor_cmd_avail:1;
220+ unsigned int mtk_beacon_ctrl_vendor_cmd_avail:1;
221
222 u64 vendor_scan_cookie;
223 u64 remain_on_chan_cookie;
224diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
225index 004c452..d13a64c 100644
226--- a/src/drivers/driver_nl80211_capa.c
227+++ b/src/drivers/driver_nl80211_capa.c
228@@ -1103,6 +1103,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
229 case MTK_NL80211_VENDOR_SUBCMD_TXPOWER_CTRL:
230 drv->mtk_txpower_vendor_cmd_avail = 1;
231 break;
232+ case MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL :
233+ drv->mtk_beacon_ctrl_vendor_cmd_avail = 1;
234+ break;
235 }
236 }
237
238--
2392.18.0
240