wlan: Support to have IE passed by supplicant through sched_scan interface

Supplicant shall add extra ie information as part of PNO request
to the driver, This commit publishes max_sched_scan_ie_len
to NL interface to support such PNO scan request.

CRs-fixed: 546962
Change-Id: I73c41133565c76901bba748ba2cd49ad5a4ca4ff
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index f9783ec..00a911c 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -671,6 +671,7 @@
     wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
     wiphy->max_sched_scan_ssids = SIR_PNO_MAX_SUPP_NETWORKS;
     wiphy->max_match_sets       = SIR_PNO_MAX_SUPP_NETWORKS;
+    wiphy->max_sched_scan_ie_len = SIR_MAC_MAX_IE_LENGTH;
 #endif/*FEATURE_WLAN_SCAN_PNO*/
 
 #ifdef CONFIG_ENABLE_LINUX_REG
@@ -7506,6 +7507,19 @@
         pPnoRequest->aNetworks[i].rssiThreshold = 0; //Default value
     }
 
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+              "request->ie_len = %d", request->ie_len);
+    if ((0 < request->ie_len) && (NULL != request->ie))
+    {
+        pPnoRequest->us24GProbeTemplateLen = request->ie_len;
+        memcpy(&pPnoRequest->p24GProbeTemplate, request->ie,
+                pPnoRequest->us24GProbeTemplateLen);
+
+        pPnoRequest->us5GProbeTemplateLen = request->ie_len;
+        memcpy(&pPnoRequest->p5GProbeTemplate, request->ie,
+                pPnoRequest->us5GProbeTemplateLen);
+    }
+
     /* Driver gets only one time interval which is hardcoded in
      * supplicant for 10000ms. Taking power consumption into account 6 timers
      * will be used, Timervalue is increased exponentially i.e 10,20,40,
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index 6279221..9150652 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -2958,12 +2958,60 @@
                                        csrFindBestPhyMode( pMac, pMac->roam.configParam.phyMode ));
 
     /*Prepare a probe request for 2.4GHz band and one for 5GHz band*/
-    pmcPrepareProbeReqTemplate(pMac,SIR_PNO_24G_DEFAULT_CH, ucDot11Mode, pSession->selfMacAddr, 
-                               pRequestBuf->p24GProbeTemplate, &pRequestBuf->us24GProbeTemplateLen); 
+    if (eSIR_SUCCESS == pmcPrepareProbeReqTemplate(pMac, SIR_PNO_24G_DEFAULT_CH,
+                              ucDot11Mode, pSession->selfMacAddr,
+                              pRequestBuf->p24GProbeTemplate,
+                              &pRequestBuf->us24GProbeTemplateLen))
+    {
+        /* Append IE passed by supplicant(if any) to probe request */
+        if ((0 < pRequest->us24GProbeTemplateLen) &&
+            ((pRequestBuf->us24GProbeTemplateLen +
+              pRequest->us24GProbeTemplateLen) < SIR_PNO_MAX_PB_REQ_SIZE ))
+        {
+            vos_mem_copy((tANI_U8 *)&pRequestBuf->p24GProbeTemplate +
+                          pRequestBuf->us24GProbeTemplateLen,
+                          (tANI_U8 *)&pRequest->p24GProbeTemplate,
+                          pRequest->us24GProbeTemplateLen);
+            pRequestBuf->us24GProbeTemplateLen +=
+                                                pRequest->us24GProbeTemplateLen;
+            VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+                   "%s: pRequest->us24GProbeTemplateLen = %d", __func__,
+                    pRequest->us24GProbeTemplateLen);
+        }
+        else
+        {
+            VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+                   "%s: Extra ie discarded on 2.4G, IE length = %d", __func__,
+                    pRequest->us24GProbeTemplateLen);
+        }
+    }
 
-    pmcPrepareProbeReqTemplate(pMac,SIR_PNO_5G_DEFAULT_CH, ucDot11Mode, pSession->selfMacAddr, 
-                               pRequestBuf->p5GProbeTemplate, &pRequestBuf->us5GProbeTemplateLen); 
-
+    if (eSIR_SUCCESS == pmcPrepareProbeReqTemplate(pMac, SIR_PNO_5G_DEFAULT_CH,
+                               ucDot11Mode, pSession->selfMacAddr,
+                               pRequestBuf->p5GProbeTemplate,
+                               &pRequestBuf->us5GProbeTemplateLen))
+    {
+        /* Append IE passed by supplicant(if any) to probe request */
+        if ((0 < pRequest->us5GProbeTemplateLen ) &&
+            ((pRequestBuf->us5GProbeTemplateLen +
+              pRequest->us5GProbeTemplateLen) < SIR_PNO_MAX_PB_REQ_SIZE ))
+        {
+            vos_mem_copy((tANI_U8 *)&pRequestBuf->p5GProbeTemplate +
+                          pRequestBuf->us5GProbeTemplateLen,
+                          (tANI_U8 *)&pRequest->p5GProbeTemplate,
+                          pRequest->us5GProbeTemplateLen);
+            pRequestBuf->us5GProbeTemplateLen += pRequest->us5GProbeTemplateLen;
+            VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+                    "%s: pRequestBuf->us5GProbeTemplateLen = %d", __func__,
+                     pRequest->us5GProbeTemplateLen);
+        }
+        else
+        {
+            VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+                   "%s: Extra IE discarded on 5G, IE length = %d", __func__,
+                    pRequest->us5GProbeTemplateLen);
+        }
+    }
 
     msg.type     = WDA_SET_PNO_REQ;
     msg.reserved = 0;