summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgaurank kathpalia <gkathpal@codeaurora.org>2018-07-10 16:05:38 +0530
committernshrivas <nshrivas@codeaurora.org>2018-07-16 12:54:58 -0700
commit849c007d420b7531c8f7729e41c9af9778a66293 (patch)
treea014b5b8c666050027b9b41325ad2a4a725a8209
parentf79c7951f65f69a2e10d7c0316382e5593a01323 (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.h2
-rw-r--r--wmi/src/wmi_unified_tlv.c59
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,
+ &params->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, &params->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);