/*========================================================================== 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_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_U8_t txFlag, v_U32_t timeStamp, v_U8_t ucIsEapol, v_U8_t ucUP ) { #if defined( FEATURE_WLAN_INTEGRATED_SOC ) VOS_STATUS vosStatus; WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL; v_SIZE_t usMacAddrSize; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /*------------------------------------------------------------------------ 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; // 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 ) { 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_ASSERT(usMacAddrSize == VOS_MAC_ADDR_SIZE); 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; #else /* FEATURE_WLAN_INTEGRATED_SOC */ VOS_STATUS vosStatus; v_PVOID_t pvBDHeader; WDA_DS_PrepareBDHeader( vosDataBuff, &pvBDHeader, pvDestMacAddr, ucDisableFrmXtl, &vosStatus, pusPktLen, ucQosEnabled, ucWDSEnabled, extraHeadSpace ); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:Failed while attempting to prepare BD %d", vosStatus ); return vosStatus; } vosStatus = WLANHAL_FillTxBd( pvosGCtx, typeSubtype, pvDestMacAddr, pAddr2, &uTid, ucDisableFrmXtl, pvBDHeader, txFlag, timeStamp ); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:Failed while attempting to fill BD %d", vosStatus ); return vosStatus; } return VOS_STATUS_SUCCESS; #endif /* FEATURE_WLAN_INTEGRATED_SOC */ }