diff options
| -rw-r--r-- | wmi/inc/wmi_unified_param.h | 2 | ||||
| -rw-r--r-- | wmi/src/wmi_unified_tlv.c | 59 |
2 files changed, 41 insertions, 20 deletions
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index f3e0c86382b4..8bf35ef108c6 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -3405,6 +3405,7 @@ struct periodic_tx_pattern { * @kek_len: Kek length * @ullKeyReplayCounter: replay counter * @bssid: bss id + * @is_fils_connection: Whether the present connection with the AP is FILS */ struct gtk_offload_params { uint32_t ulFlags; @@ -3413,6 +3414,7 @@ struct gtk_offload_params { uint32_t kek_len; uint64_t ullKeyReplayCounter; struct qdf_mac_addr bssid; + bool is_fils_connection; }; /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index bda12de35414..1a8cde22ebe1 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -9230,6 +9230,34 @@ send_cmd: return QDF_STATUS_SUCCESS; } +static void +fill_fils_tlv_params(WMI_GTK_OFFLOAD_CMD_fixed_param *cmd, + uint8_t vdev_id, + struct gtk_offload_params *params) +{ + uint8_t *buf_ptr; + wmi_gtk_offload_fils_tlv_param *ext_param; + + buf_ptr = (uint8_t *) cmd + 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->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); +} + /** * send_gtk_offload_cmd_tlv() - send GTK offload command to fw * @wmi_handle: wmi handle @@ -9246,13 +9274,18 @@ 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) + WMI_TLV_HDR_SIZE + sizeof(*ext_param); + len = sizeof(*cmd); + /** + * In case of FILS connection, the buf will contain fixed params + * and the FILS lv params, so accordingly allocate the buffer. + */ + if (params->is_fils_connection) + len += WMI_TLV_HDR_SIZE + + sizeof(wmi_gtk_offload_fils_tlv_param); /* alloc wmi buffer */ buf = wmi_buf_alloc(wmi_handle, len); @@ -9263,7 +9296,6 @@ 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 @@ -9284,22 +9316,9 @@ 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; - - 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); + /* In case of FILS connection the FW requires FILS tlv params */ + if (params->is_fils_connection) + fill_fils_tlv_params(cmd, vdev_id, params); WMI_LOGD("VDEVID: %d, GTK_FLAGS: x%x kek len %d", vdev_id, cmd->flags, params->kek_len); |
