wlan: Fix for DHCP failure in GO + STA.

TL handles STA with TDLS peer similiar as AP mode or concurrent mode
LIM->SME properly propagate TDLSDelStaRsp to HDD and HDD maintains PTeerTable accordingly
Merging using lhoonki_prima_1.2_to_dev_tdls.

CRs-Fixed: 443359

Change-Id: I3354578f32a2c14d2cca7a323fe2da53a6327478
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 6a6fb50..6c52f39 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -533,6 +533,10 @@
                 pTLConfig->uMinFramesProcThres;
 #endif
 
+#ifdef FEATURE_WLAN_TDLS
+  pTLCb->ucTdlsPeerCount = 0;
+#endif
+
   pTLCb->tlConfigInfo.uDelayedTriggerFrmInt =
                 pTLConfig->uDelayedTriggerFrmInt;
 
@@ -1360,6 +1364,10 @@
       VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
          " %s fails to start forwarding", __func__);
     }
+#ifdef FEATURE_WLAN_TDLS
+    if( WLAN_STA_TDLS == pwSTADescType->wSTAType )
+        pTLCb->ucTdlsPeerCount++;
+#endif
 #ifdef WLAN_SOFTAP_FEATURE
   }
 #endif
@@ -1443,6 +1451,13 @@
      WLANTL_BaSessionDel (pvosGCtx, ucSTAId, ucIndex);
   }
 
+#ifdef FEATURE_WLAN_TDLS
+  /* decrement ucTdlsPeerCount only if it is non-zero */
+  if(WLAN_STA_TDLS == pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType
+      && pTLCb->ucTdlsPeerCount)
+      pTLCb->ucTdlsPeerCount--;
+#endif
+
   /*------------------------------------------------------------------------
     Clear station
    ------------------------------------------------------------------------*/
@@ -1639,7 +1654,7 @@
 
   if ( 0 == pTLCb->atlSTAClients[ucSTAId].ucExists )
   {
-    TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+    TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
      "WLAN TL:Station was not previously registered on WLANTL_GetSTAState"));
     return VOS_STATUS_E_EXISTS;
   }
@@ -1764,10 +1779,17 @@
     through WLANTL_TX_STAID_AC_IND message.
   -----------------------------------------------------------------------*/
 #ifdef WLAN_SOFTAP_FEATURE
+#ifdef FETURE_WLAN_TDLS
+    if ((WLAN_STA_SOFTAP != pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType) &&
+        !(vos_concurrent_sessions_running()) &&
+        !pTLCb->ucTdlsPeerCount)
+    {
+#else
     if ((WLAN_STA_SOFTAP != pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType) &&
         !(vos_concurrent_sessions_running()))
     {
 #endif
+#endif
 
       pTLCb->atlSTAClients[ucSTAId].aucACMask[ucAc] = 1; 
 
@@ -5970,9 +5992,16 @@
   /*------------------------------------------------------------------------
     Fetch packet from HDD
    ------------------------------------------------------------------------*/
+#ifdef FEATURE_WLAN_TDLS
+  if ((WLAN_STA_SOFTAP != pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType) &&
+      (!vos_concurrent_sessions_running()) &&
+      !pTLCb->ucTdlsPeerCount)
+  {
+#else
   if ((WLAN_STA_SOFTAP != pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType) &&
       (!vos_concurrent_sessions_running()))
   {
+#endif
       ucAC = pTLCb->atlSTAClients[ucSTAId].ucCurrentAC;
 
   /*-------------------------------------------------------------------
@@ -6314,10 +6343,17 @@
     Fetch packet from HDD
    ------------------------------------------------------------------------*/
 #ifdef WLAN_SOFTAP_FEATURE
+#ifdef FEATURE_WLAN_TDLS
+  if ((WLAN_STA_SOFTAP != pTLCb->atlSTAClients[ucSTAId].wSTADesc.wSTAType) &&
+      (!vos_concurrent_sessions_running()) &&
+      !pTLCb->ucTdlsPeerCount)
+  {
+#else
   if ((WLAN_STA_SOFTAP != pStaClient->wSTADesc.wSTAType) &&
       (!vos_concurrent_sessions_running()))
   {
 #endif
+#endif
   ucAC = pStaClient->ucCurrentAC;
 
   /*-------------------------------------------------------------------
@@ -6860,7 +6896,7 @@
     /* that we get an EAPOL packet in WAPI mode or vice versa? */
     if ( WLANTL_LLC_8021X_TYPE  != usEtherType && WLANTL_LLC_WAI_TYPE  != usEtherType )
     {
-      VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+      VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
                  "WLAN TL:RX Frame not EAPOL or WAI EtherType %d - dropping", usEtherType );
       /* Drop packet */
       vos_pkt_return_packet(vosDataBuff);
@@ -8349,7 +8385,8 @@
 
 #ifdef FEATURE_WLAN_TDLS
 
-  if( WLAN_STA_INFRA == pTLCb->atlSTAClients[ucStaId].wSTADesc.wSTAType )
+  if( WLAN_STA_INFRA == pTLCb->atlSTAClients[ucStaId].wSTADesc.wSTAType
+      && pTLCb->ucTdlsPeerCount)
   {
     v_U8_t ucIndex = 0;
     for ( ucIndex = 0; ucIndex < WLAN_MAX_STA_COUNT ; ucIndex++)
@@ -9514,12 +9551,7 @@
   }
 
   systemRole = wdaGetGlobalSystemRole(pMac);
-  if ((eSYSTEM_AP_ROLE == systemRole) || (vos_concurrent_sessions_running()))
-  {
-    return WLAN_TLAPGetNextTxIds(pvosGCtx,pucSTAId);
-  }
 
-  
   /*------------------------------------------------------------------------
     Extract TL control block
   ------------------------------------------------------------------------*/
@@ -9531,6 +9563,16 @@
     return VOS_STATUS_E_FAULT;
   }
 
+#ifdef FEATURE_WLAN_TDLS
+  if ((eSYSTEM_AP_ROLE == systemRole) || (vos_concurrent_sessions_running()) || pTLCb->ucTdlsPeerCount)
+#else
+  if ((eSYSTEM_AP_ROLE == systemRole) || (vos_concurrent_sessions_running()))
+#endif
+  {
+    return WLAN_TLAPGetNextTxIds(pvosGCtx,pucSTAId);
+  }
+
+
   if ( VOS_STATUS_SUCCESS != WDA_DS_GetTxFlowMask( pvosGCtx, &uFlowMask ) )
   {
     TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index d3aa20a..1f0bc7b 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -834,6 +834,12 @@
   v_U8_t done_once;
   v_U8_t uFramesProcThres;
 #endif
+#ifdef FEATURE_WLAN_TDLS
+  /*number of total TDLS peers registered to TL
+    Incremented at WLANTL_RegisterSTAClient(staType == WLAN_STA_TDLS)
+    Decremented at WLANTL_ClearSTAClient(staType == WLAN_STA_TDLS) */
+  v_U8_t        ucTdlsPeerCount;
+#endif
   /*whether we are in BMPS/UAPSD/WOWL mode, since the latter 2 need to be BMPS first*/
   v_BOOL_t                  isBMPS;
   /* Whether WDA_DS_TX_START_XMIT msg is pending or not */