diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h index 53cdb53077..0d75b56b79 100644 --- a/os_if/linux/qca_vendor.h +++ b/os_if/linux/qca_vendor.h @@ -2184,6 +2184,10 @@ enum qca_roaming_policy { * WLAN_VENDOR_ATTR_ROAM_AUTH_STATUS to indicate the current * re-association status. Type flag. * This attribute is applicable only for re-association failure cases. + * @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PMK: AUTH PMK + * @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PMKID: AUTH PMKID + * @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_FILS_ERP_NEXT_SEQ_NUM: FILS erp next + * seq number */ enum qca_wlan_vendor_attr_roam_auth { QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID = 0, @@ -2197,6 +2201,9 @@ enum qca_wlan_vendor_attr_roam_auth { QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_STATUS, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_RETAIN_CONNECTION, + QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PMK, + QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PMKID, + QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_FILS_ERP_NEXT_SEQ_NUM, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX = QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST - 1 diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index c1128c264c..95aaf098d2 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1529,6 +1529,27 @@ QDF_STATUS wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl, QDF_STATUS wmi_unified_set_country_cmd_send(void *wmi_hdl, struct set_country *param); +/* + * wmi_unified_set_del_pmkid_cache() - set delete PMKID + * @wmi_hdl: wma handle + * @pmksa: pointer to pmk cache entry + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_set_del_pmkid_cache(void *wmi_hdl, + struct wmi_unified_pmk_cache *pmksa); + +#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 7b6b2e5c10..6ccba61b69 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -1913,6 +1913,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 @@ -1937,6 +1966,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; @@ -1969,6 +2002,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 @@ -3219,6 +3256,11 @@ struct periodic_tx_pattern { uint8_t ucPattern[WMI_PERIODIC_TX_PTRN_MAX_SIZE]; }; +#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 + /** * struct flashing_req_params - led flashing parameter * @reqId: request id @@ -3459,6 +3501,53 @@ 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]; +}; + +#define WMI_UNIFIED_MAX_PMKID_LEN 16 +#define WMI_UNIFIED_MAX_PMK_LEN 64 + +/** + * struct wmi_unified_pmk_cache - used to set del pmkid cache + * @tlv_header: TLV header, TLV tag and len; tag equals WMITLV_TAG_ARRAY_UINT32 + * @pmk_len: PMK len + * for big-endian hosts, manual endian conversion will be needed to keep + * the array values in their original order in spite of the automatic + * byte-swap applied to WMI messages during download + * @pmk: PMK array + * @pmkid_len: PMK ID Len + * @pmkid: PMK ID Array + * @bssid: BSSID + * @ssid: SSID + * @cache_id: PMK Cache ID + * @cat_flag: whether (bssid) or (ssid,cache_id) is valid + * @action_flag: add/delete the entry + */ +struct wmi_unified_pmk_cache { + A_UINT32 tlv_header; + A_UINT32 pmk_len; + A_UINT8 session_id; + A_UINT8 pmk[WMI_UNIFIED_MAX_PMK_LEN]; + A_UINT32 pmkid_len; + A_UINT8 pmkid[WMI_UNIFIED_MAX_PMKID_LEN]; + wmi_host_mac_addr bssid; + struct mac_ssid ssid; + A_UINT32 cache_id; + A_UINT32 cat_flag; + A_UINT32 action_flag; +}; + + /** * 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 4c5ed20775..467d7a1f6a 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -416,6 +416,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_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); @@ -880,6 +885,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, + struct wmi_unified_pmk_cache *req_buf); QDF_STATUS (*send_bss_chan_info_request_cmd)(wmi_unified_t wmi_handle, struct bss_chan_info_request_params *param); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 710377bbd7..0e71a982a3 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -3298,6 +3298,32 @@ 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, + struct wmi_unified_pmk_cache *req_buf) +{ + 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); + + 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_hlp_cmd) + return wmi_handle->ops->send_roam_scan_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 4507bf45f1..7d510506c6 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -5490,6 +5490,69 @@ static QDF_STATUS send_set_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_hand 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 @@ -5519,6 +5582,7 @@ static 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 */ @@ -5558,6 +5622,12 @@ static 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", @@ -5584,7 +5654,6 @@ static 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, @@ -5818,7 +5887,9 @@ static 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 += qdf_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)); @@ -6356,6 +6427,57 @@ static QDF_STATUS send_roam_scan_filter_cmd_tlv(wmi_unified_t wmi_handle, return status; } +#if defined(WLAN_FEATURE_FILS_SK) +static 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 += qdf_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 @@ -13976,11 +14098,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); @@ -13991,6 +14115,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 @@ -14004,15 +14129,31 @@ QDF_STATUS send_gtk_offload_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id, /* Copy the keys and replay counter */ qdf_mem_copy(cmd->KCK, params->kck, PMO_KCK_LEN); - qdf_mem_copy(cmd->KEK, params->kek, PMO_KEK_LEN); + qdf_mem_copy(cmd->KEK, params->kek, PMO_KEK_LEN_LEGACY); qdf_mem_copy(cmd->replay_counter, ¶ms->replay_counter, GTK_REPLAY_COUNTER_BYTES); } else { cmd->flags = gtk_offload_opcode; } - WMI_LOGD("VDEVID: %d, GTK_FLAGS: x%x", vdev_id, cmd->flags); + buf_ptr += sizeof(*cmd); + WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, sizeof(*ext_param)); + buf_ptr += WMI_TLV_HDR_SIZE; + 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->kek, params->kek_len); + qdf_mem_copy(ext_param->KCK, params->kck, WMI_GTK_OFFLOAD_KCK_BYTES); + qdf_mem_copy(ext_param->replay_counter, ¶ms->replay_counter, + 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, WMI_GTK_OFFLOAD_CMDID)) { @@ -19243,6 +19384,74 @@ error: return status; } +/** + * 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, + struct wmi_unified_pmk_cache *pmk_info) +{ + 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 = pmk_info->session_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); + qdf_mem_copy(&(pmksa->bssid), &(pmk_info->bssid), sizeof(wmi_mac_addr)); + pmksa->ssid.ssid_len = pmk_info->ssid.length; + qdf_mem_copy(&(pmksa->ssid.ssid), &(pmk_info->ssid.mac_ssid), + pmksa->ssid.ssid_len); + 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, .send_vdev_delete_cmd = send_vdev_delete_cmd_tlv, @@ -19637,6 +19846,10 @@ struct wmi_ops tlv_ops = { extract_reg_ch_avoid_event_tlv, .send_set_arp_stats_req_cmd = send_set_arp_stats_req_cmd_tlv, .send_get_arp_stats_req_cmd = send_get_arp_stats_req_cmd_tlv, + .send_set_del_pmkid_cache_cmd = send_set_del_pmkid_cache_cmd_tlv, +#if defined(WLAN_FEATURE_FILS_SK) + .send_roam_scan_hlp_cmd = send_roam_scan_send_hlp_cmd_tlv, +#endif }; /**