blob: 386ce8dbca5c96afa9fc3faa762914b5ac0dfe65 [file] [log] [blame]
From 934c90729e00901fe6785727dc9004315725b587 Mon Sep 17 00:00:00 2001
From: Evelyn Tsai <evelyn.tsai@mediatek.com>
Date: Fri, 17 Mar 2023 16:17:14 +0800
Subject: [PATCH 23/28] hostapd: mtk: Add vendor for CAPI certification
commands
---
hostapd/ctrl_iface.c | 95 +++++++++++++++++++++++++++++++
src/ap/ap_drv_ops.c | 21 +++++++
src/ap/ap_drv_ops.h | 3 +
src/common/mtk_vendor.h | 32 +----------
src/drivers/driver.h | 22 +++++++
src/drivers/driver_nl80211.c | 54 ++++++++++++++++++
src/drivers/driver_nl80211.h | 1 +
src/drivers/driver_nl80211_capa.c | 3 +
8 files changed, 201 insertions(+), 30 deletions(-)
diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index da6e727..79457d7 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -70,6 +70,7 @@
#include "ctrl_iface.h"
#include "config_file.h"
+#include "common/mtk_vendor.h"
#define HOSTAPD_CLI_DUP_VALUE_MAX_LEN 256
@@ -3801,6 +3802,96 @@ hostapd_ctrl_iface_get_aval_color_bmp(struct hostapd_data *hapd, char *buf,
return pos - buf;
}
+static int
+hostapd_ctrl_iface_ap_wireless(struct hostapd_data *hapd, char *cmd,
+ char *buf, size_t buflen)
+{
+ char *pos, *value, *config = cmd;
+ enum mtk_vendor_attr_wireless_ctrl sub_cmd;
+
+ pos = os_strchr(config, '=');
+ if (pos == NULL)
+ return -1;
+ *pos++ = '\0';
+
+ if(pos == NULL)
+ return -1;
+ value = pos;
+
+ if (os_strncmp(config, "fixed_mcs", 9) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS;
+ else if (os_strncmp(config, "ofdma", 5) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA;
+ else if (os_strncmp(config, "ppdu_type", 9) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE;
+ else if (os_strncmp(config, "nusers_ofdma", 12) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA;
+ else if (os_strncmp(config, "add_ba_req_bufsize", 18) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE;
+ else if (os_strncmp(config, "mimo", 4) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO;
+ else if (os_strncmp(config, "cert", 4) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT ;
+ else {
+ wpa_printf(MSG_ERROR,
+ "Unsupported parameter %s for ap_wireless", config);
+ return -1;
+ }
+
+ if (hostapd_drv_ap_wireless(hapd, (u8) sub_cmd, atoi(value)) != 0)
+ return -1;
+
+ return os_snprintf(buf, buflen, "OK\n");
+}
+
+static int
+hostapd_ctrl_iface_ap_rfeatures(struct hostapd_data *hapd, char *cmd,
+ char *buf, size_t buflen)
+{
+ char *pos, *value, *type, *config = cmd;
+ enum mtk_vendor_attr_rfeature_ctrl sub_cmd;
+
+ pos = os_strchr(config, '=');
+ if (pos == NULL)
+ return -1;
+ *pos++ = '\0';
+
+ if(pos == NULL)
+ return -1;
+ value = pos;
+
+ if (os_strncmp(config, "he_gi", 5) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI;
+ else if (os_strncmp(config, "he_ltf", 6) == 0)
+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF;
+ else if (os_strncmp(config, "trig_type", 9) == 0) {
+ pos = os_strchr(value, ',');
+ if (pos == NULL)
+ return -1;
+ *pos++ = '\0';
+ if(pos == NULL)
+ return -1;
+ type = pos;
+ goto trigtype;
+ } else if (os_strcmp(config, "ack_policy") == 0)
+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY;
+ else {
+ wpa_printf(MSG_ERROR,
+ "Unsupported parameter %s for ap_rfeatures", config);
+ return -1;
+ }
+
+ if (hostapd_drv_ap_rfeatures(hapd, (u8) sub_cmd, atoi(value)) != 0)
+ return -1;
+ goto exit;
+
+trigtype:
+ if (hostapd_drv_ap_trig_type(hapd, atoi(value), atoi(type)) != 0)
+ return -1;
+
+exit:
+ return os_snprintf(buf, buflen, "OK\n");
+}
static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
char *buf, char *reply,
@@ -4381,6 +4472,10 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
reply_len = hostapd_ctrl_iface_get_bss_color(hapd, reply, reply_size);
} else if (os_strncmp(buf, "AVAL_COLOR_BMP", 14) == 0) {
reply_len = hostapd_ctrl_iface_get_aval_color_bmp(hapd, reply, reply_size);
+ } else if (os_strncmp(buf, "ap_wireless ", 12) == 0) {
+ reply_len = hostapd_ctrl_iface_ap_wireless(hapd, buf + 12, reply, reply_size);
+ } else if (os_strncmp(buf, "ap_rfeatures ", 13) == 0) {
+ reply_len = hostapd_ctrl_iface_ap_rfeatures(hapd, buf + 13, reply, reply_size);
} else {
os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
reply_len = 16;
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index 7b686e5..78b52c8 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -1139,3 +1139,24 @@ int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd, u64 *aval_colo
return 0;
return hapd->driver->get_aval_color_bmp(hapd->drv_priv, aval_color_bmp);
}
+
+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
+{
+ if (!hapd->driver || !hapd->driver->ap_wireless)
+ return 0;
+ return hapd->driver->ap_wireless(hapd->drv_priv, sub_vendor_id, value);
+}
+
+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
+{
+ if (!hapd->driver || !hapd->driver->ap_rfeatures)
+ return 0;
+ return hapd->driver->ap_rfeatures(hapd->drv_priv, sub_vendor_id, value);
+}
+
+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type)
+{
+ if (!hapd->driver || !hapd->driver->ap_trigtype)
+ return 0;
+ return hapd->driver->ap_trigtype(hapd->drv_priv, enable, type);
+}
diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
index 47356ab..bb9fdf7 100644
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -157,6 +157,9 @@ int hostapd_drv_amsdu_ctrl(struct hostapd_data *hapd);
int hostapd_drv_amsdu_dump(struct hostapd_data *hapd, u8 *amsdu);
int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd,
u64 *aval_color_bmp);
+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type);
#include "drivers/driver.h"
diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
index a99e6f2..32438af 100644
--- a/src/common/mtk_vendor.h
+++ b/src/common/mtk_vendor.h
@@ -48,16 +48,6 @@ enum mtk_vendor_attr_edcca_dump {
NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP - 1
};
-
-static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
- [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
- [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
- [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
-};
-
enum mtk_vendor_attr_3wire_ctrl {
MTK_VENDOR_ATTR_3WIRE_CTRL_UNSPEC,
@@ -69,10 +59,6 @@ enum mtk_vendor_attr_3wire_ctrl {
NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL - 1
};
-static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
- [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
-};
-
enum mtk_vendor_attr_csi_ctrl {
MTK_VENDOR_ATTR_CSI_CTRL_UNSPEC,
@@ -169,7 +155,7 @@ enum mtk_vendor_attr_wireless_ctrl {
MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO,
MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU,
- MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT,
+ MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT = 9,
MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA,
/* keep last */
@@ -189,11 +175,6 @@ enum mtk_vendor_attr_wireless_dump {
NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
};
-static const struct nla_policy
-wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
- [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
-};
-
enum mtk_vendor_attr_rfeature_ctrl {
MTK_VENDOR_ATTR_RFEATURE_CTRL_UNSPEC,
@@ -203,6 +184,7 @@ enum mtk_vendor_attr_rfeature_ctrl {
MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN,
MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE,
MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY,
+ MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF,
/* keep last */
NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL,
@@ -244,16 +226,6 @@ enum mtk_vendor_attr_ibf_dump {
NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
};
-static struct nla_policy
-ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
- [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
-};
-
-static struct nla_policy
-ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
- [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
-};
-
enum mtk_vendor_attr_bss_color_ctrl {
MTK_VENDOR_ATTR_BSS_COLOR_CTRL_UNSPEC,
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index f9f9fb5..ae692c2 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -5062,6 +5062,28 @@ struct wpa_driver_ops {
*
*/
int (*get_aval_color_bmp)(void *priv, u64 *aval_color_bmp);
+
+ /**
+ * ap_wireless - set wireless command
+ * @priv: Private driver interface data
+ * @value: value
+ */
+ int (*ap_wireless)(void *priv, u8 mode, int value);
+
+ /**
+ * ap_rfeatures - set ap rf features command
+ * @priv: Private driver interface data
+ * @value: value
+ */
+ int (*ap_rfeatures)(void *priv, u8 mode, int value);
+
+ /**
+ * ap_trigtype - set trigger type
+ * @priv: Private driver interface data
+ * @enable: enable or disable
+ * @type: trigger type
+ */
+ int (*ap_trigtype)(void *priv, u8 enable, u8 type);
};
/**
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 18a5647..730a696 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -76,6 +76,57 @@ enum nlmsgerr_attrs {
#endif /* ANDROID */
+static struct nla_policy
+ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
+ [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
+};
+
+static struct nla_policy
+ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
+ [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
+};
+
+static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
+ [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
+};
+
+static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
+};
+
+static const struct nla_policy
+wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
+ [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
+};
+
+static const struct nla_policy
+rfeature_ctrl_policy[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL] = {
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG] = { .type = NLA_NESTED },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY] = { .type = NLA_U8 },
+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF] = { .type = NLA_U8 },
+};
+
+static const struct nla_policy
+wireless_ctrl_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL] = {
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE] = {.type = NLA_U16 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU] = {.type = NLA_U8 },
+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT] = {.type = NLA_U8 },
+};
+
static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
{
struct nl_sock *handle;
@@ -14246,4 +14297,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.amsdu_ctrl = nl80211_enable_amsdu,
.amsdu_dump = nl80211_dump_amsdu,
.get_aval_color_bmp = nl80211_get_aval_color_bmp,
+ .ap_wireless = nl80211_ap_wireless,
+ .ap_rfeatures = nl80211_ap_rfeatures,
+ .ap_trigtype = nl80211_ap_trigtype,
};
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 190e7a5..49588e6 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -205,6 +205,7 @@ struct wpa_driver_nl80211_data {
unsigned int mtk_ibf_vendor_cmd_avail:1;
unsigned int mtk_wireless_vendor_cmd_avail:1;
unsigned int mtk_bss_color_vendor_cmd_avail:1;
+ unsigned int mtk_rfeatures_vendor_cmd_avail:1;
u64 vendor_scan_cookie;
u64 remain_on_chan_cookie;
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index a266926..0674b66 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -1120,6 +1120,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
case MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL :
drv->mtk_bss_color_vendor_cmd_avail = 1;
break;
+ case MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL:
+ drv->mtk_rfeatures_vendor_cmd_avail = 1;
+ break;
}
}
--
2.18.0