diff options
| author | Sridhar Selvaraj <sselvara@codeaurora.org> | 2017-07-24 18:17:46 +0530 |
|---|---|---|
| committer | Sridhar Selvaraj <sselvara@codeaurora.org> | 2017-08-16 19:19:01 +0530 |
| commit | 76a9fcd9556f88469e07a5fbc90d6c12507da964 (patch) | |
| tree | c81ed65eb2eb5003fb822f207a01cbafa2121953 | |
| parent | 2858cb7e4a5f283a925c735ef38fb25e3068b87b (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.h | 23 | ||||
| -rw-r--r-- | wmi/inc/wmi_unified_param.h | 54 | ||||
| -rw-r--r-- | wmi/inc/wmi_unified_priv.h | 7 | ||||
| -rw-r--r-- | wmi/inc/wmi_unified_tlv.h | 10 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_api.c | 28 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_tlv.c | 221 |
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, ¶ms->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 |
