blob: 8b215351c0839f969b8539d02c0592c7526cce48 [file] [log] [blame]
developer617abbd2024-04-23 14:50:01 +08001From b9b137827e9c0584682606bd5fe1cd9f50635819 Mon Sep 17 00:00:00 2001
2From: Evelyn Tsai <evelyn.tsai@mediatek.com>
3Date: Fri, 17 Mar 2023 16:17:14 +0800
4Subject: [PATCH 049/104] mtk: hostapd: Add vendor for CAPI certification
5 commands
6
7---
8 hostapd/ctrl_iface.c | 99 +++++++++++++++++++++++++++++++
9 src/ap/ap_drv_ops.c | 21 +++++++
10 src/ap/ap_drv_ops.h | 3 +
11 src/common/mtk_vendor.h | 33 +----------
12 src/drivers/driver.h | 22 +++++++
13 src/drivers/driver_nl80211.c | 55 +++++++++++++++++
14 src/drivers/driver_nl80211.h | 1 +
15 src/drivers/driver_nl80211_capa.c | 3 +
16 8 files changed, 206 insertions(+), 31 deletions(-)
17
18diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
19index 7b83bdd4f..1154a2394 100644
20--- a/hostapd/ctrl_iface.c
21+++ b/hostapd/ctrl_iface.c
22@@ -71,6 +71,7 @@
23 #include "config_file.h"
24 #include "ctrl_iface.h"
25
26+#include "common/mtk_vendor.h"
27
28 #define HOSTAPD_CLI_DUP_VALUE_MAX_LEN 256
29
30@@ -4327,6 +4328,100 @@ hostapd_ctrl_iface_get_aval_color_bmp(struct hostapd_data *hapd, char *buf,
31 return pos - buf;
32 }
33
34+static int
35+hostapd_ctrl_iface_ap_wireless(struct hostapd_data *hapd, char *cmd,
36+ char *buf, size_t buflen)
37+{
38+ char *pos, *value, *config = cmd;
39+ enum mtk_vendor_attr_wireless_ctrl sub_cmd;
40+
41+ pos = os_strchr(config, '=');
42+ if (pos == NULL)
43+ return -1;
44+ *pos++ = '\0';
45+
46+ if(pos == NULL)
47+ return -1;
48+ value = pos;
49+
50+ if (os_strncmp(config, "fixed_mcs", 9) == 0)
51+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS;
52+ else if (os_strncmp(config, "ofdma", 5) == 0)
53+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA;
54+ else if (os_strncmp(config, "ppdu_type", 9) == 0)
55+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE;
56+ else if (os_strncmp(config, "nusers_ofdma", 12) == 0)
57+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA;
58+ else if (os_strncmp(config, "add_ba_req_bufsize", 18) == 0)
59+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE;
60+ else if (os_strncmp(config, "mimo", 4) == 0)
61+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO;
62+ else if (os_strncmp(config, "cert", 4) == 0)
63+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT ;
64+ else if (os_strncmp(config, "amsdu", 5) == 0)
65+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU;
66+ else if (os_strncmp(config, "rts_sigta", 9) == 0)
67+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA;
68+ else {
69+ wpa_printf(MSG_ERROR,
70+ "Unsupported parameter %s for ap_wireless", config);
71+ return -1;
72+ }
73+
74+ if (hostapd_drv_ap_wireless(hapd, (u8) sub_cmd, atoi(value)) != 0)
75+ return -1;
76+
77+ return os_snprintf(buf, buflen, "OK\n");
78+}
79+
80+static int
81+hostapd_ctrl_iface_ap_rfeatures(struct hostapd_data *hapd, char *cmd,
82+ char *buf, size_t buflen)
83+{
84+ char *pos, *value, *type, *config = cmd;
85+ enum mtk_vendor_attr_rfeature_ctrl sub_cmd;
86+
87+ pos = os_strchr(config, '=');
88+ if (pos == NULL)
89+ return -1;
90+ *pos++ = '\0';
91+
92+ if(pos == NULL)
93+ return -1;
94+ value = pos;
95+
96+ if (os_strncmp(config, "he_gi", 5) == 0)
97+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI;
98+ else if (os_strncmp(config, "he_ltf", 6) == 0)
99+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF;
100+ else if (os_strncmp(config, "trig_type", 9) == 0) {
101+ pos = os_strchr(value, ',');
102+ if (pos == NULL)
103+ return -1;
104+ *pos++ = '\0';
105+ if(pos == NULL)
106+ return -1;
107+ type = pos;
108+ goto trigtype;
109+ } else if (os_strcmp(config, "ack_policy") == 0)
110+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY;
111+ else {
112+ wpa_printf(MSG_ERROR,
113+ "Unsupported parameter %s for ap_rfeatures", config);
114+ return -1;
115+ }
116+
117+ if (hostapd_drv_ap_rfeatures(hapd, (u8) sub_cmd, atoi(value)) != 0)
118+ return -1;
119+ goto exit;
120+
121+trigtype:
122+ if (hostapd_drv_ap_trig_type(hapd, atoi(value), atoi(type)) != 0)
123+ return -1;
124+
125+exit:
126+ return os_snprintf(buf, buflen, "OK\n");
127+}
128
129 static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
130 char *buf, char *reply,
131@@ -4952,6 +5047,10 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
132 reply_len = hostapd_ctrl_iface_get_bss_color(hapd, reply, reply_size);
133 } else if (os_strncmp(buf, "AVAL_COLOR_BMP", 14) == 0) {
134 reply_len = hostapd_ctrl_iface_get_aval_color_bmp(hapd, reply, reply_size);
135+ } else if (os_strncmp(buf, "ap_wireless ", 12) == 0) {
136+ reply_len = hostapd_ctrl_iface_ap_wireless(hapd, buf + 12, reply, reply_size);
137+ } else if (os_strncmp(buf, "ap_rfeatures ", 13) == 0) {
138+ reply_len = hostapd_ctrl_iface_ap_rfeatures(hapd, buf + 13, reply, reply_size);
139 } else {
140 os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
141 reply_len = 16;
142diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
143index cabcd47af..06d71f309 100644
144--- a/src/ap/ap_drv_ops.c
145+++ b/src/ap/ap_drv_ops.c
146@@ -1330,3 +1330,24 @@ int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd, u64 *aval_colo
147 return 0;
148 return hapd->driver->get_aval_color_bmp(hapd->drv_priv, aval_color_bmp);
149 }
150+
151+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
152+{
153+ if (!hapd->driver || !hapd->driver->ap_wireless)
154+ return 0;
155+ return hapd->driver->ap_wireless(hapd->drv_priv, sub_vendor_id, value);
156+}
157+
158+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
159+{
160+ if (!hapd->driver || !hapd->driver->ap_rfeatures)
161+ return 0;
162+ return hapd->driver->ap_rfeatures(hapd->drv_priv, sub_vendor_id, value);
163+}
164+
165+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type)
166+{
167+ if (!hapd->driver || !hapd->driver->ap_trigtype)
168+ return 0;
169+ return hapd->driver->ap_trigtype(hapd->drv_priv, enable, type);
170+}
171diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
172index 9da2b0049..c58930217 100644
173--- a/src/ap/ap_drv_ops.h
174+++ b/src/ap/ap_drv_ops.h
175@@ -162,6 +162,9 @@ int hostapd_drv_amsdu_ctrl(struct hostapd_data *hapd);
176 int hostapd_drv_amsdu_dump(struct hostapd_data *hapd, u8 *amsdu);
177 int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd,
178 u64 *aval_color_bmp);
179+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
180+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
181+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type);
182
183 #include "drivers/driver.h"
184
185diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
186index e27fe69b3..0b23c76ad 100644
187--- a/src/common/mtk_vendor.h
188+++ b/src/common/mtk_vendor.h
189@@ -50,17 +50,6 @@ enum mtk_vendor_attr_edcca_dump {
190 NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP - 1
191 };
192
193-
194-static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
195- [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
196- [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
197- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
198- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
199- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
200- [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
201- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL] = { .type = NLA_U8 },
202-};
203-
204 enum mtk_vendor_attr_3wire_ctrl {
205 MTK_VENDOR_ATTR_3WIRE_CTRL_UNSPEC,
206
207@@ -72,10 +61,6 @@ enum mtk_vendor_attr_3wire_ctrl {
208 NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL - 1
209 };
210
211-static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
212- [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
213-};
214-
215 enum mtk_vendor_attr_csi_ctrl {
216 MTK_VENDOR_ATTR_CSI_CTRL_UNSPEC,
217
218@@ -172,7 +157,7 @@ enum mtk_vendor_attr_wireless_ctrl {
219 MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
220 MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO,
221 MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU,
222- MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT,
223+ MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT = 9,
224 MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA,
225
226 /* keep last */
227@@ -192,11 +177,6 @@ enum mtk_vendor_attr_wireless_dump {
228 NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
229 };
230
231-static const struct nla_policy
232-wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
233- [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
234-};
235-
236 enum mtk_vendor_attr_rfeature_ctrl {
237 MTK_VENDOR_ATTR_RFEATURE_CTRL_UNSPEC,
238
239@@ -206,6 +186,7 @@ enum mtk_vendor_attr_rfeature_ctrl {
240 MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN,
241 MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE,
242 MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY,
243+ MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF,
244
245 /* keep last */
246 NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL,
247@@ -247,16 +228,6 @@ enum mtk_vendor_attr_ibf_dump {
248 NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
249 };
250
251-static struct nla_policy
252-ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
253- [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
254-};
255-
256-static struct nla_policy
257-ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
258- [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
259-};
260-
261 enum mtk_vendor_attr_bss_color_ctrl {
262 MTK_VENDOR_ATTR_BSS_COLOR_CTRL_UNSPEC,
263
264diff --git a/src/drivers/driver.h b/src/drivers/driver.h
265index 6b6317bfa..a25601c91 100644
266--- a/src/drivers/driver.h
267+++ b/src/drivers/driver.h
268@@ -5281,6 +5281,28 @@ struct wpa_driver_ops {
269 *
270 */
271 int (*get_aval_color_bmp)(void *priv, u64 *aval_color_bmp);
272+
273+ /**
274+ * ap_wireless - set wireless command
275+ * @priv: Private driver interface data
276+ * @value: value
277+ */
278+ int (*ap_wireless)(void *priv, u8 mode, int value);
279+
280+ /**
281+ * ap_rfeatures - set ap rf features command
282+ * @priv: Private driver interface data
283+ * @value: value
284+ */
285+ int (*ap_rfeatures)(void *priv, u8 mode, int value);
286+
287+ /**
288+ * ap_trigtype - set trigger type
289+ * @priv: Private driver interface data
290+ * @enable: enable or disable
291+ * @type: trigger type
292+ */
293+ int (*ap_trigtype)(void *priv, u8 enable, u8 type);
294 };
295
296 /**
297diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
298index 4c98e8ab3..86e5844cd 100644
299--- a/src/drivers/driver_nl80211.c
300+++ b/src/drivers/driver_nl80211.c
301@@ -91,6 +91,58 @@ static void handle_nl_debug_hook(struct nl_msg *msg, int tx)
302 wpa_netlink_hook(tx, nlh, nlh->nlmsg_len);
303 }
304
305+static struct nla_policy
306+ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
307+ [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
308+};
309+
310+static struct nla_policy
311+ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
312+ [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
313+};
314+
315+static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
316+ [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
317+};
318+
319+static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
320+ [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
321+ [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
322+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
323+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
324+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
325+ [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
326+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL] = { .type = NLA_U8 },
327+};
328+
329+static const struct nla_policy
330+wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
331+ [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
332+};
333+
334+static const struct nla_policy
335+rfeature_ctrl_policy[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL] = {
336+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI] = {.type = NLA_U8 },
337+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF] = { .type = NLA_U8 },
338+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG] = { .type = NLA_NESTED },
339+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN] = { .type = NLA_U8 },
340+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE] = { .type = NLA_U8 },
341+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY] = { .type = NLA_U8 },
342+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF] = { .type = NLA_U8 },
343+};
344+
345+static const struct nla_policy
346+wireless_ctrl_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL] = {
347+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS] = {.type = NLA_U8 },
348+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA] = {.type = NLA_U8 },
349+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE] = {.type = NLA_U8 },
350+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA] = {.type = NLA_U8 },
351+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO] = {.type = NLA_U8 },
352+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE] = {.type = NLA_U16 },
353+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU] = {.type = NLA_U8 },
354+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT] = {.type = NLA_U8 },
355+};
356+
357 static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
358 {
359 struct nl_sock *handle;
360@@ -14975,4 +15027,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
361 .amsdu_ctrl = nl80211_enable_amsdu,
362 .amsdu_dump = nl80211_dump_amsdu,
363 .get_aval_color_bmp = nl80211_get_aval_color_bmp,
364+ .ap_wireless = nl80211_ap_wireless,
365+ .ap_rfeatures = nl80211_ap_rfeatures,
366+ .ap_trigtype = nl80211_ap_trigtype,
367 };
368diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
369index 5b4d45567..046991a3d 100644
370--- a/src/drivers/driver_nl80211.h
371+++ b/src/drivers/driver_nl80211.h
372@@ -206,6 +206,7 @@ struct wpa_driver_nl80211_data {
373 unsigned int mtk_ibf_vendor_cmd_avail:1;
374 unsigned int mtk_wireless_vendor_cmd_avail:1;
375 unsigned int mtk_bss_color_vendor_cmd_avail:1;
376+ unsigned int mtk_rfeatures_vendor_cmd_avail:1;
377
378 u32 ignore_next_local_disconnect;
379 u32 ignore_next_local_deauth;
380diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
381index a7df2d172..6498eba6d 100644
382--- a/src/drivers/driver_nl80211_capa.c
383+++ b/src/drivers/driver_nl80211_capa.c
384@@ -1159,6 +1159,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
385 case MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL :
386 drv->mtk_bss_color_vendor_cmd_avail = 1;
387 break;
388+ case MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL:
389+ drv->mtk_rfeatures_vendor_cmd_avail = 1;
390+ break;
391 }
392 }
393
394--
3952.39.2
396