wlan: Enhancement of GTK rekey offload.

Earlier case supplicant was handling GTK rekeying
even when wlan suspended thus wlan host had to
come out from the sleep for GTK rekeying.
with this change, support for GTK offload has been added
so that firmware will take care of GTK rekey when
wlan is in suspend mode.
Enhancement of "wlan: Support for GTK rekey offload"

CRs-fixed: 467114
Change-Id: I5d90f5b51f47e851704b1007388686c66e39c7dc
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 933f5a8..7fff486 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -4900,13 +4900,13 @@
         }
 #endif /* FEATURE_WLAN_WAPI */
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
-        /* Initializing gtkOffloadRequestParams */
+        /* Initializing gtkOffloadReqParams */
         if ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
             (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))
         {
-            pHddStaCtx->gtkOffloadRequestParams.requested = FALSE;
-            memset(&pHddStaCtx->gtkOffloadRequestParams.gtkOffloadReqParams,
-                 0, sizeof (tSirGtkOffloadParams));
+            memset(&pHddStaCtx->gtkOffloadReqParams, 0,
+                  sizeof (tSirGtkOffloadParams));
+            pHddStaCtx->gtkOffloadReqParams.ulFlags = GTK_OFFLOAD_DISABLE;
         }
 #endif
         pRoamProfile->csrPersona = pAdapter->device_mode;
@@ -7783,6 +7783,8 @@
 {
 
     hdd_adapter_t *pAdapter = (hdd_adapter_t *)callbackContext;
+    tANI_U8 tempReplayCounter[8];
+    hdd_station_ctx_t *pHddStaCtx;
 
     ENTER();
 
@@ -7808,9 +7810,27 @@
         return ;
     }
 
+    pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+    /* Update replay counter */
+    pHddStaCtx->gtkOffloadReqParams.ullKeyReplayCounter =
+                                   pGtkOffloadGetInfoRsp->ullKeyReplayCounter;
+
+    {
+        /* changing from little to big endian since supplicant
+         * works on big endian format
+         */
+        int i;
+        tANI_U8 *p = (tANI_U8 *)&pGtkOffloadGetInfoRsp->ullKeyReplayCounter;
+
+        for (i = 0; i < 8; i++)
+        {
+            tempReplayCounter[7-i] = (tANI_U8)p[i];
+        }
+    }
+
     /* Update replay counter to NL */
     cfg80211_gtk_rekey_notify(pAdapter->dev, pGtkOffloadGetInfoRsp->bssId,
-          (tANI_U8 *)&pGtkOffloadGetInfoRsp->ullKeyReplayCounter, GFP_KERNEL);
+          tempReplayCounter, GFP_KERNEL);
 }
 
 /*
@@ -7825,7 +7845,7 @@
     hdd_station_ctx_t *pHddStaCtx;
     tHalHandle hHal;
     int result;
-    tpSirGtkOffloadParams pGtkOffloadReqParams;
+    tSirGtkOffloadParams hddGtkOffloadReqParams;
     eHalStatus status = eHAL_STATUS_FAILURE;
 
     ENTER();
@@ -7855,21 +7875,31 @@
         return -EAGAIN;
     }
 
-    pGtkOffloadReqParams =
-          &pHddStaCtx->gtkOffloadRequestParams.gtkOffloadReqParams;
-
-    pGtkOffloadReqParams->ulFlags = GTK_OFFLOAD_ENABLE;
-    memcpy(pGtkOffloadReqParams->aKCK, data->kck, NL80211_KCK_LEN);
-    memcpy(pGtkOffloadReqParams->aKEK, data->kek, NL80211_KEK_LEN);
-    memcpy(pGtkOffloadReqParams->bssId, &pHddStaCtx->conn_info.bssId,
+    pHddStaCtx->gtkOffloadReqParams.ulFlags = GTK_OFFLOAD_ENABLE;
+    memcpy(pHddStaCtx->gtkOffloadReqParams.aKCK, data->kck, NL80211_KCK_LEN);
+    memcpy(pHddStaCtx->gtkOffloadReqParams.aKEK, data->kek, NL80211_KEK_LEN);
+    memcpy(pHddStaCtx->gtkOffloadReqParams.bssId, &pHddStaCtx->conn_info.bssId,
           WNI_CFG_BSSID_LEN);
-    memcpy(&pGtkOffloadReqParams->ullKeyReplayCounter, &data->replay_ctr,
-          sizeof (tANI_U64));
+    {
+        /* changing from big to little endian since driver
+         * works on little endian format
+         */
+        tANI_U8 *p =
+              (tANI_U8 *)&pHddStaCtx->gtkOffloadReqParams.ullKeyReplayCounter;
+        int i;
+
+        for (i = 0; i < 8; i++)
+        {
+            p[7-i] = data->replay_ctr[i];
+        }
+    }
 
     if (TRUE == pHddCtx->hdd_wlan_suspended)
     {
         /* if wlan is suspended, enable GTK offload directly from here */
-        status = sme_SetGTKOffload(hHal, pGtkOffloadReqParams,
+        memcpy(&hddGtkOffloadReqParams, &pHddStaCtx->gtkOffloadReqParams,
+              sizeof (tSirGtkOffloadParams));
+        status = sme_SetGTKOffload(hHal, &hddGtkOffloadReqParams,
                        pAdapter->sessionId);
 
         if (eHAL_STATUS_SUCCESS != status)
@@ -7879,19 +7909,17 @@
                     __func__, status);
             return status;
         }
-        pHddStaCtx->gtkOffloadRequestParams.requested = FALSE;
         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
                 "%s: sme_SetGTKOffload successfull", __func__);
     }
     else
     {
-        pHddStaCtx->gtkOffloadRequestParams.requested = TRUE;
         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
                 "%s: wlan not suspended GTKOffload request is stored",
                 __func__);
-        return eHAL_STATUS_SUCCESS;
     }
-    return status;
+
+    return eHAL_STATUS_SUCCESS;
 }
 #endif /*WLAN_FEATURE_GTK_OFFLOAD*/