286 lines
9.1 KiB
Diff
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",
|