/*========================================================================== FUNCTION WDA_DS_PeekRxPacketInfo DESCRIPTION Return RX metainfo pointer for for integrated SOC. Same function will return BD header pointer. DEPENDENCIES PARAMETERS IN vosDataBuff vos data buffer pvDestMacAddr destination MAC address ponter bSwap Want to swap BD header? For backward compatability It does nothing for integrated SOC OUT *ppRxHeader RX metainfo pointer RETURN VALUE VOS_STATUS_E_FAULT: pointer is NULL and other errors VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WDA_DS_PeekRxPacketInfo ( vos_pkt_t *vosDataBuff, v_PVOID_t *ppRxHeader, v_BOOL_t bSwap ) { #if defined( FEATURE_WLAN_INTEGRATED_SOC ) /*------------------------------------------------------------------------ Sanity check ------------------------------------------------------------------------*/ if ( NULL == vosDataBuff ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WDA:Invalid parameter sent on WDA_DS_PeekRxPacketInfo" ); return VOS_STATUS_E_FAULT; } *ppRxHeader = WDI_DS_ExtractRxMetaData( (wpt_packet*)vosDataBuff ); if ( NULL == *ppRxHeader ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WDA:Failed to get RX meta data from WDI" ); return VOS_STATUS_E_FAILURE; } return VOS_STATUS_SUCCESS; #else /* FEATURE_WLAN_INTEGRATED_SOC */ VOS_STATUS vosStatus; vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)ppRxHeader, WLANHAL_RX_BD_HEADER_SIZE); if ( ( VOS_STATUS_SUCCESS != vosStatus ) || ( NULL == (v_PVOID_t)ppRxHeader ) ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WDA :Cannot extract BD header" ); return VOS_STATUS_E_FAILURE; } if ( VOS_TRUE == bSwap ) { WLANHAL_SwapRxBd( *ppRxHeader ); } return VOS_STATUS_SUCCESS; #endif /* FEATURE_WLAN_INTEGRATED_SOC */ }
v_BOOL_t hdd_IsEAPOLPacket( vos_pkt_t *pVosPacket ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; v_BOOL_t fEAPOL = VOS_FALSE; void *pBuffer = NULL; vosStatus = vos_pkt_peek_data( pVosPacket, (v_SIZE_t)HDD_ETHERTYPE_802_1_X_FRAME_OFFSET, &pBuffer, HDD_ETHERTYPE_802_1_X_SIZE ); if (VOS_IS_STATUS_SUCCESS( vosStatus ) ) { if ( vos_be16_to_cpu( *(unsigned short*)pBuffer ) == HDD_ETHERTYPE_802_1_X ) { fEAPOL = VOS_TRUE; } } return fEAPOL; }
v_BOOL_t hdd_IsWAIPacket( vos_pkt_t *pVosPacket ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; v_BOOL_t fIsWAI = VOS_FALSE; void *pBuffer = NULL; // Need to update this function vosStatus = vos_pkt_peek_data( pVosPacket, (v_SIZE_t)HDD_ETHERTYPE_802_1_X_FRAME_OFFSET, &pBuffer, HDD_ETHERTYPE_802_1_X_SIZE ); if (VOS_IS_STATUS_SUCCESS( vosStatus ) ) { if ( vos_be16_to_cpu( *(unsigned short*)pBuffer ) == HDD_ETHERTYPE_WAI) { fIsWAI = VOS_TRUE; } } return fIsWAI; }
/*--------------------------------------------------------------------------- wpalPacketGetRawBuf – Return the starting buffer virtual address for the RAW flat buffer It is inline in hope of faster implementation for certain platform. For Winxp, it will be slow. Param: pPkt - pointer to a wpt_packet. Return: NULL - fail. Otherwise the address of the starting of the buffer ---------------------------------------------------------------------------*/ wpt_uint8 *wpalPacketGetRawBuf(wpt_packet *pPkt) { wpt_uint8 *pRet = NULL; // Validate the parameter pointers if (unlikely(NULL == pPkt)) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s : NULL packet pointer", __func__); return NULL; } //Since it is a flat buffer, all we need is to get one byte of offset 0 if( (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) || (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ) { vos_pkt_peek_data(WPAL_TO_VOS_PKT(pPkt), 0, (v_VOID_t**)&pRet, 1); WPAL_ASSERT(NULL != pRet); } return pRet; }/*wpalPacketGetRawBuf*/
wpt_uint8 *wpalPacketGetRawBuf(wpt_packet *pPkt) { wpt_uint8 *pRet = NULL; // if (unlikely(NULL == pPkt)) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s : NULL packet pointer", __func__); return NULL; } // if( (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) || (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ) { vos_pkt_peek_data(WPAL_TO_VOS_PKT(pPkt), 0, (v_VOID_t**)&pRet, 1); WPAL_ASSERT(NULL != pRet); } return pRet; }/* */
/*========================================================================== FUNCTION WDA_DS_BuildTxPacketInfo DESCRIPTION Build TX meta info for integrated SOC. Same function calls HAL for reserve BD header space into VOS packet and HAL function to fill it. DEPENDENCIES PARAMETERS IN pvosGCtx VOS context vosDataBuff vos data buffer pvDestMacAddr destination MAC address ponter ucDisableFrmXtl Is frame xtl disabled? ucQosEnabled Is QoS enabled? ucWDSEnabled Is WDS enabled? extraHeadSpace Extra head bytes. If it's not 0 due to 4 bytes align of BD header. typeSubtype typeSubtype from MAC header or TX metainfo/BD pAddr2 address 2 uTid tid txFlag timeStamp ucIsEapol ucUP OUT *pusPktLen Packet length RETURN VALUE VOS_STATUS_E_FAULT: pointer is NULL and other errors VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WDA_DS_BuildTxPacketInfo ( v_PVOID_t pvosGCtx, vos_pkt_t* vosDataBuff, v_MACADDR_t* pvDestMacAddr, v_U8_t ucDisableFrmXtl, v_U16_t* pusPktLen, v_U8_t ucQosEnabled, v_U8_t ucWDSEnabled, v_U8_t extraHeadSpace, v_U8_t typeSubtype, v_PVOID_t pAddr2, v_U8_t uTid, v_U32_t txFlag, v_U32_t timeStamp, v_U8_t ucIsEapol, v_U8_t ucUP ) { VOS_STATUS vosStatus; WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL; v_SIZE_t usMacAddrSize; wpt_FrameCtrl *pFrameControl; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /*------------------------------------------------------------------------ Sanity check Extract TL control block ------------------------------------------------------------------------*/ if ( ( NULL == pvosGCtx ) || ( NULL == vosDataBuff ) || ( NULL == pvDestMacAddr ) ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WDA:Invalid parameter sent on WDA_DS_BuildTxPacketInfo" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Extract TX Meta Info pointer from PAL packet ------------------------------------------------------------------------*/ pTxMetaInfo = WDI_DS_ExtractTxMetaData( VOS_TO_WPAL_PKT(vosDataBuff) ); if ( NULL == pTxMetaInfo ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:Invalid RxMetaInfo pointer from PAL packet on WLANTL_RxFrames"); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAULT; } /* Zero out memeory */ vos_mem_zero( pTxMetaInfo, sizeof( WDI_DS_TxMetaInfoType ) ); /* Fill the TX Meta info */ pTxMetaInfo->txFlags = txFlag; pTxMetaInfo->qosEnabled = ucQosEnabled; pTxMetaInfo->fenableWDS = ucWDSEnabled; pTxMetaInfo->ac = ucUP; pTxMetaInfo->fUP = uTid; pTxMetaInfo->isEapol = ucIsEapol; pTxMetaInfo->fdisableFrmXlt = ucDisableFrmXtl; pTxMetaInfo->frmType = ( ( typeSubtype & 0x30 ) >> 4 ); pTxMetaInfo->typeSubtype = typeSubtype; /* Length = MAC header + payload */ vos_pkt_get_packet_length( vosDataBuff, pusPktLen); pTxMetaInfo->fPktlen = *pusPktLen; /* For management frames, peek into Frame Control field to get value of Protected Frame bit */ pTxMetaInfo->fProtMgmtFrame = 0; if ( WDA_TLI_MGMT_FRAME_TYPE == pTxMetaInfo->frmType ) { if ( 1 == ucDisableFrmXtl ) /* should be 802.11, but check */ { vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)&pFrameControl, sizeof( wpt_FrameCtrl )); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WDA: Failed while attempting to extract Protect Bit in " "Frame Control, status %d", vosStatus ); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAULT; } pTxMetaInfo->fProtMgmtFrame = pFrameControl->wep; VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, "WLAN TL: fProtMgmtFrame:%d", pTxMetaInfo->fProtMgmtFrame ); } } // Dst address usMacAddrSize = VOS_MAC_ADDR_SIZE; vosStatus = vos_pkt_extract_data( vosDataBuff, WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ), (v_PVOID_t)pvDestMacAddr, &usMacAddrSize ); if ((VOS_STATUS_SUCCESS != vosStatus) || (usMacAddrSize != VOS_MAC_ADDR_SIZE)) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WDA:Failed while attempting to extract MAC Addr %d", vosStatus ); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAULT; } vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr ); // ADDR2 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress, pAddr2 ); /* Dump TX meta infro for debugging */ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, "WLAN TL: Dump TX meta info: " "txFlags:%d, qosEnabled:%d, ac:%d, " "isEapol:%d, fdisableFrmXlt:%d, frmType:%d", pTxMetaInfo->txFlags, ucQosEnabled, pTxMetaInfo->ac, pTxMetaInfo->isEapol, pTxMetaInfo->fdisableFrmXlt, pTxMetaInfo->frmType ); return VOS_STATUS_SUCCESS; }
/*========================================================================== FUNCTION WDA_TLI_FastHwFwdDataFrame DESCRIPTION For NON integrated SOC, this function is called by TL. Fast path function to quickly forward a data frame if HAL determines BD signature computed here matches the signature inside current VOSS packet. If there is a match, HAL and TL fills in the swapped packet length into BD header and DxE header, respectively. Otherwise, packet goes back to normal (slow) path and a new BD signature would be tagged into BD in this VOSS packet later by the WLANHAL_FillTxBd() function. TODO For integrated SOC, this function does nothing yet. Pima SLM/HAL should provide the equivelant functionality. DEPENDENCIES PARAMETERS IN pvosGCtx VOS context vosDataBuff Ptr to VOSS packet pMetaInfo For getting frame's TID pStaInfo For checking STA type OUT pvosStatus returned status puFastFwdOK Flag to indicate whether frame could be fast forwarded RETURN VALUE No return. SIDE EFFECTS ============================================================================*/ void WDA_TLI_FastHwFwdDataFrame ( v_PVOID_t pvosGCtx, vos_pkt_t* vosDataBuff, VOS_STATUS* pvosStatus, v_U32_t* puFastFwdOK, WLANTL_MetaInfoType* pMetaInfo, WLAN_STADescType* pStaInfo ) { #if defined( FEATURE_WLAN_INTEGRATED_SOC ) /* FIXME WDI/WDA should support this function once HAL supports it */ #else /* FEATURE_WLAN_INTEGRATED_SOC */ v_PVOID_t pvPeekData; v_U8_t ucDxEBDWLANHeaderLen = WLANTL_BD_HEADER_LEN(0) + sizeof(WLANBAL_sDXEHeaderType); v_U8_t ucIsUnicast; WLANBAL_sDXEHeaderType *pDxEHeader; v_PVOID_t pvBDHeader; v_PVOID_t pucBuffPtr; v_U16_t usPktLen; /*----------------------------------------------------------------------- Extract packet length -----------------------------------------------------------------------*/ vos_pkt_get_packet_length( vosDataBuff, &usPktLen); /*----------------------------------------------------------------------- Extract MAC address -----------------------------------------------------------------------*/ *pvosStatus = vos_pkt_peek_data( vosDataBuff, WLANTL_MAC_ADDR_ALIGN(0), (v_PVOID_t)&pvPeekData, VOS_MAC_ADDR_SIZE ); if ( VOS_STATUS_SUCCESS != *pvosStatus ) { TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:Failed while attempting to extract MAC Addr %d", *pvosStatus)); *pvosStatus = VOS_STATUS_E_INVAL; return; } /*----------------------------------------------------------------------- Reserve head room for DxE header, BD, and WLAN header -----------------------------------------------------------------------*/ vos_pkt_reserve_head( vosDataBuff, &pucBuffPtr, ucDxEBDWLANHeaderLen ); if ( NULL == pucBuffPtr ) { TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:No enough space in VOSS packet %p for DxE/BD/WLAN header", vosDataBuff)); *pvosStatus = VOS_STATUS_E_INVAL; return; } pDxEHeader = (WLANBAL_sDXEHeaderType *)pucBuffPtr; pvBDHeader = (v_PVOID_t) &pDxEHeader[1]; /* UMA Tx acceleration is enabled. * UMA would help convert frames to 802.11, fill partial BD fields and * construct LLC header. To further accelerate this kind of frames, * HAL would attempt to reuse the BD descriptor if the BD signature * matches to the saved BD descriptor. */ if(pStaInfo->wSTAType == WLAN_STA_IBSS) ucIsUnicast = !(((tANI_U8 *)pvPeekData)[0] & 0x01); else ucIsUnicast = 1; *puFastFwdOK = (v_U32_t) WLANHAL_TxBdFastFwd(pvosGCtx, pvPeekData, pMetaInfo->ucTID, ucIsUnicast, pvBDHeader, usPktLen ); /* Can't be fast forwarded. Trim the VOS head back to original location. */ if(! *puFastFwdOK){ vos_pkt_trim_head(vosDataBuff, ucDxEBDWLANHeaderLen); }else{ /* could be fast forwarded. Now notify BAL DxE header filling could be completely skipped */ v_U32_t uPacketSize = WLANTL_BD_HEADER_LEN(0) + usPktLen; vos_pkt_set_user_data_ptr( vosDataBuff, VOS_PKT_USER_DATA_ID_BAL, (v_PVOID_t)uPacketSize); pDxEHeader->size = SWAP_ENDIAN_UINT32(uPacketSize); } *pvosStatus = VOS_STATUS_SUCCESS; return; #endif /* FEATURE_WLAN_INTEGRATED_SOC */ }
/*========================================================================== FUNCTION WDA_DS_PrepareBDHeader DESCRIPTION Inline function for preparing BD header before HAL processing. DEPENDENCIES Just notify HAL that suspend in TL is complete. PARAMETERS IN vosDataBuff: vos data buffer ucDisableFrmXtl: is frame xtl disabled OUT ppvBDHeader: it will contain the BD header pvDestMacAddr: it will contain the destination MAC address pvosStatus: status of the combined processing pusPktLen: packet len. RETURN VALUE No return. SIDE EFFECTS ============================================================================*/ void WDA_DS_PrepareBDHeader ( vos_pkt_t* vosDataBuff, v_PVOID_t* ppvBDHeader, v_MACADDR_t* pvDestMacAddr, v_U8_t ucDisableFrmXtl, VOS_STATUS* pvosStatus, v_U16_t* pusPktLen, v_U8_t ucQosEnabled, v_U8_t ucWDSEnabled, v_U8_t extraHeadSpace ) { v_U8_t ucHeaderOffset; v_U8_t ucHeaderLen; #ifndef WLAN_SOFTAP_FEATURE v_PVOID_t pvPeekData; #endif v_U8_t ucBDHeaderLen = WLANTL_BD_HEADER_LEN(ucDisableFrmXtl); /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /*------------------------------------------------------------------------- Get header pointer from VOSS !!! make sure reserve head zeros out the memory -------------------------------------------------------------------------*/ vos_pkt_get_packet_length( vosDataBuff, pusPktLen); if ( WLANTL_MAC_HEADER_LEN(ucDisableFrmXtl) > *pusPktLen ) { TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL: Length of the packet smaller than expected network" " header %d", *pusPktLen )); *pvosStatus = VOS_STATUS_E_INVAL; return; } vos_pkt_reserve_head( vosDataBuff, ppvBDHeader, ucBDHeaderLen ); if ( NULL == *ppvBDHeader ) { TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:VOSS packet corrupted on Attach BD header")); *pvosStatus = VOS_STATUS_E_INVAL; return; } /*----------------------------------------------------------------------- Extract MAC address -----------------------------------------------------------------------*/ #ifdef WLAN_SOFTAP_FEATURE { v_SIZE_t usMacAddrSize = VOS_MAC_ADDR_SIZE; *pvosStatus = vos_pkt_extract_data( vosDataBuff, ucBDHeaderLen + WLANTL_MAC_ADDR_ALIGN(ucDisableFrmXtl), (v_PVOID_t)pvDestMacAddr, &usMacAddrSize ); } #else *pvosStatus = vos_pkt_peek_data( vosDataBuff, ucBDHeaderLen + WLANTL_MAC_ADDR_ALIGN(ucDisableFrmXtl), (v_PVOID_t)&pvPeekData, VOS_MAC_ADDR_SIZE ); /*Fix me*/ vos_copy_macaddr(pvDestMacAddr, (v_MACADDR_t*)pvPeekData); #endif if ( VOS_STATUS_SUCCESS != *pvosStatus ) { TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:Failed while attempting to extract MAC Addr %d", *pvosStatus)); } else { /*--------------------------------------------------------------------- Fill MPDU info fields: - MPDU data start offset - MPDU header start offset - MPDU header length - MPDU length - this is a 16b field - needs swapping --------------------------------------------------------------------*/ ucHeaderOffset = ucBDHeaderLen; ucHeaderLen = WLANTL_MAC_HEADER_LEN(ucDisableFrmXtl); if ( 0 != ucDisableFrmXtl ) { if ( 0 != ucQosEnabled ) { ucHeaderLen += WLANTL_802_11_HEADER_QOS_CTL; } // Similar to Qos we need something for WDS format ! if ( ucWDSEnabled != 0 ) { // If we have frame translation enabled ucHeaderLen += WLANTL_802_11_HEADER_ADDR4_LEN; } if ( extraHeadSpace != 0 ) { // Decrease the packet length with the extra padding after the header *pusPktLen = *pusPktLen - extraHeadSpace; } } WLANHAL_TX_BD_SET_MPDU_HEADER_LEN( *ppvBDHeader, ucHeaderLen); WLANHAL_TX_BD_SET_MPDU_HEADER_OFFSET( *ppvBDHeader, ucHeaderOffset); WLANHAL_TX_BD_SET_MPDU_DATA_OFFSET( *ppvBDHeader, ucHeaderOffset + ucHeaderLen + extraHeadSpace); WLANHAL_TX_BD_SET_MPDU_LEN( *ppvBDHeader, *pusPktLen); TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WLAN TL: VALUES ARE HLen=%x Hoff=%x doff=%x len=%x ex=%d", ucHeaderLen, ucHeaderOffset, (ucHeaderOffset + ucHeaderLen + extraHeadSpace), *pusPktLen, extraHeadSpace)); }/* if peek MAC success*/ }/* WLANTL_PrepareBDHeader */
int bapRsnFormPktFromVosPkt( tAniPacket **ppPacket, vos_pkt_t *pVosPacket ) { int retVal = ANI_ERROR; VOS_STATUS status; v_U16_t uPktLen; #define BAP_RSN_SNAP_TYPE_OFFSET 20 #define BAP_RSN_ETHERNET_3_HEADER_LEN 22 v_U8_t *pFrame = NULL; tAniPacket *pAniPacket = NULL; do { status = vos_pkt_get_packet_length( pVosPacket, &uPktLen ); if( !VOS_IS_STATUS_SUCCESS(status) ) break; if( (uPktLen < BAP_RSN_ETHERNET_3_HEADER_LEN) ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, " authRsnRxFrameHandler receive eapol packet size (%d) too small (%d)\n", uPktLen, BAP_RSN_ETHERNET_3_HEADER_LEN ); break; } status = vos_pkt_peek_data( pVosPacket, 0, (v_VOID_t *)&pFrame, uPktLen ); if( !VOS_IS_STATUS_SUCCESS(status) || (NULL == pFrame) ) break; retVal = aniAsfPacketAllocateExplicit(&pAniPacket, uPktLen, 0 ); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, " authRsnRxFrameHandler failed to get buffer size (%d) \n", uPktLen ); break; } aniAsfPacketEmptyExplicit( pAniPacket, 0 ); pFrame[ETHER_PROTO_POS] = pFrame[BAP_RSN_SNAP_TYPE_OFFSET]; pFrame[ETHER_PROTO_POS + 1] = pFrame[BAP_RSN_SNAP_TYPE_OFFSET + 1]; //push ethernet II header in retVal = aniAsfPacketAppendBuffer( pAniPacket, pFrame, ETHER_PROTO_POS + 2 ); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; //Get the rest of the data in uPktLen -= BAP_RSN_ETHERNET_3_HEADER_LEN; if (uPktLen <= 0){ VOS_ASSERT(0); retVal = ANI_ERROR; break; } retVal = aniAsfPacketAppendBuffer( pAniPacket, pFrame + BAP_RSN_ETHERNET_3_HEADER_LEN, uPktLen ); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, " authRsnRxFrameHandler cannot retrieve eapol payload size (%d)\n", uPktLen ); break; } }while( 0 ); if( ANI_IS_STATUS_SUCCESS( retVal ) ) { *ppPacket = pAniPacket; } else if( pAniPacket ) { aniAsfPacketFree( pAniPacket ); } return retVal; }