wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp
changeset 0 c40eb8fe8501
child 10 0abc8c98be24
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,1876 @@
+/*
+* Copyright (c) 2002-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:   Implementation of the WlanContextImpl class
+*
+*/
+
+/*
+* %version: 70 %
+*/
+
+#include "config.h"
+#include "UmacContextImpl.h"
+#include "umacconnectcontext.h"
+#include "UmacWsaInitiliaze.h"
+#include "UmacWsaConfigure.h"
+#include "UmacWsaReadMib.h"
+#include "UmacWsaWriteMib.h"
+#include "UmacWsaJoin.h"
+#include "UmacWsaDisconnect.h"
+#include "UmacWsaScan.h"
+#include "umacwhastopscan.h"
+#include "UmacWsaSetBssParameters.h"
+#include "UmacWsaAddKey.h"
+#include "UmacWsaSetPsMode.h"
+#include "umacwhaconfigurequeue.h"
+#include "umacwhaconfigureac.h"
+#include "umacwharelease.h"
+
+#include "umacaddbroadcastwepkey.h"
+#include "umacconfiguretxqueueparams.h"
+#include "umacconfiguretxautoratepolicy.h"
+
+
+struct SWsaCommands
+    {
+    WlanConfigureTxQueueParams      iConfigureTxQueueParams;
+    WlanAddBroadcastWepKey          iAddBroadcastWepKey;
+    WlanConfigureTxAutoRatePolicy   iConfigureTxAutoRatePolicy;
+    WlanWsaInitiliaze               iWsaInitiliaze;
+    WlanWsaConfigure                iWsaConfigure;
+    WlanWsaReadMib                  iWsaReadMib;
+    WlanWsaWriteMib                 iWsaWriteMib;
+    WlanWsaJoin                     iWsaJoin;
+    WlanWsaDisconnect               iWsaDisconnect;
+    WlanWsaScan                     iWsaScan;
+    WlanWhaStopScan                 iWhaStopScan;
+    WlanWsaSetBssParameters         iWsaSetBssParameters;
+    WlanWsaAddKey                   iWsaAddKey;
+    WlanWsaSetPsMode                iWsaSetPsMode;
+    WlanWhaConfigureQueue           iWhaConfigureQueue;
+    WlanWhaConfigureAc              iWhaConfigureAc;
+    WlanWhaRelease                  iWlanWhaRelease;
+    };
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanContextImpl::WlanContextImpl( Umac& aUmac ) : 
+            iCurrentMacState( NULL ),
+            iUmac( aUmac ), 
+            iEnableUserData( EFalse ),
+            iCurrentRxBuffer( NULL ),
+            iInternalTxBufFree ( ETrue ),
+            iInternalTxBufBeingWaited ( EFalse ),            
+            iAlignNullData( 0 ), 
+            iAlignQosNullData( 0 ),
+            iConsecutiveBeaconsLostIndicated ( EFalse ),
+            iConsecutiveTxFailuresIndicated ( EFalse ),
+            iConsecutivePwrModeSetFailuresIndicated ( EFalse ),
+            iFailedTxPacketCount ( 0 ), 
+            iWsaCmdActive( EFalse ), 
+            iWhaCommandAct( 0 ), 
+            iWha( NULL ), 
+            iWsaCommands( NULL ), 
+            iEventDispatcher( aUmac ), 
+            iPacketScheduler( *this ), 
+            iDynamicPowerModeCntx ( *this ),
+            iNullSendController( *this, *this ),
+            iProprietarySnapHeader( KUndefinedSnapHeader )
+    {
+    OsTracePrint( KInitLevel, 
+        (TUint8*)("UMAC: WlanContextImpl::WlanContextImpl(): this: 0x%08x"), 
+        reinterpret_cast<TUint32>(this) );    
+
+    os_memset( 
+        iSupportedRatesLookUpTable, 
+        0, 
+        sizeof( iSupportedRatesLookUpTable ) );
+
+    os_memset( &iWHASettings, 0, sizeof( iWHASettings ) );
+
+    os_memset( 
+        &iOurBssMembershipFeatureArray, 
+        KUnallocated, 
+        sizeof( iOurBssMembershipFeatureArray ) );
+
+    os_memset( 
+        &iHtBlockAckConfigure, 
+        0, 
+        sizeof( iHtBlockAckConfigure ) );
+
+    ResetFrameStatistics();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::BootUp(
+    const TUint8* aPda, 
+    TUint32 aPdaLength,
+    const TUint8* aFw, 
+    TUint32 aFwLength )
+    {    
+    // boot the system up
+    OsTracePrint( KInitLevel, (TUint8*)("UMAC:  WlanContextImpl::BootUp"));    
+
+    iStates.iInitPhase1State.BootUp( *this, aPda, aPdaLength, aFw, aFwLength );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanAddBroadcastWepKey& WlanContextImpl::AddBroadcastWepKey()
+    {
+    return iWsaCommands->iAddBroadcastWepKey;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanConfigureTxQueueParams& WlanContextImpl::ConfigureTxQueueParams()
+    {
+    return iWsaCommands->iConfigureTxQueueParams;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanConfigureTxAutoRatePolicy& WlanContextImpl::ConfigureTxAutoRatePolicy()
+    {
+    return iWsaCommands->iConfigureTxAutoRatePolicy;    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaInitiliaze& WlanContextImpl::WsaInitiliaze()
+    {
+    return iWsaCommands->iWsaInitiliaze;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaConfigure& WlanContextImpl::WsaConfigure()
+    {
+    return iWsaCommands->iWsaConfigure;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaReadMib& WlanContextImpl::WsaReadMib()
+    {
+    return iWsaCommands->iWsaReadMib;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaWriteMib& WlanContextImpl::WsaWriteMib()
+    {
+    return iWsaCommands->iWsaWriteMib;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaJoin& WlanContextImpl::WsaJoin()
+    {
+    return iWsaCommands->iWsaJoin;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaDisconnect& WlanContextImpl::WsaDisconnect()
+    {
+    return iWsaCommands->iWsaDisconnect;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaSetBssParameters& WlanContextImpl::WsaSetBssParameters()
+    {
+    return iWsaCommands->iWsaSetBssParameters;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaScan& WlanContextImpl::WsaScan()
+    {
+    return iWsaCommands->iWsaScan;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWhaStopScan& WlanContextImpl::WhaStopScan()
+    {
+    return iWsaCommands->iWhaStopScan;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaAddKey& WlanContextImpl::WsaAddKey()
+    {
+    return iWsaCommands->iWsaAddKey;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWsaSetPsMode& WlanContextImpl::WsaSetPsMode()
+    {
+    return iWsaCommands->iWsaSetPsMode;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWhaConfigureQueue& WlanContextImpl::WhaConfigureQueue()
+    {
+    return iWsaCommands->iWhaConfigureQueue;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWhaConfigureAc& WlanContextImpl::WhaConfigureAc()
+    {
+    return iWsaCommands->iWhaConfigureAc;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanWhaRelease& WlanContextImpl::WlanWhaRelease()
+    {
+    return iWsaCommands->iWlanWhaRelease;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool WlanContextImpl::Initialize()
+    {
+    // deallocation of objecs allocated here is done in destructor
+
+    iStates.iIdleScanningMode.Set( *this );
+    iStates.iIbssScanningMode.Set( *this );
+    iStates.iInfrastructureScanningMode.Set( *this );
+
+    iCurrentMacState = &(iStates.iInitPhase1State);
+
+    OsTracePrint( KInitLevel, (TUint8*)("UMAC: WlanContextImpl::Initialize: alloc WSA commands; size: %d"), sizeof(SWsaCommands));
+
+    iWsaCommands 
+        = static_cast<SWsaCommands*>(os_alloc( sizeof(SWsaCommands) )); 
+    if ( !iWsaCommands ) 
+        {        
+        OsTracePrint( KErrorLevel, 
+            (TUint8*)("UMAC: WlanContextImpl::Initialize: alloc WSA commands failure -> abort"));                        
+        return EFalse;
+        }
+
+    new (iWsaCommands) SWsaCommands;
+
+    // made it 
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+WlanContextImpl::~WlanContextImpl()
+    {
+    OsTracePrint( KInitLevel, 
+        (TUint8*)("UMAC: WlanContextImpl::~WlanContextImpl"));        
+
+#ifndef RD_WLAN_DDK
+    delete iWha;
+#endif
+    iWha = NULL;
+
+    if ( iWsaCommands ) 
+        {        
+        iWsaCommands->~SWsaCommands();
+        os_free( iWsaCommands );
+        iWsaCommands = NULL;
+        }
+
+    iCurrentMacState = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::MakeLookUpTable()
+    {    
+    // make bit rate lookup table
+
+    OsTracePrint( KUmacDetails, 
+        (TUint8*)("UMAC * construct dot11 rate to WHA rate lookup table"));
+
+    TUint index(0);
+    
+    if ( iWHASettings.iRates & WHA::KRate1Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate1MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate1Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate2Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate2MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate2Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate5_5Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate5p5MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate5_5Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate6Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate6MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate6Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate9Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate9MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate9Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate11Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate11MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate11Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate12Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate12MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate12Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate18Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate18MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate18Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate22Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate22MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate22Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate24Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate24MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate24Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate33Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate33MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate33Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate36Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate36MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate36Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate48Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate48MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate48Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }
+    if ( iWHASettings.iRates & WHA::KRate54Mbits )
+        {
+        iSupportedRatesLookUpTable[index].iSupportedRate = E802Dot11Rate54MBit;
+        iSupportedRatesLookUpTable[index].iWsaRate = WHA::KRate54Mbits;
+
+        OsTracePrint( KUmacDetails, (TUint8*)("current index: %d"), index);
+        OsTracePrint( KUmacDetails, (TUint8*)("dot11 rate added: 0x%02x"), 
+            iSupportedRatesLookUpTable[index].iSupportedRate);
+        OsTracePrint( KUmacDetails, (TUint8*)("WHA rate added: 0x%08x"), 
+            iSupportedRatesLookUpTable[index].iWsaRate);
+
+        ++index;
+        }                
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::AttachWsa( WHA::Wha* aWha )
+    {
+    iWha = aWha;
+
+    OsTracePrint( KInitLevel, 
+        (TUint8*)("UMAC: WlanContextImpl::AttachWsa: address: 0x%08x"), 
+        reinterpret_cast<TUint32>(iWha) );    
+    OsTracePrint( KInitLevel, (TUint8*)("UMAC: WHA-CMD-Attach"));
+    // attach the NWSA-callback
+    iWha->Attach( *this );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::CommandResponse( 
+    WHA::TCommandId aCommandId, 
+    WHA::TStatus aStatus,
+    const WHA::UCommandResponseParams& aCommandResponseParams )
+    {
+    OsTracePrint( KWsaCallback, 
+        (TUint8*)("UMAC * WHA-CB-CommandResponse()"));
+
+    iCurrentMacState->CommandResponse( 
+        *this, 
+        aCommandId,
+        aStatus,
+        aCommandResponseParams );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool WlanContextImpl::OnDeferredWhaCommandComplete( 
+    WHA::TCompleteCommandId aCompleteCommandId, 
+    WHA::TStatus aStatus,
+    const WHA::UCommandCompletionParams& aCommandCompletionParams )
+    {
+    if ( WsaCmdActive() )
+        {
+        // programming error
+        OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+
+    return iCurrentMacState->CommandComplete( 
+        *this, 
+        aCompleteCommandId, 
+        aStatus,
+        aCommandCompletionParams );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool WlanContextImpl::OnDeferredInternalEvent( TInternalEvent aInternalEvent )
+    {
+    OsTracePrint( KUmacDetails, 
+        (TUint8*)("UMAC: WlanContextImpl::OnDeferredInternalEvent()"));    
+    
+    TBool stateChanged ( EFalse );
+
+    if ( WsaCmdActive() )
+        {
+        // programming error
+        OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+
+    switch ( aInternalEvent )
+        {
+        case KAcParamUpdate:
+            stateChanged = iCurrentMacState->ConfigureAcParams( *this );
+            break;
+        case KPowerMgmtTransition:
+            stateChanged = iCurrentMacState->ChangePowerMgmtMode( *this );
+            break;
+        case KTimeout:
+            stateChanged = iCurrentMacState->OnTimeout( *this );
+            break;
+        case KVoiceCallEntryTimerTimeout:
+            stateChanged = iCurrentMacState->OnVoiceCallEntryTimerTimeout( 
+                *this );
+            break;
+        case KNullTimerTimeout:
+            stateChanged = iCurrentMacState->OnNullTimerTimeout( *this );
+            break;
+        case KNoVoiceTimerTimeout:
+            stateChanged = iCurrentMacState->OnNoVoiceTimerTimeout( *this );
+            break;
+        case KKeepAliveTimerTimeout:
+            stateChanged = iCurrentMacState->OnKeepAliveTimerTimeout( *this );
+            break;
+        case KActiveToLightPsTimerTimeout:
+            stateChanged = iCurrentMacState->OnActiveToLightPsTimerTimeout( 
+                *this );
+            break;
+        case KLightPsToActiveTimerTimeout:
+            stateChanged = iCurrentMacState->OnLightPsToActiveTimerTimeout( 
+                *this );
+            break;
+        case KLightPsToDeepPsTimerTimeout:
+            stateChanged = iCurrentMacState->OnLightPsToDeepPsTimerTimeout( 
+                *this );
+            break;
+        case KSetCtsToSelf:
+            stateChanged = iCurrentMacState->SetCtsToSelfMib( *this );
+            break;
+        case KSetRcpiTriggerLevel:
+            stateChanged = iCurrentMacState->SetRcpiTriggerLevelMib( 
+                *this, 
+                WHA::KRcpiThresholdDefault, 
+                EFalse );
+            break;
+        case KSetHtBssOperation:
+            stateChanged = iCurrentMacState->ConfigureHtBssOperation( *this );
+            break;
+        default:
+            OsTracePrint( KErrorLevel, 
+                (TUint8*)("UMAC: aInternalEvent: %d"), aInternalEvent );
+            OsAssert( 
+                (TUint8*)("UMAC: panic"), 
+                (TUint8*)(WLAN_FILE), 
+                __LINE__ );        
+        }        
+    return stateChanged;
+    }
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::CommandComplete( 
+    WHA::TCompleteCommandId aCompleteCommandId, 
+    WHA::TStatus aStatus,
+    const WHA::UCommandCompletionParams& aCommandCompletionParams )
+    {
+    OsTracePrint( KWsaCallback, 
+        (TUint8*)("UMAC: WHA-CB-CommandComplete: aStatus: %d"),
+        aStatus );
+
+    if ( !WsaCmdActive() )
+        {
+        iCurrentMacState->CommandComplete( 
+            *this, 
+            aCompleteCommandId, 
+            aStatus,
+            aCommandCompletionParams );
+        }
+    else
+        {
+        // WHA command is in progress so we must defer this access
+        iEventDispatcher.Register( 
+            aCompleteCommandId, 
+            aStatus,
+            aCommandCompletionParams );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::Indication( 
+    WHA::TIndicationId aIndicationId,
+    const WHA::UIndicationParams& aIndicationParams )
+    {
+    OsTracePrint( KWsaCallback, 
+        (TUint8*)("UMAC: WHA-CB-Indication: indication: %d"), aIndicationId);
+
+    iCurrentMacState->Indication( 
+        *this, 
+        aIndicationId, 
+        aIndicationParams );
+    }
+
+// Frame sending callbacks
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::SendPacketTransfer(
+    WHA::TPacketId aPacketId )
+    {
+#ifndef NDEBUG
+    OsTracePrint( KWsaCallback | KWsaTx, 
+        (TUint8*)("UMAC: WHA-CB-SendPacketTransfer: aPacketId: 0x%08x"),
+        aPacketId );
+#endif // !NDEBUG
+
+    iPacketScheduler.SendPacketTransfer( *this, aPacketId );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::SendPacketComplete(
+    WHA::TStatus aStatus,
+    WHA::TPacketId aPacketId,
+    WHA::TRate aRate,
+    TUint32 aPacketQueueDelay,
+    TUint32 aMediaDelay,
+    TUint8 aAckFailures,
+    TUint16 aSequenceNumber )
+    {
+#ifndef NDEBUG
+    OsTracePrint( KWsaCallback | KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aStatus: %d"),
+        aStatus );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aPacketId: 0x%08x"),
+        aPacketId );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aRate: 0x%08x"),
+        aRate );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aPacketQueueDelay: %d"),
+        aPacketQueueDelay );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aMediaDelay: %d"),
+        aMediaDelay );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aAckFailures: %d"),
+        aAckFailures );
+    OsTracePrint( KWsaTx, (TUint8*)
+        ("UMAC: WHA-CB-SendPacketComplete: aSequenceNumber: %d"),
+        aSequenceNumber );
+#endif // !NDEBUG
+    
+    iPacketScheduler.SendPacketComplete( 
+        *this,
+        aStatus,
+        aPacketId,
+        aRate,
+        aPacketQueueDelay,
+        aMediaDelay,
+        aAckFailures );
+    }
+
+// Frame receive
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TAny* WlanContextImpl::RequestForBuffer( 
+    TUint16 aLength )
+    {
+#ifndef NDEBUG
+    OsTracePrint( KWsaCallback, 
+        (TUint8*)("UMAC: WHA-CB-RequestForBuffer: aLength: %d"), aLength);
+#endif // !NDEBUG
+
+    TAny* buffer = iCurrentMacState->RequestForBuffer( *this, aLength );
+
+    return buffer;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::ReceivePacket( 
+    WHA::TStatus aStatus,
+    const void* aFrame,
+    TUint16 aLength,
+    WHA::TRate aRate,
+    WHA::TRcpi aRcpi,
+    WHA::TChannelNumber aChannel,
+    void* aBuffer,
+    TUint32 aFlags )
+    {
+#ifndef NDEBUG
+    OsTracePrint( KWsaCallback | KRxFrame, (TUint8*)
+        ("UMAC: WHA-CB-ReceivePacket(): aStatus: %d"), aStatus);
+    OsTracePrint( KWsaCallback | KRxFrame, (TUint8*)
+        ("UMAC: aLength: %d"), aLength);
+    OsTracePrint( KWsaCallback | KRxFrame, (TUint8*)
+        ("UMAC: aBuffer: 0x%08x"), reinterpret_cast<TUint32>(aBuffer) );
+    OsTracePrint( KWsaCallback | KRxFrame, (TUint8*)
+        ("UMAC: aFlags: 0x%08x"), aFlags );
+
+    if ( aFrame )
+        {
+        SDataMpduHeader* hdr 
+            = reinterpret_cast<SDataMpduHeader*>(const_cast<TAny*>(aFrame));
+    
+        OsTracePrint( KRxFrame, 
+            (TUint8*)("UMAC: WlanContextImpl::ReceivePacket: sequence nbr: %d"), 
+            hdr->iHdr.SequenceNumber() );
+        OsTracePrint( KRxFrame, 
+            (TUint8*)("UMAC: WlanContextImpl::ReceivePacket: sequence nbr: 0x%04x"), 
+            hdr->iHdr.SequenceNumber() );
+        }
+#endif // !NDEBUG
+
+    if ( !(WHASettings().iCapability & WHA::SSettings::KMultipleRxBuffers ) )
+        {
+        aBuffer = iCurrentRxBuffer;
+        OsTracePrint( KRxFrame, (TUint8*)
+            ("UMAC: single Rx buf mode; aBuffer set to: 0x%08x"), 
+            reinterpret_cast<TUint32>(aBuffer) );
+        }
+
+#ifndef NDEBUG
+    if ( !aBuffer )
+        {
+        // the Rx buffer pointer is NULL. Irrespective of the mode (single or
+        // multiple Rx buffers) this is a sign of an implementation error in 
+        // the lower layers
+        OsTracePrint( KErrorLevel, (TUint8*)("UMAC: Rx buf pointer is NULL") );
+        OsAssert( (TUint8*)("UMAC: panic"),(TUint8*)(WLAN_FILE), __LINE__ );
+        }
+#endif // !NDEBUG
+    
+    iCurrentMacState->ReceivePacket( 
+        *this, 
+        aStatus, 
+        aFrame, 
+        aLength, 
+        aRate, 
+        aRcpi, 
+        aChannel,
+        reinterpret_cast<TUint8*>(aBuffer), 
+        aFlags );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TBool WlanContextImpl::TxNullDataFrame( 
+    WlanContextImpl& aCtxImpl, 
+    TBool aQosNull )
+    {
+    return iCurrentMacState->TxNullDataFrame( aCtxImpl, aQosNull );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+WlanContextImpl::JoinedMulticastGroups::JoinedMulticastGroups()
+    : iFirstFreeIndex( 0 )
+    {
+    os_memset( iStorage, 0, sizeof( iStorage ) );
+    Reset();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+WlanContextImpl::TGroupAddStatus 
+    WlanContextImpl::JoinedMulticastGroups::AddGroup( 
+        const TMacAddress& aGroup )
+    {
+    TGroupAddStatus addStatus( EOk );
+    TUint index( 0 );
+    
+    if ( iFirstFreeIndex == KMaxNbrOfGroups )
+        {
+        // container full, cannot add any more
+        addStatus = EFull;
+        }
+    else
+        {
+        // not full
+        
+        if ( FindGroup( aGroup, index ) )
+            {
+            // group already exists, don't add again
+            addStatus = EAlreadyExists;
+            }
+        else
+            {
+            // doesn't exist yet, so go ahead and add it            
+            iStorage[iFirstFreeIndex] = aGroup;
+            ++iFirstFreeIndex;
+            }
+        }
+        
+    return addStatus;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TBool WlanContextImpl::JoinedMulticastGroups::RemoveGroup( 
+    const TMacAddress& aGroup )
+    {
+    TBool foundAndRemoved( EFalse );
+    TUint index( 0 );
+    
+    if ( FindGroup( aGroup, index ) )
+        { 
+        // entry found
+        
+        if ( index < ( iFirstFreeIndex - 1 ) )
+            {
+            // it wasn't the last (or the only) entry, so replace the entry to 
+            // be removed with the last entry so that we don't create an empty 
+            // slot in the middle (or in the beginning)
+            iStorage[index] = iStorage[iFirstFreeIndex - 1];
+            iFree[iFirstFreeIndex - 1] = ETrue;
+            }
+        else
+            {
+            // it was the last (and possibly also the only) entry
+            // just mark the entry to be free
+            iFree[index] = ETrue;
+            }
+
+        foundAndRemoved = ETrue;
+        --iFirstFreeIndex;        
+        }
+        
+    return foundAndRemoved;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TUint8 WlanContextImpl::JoinedMulticastGroups::Count() const
+    {
+    return iFirstFreeIndex;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TUint8 WlanContextImpl::JoinedMulticastGroups::GetGroups( 
+    const TMacAddress*& aGroups ) const
+    {
+    aGroups = iStorage;
+    return iFirstFreeIndex;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::JoinedMulticastGroups::Reset()
+    {
+    for (TUint8 i = 0; i < KMaxNbrOfGroups; i++ )
+        {
+        iFree[i] = ETrue;
+        }
+        
+    iFirstFreeIndex = 0;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TBool WlanContextImpl::JoinedMulticastGroups::FindGroup( 
+    const TMacAddress& aGroup, TUint& aIndex ) const
+    {
+    TBool found( EFalse );
+    TUint index( 0 );
+    
+    while ( !found && ( index < iFirstFreeIndex ) )
+        {
+        if ( aGroup == iStorage[index] )
+            {
+            found = ETrue;
+            aIndex = index;
+            }
+        else
+            {
+            ++index;
+            }
+        }
+        
+    return found;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UseShortSlotTime( 
+    TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KUseShortSlotTime;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KUseShortSlotTime);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::ProtectionBitSet( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KProtectionBitSet;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KProtectionBitSet);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::QosEnabled( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KQosEnabled;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KQosEnabled);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdEnabled( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KUapsdEnabled;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KUapsdEnabled);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::MulticastFilteringDisAllowed( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KMulticastFilteringDisAllowed;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KMulticastFilteringDisAllowed);
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::ErpIePresent( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KErpIePresent;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KErpIePresent);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::DisassociatedByAp( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KDisassociatedByAp;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KDisassociatedByAp);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdRequestedForVoice( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KUapsdRequestedForVoice;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KUapsdRequestedForVoice);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdRequestedForVideo( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdRequestedForVideo;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdRequestedForVideo);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdRequestedForBestEffort( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdRequestedForBestEffort;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdRequestedForBestEffort);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdRequestedForBackground( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdRequestedForBackground;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdRequestedForBackground);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdUsedForVoice( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KUapsdUsedForVoice;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KUapsdUsedForVoice);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdUsedForVideo( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdUsedForVideo;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdUsedForVideo);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdUsedForBestEffort( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdUsedForBestEffort;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdUsedForBestEffort);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UapsdUsedForBackground( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KUapsdUsedForBackground;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KUapsdUsedForBackground);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::ApTestOpportunitySeekStarted( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KApTestOpportunitySeekStarted;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KApTestOpportunitySeekStarted);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::ApTestOpportunityIndicated( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KApTestOpportunityIndicated;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KApTestOpportunityIndicated);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::HtSupportedByNw( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KHtSupportedByNw;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KHtSupportedByNw);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::Reassociate( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KReassociate;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KReassociate);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::UseShortPreamble( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= WlanConnectContext::KUseShortPreamble;
+        }
+    else
+       {
+        iConnectContext.iFlags &= ~(WlanConnectContext::KUseShortPreamble);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TPowerMgmtMode WlanContextImpl::CurrentPwrMgmtMode() const
+    {
+    if ( CurrentDot11PwrMgmtMode() == WHA::KPsDisable )
+        {
+        return EActive;
+        }
+    else
+        {
+        const TDot11PsModeWakeupSetting lightPsModeWakeupSetting = 
+            ClientLightPsModeConfig();
+        
+        if ( iWlanMib.iWlanWakeupInterval == 
+             lightPsModeWakeupSetting.iWakeupMode )
+            {
+            if ( iWlanMib.iWlanWakeupInterval 
+                 == EWakeUpIntervalEveryNthBeacon || 
+                 iWlanMib.iWlanWakeupInterval 
+                 == EWakeUpIntervalEveryNthDtim )
+                {
+                if ( iWlanMib.iWlanListenInterval == 
+                     lightPsModeWakeupSetting.iListenInterval )
+                    {
+                    return ELightPs;                
+                    }
+                else
+                    {
+                    // implementation error
+                    OsAssert( (TUint8*)("UMAC: panic"), 
+                        (TUint8*)(WLAN_FILE), __LINE__ );
+                    // this return value is not relevant
+                    return ELightPs;                    
+                    }                        
+                }
+            else
+                {
+                // for these wake-up modes a possible difference in listen
+                // interval is not meaningful                
+                return ELightPs;
+                }
+            }
+        else 
+            {
+            const TDot11PsModeWakeupSetting deepPsModeWakeupSetting = 
+                ClientDeepPsModeConfig();
+            
+            if ( iWlanMib.iWlanWakeupInterval == 
+                 deepPsModeWakeupSetting.iWakeupMode )
+                {
+                if ( iWlanMib.iWlanWakeupInterval 
+                     == EWakeUpIntervalEveryNthBeacon || 
+                     iWlanMib.iWlanWakeupInterval 
+                     == EWakeUpIntervalEveryNthDtim )
+                    {
+                    if ( iWlanMib.iWlanListenInterval == 
+                         deepPsModeWakeupSetting.iListenInterval )
+                        {
+                        return EDeepPs;                
+                        }
+                    else
+                        {
+                        // implementation error
+                        OsAssert( (TUint8*)("UMAC: panic"), 
+                            (TUint8*)(WLAN_FILE), __LINE__ );
+                        // this return value is not relevant
+                        return ELightPs;                    
+                        }                        
+                    }
+                else
+                    {
+                    // for these wake-up modes a possible difference in listen
+                    // interval is not meaningful                
+                    return EDeepPs;
+                    }
+                }
+            else
+                {
+                // implementation error
+                OsAssert( (TUint8*)("UMAC: panic"), 
+                    (TUint8*)(WLAN_FILE), __LINE__ );
+                // this return value is not relevant
+                return EActive;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::DynamicPwrModeMgtDisabled( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iConnectContext.iFlags |= 
+            WlanConnectContext::KDynamicPwrModeMgmtDisabled;
+        }
+    else
+       {
+        iConnectContext.iFlags &= 
+            ~(WlanConnectContext::KDynamicPwrModeMgmtDisabled);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TUint8* WlanContextImpl::GetRxBuffer( 
+    const TUint16 aLengthinBytes, 
+    TBool aInternal )
+    {
+    TUint8* buffer ( NULL );
+    
+    if ( aLengthinBytes <= KMaxDot11RxMpduLength )    
+        {
+        if ( aInternal )
+            {
+            buffer = iUmac.GetBufferForRxData( aLengthinBytes  );
+            }
+        else
+            {
+            buffer = iUmac.GetBufferForRxData( 
+                aLengthinBytes + iWHASettings.iRxoffset );
+            
+            // set the current Rx buffer. This must be done only for 
+            // non-internal Rx buf requests, i.e. requests from WHA layer
+            iCurrentRxBuffer = buffer;
+            }
+        
+        if ( buffer )
+            {
+            OsTracePrint( KRxFrame, (TUint8*)
+                ("UMAC: WlanContextImpl::GetRxBuffer: buf addr: 0x%08x"),
+                reinterpret_cast<TUint32>(buffer) );
+            return buffer;
+            }
+        else
+            {
+            OsTracePrint( KRxFrame | KWarningLevel, (TUint8*)
+                ("UMAC: WlanContextImpl::GetRxBuffer: WARNING: buffer reservation failed") );
+                
+            return NULL;
+            }
+        }
+    else
+        {
+        OsTracePrint( KRxFrame | KWarningLevel, (TUint8*)
+            ("UMAC: WlanContextImpl::GetRxBuffer: WARNING: Buffer longer than max MPDU len requested. NULL returned") );
+        return NULL;        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TDataBuffer* WlanContextImpl::GetRxFrameMetaHeader()
+    {
+    return iUmac.GetRxFrameMetaHeader();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::FreeRxFrameMetaHeader( TDataBuffer* aMetaHeader )
+    {
+    iUmac.FreeRxFrameMetaHeader( aMetaHeader );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TUint8* WlanContextImpl::TxBuffer( TBool aWaitIfNotFree )
+    {
+    TUint8* address ( NULL );
+    
+    if ( iInternalTxBufFree )
+        {
+        address = iUmac.DmaPrivateTxMemory() + iWHASettings.iTxFrameHeaderSpace;
+
+        if ( address )
+            {
+            // valid address will be returned => mark buffer to be in use
+            iInternalTxBufFree = EFalse;
+
+            OsTracePrint( KUmacDetails, (TUint8*)
+                ("UMAC: WlanContextImpl::TxBuffer: internal Tx buf now in use"));
+            }
+        }
+    else
+        {
+        // buffer already in use. NULL will be returned.
+        
+        if ( aWaitIfNotFree )
+            {
+            // client would like to wait for the buffer to become free
+            
+            if ( !iInternalTxBufBeingWaited )
+                {
+                // the buffer is not being waited for currently
+                
+                // Note that someone is now waiting for the buffer
+                iInternalTxBufBeingWaited = ETrue;
+
+                OsTracePrint( KUmacDetails, (TUint8*)
+                    ("UMAC: WlanContextImpl::TxBuffer: internal Tx buf already in use => now being waited for"));
+                }
+            else
+                {
+                // the buffer is already being waited for. This is an
+                // implementation error
+                OsAssert( 
+                    (TUint8*)("UMAC: panic"), 
+                    (TUint8*)(WLAN_FILE), 
+                    __LINE__ );
+                }
+            }
+        }
+        
+    return address;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool WlanContextImpl::OnBssRegained()
+    {
+    TBool ret( EFalse );
+
+    if ( iConsecutiveBeaconsLostIndicated ||
+         iConsecutiveTxFailuresIndicated ||
+         iConsecutivePwrModeSetFailuresIndicated )
+        {
+        ResetBssLossIndications();
+        ret = ETrue;        
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TUint WlanContextImpl::AverageTxMediaDelay( 
+    WHA::TQueueId aAccessCategory ) const
+    {
+    const TUint totalTxDataFrameCount = 
+        iFrameStatistics.acSpecific[aAccessCategory].txUnicastDataFrameCount +
+        iFrameStatistics.acSpecific[aAccessCategory].txMulticastDataFrameCount;
+        
+    // return zero if no frames have been transmitted via this AC
+    return totalTxDataFrameCount ? 
+            iFrameStatistics.acSpecific[aAccessCategory].txMediaDelay /
+            totalTxDataFrameCount : 
+            0;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::CalculateAverageTxMediaDelays()
+    {
+    for ( TUint accessCategory = 0; 
+          accessCategory < EQueueIdMax; 
+          ++accessCategory )
+        {
+        iFrameStatistics.acSpecific[accessCategory].txMediaDelay =
+            AverageTxMediaDelay( static_cast<WHA::TQueueId>(accessCategory) );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanContextImpl::UpdateTotalTxDelayHistogram( 
+    WHA::TQueueId aAccessCategory,
+    TUint aDelay )
+    {
+    const TUint KTotalTxDelayBin0UpperBound = 10000; // 10 ms
+    const TUint KTotalTxDelayBin1UpperBound = 20000; // 20 ms
+    const TUint KTotalTxDelayBin2UpperBound = 40000; // 40 ms
+
+    if ( aDelay <= KTotalTxDelayBin0UpperBound )
+        {
+        ++iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin0;
+
+        OsTracePrint( KWsaTxDetails, (TUint8*)
+            ("UMAC: WlanContextImpl::UpdateTotalTxDelayHistogram: bin 0 cnt incremented. Count now: %d"),
+            iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin0 );
+        }
+    else if ( aDelay > KTotalTxDelayBin0UpperBound && 
+              aDelay <= KTotalTxDelayBin1UpperBound )
+        {
+        ++iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin1;
+
+        OsTracePrint( KWsaTxDetails, (TUint8*)
+            ("UMAC: WlanContextImpl::UpdateTotalTxDelayHistogram: bin 1 cnt incremented. Count now: %d"),
+            iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin1 );
+        }
+    else if ( aDelay > KTotalTxDelayBin1UpperBound && 
+              aDelay <= KTotalTxDelayBin2UpperBound )
+        {
+        ++iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin2;
+
+        OsTracePrint( KWsaTxDetails, (TUint8*)
+            ("UMAC: WlanContextImpl::UpdateTotalTxDelayHistogram: bin 2 cnt incremented. Count now: %d"),
+            iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin2 );
+        }
+    else // aDelay > KTotalTxDelayBin2UpperBound
+        {
+        ++iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin3;
+
+        OsTracePrint( KWsaTxDetails, (TUint8*)
+            ("UMAC: WlanContextImpl::UpdateTotalTxDelayHistogram: bin 3 cnt incremented. Count now: %d"),
+            iFrameStatistics.acSpecific[aAccessCategory].totalTxDelayBin3 );
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TUint WlanContextImpl::AverageTotalTxDelay( 
+    WHA::TQueueId aAccessCategory ) const
+    {
+    const TUint totalTxDataFrameCount = 
+        iFrameStatistics.acSpecific[aAccessCategory].txUnicastDataFrameCount +
+        iFrameStatistics.acSpecific[aAccessCategory].txMulticastDataFrameCount;
+        
+    // return zero if no frames have been transmitted via this AC
+    return totalTxDataFrameCount ? 
+            iFrameStatistics.acSpecific[aAccessCategory].totalTxDelay /
+            totalTxDataFrameCount : 
+            0;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::CalculateAverageTotalTxDelays()
+    {
+    for ( TUint accessCategory = 0; 
+          accessCategory < EQueueIdMax; 
+          ++accessCategory )
+        {
+        iFrameStatistics.acSpecific[accessCategory].totalTxDelay =
+            AverageTotalTxDelay( static_cast<WHA::TQueueId>(accessCategory) );
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::AddBssMembershipFeature( 
+    T802Dot11BssMembershipSelector aFeature )
+    {
+    TUint8 i ( 0 );
+
+    do
+        {
+        if ( iOurBssMembershipFeatureArray[i] == KUnallocated )
+            {
+            iOurBssMembershipFeatureArray[i] = aFeature;
+
+            OsTracePrint( KUmacDetails, (TUint8*)
+                ("UMAC: WlanContextImpl::AddBssMembershipFeature: feature %d added to our feature list"),
+                aFeature );            
+            
+            break;
+            }
+        else
+            {
+            ++i;
+            }
+        } while ( i != KMaxNumOfWlanFeatures );
+        
+#ifndef NDEBUG 
+    if ( i == KMaxNumOfWlanFeatures )
+        {
+        // not enough space reserved for features
+        OsTracePrint( KErrorLevel, (TUint8*)
+            ("UMAC: WlanContextImpl::AddBssMembershipFeature: ERROR: not enough space reserved for features") );
+        OsAssert( 
+            (TUint8*)("UMAC: panic"), 
+            (TUint8*)(WLAN_FILE), __LINE__ );            
+        }
+#endif
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TBool WlanContextImpl::BssMembershipFeatureSupported( TUint8 aItem ) const
+    {
+    TBool supported ( EFalse );
+    
+    TUint8 i ( 0 );
+
+    do
+        {
+        if ( aItem == iOurBssMembershipFeatureArray[i] )
+            {
+            supported = ETrue;
+
+            OsTracePrint( KUmacDetails, (TUint8*)
+                ("UMAC: WlanContextImpl::BssMembershipFeatureSupported: feature %d is supported by us"),
+                aItem );            
+
+            break;
+            }
+        else
+            {
+            ++i;
+            }
+        } while ( i != KMaxNumOfWlanFeatures );
+
+    return supported;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::OnPacketTransferComplete( 
+    WlanContextImpl& aCtxImpl, 
+    TUint32 aPacketId,
+    TDataBuffer* aMetaHeader )
+    {
+    iCurrentMacState->OnPacketTransferComplete( 
+        aCtxImpl, 
+        aPacketId,
+        aMetaHeader );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::OnPacketSendComplete(
+    WlanContextImpl& aCtxImpl, 
+    WHA::TStatus aStatus,
+    TUint32 aPacketId,
+    WHA::TRate aRate,
+    TUint32 aPacketQueueDelay,
+    TUint32 aMediaDelay,
+    TUint aTotalTxDelay,
+    TUint8 aAckFailures,
+    WHA::TQueueId aQueueId,
+    WHA::TRate aRequestedRate,
+    TBool aMulticastData )
+    {
+    iCurrentMacState->OnPacketSendComplete(
+        aCtxImpl,
+        aStatus,
+        aPacketId,
+        aRate,
+        aPacketQueueDelay,
+        aMediaDelay,
+        aTotalTxDelay,
+        aAckFailures,
+        aQueueId,
+        aRequestedRate,
+        aMulticastData );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::CallPacketSchedule( 
+    WlanContextImpl& aCtxImpl,
+    TBool aMore )
+    {
+    iCurrentMacState->CallPacketSchedule( aCtxImpl, aMore );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::OnPacketFlushEvent(
+    WlanContextImpl& aCtxImpl, 
+    TUint32 aPacketId, 
+    TDataBuffer* aMetaHeader )
+    {
+    iCurrentMacState->OnPacketFlushEvent( aCtxImpl, aPacketId, aMetaHeader );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanContextImpl::OnPacketPushPossible( 
+    WlanContextImpl& aCtxImpl )
+    {
+    iCurrentMacState->OnPacketPushPossible( aCtxImpl );
+    }