--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/WlanLogicalChannel.h Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,798 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Declaration of the DWlanLogicalChannel class.
+*
+*/
+
+/*
+* %version: 31 %
+*/
+
+#ifndef DWLANLOGICALCHANNEL_H
+#define DWLANLOGICALCHANNEL_H
+
+#include "UmacManagementSideUmacCb.h"
+#include "UmacProtocolStackSideUmacCb.h"
+#include "wllddlogicalchannelbase.h"
+#include "RWlanLogicalChannel.h"
+
+#include "wllddoidmsgstorage.h"
+#include "wlldddmausablememory.h"
+#include "wllddpowerindicator.h"
+#include "wllddpowerhandler.h"
+
+#include "EtherCardApi.h"
+#include "FrameXferBlock.h"
+
+class DWlanLogicalDevice;
+class Umac;
+
+#ifdef RD_WLAN_DDK
+class WlanOsa;
+#endif
+
+class DEthernetFrameMemMngr;
+class RFrameXferBlock;
+class WlanChunk;
+
+class DWlanLogicalChannel :
+ public DWlanLogicalChannelBase,
+ public WlanManagementSideUmacCb,
+ public WlanProtocolStackSideUmacCb,
+ public MWlanPowerIndicator
+ {
+ // type definitions
+ // linked list entry for storing indications
+ struct TIndicationListEntry
+ {
+ TIndication indication;
+ struct TIndicationListEntry *next;
+ };
+
+ /** max number of indication list entries */
+ enum { KMaxIndicationListEntries = 6 };
+
+public:
+
+#ifndef RD_WLAN_DDK
+ DWlanLogicalChannel(
+ DWlanLogicalDevice& aParent,
+ Umac& aUmac,
+ TDynamicDfcQue& aDfcQ,
+ DMutex& aMutex,
+ DChunk*& aSharedMemoryChunk,
+ WlanChunk*& aRxFrameMemoryPool );
+#else
+ DWlanLogicalChannel(
+ DWlanLogicalDevice& aParent,
+ Umac& aUmac,
+ TDynamicDfcQue& aDfcQ,
+ WlanOsa*& aOsa,
+ DChunk*& aSharedMemoryChunk,
+ WlanChunk*& aRxFrameMemoryPool );
+#endif
+
+ virtual ~DWlanLogicalChannel();
+
+ /**
+ * Returns a reference to a pointer pointing to the only shared memory
+ * chunk instance
+ *
+ * @return See above
+ */
+ DChunk*& SharedMemoryChunk();
+
+ /**
+ * Sets the number of extra bytes required to align Rx buffer start
+ * address, to be returned to WHA layer, to allocation unit boundary
+ */
+ void SetRxBufAlignmentPadding( TInt aRxBufAlignmentPadding );
+
+ /**
+ * Returns the number of extra bytes required to align Rx buffer start
+ * address, to be returned to WHA layer, to allocation unit boundary
+ * @return See above
+ */
+ TInt RxBufAlignmentPadding() const;
+
+ /**
+ * Second phase constructor for DLogicalChannelBase objects.
+ *
+ * It is called in creating thread context in a critical section with
+ * no fast mutexes held.
+ * The default implementation does nothing.
+ *
+ * @since S60 3.1
+ * @param aUnit Requested unit number
+ * @param aInfo Additional info supplied by client
+ * @param aVer Requested interface version
+ *
+ * @return KErrNone if construction was successful,
+ * otherwise one of the other system-wide error codes.
+ */
+ virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
+
+ /**
+ * Processes a message for this logical channel.
+ * This function is called in the context of a DFC thread.
+ *
+ * @since S60 3.1
+ * @param aMsg The message to process.
+ * The iValue member of this distinguishes the message type:
+ * iValue==ECloseMsg, channel close message
+ * iValue==KMaxTInt, a 'DoCancel' message
+ * iValue>=0, a 'DoControl' message with function number equal to iValue
+ * iValue<0, a 'DoRequest' message with function number equal to ~iValue
+ */
+ virtual void HandleMsg(TMessageBase* aMsg);
+
+ /**
+ * Process a function for this logical channel.
+ * This function is executed in the context of client's thread in
+ * supervisor mode. All code executed in this mode MUST NOT
+ * take a lot of time and MUST NOT access the WHA layer.
+ * @param aFunction Defines the operation/function to be performed.
+ * @param param Function specific parameter
+ * @return function specific return value.
+ */
+ virtual TAny* DoControlFast( TInt aFunction, TAny* param );
+
+private:
+
+ /**
+ * Called from statemachine when oid has been completed.
+ * Triggers handling of a new oid
+ * @param aOid OID handled
+ * @param aReason completion code
+ */
+ virtual void OnOidCompleted(
+ TInt aReason,
+ SOidOutputData& OidOutputData );
+
+ /**
+ * Sets the Tx offset for every frame type which can be transmitted
+ *
+ * @since S60 5.0
+ * @param aEthernetFrameTxOffset Tx offset for Ethernet frames and Ethernet
+ * Test frames
+ * @param aDot11FrameTxOffset Tx offset for 802.11 frames
+ * @param aSnapFrameTxOffset Tx offset for SNAP frames
+ */
+ virtual void SetMgmtSideTxOffsets(
+ TUint32 aEthernetFrameTxOffset,
+ TUint32 aDot11FrameTxOffset,
+ TUint32 aSnapFrameTxOffset );
+
+ /**
+ * Gets buffer for Rx data
+ * @param aLengthinBytes Requested buffer length
+ * @return buffer for Rx data upon success
+ * NULL otherwise
+ */
+ virtual TUint8* GetBufferForRxData( TUint aLengthinBytes );
+
+ /**
+ * Completes a data read operation from management side
+ *
+ * @param aBufferStart first element of the array that holds pointers to
+ * Rx frame meta headers
+ * @param aNumOfBuffers number of meta header pointers in the array
+ */
+ virtual void MgmtDataReceiveComplete(
+ const TDataBuffer*& aBufferStart,
+ TUint32 aNumOfBuffers );
+
+ /**
+ * Completes a data write operation from management side
+ * @param aErr completion code
+ */
+ virtual void MgmtPathWriteComplete ( TInt aErr );
+
+ /**
+ * Sends a indication to the management side
+ * @param aIndication indication code
+ */
+ virtual void OnInDicationEvent( TIndication aIndication );
+
+ /**
+ * Frees the specified Rx frame buffer
+ *
+ * @param aBufferToFree The buffer to free
+ */
+ virtual void MarkRxBufFree( TUint8* aBufferToFree );
+
+ /**
+ * Sets the Tx offset for every frame type which can be transmitted
+ *
+ * @since S60 5.0
+ * @param aEthernetFrameTxOffset Tx offset for Ethernet frames
+ */
+ virtual void SetProtocolStackTxOffset(
+ TUint32 aEthernetFrameTxOffset );
+
+ /**
+ * Called when the Tx packet in question has been trasferred to the WLAN
+ * device.
+ *
+ * @param aCompletionCode Status of the operation.
+ * @param aMetaHeader Meta header associated with the related Tx packet
+ */
+ virtual void OnTxProtocolStackDataComplete(
+ TInt aCompletionCode,
+ TDataBuffer* aMetaHeader );
+
+ /**
+ * Called when a Tx packet - submitted by someone else than the Protocol
+ * Stack Side Client - has been trasferred to the WLAN device.
+ */
+ virtual void OnOtherTxDataComplete();
+
+ /**
+ * Called when the Tx of a frame has completed (either successfully or
+ * unsuccessfully).
+ */
+ virtual void OnTxDataSent();
+
+ virtual TUint8* DmaPrivateTxMemory();
+
+ /**
+ * Completes a data read operation from protocol stack side
+ *
+ * @param aBufferStart first element of the array that holds pointers to
+ * Rx frame meta headers
+ * @param aNumOfBuffers number of meta header pointers in the array
+ * @return ETrue if this event was processed successfully
+ * EFalse otherwise
+ */
+ virtual TBool ProtocolStackDataReceiveComplete(
+ const TDataBuffer*& aBufferStart,
+ TUint32 aNumOfBuffers );
+
+ /**
+ * Determines if the Protocol Stack Side client is ready to handle any
+ * callbacks from UMAC
+ *
+ * @return ETrue if the client is ready
+ * EFalse if the client is not ready
+ */
+ virtual TBool ProtocolStackSideClientReady() const;
+
+ /**
+ * From WlanProtocolStackSideUmacCb.
+ * Indicates that WLAN Mgmt Client has (re-)enabled protocol stack side
+ * user data Tx.
+ */
+ virtual void UserDataReEnabled();
+
+ virtual void RegisterTimeout(
+ TUint32 aTimeoutInMicroSeconds,
+ TWlanTimer aTimer );
+ virtual void CancelTimeout( TWlanTimer aTimer );
+
+ virtual void RegisterDfc( TAny* aCntx );
+ virtual void CancelDfc();
+
+ /**
+ * Allocates Rx frame meta header
+ * @return Rx frame meta header upon success
+ * NULL otherwise
+ */
+ virtual TDataBuffer* GetRxFrameMetaHeader();
+
+ /**
+ * Deallocates Rx frame meta header
+ * @param aMetaHeader Meta header to deallocate
+ */
+ virtual void FreeRxFrameMetaHeader( TDataBuffer* aMetaHeader );
+
+ void DoCancel( TInt aMask );
+
+ TInt DoRequest(
+ TInt aReqNo,
+ TRequestStatus* aStatus,
+ TAny* a1,
+ TAny* a2 );
+ TInt OnMgmtSideDoRequest(
+ TInt aReqNo,
+ TRequestStatus* aStatus,
+ TAny* a1,
+ TAny* a2 );
+ TInt OnEthernetSideRequest(
+ TInt aReqNo,
+ TRequestStatus* aStatus,
+ TAny* a1,
+ TAny* a2 );
+
+ TInt DoControl( TInt aFunction, TAny* a1, TAny* a2);
+ TInt OnMgmtSideControl( TInt aFunction, TAny* a1, TAny* a2 );
+ TInt OnEthernetSideControl( TInt aFunction, TAny* a1, TAny* a2 );
+
+ TInt OnInitialiseEthernetFrameBuffers(
+ TSharedChunkInfo* aSharedChunkInfo );
+
+ void OnReleaseEthernetFrameBuffers();
+
+ void TxProtocolStackData();
+ void TxManagementData();
+
+ TBool OnReadEthernetFrameRequest();
+
+ /**
+ * Stores a indication to indication list
+ * @param aIndication indication to be stored
+ */
+ void StoreIndication( TIndication aIndication );
+
+ /**
+ * Gets first stored indication and assigns it to indication buffer
+ * @return ETrue a stored indication existed, otherwise EFalse
+ */
+ TBool GetStoredIndication();
+
+ /**
+ * Calls GetStoredIndication() and after that
+ * completes the outstanding request
+ */
+ void TryToCompleteIndicationRequest();
+
+ /**
+ * Relases a indication list entry
+ * @param entry to be relased
+ */
+ void ReleaseIndicationListEntry( TIndicationListEntry* aEntry );
+
+ /**
+ * Gets a next free indication list entry
+ * @return a next free indication list entry
+ */
+ TIndicationListEntry* GetFreeIndicationListEntry();
+
+ /**
+ * Deallocates the indication list and marks all pointers NULL
+ */
+ void FreeIndicationList();
+
+ /**
+ * Clears all indication list entrys
+ */
+ void PurgeIndicationList();
+
+ /**
+ * From CWlanPhy
+ * Registers the notification to the PDD.
+ * This request is used for registering indication buffer to PDD
+ * @param aBuffer pointer to TIndication
+ */
+ void IndicationRequest( TIndication* aBuffer );
+
+ /**
+ * From CWlanPhy
+ * Releases indication buffer from PDD
+ */
+ void CancelIndicationRequest();
+
+ /**
+ * Called by the PDD when a notification is received.
+ */
+ void IndicationComplete();
+
+ TBool InitIndicationListEntries();
+
+ /**
+ * Default Timer timeout callback function
+ *
+ * @since S60 3.1
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnTimeOut( TAny *aPtr );
+
+ /**
+ * Voice Call Entry Timer timeout DFC callback method
+ *
+ * @since S60 3.2
+ */
+ void RealVoiceCallEntryTimerDfc();
+
+ /**
+ * Voice Call Entry Timer timeout DFC callback function
+ *
+ * @since S60 3.2
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void VoiceCallEntryTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Voice Call Entry Timer timeout callback function
+ *
+ * @since S60 3.2
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnVoiceCallEntryTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Null Timer timeout DFC callback method
+ *
+ * @since S60 3.2
+ */
+ void RealNullTimerDfc();
+
+ /**
+ * Null Timer timeout DFC callback function
+ *
+ * @since S60 3.2
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void NullTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Null Timer timeout callback function
+ *
+ * @since S60 3.2
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnNullTimerTimeOut( TAny *aPtr );
+
+ /**
+ * No Voice Timer timeout DFC callback method
+ *
+ * @since S60 3.2
+ */
+ void RealNoVoiceTimerDfc();
+
+ /**
+ * No Voice Timer timeout DFC callback function
+ *
+ * @since S60 3.2
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void NoVoiceTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * No Voice Timer timeout callback function
+ *
+ * @since S60 3.2
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnNoVoiceTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Keep Alive Timer timeout DFC callback method
+ *
+ * @since S60 3.2
+ */
+ void RealKeepAliveTimerDfc();
+
+ /**
+ * Keep Alive Timer timeout DFC callback function
+ *
+ * @since S60 3.2
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void KeepAliveTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Keep Alive Timer timeout callback function
+ *
+ * @since S60 3.2
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnKeepAliveTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Active to Light PS Timer timeout DFC callback method
+ *
+ * @since S60 5.1
+ */
+ void RealActiveToLightPsTimerDfc();
+
+ /**
+ * Active to Light PS Timer timeout DFC callback function
+ *
+ * @since S60 5.1
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void ActiveToLightPsTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Active to Light PS Timer timeout callback function
+ *
+ * @since S60 5.1
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnActiveToLightPsTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Light PS to Active Timer timeout DFC callback method
+ *
+ * @since S60 5.1
+ */
+ void RealLightPsToActiveTimerDfc();
+
+ /**
+ * Light PS to Active Timer timeout DFC callback function
+ *
+ * @since S60 5.1
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void LightPsToActiveTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Light PS to Active Timer timeout callback function
+ *
+ * @since S60 5.1
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnLightPsToActiveTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Light PS to Deep PS Timer timeout DFC callback method
+ *
+ * @since S60 5.1
+ */
+ void RealLightPsToDeepPsTimerDfc();
+
+ /**
+ * Light PS to Deep PS Timer timeout DFC callback function
+ *
+ * @since S60 5.1
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void LightPsToDeepPsTimerDfcDoToggle( TAny* aPtr );
+
+ /**
+ * Light PS to Deep PS Timer timeout callback function
+ *
+ * @since S60 5.1
+ * @param aPtr A pointer passed to the callback function when called.
+ * This pointer was given to the timer in timer construction.
+ */
+ static void OnLightPsToDeepPsTimerTimeOut( TAny *aPtr );
+
+ /**
+ * Default Timer timeout DFC callback method
+ *
+ * @since S60 3.1
+ */
+ void RealTimerDfc();
+
+ void RealDfc();
+
+ /**
+ * Default Timer timeout DFC callback function
+ *
+ * @since S60 3.1
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void TimerDfcDoToggle( TAny* aPtr );
+
+ static void DfcDoToggle( TAny* aPtr );
+
+ /**
+ * Protocol Stack Side Tx Trigger DFC callback method
+ */
+ void RealTxTriggerDfc();
+
+ /**
+ * Protocol Stack Side Tx Trigger DFC callback function
+ *
+ * @param aPtr this pointer (pointer to this object instance)
+ */
+ static void TxTriggerDfcDoToggle( TAny* aPtr );
+
+ void FinitSystem();
+ void InitSystem( TAny* aInputBuffer, TUint aInputLength );
+
+ /**
+ * Allocates kernel mode storage for actual parameters pointed to by
+ * pointers in an OID command
+ *
+ * @since S60 3.1
+ * @return ETrue if the operation succeeds;
+ * EFalse otherwise
+ */
+ TBool HandlePointerParameters();
+
+ /**
+ * Allocates kernel mode storage for scan response frame body and copies
+ * it from user side to kernel side from the connect command parameters
+ *
+ * @since S60 3.2
+ * @return ETrue if the operation succeeds;
+ * EFalse otherwise
+ */
+ TBool HandleScanResponseFrameBodyCase();
+
+ /**
+ * Allocates kernel mode storage for IE(s) and copies it (them) from user
+ * side to kernel side when there is IE(s) present in the connect command
+ *
+ * @since S60 3.2
+ * @return ETrue if the operation succeeds;
+ * EFalse otherwise
+ */
+ TBool CheckAndHandleIeDataCase();
+
+ /**
+ * Frees kernel mode storage allocated for scan response frame body
+ *
+ * @since S60 3.2
+ */
+ void FreeScanResponseFramebody();
+
+ /**
+ * Frees kernel mode storage allocated for IE(s)
+ *
+ * @since S60 3.2
+ */
+ void FreeIeData();
+
+ /**
+ * From MWlanPowerIndicator
+ * Indicates that power up notification has been received from kernel
+ * side Power Manager.
+ */
+ virtual void OnPowerUp();
+
+ /**
+ * From MWlanPowerIndicator
+ * Indicates that power down request has been received from kernel
+ * side Power Manager.
+ *
+ * @since S60 3.1
+ */
+ virtual void OnPowerDown();
+
+ // Prohibit copy constructor.
+ DWlanLogicalChannel ( const DWlanLogicalChannel & );
+ // Prohibit assigment operator.
+ DWlanLogicalChannel & operator= ( const DWlanLogicalChannel & );
+
+private: // data
+
+ const TUint32 KFreeOpenParamsMask = ( 1 << 0 );
+ const TUint32 KFreeScanResponseFramebodyMask = ( 1 << 1 );
+ const TUint32 KDfcCancelledMask = ( 1 << 2 );
+ const TUint32 KFreeIeDataMask = ( 1 << 3 );
+ const TUint32 KPowerHandlerRegistered = ( 1 << 4 );
+ const TUint32 KTxTriggerArmed = ( 1 << 5 );
+
+ TOpenParam iOpenParam;
+
+ DThread* iClient;
+ TInt iUnit;
+ Umac& iUmac;
+ /** pointer to our DFC queue. Not own */
+ TDynamicDfcQue* iDfcQ;
+ DWlanLogicalDevice& iParent;
+
+ /** management side requests */
+ TRequestStatus* iWlanGeneralRequestStatus;
+ TRequestStatus* iWlanRequestNotifyStatus;
+ TRequestStatus* iWlanReceiveFrameStatus;
+ TRequestStatus* iWlanSendFrameStatus;
+
+ /** indication request buffer to USER mode */
+ TIndication* iIndicationBuffer;
+ /** pointer to first stored indication */
+ TIndicationListEntry* iIndicationListHead;
+ /** pointer to the first free indication list entry */
+ TIndicationListEntry* iFreeIndicationListHead;
+
+ /** protocol stack side requests */
+ TRequestStatus* iResumeTxStatus;
+ TRequestStatus* iEthernetReceiveFrameStatus;
+
+ /** Pointer to ethernet memory manager */
+ DEthernetFrameMemMngr* iEthernetFrameMemMngr;
+
+ /** Default Timer DFC object */
+ TDfc iTimerDfc;
+ /** Default Timer object */
+ NTimer iTimer;
+ /** Voice Call Entry Timer object */
+ NTimer iVoiceCallEntryTimer;
+ /** Voice Call Entry Timer DFC object */
+ TDfc iVoiceCallEntryTimerDfc;
+ /** NULL Timer object */
+ NTimer iNullTimer;
+ /** NULL Timer DFC object */
+ TDfc iNullTimerDfc;
+ /** No Voice Timer object */
+ NTimer iNoVoiceTimer;
+ /** No Voice Timer DFC object */
+ TDfc iNoVoiceTimerDfc;
+ /** Keep Alive Timer object */
+ NTimer iKeepAliveTimer;
+ /** Keep Alive Timer DFC object */
+ TDfc iKeepAliveTimerDfc;
+ /** Active to Light PS Timer object */
+ NTimer iActiveToLightPsTimer;
+ /** Active to Light PS Timer DFC object */
+ TDfc iActiveToLightPsTimerDfc;
+ /** Light PS to Active Timer object */
+ NTimer iLightPsToActiveTimer;
+ /** Light PS to Active Timer DFC object */
+ TDfc iLightPsToActiveTimerDfc;
+ /** Light PS to Deep PS Timer object */
+ NTimer iLightPsToDeepPsTimer;
+ /** Light PS to Deep PS DFC object */
+ TDfc iLightPsToDeepPsTimerDfc;
+
+ TDfc iDfc;
+ /** Protocol Stack Side Tx Trigger DFC object */
+ TDfc iTxTriggerDfc;
+
+ SOidMsgStorage iOidMsgStorage;
+ TUint32 iFlags;
+
+ /** our power handler */
+ DWlanPowerHandler iPowerHandler;
+ /**
+ * ETrue if we are powering down because power manager has requested us
+ * to do so
+ */
+ TBool iPoweringDown;
+
+ TAny* iDfcCtx;
+
+ WlanDmaUsableMemory iDmaTxMemory;
+
+#ifndef RD_WLAN_DDK
+ /**
+ * reference to mutex used to protect LDD from simultaneous execution
+ * by several different threads.
+ */
+ DMutex& iMutex;
+#else
+ /**
+ * OS abstraction object reference
+ */
+ WlanOsa*& iOsa;
+#endif
+
+ /**
+ * reference to shared memory chunk for frame transfer between user and
+ * kernel address spaces
+ */
+ DChunk*& iSharedMemoryChunk;
+
+ /**
+ * reference to Rx frame memory pool manager
+ */
+ WlanChunk*& iRxFrameMemoryPool;
+
+ /**
+ * ETrue if the Tx packet submission loop is active.
+ * Is used to deny calling UMAC TxProtocolStackData() if the loop is
+ * already active. This prevents also recursive call stack growth.
+ */
+ TBool iTxActive;
+
+ /**
+ * ETrue if the user mode client is allowed to add new frames to Tx
+ * queues
+ */
+ TBool iAddTxFrameAllowed;
+ };
+
+
+#endif // DWLANLOGICALCHANNEL_H
+