meta-digi/meta-digi-dey/recipes-connectivity/hostapd/hostapd/murata/0053-non-upstream-WNM-wpa_c...

286 lines
9.1 KiB
Diff

From 54929427eb8af4affaf8017bc8d127cc7c629581 Mon Sep 17 00:00:00 2001
From: Shelley Yang <shelley.yang@infineon.com>
Date: Wed, 29 Mar 2023 03:28:59 -0500
Subject: [PATCH 53/60] non-upstream: WNM: wpa_cli wnm_maxilde command by IFX
vendorID
1. set
before: wl wnm_maxidle 10 1
after: wpa_cli wnm_maxidle period=10 option=1
2. get
before: wl wnm_maxidle
after: wpa_cli wnm_maxidle
Fixes: SWWLAN-145213
Upstream-Status: Inappropriate [DEY specific]
Signed-off-by: Shelley Yang <shelley.yang@infineon.com>
---
src/common/ifx_vendor.h | 55 ++++++++++++++++++
src/drivers/driver.h | 7 +++
src/drivers/driver_nl80211.c | 92 +++++++++++++++++++++++++++++++
src/drivers/driver_nl80211.h | 1 +
src/drivers/driver_nl80211_capa.c | 3 +
5 files changed, 158 insertions(+)
diff --git a/src/common/ifx_vendor.h b/src/common/ifx_vendor.h
index 6cd3b87..2fed69c 100644
--- a/src/common/ifx_vendor.h
+++ b/src/common/ifx_vendor.h
@@ -76,10 +76,11 @@ enum ifx_nl80211_vendor_subcmds {
IFX_VENDOR_SCMD_LDPC_CAP = 12,
IFX_VENDOR_SCMD_AMSDU = 13,
IFX_VENDOR_SCMD_TWT = 14,
/* Reserved 15-17 */
IFX_VENDOR_SCMD_MBO = 18,
+ IFX_VENDOR_SCMD_WNM = 25,
IFX_VENDOR_SCMD_MAX
};
/*
* enum ifx_vendor_attr - IFX nl80211 vendor attributes
@@ -310,6 +311,60 @@ enum ifx_vendor_attr_mbo_param {
IFX_VENDOR_ATTR_MBO_PARAM_ASSOC_DISALLOWED,
IFX_VENDOR_ATTR_MBO_PARAM_CELLULAR_DATA_PREF,
IFX_VENDOR_ATTR_MBO_PARAM_MAX
};
+enum ifx_vendor_attr_wnm {
+ IFX_VENDOR_ATTR_WNM_UNSPEC,
+ IFX_VENDOR_ATTR_WNM_CMD,
+ IFX_VENDOR_ATTR_WNM_PARAMS,
+ IFX_VENDOR_ATTR_WNM_MAX
+};
+
+enum ifx_wnm_config_cmd_type {
+ IFX_WNM_CONFIG_CMD_TYPE_INVALID = -1,
+ //align internal definition
+ IFX_WNM_CONFIG_CMD_IOV_WNM = 1,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_MAXIDLE = 2,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TIMBC_OFFSET = 3,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_URL = 4,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_REQ = 5,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TFS_TCLASTYPE = 6,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_PARP_DISCARD = 7,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_PARP_ALLNODE = 8,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TIMBC_SET = 9,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TIMBC_STATUS = 10,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_DMS_SET = 11,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_DMS_TERM = 12,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_SERVICE_TERM = 13,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_SLEEP_INTV = 14,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_SLEEP_MODE = 15,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_QUERY = 16,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_RESP = 17,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TCLAS_ADD = 18,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TCLAS_DEL = 19,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TCLAS_LIST = 20,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_DMS_STATUS = 21,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_KEEPALIVES_MAX_IDLE = 22,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_PM_IGNORE_BCMC = 23,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_DMS_DEPENDENCY = 24,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_ROAMTHROTTLE = 25,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TFS_SET = 26,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TFS_TERM = 27,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_TFS_STATUS = 28,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BTQ_NBR_ADD = 29,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BTQ_NBR_DEL = 30,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BTQ_NBR_LIST = 31,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_BSSTRANS_RSSI_RATE_MAP = 32,
+ IFX_WNM_CONFIG_CMD_IOV_WNM_KEEPALIVE_PKT_TYPE = 33,
+ IFX_WNM_CONFIG_CMD_TYPE_MAX
+};
+
+enum ifx_vendor_attr_wnm_maxidle_param {
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_UNSPEC,
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_GET_INFO,
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_IDLE_PERIOD,
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_PROTECTION_OPT,
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_MAX
+};
+
#endif /* IFX_VENDOR_H */
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 996614e..d75abbd 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2596,10 +2596,16 @@ struct drv_config_mbo_params {
struct {
u8 pref_value;
} cellular_pref;
} u;
};
+
+struct drv_maxidle_wnm_params {
+ u8 get_info;
+ int period;
+ int protect;
+};
#endif /* CONFIG_DRIVER_NL80211_IFX */
struct wpa_bss_trans_info {
u8 mbo_transition_reason;
u8 n_candidates;
@@ -4725,10 +4731,11 @@ struct wpa_driver_ops {
* @params: Teardown TWT params
*/
int (*teardown_twt)(void *priv, struct drv_teardown_twt_params *params);
#endif /* CONFIG_TWT_OFFLOAD_IFX */
int (*config_mbo)(void *priv, struct drv_config_mbo_params *params);
+ int (*maxidle_wnm)(void *priv, struct drv_maxidle_wnm_params *params);
#endif /* CONFIG_DRIVER_NL80211_IFX */
};
/**
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 506b1e4..ed7c969 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -12611,10 +12611,101 @@ static int wpa_driver_nl80211_config_mbo(void *priv, struct drv_config_mbo_param
fail:
nl80211_nlmsg_clear(msg);
nlmsg_free(msg);
return ret;
}
+
+static int wpa_driver_nl80211_maxidle_wnm_reply_handler(struct nl_msg *msg, void *arg)
+{
+ struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
+ struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
+ char *buf = arg;
+ char *data;
+ int len;
+
+ wpa_printf(MSG_INFO, "nl80211: maxidle_wnm command reply handler");
+
+ nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+ genlmsg_attrlen(gnlh, 0), NULL);
+
+ if (tb_msg[NL80211_ATTR_VENDOR_DATA]) {
+ data = (char *)((char *)tb_msg[NL80211_ATTR_VENDOR_DATA] + GENL_HDRLEN);
+ len = nla_len(tb_msg[NL80211_ATTR_VENDOR_DATA]);
+ os_memcpy(buf, data, len);
+ }
+ return NL_SKIP;
+}
+
+static int wpa_driver_nl80211_config_maxidle_wnm(void *priv, struct drv_maxidle_wnm_params *params)
+{
+ struct i802_bss *bss = priv;
+ struct wpa_driver_nl80211_data *drv = bss->drv;
+ struct nl_msg *msg = NULL;
+ struct nlattr *data, *wnm_param_attrs;
+ int ret = -1, get_period = 0;
+
+ if (!drv->ifx_wnm_offload)
+ goto fail;
+
+ if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_IFX) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, IFX_VENDOR_SCMD_WNM))
+ goto fail;
+
+ data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
+ if (!data)
+ goto fail;
+
+ if (nla_put_u8(msg, IFX_VENDOR_ATTR_WNM_CMD, IFX_WNM_CONFIG_CMD_IOV_WNM_MAXIDLE))
+ goto fail;
+
+ wnm_param_attrs = nla_nest_start(msg, IFX_VENDOR_ATTR_WNM_PARAMS);
+ if (!wnm_param_attrs)
+ goto fail;
+
+ if (params->get_info) {
+ if (nla_put_u8(msg, IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_GET_INFO,
+ params->get_info)) {
+ wpa_printf(MSG_ERROR,
+ "nl80211: WNM config: build msg ATTR:%d failed",
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_GET_INFO);
+ goto fail;
+ }
+ } else {
+ if (nla_put_u8(msg, IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_IDLE_PERIOD,
+ params->period) ||
+ nla_put_u8(msg, IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_PROTECTION_OPT,
+ params->protect)) {
+ wpa_printf(MSG_ERROR,
+ "nl80211: WNM config: build ATTR:%d %d failed",
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_IDLE_PERIOD,
+ IFX_VENDOR_ATTR_WNM_MAXIDLE_PARAM_PROTECTION_OPT);
+ goto fail;
+ }
+ }
+ nla_nest_end(msg, wnm_param_attrs);
+ nla_nest_end(msg, data);
+
+ if (params->get_info)
+ ret = send_and_recv_msgs(drv, msg, wpa_driver_nl80211_maxidle_wnm_reply_handler,
+ &get_period, NULL, NULL);
+ else
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+
+ if (ret)
+ wpa_printf(MSG_ERROR, "nl80211: WNM maxidle: Failed to invoke driver %s",
+ strerror(-ret));
+ else
+ if (params->get_info)
+ params->period = get_period;
+
+ return ret;
+fail:
+ nl80211_nlmsg_clear(msg);
+ nlmsg_free(msg);
+ return ret;
+}
#endif /* CONFIG_DRIVER_NL80211_IFX */
const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.name = "nl80211",
.desc = "Linux nl80211/cfg80211",
@@ -12763,7 +12854,8 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
#ifdef CONFIG_TWT_OFFLOAD_IFX
.setup_twt = wpa_driver_nl80211_setup_twt,
.teardown_twt = wpa_driver_nl80211_teardown_twt,
#endif /* CONFIG_TWT_OFFLOAD_IFX */
.config_mbo = wpa_driver_nl80211_config_mbo,
+ .maxidle_wnm = wpa_driver_nl80211_config_maxidle_wnm,
#endif /* CONFIG_DRIVER_NL80211_IFX */
};
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 6d2c094..6d9945c 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -181,10 +181,11 @@ struct wpa_driver_nl80211_data {
unsigned int qca_do_acs:1;
unsigned int brcm_do_acs:1;
#ifdef CONFIG_DRIVER_NL80211_IFX
unsigned int ifx_twt_offload:1;
unsigned int ifx_mbo_offload:1;
+ unsigned int ifx_wnm_offload:1;
#endif /* CONFIG_DRIVER_NL80211_IFX */
u64 vendor_scan_cookie;
u64 remain_on_chan_cookie;
u64 send_frame_cookie;
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index b0807a7..21b9c03 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -1060,10 +1060,13 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
drv->ifx_twt_offload = 1;
break;
case IFX_VENDOR_SCMD_MBO:
drv->ifx_mbo_offload = 1;
break;
+ case IFX_VENDOR_SCMD_WNM:
+ drv->ifx_wnm_offload = 1;
+ break;
}
#endif /* CONFIG_DRIVER_NL80211_IFX */
}
wpa_printf(MSG_DEBUG, "nl80211: Supported vendor command: vendor_id=0x%x subcmd=%u",