| From a90c24ae2b7558eac18cf92fee6cfaf480233ec2 Mon Sep 17 00:00:00 2001 |
| From: Evelyn Tsai <evelyn.tsai@mediatek.com> |
| Date: Fri, 12 May 2023 05:24:19 +0800 |
| Subject: [PATCH 28/28] hostapd: mtk: Add muru user number debug command |
| |
| --- |
| hostapd/ctrl_iface.c | 13 ++++++++++++- |
| src/ap/ap_drv_ops.c | 4 ++-- |
| src/ap/ap_drv_ops.h | 2 +- |
| src/ap/hostapd.c | 4 ++-- |
| src/common/mtk_vendor.h | 7 +++++++ |
| src/drivers/driver.h | 4 ++-- |
| src/drivers/driver_nl80211.c | 37 ++++++++++++++++++++++++++++-------- |
| 7 files changed, 55 insertions(+), 16 deletions(-) |
| |
| diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c |
| index 06d8345..2d99647 100644 |
| --- a/hostapd/ctrl_iface.c |
| +++ b/hostapd/ctrl_iface.c |
| @@ -3441,6 +3441,8 @@ hostapd_ctrl_iface_set_edcca(struct hostapd_data *hapd, char *cmd, |
| char *buf, size_t buflen) |
| { |
| char *pos, *config, *value; |
| + u8 mode; |
| + |
| config = cmd; |
| pos = os_strchr(config, ' '); |
| if (pos == NULL) |
| @@ -3547,6 +3549,8 @@ hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd, |
| char *buf, size_t buflen) |
| { |
| char *pos, *config, *value; |
| + u8 mode; |
| + |
| config = cmd; |
| pos = os_strchr(config, ' '); |
| if (pos == NULL) |
| @@ -3564,13 +3568,20 @@ hostapd_ctrl_iface_set_mu(struct hostapd_data *hapd, char *cmd, |
| return -1; |
| } |
| hapd->iconf->mu_onoff = (u8) mu; |
| + mode = MU_CTRL_ONOFF; |
| + } else if (os_strcmp(config, "ul_user_cnt") == 0) { |
| + mode = MU_CTRL_UL_USER_CNT; |
| + wpa_printf(MSG_ERROR, "ul_user_cnt:%d\n", (u8)atoi(value)); |
| + } else if (os_strcmp(config, "dl_user_cnt") == 0) { |
| + mode = MU_CTRL_DL_USER_CNT; |
| + wpa_printf(MSG_ERROR, "dl_user_cnt:%d\n", (u8)atoi(value)); |
| } else { |
| wpa_printf(MSG_ERROR, |
| "Unsupported parameter %s for SET_MU", config); |
| return -1; |
| } |
| |
| - if(hostapd_drv_mu_ctrl(hapd) == 0) { |
| + if(hostapd_drv_mu_ctrl(hapd, mode, (u8)atoi(value)) == 0) { |
| return os_snprintf(buf, buflen, "OK\n"); |
| } else { |
| return -1; |
| diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c |
| index 0052a6d..d5c7b15 100644 |
| --- a/src/ap/ap_drv_ops.c |
| +++ b/src/ap/ap_drv_ops.c |
| @@ -1079,11 +1079,11 @@ int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value) |
| return hapd->driver->get_edcca(hapd->drv_priv, mode, value); |
| } |
| |
| -int hostapd_drv_mu_ctrl(struct hostapd_data *hapd) |
| +int hostapd_drv_mu_ctrl(struct hostapd_data *hapd, u8 mode, u8 val) |
| { |
| if (!hapd->driver || !hapd->driver->mu_ctrl) |
| return 0; |
| - return hapd->driver->mu_ctrl(hapd->drv_priv, hapd->iconf->mu_onoff); |
| + return hapd->driver->mu_ctrl(hapd->drv_priv, mode, val); |
| } |
| |
| int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff) |
| diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h |
| index 9d5a23b..82283e6 100644 |
| --- a/src/ap/ap_drv_ops.h |
| +++ b/src/ap/ap_drv_ops.h |
| @@ -148,7 +148,7 @@ int hostapd_drv_configure_edcca_enable(struct hostapd_data *hapd); |
| int hostapd_drv_configure_edcca_threshold(struct hostapd_data *hapd, |
| const int *threshold); |
| int hostapd_drv_get_edcca(struct hostapd_data *hapd, const u8 mode, u8 *value); |
| -int hostapd_drv_mu_ctrl(struct hostapd_data *hapd); |
| +int hostapd_drv_mu_ctrl(struct hostapd_data *hapd, u8 mode, u8 val); |
| int hostapd_drv_mu_dump(struct hostapd_data *hapd, u8 *mu_onoff); |
| int hostapd_drv_three_wire_ctrl(struct hostapd_data *hapd); |
| int hostapd_drv_ibf_ctrl(struct hostapd_data *hapd); |
| diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c |
| index 05ddb6f..9bd81d3 100644 |
| --- a/src/ap/hostapd.c |
| +++ b/src/ap/hostapd.c |
| @@ -55,7 +55,7 @@ |
| #include "hs20.h" |
| #include "airtime_policy.h" |
| #include "wpa_auth_kay.h" |
| - |
| +#include "common/mtk_vendor.h" |
| |
| static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason); |
| #ifdef CONFIG_WEP |
| @@ -2398,7 +2398,7 @@ dfs_offload: |
| if (hostapd_drv_configure_edcca_threshold(hapd, |
| hapd->iconf->edcca_threshold) < 0) |
| goto fail; |
| - if (hostapd_drv_mu_ctrl(hapd) < 0) |
| + if (hostapd_drv_mu_ctrl(hapd, MU_CTRL_ONOFF, hapd->iconf->mu_onoff) < 0) |
| goto fail; |
| if (hostapd_drv_three_wire_ctrl(hapd) < 0) |
| goto fail; |
| diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h |
| index 74f467c..7dd2fc4 100644 |
| --- a/src/common/mtk_vendor.h |
| +++ b/src/common/mtk_vendor.h |
| @@ -197,6 +197,8 @@ enum mtk_vendor_attr_mu_ctrl { |
| |
| MTK_VENDOR_ATTR_MU_CTRL_ONOFF, |
| MTK_VENDOR_ATTR_MU_CTRL_DUMP, |
| + MTK_VENDOR_ATTR_MU_CTRL_OFDMA_MODE, |
| + MTK_VENDOR_ATTR_MU_CTRL_OFDMA_VAL, |
| |
| /* keep last */ |
| NUM_MTK_VENDOR_ATTRS_MU_CTRL, |
| @@ -270,4 +272,9 @@ struct amnt_resp_data { |
| struct amnt_data resp_data[0]; |
| }; |
| |
| +enum { |
| + MU_CTRL_ONOFF, |
| + MU_CTRL_DL_USER_CNT, |
| + MU_CTRL_UL_USER_CNT, |
| +}; |
| #endif /* MTK_VENDOR_H */ |
| diff --git a/src/drivers/driver.h b/src/drivers/driver.h |
| index cb885f9..6cd4dc9 100644 |
| --- a/src/drivers/driver.h |
| +++ b/src/drivers/driver.h |
| @@ -5017,11 +5017,11 @@ struct wpa_driver_ops { |
| int (*get_edcca)(void *priv, const u8 mode, u8 *value); |
| |
| /** |
| - * mu_ctrl - ctrl on off for UL/DL MURU |
| + * mu_ctrl - ctrl for UL/DL MURU |
| * @priv: Private driver interface data |
| * |
| */ |
| - int (*mu_ctrl)(void *priv, u8 mu_onoff); |
| + int (*mu_ctrl)(void *priv, u8 mode, u8 val); |
| int (*mu_dump)(void *priv, u8 *mu_onoff); |
| |
| /** |
| diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c |
| index 088f625..8400e57 100644 |
| --- a/src/drivers/driver_nl80211.c |
| +++ b/src/drivers/driver_nl80211.c |
| @@ -13295,13 +13295,13 @@ fail: |
| |
| |
| #ifdef CONFIG_IEEE80211AX |
| -static int nl80211_mu_onoff(void *priv, u8 mu_onoff) |
| +static int nl80211_mu_ctrl(void *priv, u8 mode, u8 val) |
| { |
| struct i802_bss *bss = priv; |
| struct wpa_driver_nl80211_data *drv = bss->drv; |
| struct nl_msg *msg; |
| struct nlattr *data; |
| - int ret; |
| + int ret = -ENOBUFS; |
| |
| if (!drv->mtk_mu_vendor_cmd_avail) { |
| wpa_printf(MSG_INFO, |
| @@ -13312,17 +13312,38 @@ static int nl80211_mu_onoff(void *priv, u8 mu_onoff) |
| if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) || |
| nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_MTK) || |
| nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_MU_CTRL) || |
| - !(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) || |
| - nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, mu_onoff)) { |
| - nlmsg_free(msg); |
| - return -ENOBUFS; |
| + !(data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA))) |
| + goto fail; |
| + |
| + switch (mode) { |
| + case MU_CTRL_ONOFF: |
| + if (nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_ONOFF, val)) |
| + goto fail; |
| + break; |
| + case MU_CTRL_UL_USER_CNT: |
| + case MU_CTRL_DL_USER_CNT: |
| + if (nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_OFDMA_MODE, mode) || |
| + nla_put_u8(msg, MTK_VENDOR_ATTR_MU_CTRL_OFDMA_VAL, val)) |
| + goto fail; |
| + break; |
| + default: |
| + wpa_printf(MSG_ERROR, "nl80211: Wrong mu mode !"); |
| + ret = -EINVAL; |
| + goto fail; |
| } |
| + |
| nla_nest_end(msg, data); |
| + |
| ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL); |
| if(ret){ |
| - wpa_printf(MSG_ERROR, "Failed to set mu_onoff. ret=%d (%s)", ret, strerror(-ret)); |
| + wpa_printf(MSG_ERROR, "Failed to set mu_ctrl. ret=%d (%s)", ret, strerror(-ret)); |
| } |
| return ret; |
| + |
| +fail: |
| + nl80211_nlmsg_clear(msg); |
| + nlmsg_free(msg); |
| + return ret; |
| } |
| |
| |
| @@ -14454,7 +14475,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { |
| .update_connect_params = nl80211_update_connection_params, |
| .send_external_auth_status = nl80211_send_external_auth_status, |
| .set_4addr_mode = nl80211_set_4addr_mode, |
| - .mu_ctrl = nl80211_mu_onoff, |
| + .mu_ctrl = nl80211_mu_ctrl, |
| .mu_dump = nl80211_mu_dump, |
| #ifdef CONFIG_DPP |
| .dpp_listen = nl80211_dpp_listen, |
| -- |
| 2.18.0 |
| |