diff options
| author | gaurank kathpalia <gkathpal@codeaurora.org> | 2018-07-10 16:05:38 +0530 |
|---|---|---|
| committer | nshrivas <nshrivas@codeaurora.org> | 2018-07-16 12:54:58 -0700 |
| commit | 849c007d420b7531c8f7729e41c9af9778a66293 (patch) | |
| tree | a014b5b8c666050027b9b41325ad2a4a725a8209 | |
| parent | f79c7951f65f69a2e10d7c0316382e5593a01323 (diff) | |
qcacmn: Fix GTK offload req params
Currently the host sends the fixed gtk offload params
and the FILS TLV params, even when the FILS feature is disabled
in the host, which force firmware to pick the KEK from the
FILS TLV structure rather than from the fixed param structure,
which further leads to GTK re-keying feature fail.
Fix is to send only the fixed params in case when host doesnt
supports FILS.
Change-Id: I53a77257e716bf290a6f4bd62927020f073e2df6
CRs-Fixed: 2275938
| -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); |
