summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSridhar Selvaraj <sselvara@codeaurora.org>2017-07-24 18:17:46 +0530
committerSridhar Selvaraj <sselvara@codeaurora.org>2017-08-16 19:19:01 +0530
commit76a9fcd9556f88469e07a5fbc90d6c12507da964 (patch)
treec81ed65eb2eb5003fb822f207a01cbafa2121953
parent2858cb7e4a5f283a925c735ef38fb25e3068b87b (diff)
qcacmn: Support FILS roaming
Add cmn support for the following: - Update ERP info in RSO Start - Update HLP info in a new command WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID - Set/Delete PMK cache info with WMI_PDEV_UPDATE_PMK_CACHE_CMDID - Process FILS TLV in Roam Synch Indication and update the FILS info [seq number,PMK, KEK, realm] to Supplicant. Change-Id: I239bf5d6c4455d39181e335dbf73bcade16aee8e CRs-Fixed: 2089128
-rw-r--r--wmi/inc/wmi_unified_api.h23
-rw-r--r--wmi/inc/wmi_unified_param.h54
-rw-r--r--wmi/inc/wmi_unified_priv.h7
-rw-r--r--wmi/inc/wmi_unified_tlv.h10
-rw-r--r--wmi/src/wmi_unified_api.c28
-rw-r--r--wmi/src/wmi_unified_tlv.c221
6 files changed, 338 insertions, 5 deletions
diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h
index 20c4936d24bd..a29f78086a74 100644
--- a/wmi/inc/wmi_unified_api.h
+++ b/wmi/inc/wmi_unified_api.h
@@ -1387,6 +1387,29 @@ QDF_STATUS wmi_unified_set_arp_stats_req(void *wmi_hdl,
struct set_arp_stats *req_buf);
QDF_STATUS wmi_unified_get_arp_stats_req(void *wmi_hdl,
struct get_arp_stats *req_buf);
+/*
+ * wmi_unified_set_del_pmkid_cache() - set delete PMKID
+ * @wmi_hdl: wma handle
+ * @pmksa: pointer to pmk cache entry
+ * @vdev_id: vdev id
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_set_del_pmkid_cache(void *wmi_hdl,
+ wmi_pmk_cache *pmksa,
+ uint32_t vdev_id);
+
+#if defined (WLAN_FEATURE_FILS_SK)
+/*
+ * wmi_unified_roam_send_hlp_cmd() -send HLP command info
+ * @wmi_hdl: wma handle
+ * @req_buf: Pointer to HLP params
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_roam_send_hlp_cmd(void *wmi_hdl,
+ struct hlp_params *req_buf);
+#endif
#ifdef WMI_INTERFACE_EVENT_LOGGING
void wmi_print_cmd_log(wmi_unified_t wmi, uint32_t count,
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h
index 03d14e4b3b92..14313b514bab 100644
--- a/wmi/inc/wmi_unified_param.h
+++ b/wmi/inc/wmi_unified_param.h
@@ -1736,6 +1736,35 @@ typedef struct {
uint32_t mcsset[WMI_HOST_ROAM_OFFLOAD_NUM_MCS_SET >> 2];
} roam_offload_param;
+#define WMI_FILS_MAX_RRK_LENGTH 64
+#define WMI_FILS_MAX_RIK_LENGTH WMI_FILS_MAX_RRK_LENGTH
+#define WMI_FILS_MAX_REALM_LENGTH 256
+#define WMI_FILS_MAX_USERNAME_LENGTH 16
+
+/**
+ * struct roam_fils_params - Roam FILS params
+ * @username: username
+ * @username_length: username length
+ * @next_erp_seq_num: next ERP sequence number
+ * @rrk: RRK
+ * @rrk_length: length of @rrk
+ * @rik: RIK
+ * @rik_length: length of @rik
+ * @realm: realm
+ * @realm_len: length of @realm
+ */
+struct roam_fils_params {
+ uint8_t username[WMI_FILS_MAX_USERNAME_LENGTH];
+ uint32_t username_length;
+ uint32_t next_erp_seq_num;
+ uint8_t rrk[WMI_FILS_MAX_RRK_LENGTH];
+ uint32_t rrk_length;
+ uint8_t rik[WMI_FILS_MAX_RIK_LENGTH];
+ uint32_t rik_length;
+ uint8_t realm[WMI_FILS_MAX_REALM_LENGTH];
+ uint32_t realm_len;
+};
+
/* struct roam_offload_scan_params - structure
* containing roaming offload scan parameters
* @is_roam_req_valid: flag to tell whether roam req
@@ -1760,6 +1789,10 @@ typedef struct {
* @is_ese_assoc: flag to determine ese assoc
* @mdid: mobility domain info
* @roam_offload_params: roam offload tlv params
+ * @assoc_ie_length: Assoc IE length
+ * @assoc_ie: Assoc IE buffer
+ * @add_fils_tlv: add FILS TLV boolean
+ * @roam_fils_params: roam fils params
*/
struct roam_offload_scan_params {
uint8_t is_roam_req_valid;
@@ -1792,6 +1825,10 @@ struct roam_offload_scan_params {
#endif
uint32_t assoc_ie_length;
uint8_t assoc_ie[MAX_ASSOC_IE_LENGTH];
+ bool add_fils_tlv;
+#ifdef WLAN_FEATURE_FILS_SK
+ struct roam_fils_params roam_fils_params;
+#endif
};
/* struct roam_offload_scan_rssi_params - structure containing
@@ -3055,7 +3092,7 @@ struct periodic_tx_pattern {
uint8_t ucPattern[WMI_PERIODIC_TX_PTRN_MAX_SIZE];
};
-#define WMI_GTK_OFFLOAD_KEK_BYTES 16
+#define WMI_GTK_OFFLOAD_KEK_BYTES 64
#define WMI_GTK_OFFLOAD_KCK_BYTES 16
#define WMI_GTK_OFFLOAD_ENABLE 0
#define WMI_GTK_OFFLOAD_DISABLE 1
@@ -3065,6 +3102,7 @@ struct periodic_tx_pattern {
* @ulFlags: optional flags
* @aKCK: Key confirmation key
* @aKEK: key encryption key
+ * @kek_len: Kek length
* @ullKeyReplayCounter: replay counter
* @bssid: bss id
*/
@@ -3072,6 +3110,7 @@ struct gtk_offload_params {
uint32_t ulFlags;
uint8_t aKCK[WMI_GTK_OFFLOAD_KCK_BYTES];
uint8_t aKEK[WMI_GTK_OFFLOAD_KEK_BYTES];
+ uint32_t kek_len;
uint64_t ullKeyReplayCounter;
struct qdf_mac_addr bssid;
};
@@ -3360,6 +3399,19 @@ struct roam_scan_filter_params {
struct rssi_disallow_bssid rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST];
};
+#define WMI_MAX_HLP_IE_LEN 2048
+/**
+ * struct hlp_params - HLP info params
+ * @vdev_id: vdev id
+ * @hlp_ie_len: HLP IE length
+ * @hlp_ie: HLP IE
+ */
+struct hlp_params {
+ uint8_t vdev_id;
+ uint32_t hlp_ie_len;
+ uint8_t hlp_ie[WMI_MAX_HLP_IE_LEN];
+};
+
/**
* struct ssid_hotlist_request_params - set SSID hotlist request struct
* @request_id: ID of the request
diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h
index bb13ba207c7a..4ede6958b416 100644
--- a/wmi/inc/wmi_unified_priv.h
+++ b/wmi/inc/wmi_unified_priv.h
@@ -406,6 +406,11 @@ QDF_STATUS (*send_roam_mawc_params_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*send_roam_scan_filter_cmd)(wmi_unified_t wmi_handle,
struct roam_scan_filter_params *roam_req);
+#if defined (WLAN_FEATURE_FILS_SK)
+QDF_STATUS (*send_roam_scan_send_hlp_cmd) (wmi_unified_t wmi_handle,
+ struct hlp_params *params);
+#endif
+
QDF_STATUS (*send_set_passpoint_network_list_cmd)(wmi_unified_t wmi_handle,
struct wifi_passpoint_req_param *req);
@@ -854,6 +859,8 @@ QDF_STATUS (*send_vdev_spectral_configure_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*send_vdev_spectral_enable_cmd)(wmi_unified_t wmi_handle,
struct vdev_spectral_enable_params *param);
+QDF_STATUS (*send_set_del_pmkid_cache_cmd) (wmi_unified_t wmi_handle,
+ wmi_pmk_cache *req_buf, uint32_t vdev_id);
QDF_STATUS (*send_bss_chan_info_request_cmd)(wmi_unified_t wmi_handle,
struct bss_chan_info_request_params *param);
diff --git a/wmi/inc/wmi_unified_tlv.h b/wmi/inc/wmi_unified_tlv.h
index 4690563a85d3..b8887e278b7d 100644
--- a/wmi/inc/wmi_unified_tlv.h
+++ b/wmi/inc/wmi_unified_tlv.h
@@ -277,6 +277,16 @@ QDF_STATUS send_roam_mawc_params_cmd_tlv(wmi_unified_t wmi_handle,
QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
struct roam_scan_filter_params *roam_req);
+/**
+ * send_roam_scan_send_hlp_cmd_tlv() - send HLP info
+ * @wmi_handle: wmi handle
+ * @params: Pointer to HLP params
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS send_roam_scan_send_hlp_cmd_tlv(wmi_unified_t wmi_handle,
+ struct hlp_params *params);
+
QDF_STATUS send_set_ric_req_cmd_tlv(wmi_unified_t wmi_handle, void *msg,
uint8_t is_add_ts);
diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c
index e542e94da081..dd16036cdde0 100644
--- a/wmi/src/wmi_unified_api.c
+++ b/wmi/src/wmi_unified_api.c
@@ -3576,6 +3576,34 @@ QDF_STATUS wmi_unified_get_arp_stats_req(void *wmi_hdl,
return QDF_STATUS_E_FAILURE;
}
+QDF_STATUS wmi_unified_set_del_pmkid_cache(void *wmi_hdl,
+ wmi_pmk_cache *req_buf,
+ uint32_t vdev_id)
+{
+ wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+ if (wmi_handle->ops->send_set_del_pmkid_cache_cmd)
+ return wmi_handle->ops->send_set_del_pmkid_cache_cmd(wmi_handle,
+ req_buf,
+ vdev_id);
+
+ return QDF_STATUS_E_FAILURE;
+}
+
+#if defined (WLAN_FEATURE_FILS_SK)
+QDF_STATUS wmi_unified_roam_send_hlp_cmd(void *wmi_hdl,
+ struct hlp_params *req_buf)
+{
+ wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+ if (wmi_handle->ops->send_roam_scan_send_hlp_cmd)
+ return wmi_handle->ops->send_roam_scan_send_hlp_cmd(wmi_handle,
+ req_buf);
+
+ return QDF_STATUS_E_FAILURE;
+}
+#endif
+
/**
* wmi_unified_get_buf_extscan_hotlist_cmd() - prepare hotlist command
* @wmi_hdl: wmi handle
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index 874dbda8b2ef..c3eed2badafd 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -4417,6 +4417,69 @@ QDF_STATUS send_set_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_handle,
return QDF_STATUS_SUCCESS;
}
+#ifdef WLAN_FEATURE_FILS_SK
+/**
+ * wmi_add_fils_tlv() - Add FILS TLV to roam scan offload command
+ * @wmi_handle: wmi handle
+ * @roam_req: Roam scan offload params
+ * @buf_ptr: command buffer to send
+ * @fils_tlv_len: fils tlv length
+ *
+ * Return: Updated buffer pointer
+ */
+static uint8_t *wmi_add_fils_tlv(wmi_unified_t wmi_handle,
+ struct roam_offload_scan_params *roam_req,
+ uint8_t *buf_ptr, uint32_t fils_tlv_len)
+{
+ wmi_roam_fils_offload_tlv_param *fils_tlv;
+ wmi_erp_info *erp_info;
+ struct roam_fils_params *roam_fils_params;
+
+ if (!roam_req->add_fils_tlv)
+ return buf_ptr;
+
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ sizeof(*fils_tlv));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+
+ fils_tlv = (wmi_roam_fils_offload_tlv_param *)buf_ptr;
+ WMITLV_SET_HDR(&fils_tlv->tlv_header,
+ WMITLV_TAG_STRUC_wmi_roam_fils_offload_tlv_param,
+ WMITLV_GET_STRUCT_TLVLEN
+ (wmi_roam_fils_offload_tlv_param));
+
+ roam_fils_params = &roam_req->roam_fils_params;
+ erp_info = (wmi_erp_info *)(&fils_tlv->vdev_erp_info);
+
+ erp_info->username_length = roam_fils_params->username_length;
+ qdf_mem_copy(erp_info->username, roam_fils_params->username,
+ erp_info->username_length);
+
+ erp_info->next_erp_seq_num = roam_fils_params->next_erp_seq_num;
+
+ erp_info->rRk_length = roam_fils_params->rrk_length;
+ qdf_mem_copy(erp_info->rRk, roam_fils_params->rrk,
+ erp_info->rRk_length);
+
+ erp_info->rIk_length = roam_fils_params->rik_length;
+ qdf_mem_copy(erp_info->rIk, roam_fils_params->rik,
+ erp_info->rIk_length);
+
+ erp_info->realm_len = roam_fils_params->realm_len;
+ qdf_mem_copy(erp_info->realm, roam_fils_params->realm,
+ erp_info->realm_len);
+
+ buf_ptr += sizeof(*fils_tlv);
+ return buf_ptr;
+}
+#else
+static inline uint8_t *wmi_add_fils_tlv(wmi_unified_t wmi_handle,
+ struct roam_offload_scan_params *roam_req,
+ uint8_t *buf_ptr, uint32_t fils_tlv_len)
+{
+ return buf_ptr;
+}
+#endif
/**
* send_roam_scan_offload_mode_cmd_tlv() - send roam scan mode request to fw
* @wmi_handle: wmi handle
@@ -4446,6 +4509,7 @@ QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle,
wmi_roam_11r_offload_tlv_param *roam_offload_11r;
wmi_roam_ese_offload_tlv_param *roam_offload_ese;
wmi_tlv_buf_len_param *assoc_ies;
+ uint32_t fils_tlv_len = 0;
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
/* Need to create a buf with roam_scan command at
* front and piggyback with scan command */
@@ -4484,6 +4548,12 @@ QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle,
len += (sizeof(*assoc_ies) + (2*WMI_TLV_HDR_SIZE)
+ roundup(roam_req->assoc_ie_length,
sizeof(uint32_t)));
+
+ if (roam_req->add_fils_tlv) {
+ fils_tlv_len = sizeof(
+ wmi_roam_fils_offload_tlv_param);
+ len += WMI_TLV_HDR_SIZE + fils_tlv_len;
+ }
} else {
if (roam_req->is_roam_req_valid)
WMI_LOGD("%s : roam offload = %d",
@@ -4510,7 +4580,6 @@ QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle,
}
buf_ptr = (uint8_t *) wmi_buf_data(buf);
-
roam_scan_mode_fp = (wmi_roam_scan_mode_fixed_param *) buf_ptr;
WMITLV_SET_HDR(&roam_scan_mode_fp->tlv_header,
WMITLV_TAG_STRUC_wmi_roam_scan_mode_fixed_param,
@@ -4730,7 +4799,9 @@ QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle,
qdf_mem_copy(buf_ptr, roam_req->assoc_ie,
assoc_ies->buf_len);
}
-
+ buf_ptr += roundup(assoc_ies->buf_len, sizeof(uint32_t));
+ buf_ptr = wmi_add_fils_tlv(wmi_handle, roam_req,
+ buf_ptr, fils_tlv_len);
} else {
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
WMITLV_GET_STRUCT_TLVLEN(0));
@@ -5265,6 +5336,57 @@ QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle,
return status;
}
+#if defined (WLAN_FEATURE_FILS_SK)
+QDF_STATUS send_roam_scan_send_hlp_cmd_tlv(wmi_unified_t wmi_handle,
+ struct hlp_params *params)
+{
+ uint32_t len;
+ uint8_t *buf_ptr;
+ wmi_buf_t buf = NULL;
+ wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param *hlp_params;
+
+ len = sizeof(wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param);
+ len += WMI_TLV_HDR_SIZE;
+ len += roundup(params->hlp_ie_len, sizeof(uint32_t));
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
+ return QDF_STATUS_E_NOMEM;
+ }
+
+ buf_ptr = (uint8_t *) wmi_buf_data(buf);
+ hlp_params = (wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param *) buf_ptr;
+ WMITLV_SET_HDR(&hlp_params->tlv_header,
+ WMITLV_TAG_STRUC_wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param));
+
+ hlp_params->vdev_id = params->vdev_id;
+ hlp_params->size = params->hlp_ie_len;
+ hlp_params->pkt_type = WMI_FILS_HLP_PKT_TYPE_DHCP_DISCOVER;
+
+ buf_ptr += sizeof(*hlp_params);
+
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
+ round_up(params->hlp_ie_len,
+ sizeof(uint32_t)));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+ qdf_mem_copy(buf_ptr, params->hlp_ie, params->hlp_ie_len);
+
+ WMI_LOGD(FL("send FILS HLP pkt vdev %d len %d"),
+ hlp_params->vdev_id, hlp_params->size);
+ if (wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID)) {
+ WMI_LOGE(FL("Failed to send FILS HLP pkt cmd"));
+ wmi_buf_free(buf);
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ return QDF_STATUS_SUCCESS;
+}
+#endif
+
/** send_set_epno_network_list_cmd_tlv() - set epno network list
* @wmi_handle: wmi handle
* @req: epno config params request structure
@@ -8678,11 +8800,13 @@ QDF_STATUS send_gtk_offload_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id,
int len;
wmi_buf_t buf;
WMI_GTK_OFFLOAD_CMD_fixed_param *cmd;
+ wmi_gtk_offload_fils_tlv_param *ext_param;
QDF_STATUS status = QDF_STATUS_SUCCESS;
+ uint8_t *buf_ptr;
WMI_LOGD("%s Enter", __func__);
- len = sizeof(*cmd);
+ len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + sizeof(*ext_param);
/* alloc wmi buffer */
buf = wmi_buf_alloc(wmi_handle, len);
@@ -8693,6 +8817,7 @@ QDF_STATUS send_gtk_offload_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id,
}
cmd = (WMI_GTK_OFFLOAD_CMD_fixed_param *) wmi_buf_data(buf);
+ buf_ptr = (uint8_t *)cmd;
WMITLV_SET_HDR(&cmd->tlv_header,
WMITLV_TAG_STRUC_WMI_GTK_OFFLOAD_CMD_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
@@ -8712,8 +8837,24 @@ QDF_STATUS send_gtk_offload_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id,
} else {
cmd->flags = gtk_offload_opcode;
}
+ buf_ptr += sizeof(*cmd);
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, sizeof(*ext_param));
+ buf_ptr += WMI_TLV_HDR_SIZE;
- WMI_LOGD("VDEVID: %d, GTK_FLAGS: x%x", vdev_id, cmd->flags);
+ ext_param = (wmi_gtk_offload_fils_tlv_param *)buf_ptr;
+ WMITLV_SET_HDR(&ext_param->tlv_header,
+ WMITLV_TAG_STRUC_wmi_gtk_offload_extended_tlv_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_gtk_offload_fils_tlv_param));
+ ext_param->vdev_id = vdev_id;
+ ext_param->flags = cmd->flags;
+ ext_param->kek_len = params->kek_len;
+ qdf_mem_copy(ext_param->KEK, params->aKEK, params->kek_len);
+ qdf_mem_copy(ext_param->KCK, params->aKCK, WMI_GTK_OFFLOAD_KCK_BYTES);
+ qdf_mem_copy(ext_param->replay_counter, &params->ullKeyReplayCounter,
+ GTK_REPLAY_COUNTER_BYTES);
+
+ WMI_LOGD("VDEVID: %d, GTK_FLAGS: x%x kek len %d", vdev_id, cmd->flags, params->kek_len);
/* send the wmi command */
if (wmi_unified_cmd_send(wmi_handle, buf, len,
@@ -13465,6 +13606,72 @@ QDF_STATUS send_limit_off_chan_cmd_tlv(wmi_unified_t wmi_handle,
return QDF_STATUS_SUCCESS;
}
+/**
+ * send_set_del_pmkid_cache_cmd_tlv() - send wmi cmd of set del pmkid
+ * @wmi_handle: wmi handler
+ * @pmk_info: pointer to PMK cache entry
+ * @vdev_id: vdev id
+ *
+ * Return: 0 for success and non zero for failure
+ */
+static QDF_STATUS send_set_del_pmkid_cache_cmd_tlv(wmi_unified_t wmi_handle,
+ wmi_pmk_cache *pmk_info,
+ uint32_t vdev_id)
+{
+ wmi_pdev_update_pmk_cache_cmd_fixed_param *cmd;
+ wmi_buf_t buf;
+ QDF_STATUS status;
+ uint8_t *buf_ptr;
+ wmi_pmk_cache *pmksa;
+ uint32_t len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + sizeof(*pmksa);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGP("%s: failed to allocate memory for set del pmkid cache",
+ __func__);
+ return QDF_STATUS_E_NOMEM;
+ }
+
+ buf_ptr = (uint8_t *) wmi_buf_data(buf);
+ cmd = (wmi_pdev_update_pmk_cache_cmd_fixed_param *) buf_ptr;
+
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_pdev_update_pmk_cache_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_pdev_update_pmk_cache_cmd_fixed_param));
+
+ cmd->vdev_id = vdev_id;
+ cmd->num_cache = 1;
+ buf_ptr += sizeof(*cmd);
+
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ sizeof(*pmksa));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+
+ pmksa = (wmi_pmk_cache *)buf_ptr;
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_STRUC_wmi_pmk_cache,
+ WMITLV_GET_STRUCT_TLVLEN
+ (wmi_pmk_cache));
+ pmksa->pmk_len = pmk_info->pmk_len;
+ qdf_mem_copy(pmksa->pmk, pmk_info->pmk, pmksa->pmk_len);
+ pmksa->pmkid_len = pmk_info->pmkid_len;
+ qdf_mem_copy(pmksa->pmkid, pmk_info->pmkid, pmksa->pmkid_len);
+ pmksa->bssid = pmk_info->bssid;
+ pmksa->ssid = pmk_info->ssid;
+ pmksa->cache_id = pmk_info->cache_id;
+ pmksa->cat_flag = pmk_info->cat_flag;
+ pmksa->action_flag = pmk_info->action_flag;
+
+ status = wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_PDEV_UPDATE_PMK_CACHE_CMDID);
+ if (status != QDF_STATUS_SUCCESS) {
+ WMI_LOGE("%s: failed to send set del pmkid cache command %d",
+ __func__, status);
+ wmi_buf_free(buf);
+ }
+
+ return status;
+}
struct wmi_ops tlv_ops = {
.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
@@ -13745,6 +13952,12 @@ struct wmi_ops tlv_ops = {
#endif
.send_limit_off_chan_cmd =
send_limit_off_chan_cmd_tlv,
+ .send_set_del_pmkid_cache_cmd =
+ send_set_del_pmkid_cache_cmd_tlv,
+#if defined (WLAN_FEATURE_FILS_SK)
+ .send_roam_scan_send_hlp_cmd =
+ send_roam_scan_send_hlp_cmd_tlv,
+#endif
};
#ifdef WMI_TLV_AND_NON_TLV_SUPPORT