wlan: CCX upload support for statically linked driver
jb_mr2 enforces drivers must be statically linked and
does not support dynamically linked driver. CCX feature
has 7 proprietary files which cannot be pushed to public domain.
The changes in the 7 files are pushed to wpa_supplicant.
These are the changes required to support uploaded
approach and as well as support backward compatibility.
1. Traffic stream Metrics and TSR IE structures are moved
to common header files
2. Forwarding the IAPP data frame to wpa_supplicant incase
of CCX connection along with LLC header
3. Implementation of driver private commands
3.1 SETCCKMIE
3.2 GETTSMSTATS
3.3 SETCCXROAMSCANCHANNELS
4. Implementation of IWEVCUSTOM events
4.1 Sending CCKMPREAUTHNOTIFY event with bssid and TSF
4.2 Sending TSMIE event
4.3 Sending CCXADJAPREP event with roam delay info
5. New feature macro FEATURE_WLAN_CCX_UPLOAD added
Change-Id: Ic185d531de6e5b13984df1c563b0453f313afa27
CRs-Fixed: 555470
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index ecc63fa..6076c22 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -4209,7 +4209,7 @@
if ( NULL != pfnSTAFsm )
{
pClientSTA->ucNoMoreData = 0;
- vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf);
+ vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf, VOS_FALSE);
if (( VOS_STATUS_SUCCESS != vosStatus ) &&
( NULL != vosTempBuf ))
@@ -4345,7 +4345,7 @@
if ( NULL != pfnSTAFsm )
{
pClientSTA->ucNoMoreData = 0;
- vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf);
+ vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf, VOS_FALSE);
if (( VOS_STATUS_SUCCESS != vosStatus ) &&
( NULL != vosTempBuf ))
@@ -4925,7 +4925,7 @@
}/*WLANTL_ForwardSTAFrames*/
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
/*==========================================================================
FUNCTION WLANTL_IsIAPPFrame
@@ -5171,7 +5171,7 @@
/* software frame translation for BTAMP WDS.*/
WLANTL_Translate80211To8023Header( vosTempBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb,ucSTAId );
+ ucMPDUHLen, pTLCb,ucSTAId, VOS_FALSE);
}
if (pTLCb->tlBAPClient.pfnTlBAPRx)
@@ -5470,6 +5470,8 @@
v_U8_t ucMPDUHLen = 0 ;
v_U16_t usEtherType = 0;
#endif
+ v_BOOL_t bForwardIAPPwithLLC = VOS_FALSE;
+
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
@@ -5762,7 +5764,23 @@
continue;
}
-#ifdef FEATURE_WLAN_CCX
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ if ((pClientSTA->wSTADesc.ucIsCcxSta)|| broadcast)
+ {
+ /*--------------------------------------------------------------------
+ Filter the IAPP frames for CCX connection;
+ if data it will return false and it
+ will be routed through the regular data path
+ --------------------------------------------------------------------*/
+ if ( WLANTL_IsIAPPFrame(pvBDHeader,
+ vosTempBuff))
+ {
+ bForwardIAPPwithLLC = VOS_TRUE;
+ }
+ }
+#endif
+
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
if ((pClientSTA->wSTADesc.ucIsCcxSta)|| broadcast)
{
/*--------------------------------------------------------------------
@@ -5790,7 +5808,7 @@
continue;
}
}
-#endif
+#endif /* defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD) */
if ( WLAN_STA_BT_AMP == pClientSTA->wSTADesc.wSTAType )
{
@@ -5857,7 +5875,7 @@
FL("Failed to Read SNR")));
}
- pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuff);
+ pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuff, bForwardIAPPwithLLC);
}
else
{
@@ -6129,7 +6147,7 @@
*/
}
pfnSTAFsm( vos_get_global_context(VOS_MODULE_ID_TL,pTLCb), ucSTAId,
- &vosTempBuff);
+ &vosTempBuff, VOS_FALSE);
}
else
{
@@ -6613,7 +6631,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
v_U16_t usPktLen;
@@ -6986,7 +7005,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
v_U16_t usPktLen;
@@ -7436,7 +7456,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -7514,7 +7535,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -7637,7 +7659,7 @@
}
vosStatus = WLANTL_Translate80211To8023Header( vosDataBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb, ucSTAId);
+ ucMPDUHLen, pTLCb, ucSTAId, bForwardIAPPwithLLC);
if ( VOS_STATUS_SUCCESS != vosStatus )
{
@@ -7878,7 +7900,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -8097,7 +8120,7 @@
usActualHLen = usMPDUDOffset - ucMPDUHOffset;
}
vosStatus = WLANTL_Translate80211To8023Header( vosDataBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb, ucSTAId);
+ ucMPDUHLen, pTLCb, ucSTAId, bForwardIAPPwithLLC);
if ( VOS_STATUS_SUCCESS != vosStatus )
{
@@ -8289,7 +8312,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
@@ -9080,7 +9104,11 @@
WLANTL_STAClientType* pClientSTA = NULL;
v_U8_t ucQoSOffset = WLAN80211_MANDATORY_HEADER_SIZE;
v_U8_t ucStaId;
-
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ v_BOOL_t bIAPPTxwithLLC = VOS_FALSE;
+ v_SIZE_t wIAPPSnapSize = WLANTL_LLC_HEADER_LEN;
+ v_U8_t wIAPPSnap[WLANTL_LLC_HEADER_LEN] = {0};
+#endif
*ucWDSEnabled = 0; // default WDS off.
vosStatus = vos_pkt_pop_head( vosDataBuff, &w8023Header,
sizeof(w8023Header));
@@ -9139,8 +9167,28 @@
}
#endif
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+if ((0 == w8023Header.usLenType) && (pClientSTA->wSTADesc.ucIsCcxSta))
+{
+ vos_pkt_extract_data(vosDataBuff,0,&wIAPPSnap[0],&wIAPPSnapSize);
+ if (vos_mem_compare(wIAPPSnap,WLANTL_AIRONET_SNAP_HEADER,WLANTL_LLC_HEADER_LEN))
+ {
+ /*The SNAP and the protocol type are already in the data buffer.
+ They are filled by the application (wpa_supplicant). So, Skip Adding LLC below.*/
+ bIAPPTxwithLLC = VOS_TRUE;
+ }
+ else
+ {
+ bIAPPTxwithLLC = VOS_FALSE;
+ }
+}
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
- if ( 0 != pClientSTA->wSTADesc.ucAddRmvLLC )
+ if ((0 != pClientSTA->wSTADesc.ucAddRmvLLC)
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ && (!bIAPPTxwithLLC)
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
+ )
{
/* Push the length */
vosStatus = vos_pkt_push_head(vosDataBuff,
@@ -9185,6 +9233,9 @@
}/*If add LLC is enabled*/
else
{
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ bIAPPTxwithLLC = VOS_FALSE; /*Reset the Flag here to start afresh with the next TX pkt*/
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL: STA Client registered to not remove LLC"
" WLANTL_Translate8023To80211Header"));
@@ -9452,7 +9503,8 @@
v_U16_t usActualHLen,
v_U8_t ucHeaderLen,
WLANTL_CbType* pTLCb,
- v_U8_t ucSTAId
+ v_U8_t ucSTAId,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_8023HeaderType w8023Header;
@@ -9542,7 +9594,11 @@
return VOS_STATUS_E_FAILURE;
}
- if ( 0 != pTLCb->atlSTAClients[ucSTAId]->wSTADesc.ucAddRmvLLC )
+ if ( 0 != pTLCb->atlSTAClients[ucSTAId]->wSTADesc.ucAddRmvLLC
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ && (!bForwardIAPPwithLLC)
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
+ )
{
// Extract the LLC header
vosStatus = vos_pkt_pop_head( vosDataBuff, aucLLCHeader,