summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c145
-rw-r--r--core/sme/src/common/sme_api.c2
-rw-r--r--core/wma/src/wma_features.c3
3 files changed, 111 insertions, 39 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 5ed4d014185e..54416d94318a 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -3775,6 +3775,62 @@ wlan_hdd_cfg80211_get_logger_supp_feature(struct wiphy *wiphy,
return ret;
}
+/**
+ * wlan_hdd_save_gtk_offload_params() - Save gtk offload parameters in STA
+ * context for offload operations.
+ * @adapter: Adapter context
+ * @kck_ptr: KCK buffer pointer
+ * @kek_ptr: KEK buffer pointer
+ * @replay_ctr: Pointer to 64 bit long replay counter
+ * @big_endian: true if replay_ctr is in big endian format
+ * @ul_flags: Offload flags
+ *
+ * Return: None
+ */
+#ifdef WLAN_FEATURE_GTK_OFFLOAD
+static void wlan_hdd_save_gtk_offload_params(hdd_adapter_t *adapter,
+ uint8_t *kck_ptr,
+ uint8_t *kek_ptr,
+ uint8_t *replay_ctr,
+ bool big_endian,
+ uint32_t ul_flags)
+{
+ hdd_station_ctx_t *hdd_sta_ctx;
+ uint8_t *p;
+ int i;
+
+ hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+ memcpy(hdd_sta_ctx->gtkOffloadReqParams.aKCK, kck_ptr,
+ NL80211_KCK_LEN);
+ memcpy(hdd_sta_ctx->gtkOffloadReqParams.aKEK, kek_ptr,
+ NL80211_KEK_LEN);
+ qdf_copy_macaddr(&hdd_sta_ctx->gtkOffloadReqParams.bssid,
+ &hdd_sta_ctx->conn_info.bssId);
+ /*
+ * changing from big to little endian since driver
+ * works on little endian format
+ */
+ p = (uint8_t *)&hdd_sta_ctx->gtkOffloadReqParams.ullKeyReplayCounter;
+
+ for (i = 0; i < 8; i++) {
+ if (big_endian)
+ p[7 - i] = replay_ctr[i];
+ else
+ p[i] = replay_ctr[i];
+ }
+ hdd_sta_ctx->gtkOffloadReqParams.ulFlags = ul_flags;
+}
+#else
+static void wlan_hdd_save_gtk_offload_params(hdd_adapter_t *adapter,
+ uint8_t *kck_ptr,
+ uint8_t *kek_ptr,
+ uint8_t *replay_ctr,
+ bool big_endian,
+ uint32_t ul_flags)
+{
+}
+#endif
+
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* wlan_hdd_send_roam_auth_event() - Send the roamed and authorized event
@@ -3810,6 +3866,7 @@ int wlan_hdd_send_roam_auth_event(hdd_adapter_t *adapter, uint8_t *bssid,
hdd_context_t *hdd_ctx_ptr = WLAN_HDD_GET_CTX(adapter);
struct sk_buff *skb = NULL;
eCsrAuthType auth_type;
+
ENTER();
if (wlan_hdd_validate_context(hdd_ctx_ptr))
@@ -3874,6 +3931,20 @@ int wlan_hdd_send_roam_auth_event(hdd_adapter_t *adapter, uint8_t *bssid,
hdd_err("nla put fail");
goto nla_put_failure;
}
+
+ /*
+ * Save the gtk rekey parameters in HDD STA context. They will
+ * be used next time when host enables GTK offload and goes
+ * into power save state.
+ */
+ wlan_hdd_save_gtk_offload_params(adapter, roam_info_ptr->kck,
+ roam_info_ptr->kek,
+ roam_info_ptr->replay_ctr,
+ true,
+ GTK_OFFLOAD_DISABLE);
+ hdd_info("roam_info_ptr->replay_ctr 0x%llx",
+ *((uint64_t *)roam_info_ptr->replay_ctr));
+
} else {
hdd_debug("No Auth Params TLV's");
if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED,
@@ -14643,6 +14714,10 @@ void wlan_hdd_cfg80211_update_replay_counter_callback(void *callbackContext,
}
}
+ hdd_info("GtkOffloadGetInfoRsp replay counter 0x%llx, value reported to supplicant 0x%llx",
+ pGtkOffloadGetInfoRsp->ullKeyReplayCounter,
+ *((uint64_t *)tempReplayCounter));
+
/* Update replay counter to NL */
cfg80211_gtk_rekey_notify(pAdapter->dev,
pGtkOffloadGetInfoRsp->bssid.bytes,
@@ -14664,12 +14739,12 @@ int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_gtk_rekey_data *data)
{
- hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
- hdd_context_t *pHddCtx = wiphy_priv(wiphy);
- hdd_station_ctx_t *pHddStaCtx;
- tHalHandle hHal;
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ hdd_station_ctx_t *hdd_sta_ctx;
+ tHalHandle hal;
int result;
- tSirGtkOffloadParams hddGtkOffloadReqParams;
+ tSirGtkOffloadParams hdd_gtk_offload_req_params;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
ENTER();
@@ -14679,56 +14754,50 @@ int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
return -EINVAL;
}
- if (wlan_hdd_validate_session_id(pAdapter->sessionId)) {
- hdd_err("invalid session id: %d", pAdapter->sessionId);
+ if (wlan_hdd_validate_session_id(adapter->sessionId)) {
+ hdd_err("invalid session id: %d", adapter->sessionId);
return -EINVAL;
}
MTRACE(qdf_trace(QDF_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_SET_REKEY_DATA,
- pAdapter->sessionId, pAdapter->device_mode));
+ adapter->sessionId, adapter->device_mode));
- result = wlan_hdd_validate_context(pHddCtx);
+ result = wlan_hdd_validate_context(hdd_ctx);
if (0 != result)
return result;
- pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
- hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
- if (NULL == hHal) {
+ hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+ hal = WLAN_HDD_GET_HAL_CTX(adapter);
+ if (NULL == hal) {
hdd_err("HAL context is Null!!!");
return -EAGAIN;
}
- pHddStaCtx->gtkOffloadReqParams.ulFlags = GTK_OFFLOAD_ENABLE;
- memcpy(pHddStaCtx->gtkOffloadReqParams.aKCK, data->kck,
- NL80211_KCK_LEN);
- memcpy(pHddStaCtx->gtkOffloadReqParams.aKEK, data->kek,
- NL80211_KEK_LEN);
- qdf_copy_macaddr(&pHddStaCtx->gtkOffloadReqParams.bssid,
- &pHddStaCtx->conn_info.bssId);
- {
- /* changing from big to little endian since driver
- * works on little endian format
- */
- uint8_t *p =
- (uint8_t *) &pHddStaCtx->gtkOffloadReqParams.
- ullKeyReplayCounter;
- int i;
-
- for (i = 0; i < 8; i++) {
- p[7 - i] = data->replay_ctr[i];
- }
- }
-
- if (true == pHddCtx->hdd_wlan_suspended) {
+ /*
+ * Save gtk rekey parameters in HDD STA context. They will be used
+ * repeatedly when host goes into power save mode.
+ */
+ wlan_hdd_save_gtk_offload_params(adapter,
+ (uint8_t *)data->kck,
+ (uint8_t *)data->kek,
+ (uint8_t *)data->replay_ctr,
+ true,
+ GTK_OFFLOAD_ENABLE);
+ hdd_info("replay counter from supplicant 0x%llx, value stored in ullKeyReplayCounter 0x%llx",
+ *((uint64_t *)data->replay_ctr),
+ hdd_sta_ctx->gtkOffloadReqParams.ullKeyReplayCounter);
+
+
+ if (hdd_ctx->hdd_wlan_suspended) {
/* if wlan is suspended, enable GTK offload directly from here */
- memcpy(&hddGtkOffloadReqParams,
- &pHddStaCtx->gtkOffloadReqParams,
+ memcpy(&hdd_gtk_offload_req_params,
+ &hdd_sta_ctx->gtkOffloadReqParams,
sizeof(tSirGtkOffloadParams));
status =
- sme_set_gtk_offload(hHal, &hddGtkOffloadReqParams,
- pAdapter->sessionId);
+ sme_set_gtk_offload(hal, &hdd_gtk_offload_req_params,
+ adapter->sessionId);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("sme_set_gtk_offload failed, status(%d)",
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 96938c7a2e5f..835b7beb004e 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -6364,7 +6364,7 @@ QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
- "%s: KeyReplayCounter: %lld", __func__,
+ "%s: KeyReplayCounter: 0x%llx", __func__,
pGtkOffload->ullKeyReplayCounter);
if (NULL == pSession) {
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 7ed7ea689140..c53ff8a46206 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -5428,6 +5428,9 @@ QDF_STATUS wma_process_gtk_offload_req(tp_wma_handle wma,
WMA_LOGD("%s Enter", __func__);
+ WMA_LOGD("%s replay_ctr 0x%llx", __func__,
+ params->ullKeyReplayCounter);
+
/* Get the vdev id */
if (!wma_find_vdev_by_bssid(wma, params->bssid.bytes, &vdev_id)) {
WMA_LOGE("vdev handle is invalid for %pM", params->bssid.bytes);