wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp
changeset 0 c40eb8fe8501
child 25 a0fdcd0e4c56
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,414 @@
+/*
+* 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:   Implementation of the WlanDot11SoftReset class
+*
+*/
+
+/*
+* %version: 28 %
+*/
+
+#include "config.h"
+#include "UmacDot11SoftReset.h"
+#include "UmacContextImpl.h"
+#include "UmacWsaWriteMib.h"
+#include "UmacWsaDisconnect.h"
+#include "umacconfiguretxqueueparams.h"
+
+#ifndef NDEBUG
+const TInt8 WlanDot11SoftReset::iName[] = "dot11-softreset";
+
+const TUint8 WlanDot11SoftReset::iStateName
+    [ESTATEMAX][KMaxStateStringLength] = 
+    {
+        {"EINIT"},
+        {"EISSUEDISCONNECT"}, 
+        {"ECONFTXQUEUE"},
+        {"ECONTINUEDOT11TRAVERSE"}
+    };
+
+const TUint8 WlanDot11SoftReset::iEventName
+    [EEVENTMAX][KMaxEventStringLength] = 
+    {
+        {"ESTATEENTRY"}, 
+        {"ETXCOMPLETE"},
+        {"EABORT"}
+    };
+#endif 
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::Fsm( 
+    WlanContextImpl& aCtxImpl, 
+    TEvent aEvent )
+    {
+#ifndef NDEBUG
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::Fsm(): event: "));
+    OsTracePrint( 
+        KUmacDetails, 
+        iEventName[aEvent] );
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::Fsm(): state: ")); 
+    OsTracePrint( 
+        KUmacDetails, 
+        iStateName[iState] );
+#endif
+
+    switch ( aEvent )
+        {
+        case ESTATEENTRY:
+            OnStateEntryEvent( aCtxImpl );
+            break;
+        case ETXCOMPLETE:
+            OnTxCompleteEvent( aCtxImpl );
+            break;
+        case EABORT:
+            OnAbortEvent( aCtxImpl );
+            break;
+        default:
+            OsTracePrint( 
+                KErrorLevel, 
+                (TUint8*)("UMAC: WlanDot11SoftReset::Fsm(): event: %d"), 
+                aEvent);        
+            OsAssert( 
+                (TUint8*)("UMAC: WlanDot11SoftReset::Fsm(): panic"), 
+                (TUint8*)(WLAN_FILE), __LINE__ );
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::OnStateEntryEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::OnStateEntryEvent()"));
+
+    switch ( iState )
+        {
+        case EINIT:
+            InitActions( aCtxImpl );
+            ChangeInternalState( aCtxImpl, EISSUEDISCONNECT );            
+            break;
+        case EISSUEDISCONNECT:
+            IssueDisconnect( aCtxImpl );
+            break;
+        case ECONFTXQUEUE:
+            // configure just the legacy Tx queue    
+            ConfigureQueue( aCtxImpl );
+            break;
+        case ECONTINUEDOT11TRAVERSE:
+            ContinueDot11StateTraversal( aCtxImpl );
+            break;
+        default:
+            // programming error
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state: %d"), iState);
+            OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::InitActions( WlanContextImpl& aCtxImpl )
+    {
+    // we are breaking an existing join so we have to reset some
+    // state variables and settings
+    aCtxImpl.CurrentDot11PwrMgmtMode( WHA::KPsDisable );
+    aCtxImpl.Reassociate( EFalse );
+    aCtxImpl.QosEnabled( EFalse );
+    aCtxImpl.UapsdEnabled( EFalse );
+    DetermineAcUapsdUsage( aCtxImpl );
+    aCtxImpl.TerminateVoiceOverWlanCallMaintenance();
+    aCtxImpl.MulticastFilteringDisAllowed( EFalse );
+    aCtxImpl.ResetMulticastAddresses();
+    aCtxImpl.ResetFailedTxPacketCount();            
+    aCtxImpl.IeData( NULL );
+    aCtxImpl.DisassociatedByAp( EFalse );
+    aCtxImpl.ResetTxRateAdaptation();
+    os_memset( 
+        reinterpret_cast<TUint8*>(&(aCtxImpl.GetNwHtCapabilitiesIe().iData)), 
+        0, 
+        K802Dot11HtCapabilitiesIeDataLen );
+
+    for ( TUint i = 0; i < WHA::EQueueIdMax; ++i )
+        {
+        aCtxImpl.iWlanMib.dot11MaxTransmitMSDULifetime[i] = 
+            aCtxImpl.iWlanMib.dot11MaxTransmitMSDULifetimeDefault;
+        aCtxImpl.iWlanMib.iMediumTime[i] = KDot11MediumTimeDefault;
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::OnTxCompleteEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::OnTxCompleteEvent()"));
+
+    switch ( iState )
+        {
+        case EISSUEDISCONNECT:
+            // continue state traversal
+            ChangeInternalState( aCtxImpl, ECONFTXQUEUE );
+            break;
+        case ECONFTXQUEUE:
+            // continue state traversal
+            ChangeInternalState( aCtxImpl, ECONTINUEDOT11TRAVERSE );
+            break;
+        default:
+            // catch internal FSM programming error
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state: %d"), iState);
+            OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::OnAbortEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( KWarningLevel, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::OnAbortEvent()") );
+    DoErrorIndication( aCtxImpl, WHA::KErrorMacNotResponding );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::ContinueDot11StateTraversal( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( KUmacDetails, (TUint8*)
+        ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal()"));
+
+#ifndef NDEBUG
+    
+    // trace current frame statistics
+    
+    const TStatisticsResponse& frameStatistics ( aCtxImpl.FrameStatistics() );
+       
+    OsTracePrint( 
+        KUmacDetails, (TUint8*)
+        ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: *** current frame statistics ***:") );
+
+    for ( TUint i = 0; i < EQueueIdMax; ++i )
+        {
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: * Access Category: %d *"),
+            i );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: successfully received unicast data frames: %d"), 
+             frameStatistics.acSpecific[i].rxUnicastDataFrameCount );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: successfully transmitted unicast data frames: %d"), 
+             frameStatistics.acSpecific[i].txUnicastDataFrameCount );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: successfully received multicast data frames: %d"), 
+             frameStatistics.acSpecific[i].rxMulticastDataFrameCount );
+        
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: successfully transmitted multicast data frames: %d"), 
+             frameStatistics.acSpecific[i].txMulticastDataFrameCount );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: nbr of data frame transmit retries: %d"), 
+             frameStatistics.acSpecific[i].txRetryCount );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: nbr of data frame WLAN delivery failures: %d"), 
+             frameStatistics.acSpecific[i].txErrorCount );                    
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: average data frame Tx media delay in microsecs: %d"), 
+            aCtxImpl.AverageTxMediaDelay( static_cast<WHA::TQueueId>(i) ) );                    
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: average data frame total Tx delay in microsecs: %d"), 
+             aCtxImpl.AverageTotalTxDelay( static_cast<WHA::TQueueId>(i) ) );                    
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: data frame total Tx delay bin 0 count: %d"), 
+             frameStatistics.acSpecific[i].totalTxDelayBin0 );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: data frame total Tx delay bin 1 count: %d"), 
+             frameStatistics.acSpecific[i].totalTxDelayBin1 );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: data frame total Tx delay bin 2 count: %d"), 
+             frameStatistics.acSpecific[i].totalTxDelayBin2 );
+
+        OsTracePrint( 
+            KUmacDetails, (TUint8*)
+            ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: data frame total Tx delay bin 3 count: %d"), 
+             frameStatistics.acSpecific[i].totalTxDelayBin3 );
+        }
+
+    OsTracePrint( 
+        KUmacDetails, (TUint8*)
+        ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: all ACs: nbr of FCS errors in received MPDUs: %d"), 
+         frameStatistics.fcsErrorCount );
+#endif
+
+    // change global state: entry procedure triggers action
+    ChangeState( aCtxImpl,              
+        *this,                                  // prev state
+        aCtxImpl.iStates.iMibDefaultConfigure   // next state
+        );                               
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::ChangeInternalState( 
+    WlanContextImpl& aCtxImpl, 
+    TState aNewState )
+    {
+#ifndef NDEBUG
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)
+        ("UMAC: WlanDot11SoftReset::ChangeInternalState(): old state:"));
+    OsTracePrint( 
+        KUmacDetails, 
+        iStateName[iState] );
+    OsTracePrint( 
+        KUmacDetails, 
+        (TUint8*)
+        ("UMAC: WlanDot11SoftReset::ChangeInternalState(): new state:"));
+    OsTracePrint( 
+        KUmacDetails, 
+        iStateName[aNewState] );
+#endif
+
+    iState = aNewState;
+    Fsm( aCtxImpl, ESTATEENTRY );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::IssueDisconnect( 
+    WlanContextImpl& aCtxImpl )
+    {
+    // change global state: entry procedure triggers action
+    ChangeState( aCtxImpl, 
+        *this,                      // prev state
+        aCtxImpl.WsaDisconnect()    // next state
+        );      
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::ConfigureQueue( 
+    WlanContextImpl& aCtxImpl )
+    {
+    ConfigureTxQueue( aCtxImpl, WHA::ELegacy );    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+#ifndef NDEBUG 
+const TInt8* WlanDot11SoftReset::GetStateName( TUint8& aLength ) const
+    {
+    aLength = sizeof( iName );
+    return iName;
+    }
+#endif
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::Entry( WlanContextImpl& aCtxImpl )
+    {
+    if ( aCtxImpl.WsaCmdActive() )
+        {
+        // sanity checking code
+        OsAssert( (TUint8*)("UMAC * panic"), 
+            (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+
+    // don't want to do event dispatching here as we want
+    // to run this dot11 state critter in non pre-emptive mode
+
+    if ( iState != EINIT )
+        {
+        // this is NOT the start of the the FSM actions
+        // note that we send the ETXCOMPLETE event as the states
+        // that wait for it are the only ones that can be interrupted
+        // as they are asynchronous operations by nature
+        // and wait for corresponding WHA completion method
+        Fsm( aCtxImpl, ETXCOMPLETE );
+        }
+    else
+        {
+        // this is the start of the the FSM actions
+        Fsm( aCtxImpl, ESTATEENTRY );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void WlanDot11SoftReset::Exit( WlanContextImpl& /*aCtxImpl*/ )
+    {
+    OsTracePrint( 
+        KUmacProtocolState, 
+        (TUint8*)("UMAC: WlanDot11SoftReset::Exit()"));
+
+    // reset our local FSM for the next time...
+    iState = EINIT;
+    }