wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxautoratepolicy.cpp
changeset 0 c40eb8fe8501
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxautoratepolicy.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,356 @@
+/*
+* Copyright (c) 2007-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 WlanConfigureTxAutoRatePolicy class
+*
+*/
+
+/*
+* %version: 6 %
+*/
+
+#include "config.h"
+#include "umacconfiguretxautoratepolicy.h"
+#include "UmacContextImpl.h"
+#include "UmacWsaWriteMib.h"
+
+#ifndef RD_WLAN_DDK
+#include <wha_mib.h>
+#else
+#include <wlanwha_mib.h>
+#endif
+
+
+#ifndef NDEBUG
+const TInt8 WlanConfigureTxAutoRatePolicy::iName[] 
+    = "whacomplex-configuretxautoratepolicy";
+
+const TUint8 WlanConfigureTxAutoRatePolicy::iStateName
+    [ESTATEMAX][KMaxStateStringLength] = 
+    {
+        {"EINIT"}, 
+        {"ESETAUTORATEPOLICY"},
+        {"EFINIT"}
+    };
+
+const TUint8 WlanConfigureTxAutoRatePolicy::iEventName
+    [EEVENTMAX][KMaxEventStringLength] = 
+    {
+        {"ESTATEENTRY"}, 
+        {"ETXCOMPLETE"},
+        {"EABORT"}
+    };
+#endif // !NDEBUG
+
+// length of txAutoRatePolicy MIB
+const TUint16 KtxAutoRatePolicyMibLen = sizeof( WHA::StxAutoRatePolicy );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+WlanConfigureTxAutoRatePolicy::WlanConfigureTxAutoRatePolicy() : 
+     iState ( EINIT ),
+     iCompleteMgmtRequest ( EFalse ),
+     iTxAutoRatePolicyMib ( NULL ),
+     iNumberOfPolicyClassesToConfigure ( 0 ),
+     iRatePolicyClass ( 0 )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+WlanConfigureTxAutoRatePolicy::~WlanConfigureTxAutoRatePolicy() 
+    { 
+    iTxAutoRatePolicyMib = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::Set( TBool aCompleteMgmtRequest  )
+    {
+    iCompleteMgmtRequest = aCompleteMgmtRequest;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::Fsm( 
+    WlanContextImpl& aCtxImpl, 
+    TEvent aEvent )
+    {
+#ifndef NDEBUG
+    OsTracePrint( KUmacDetails, (TUint8*)
+        ("UMAC: WlanConfigureTxAutoRatePolicy::Fsm: event:"));
+    OsTracePrint( KUmacDetails, iEventName[aEvent] );
+    OsTracePrint( KUmacDetails, (TUint8*)
+        ("UMAC: WlanConfigureTxAutoRatePolicy::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:
+            // catch internal FSM programming error
+#ifndef NDEBUG
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: event:"));
+            OsTracePrint( KErrorLevel, iEventName[aEvent] );                
+#endif 
+            OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::OnStateEntryEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    switch ( iState )
+        {
+        case EINIT:
+            // determine the number of rate policy classes to set
+            iNumberOfPolicyClassesToConfigure = 
+                (aCtxImpl.RatePolicy()).numOfPolicyObjects;
+            OsTracePrint( KUmacDetails, (TUint8*)
+                ("UMAC: WlanConfigureTxAutoRatePolicy::OnStateEntryEvent: nbr of policy classes to configure: %d"),
+                iNumberOfPolicyClassesToConfigure );
+
+            // rate policy class IDs start from 1, so that's the 1st to 
+            // configure
+            iRatePolicyClass = 1;
+            // allocate memory for the MIB to write
+            iTxAutoRatePolicyMib = 
+                static_cast<WHA::StxAutoRatePolicy*>(
+                    os_alloc( KtxAutoRatePolicyMibLen ) ); 
+
+            if ( iTxAutoRatePolicyMib )
+                {
+                // start the FSM traversal
+                ChangeInternalState( aCtxImpl, ESETAUTORATEPOLICY );
+                }
+            else
+                {
+                // allocation failure, abort processing
+                Fsm( aCtxImpl, EABORT );                
+                }
+            break;
+        case ESETAUTORATEPOLICY:
+            SetAutoRatePolicy( aCtxImpl );                
+            break;
+        case EFINIT:
+            // fsm execution complete. 
+            
+            // complete WLAN Mgmt Client request, if necessary
+            if ( iCompleteMgmtRequest )
+                {
+                OnOidComplete( aCtxImpl, KErrNone );
+                }
+                
+            // Traverse back to history state
+            TraverseToHistoryState( aCtxImpl );
+            break;
+        default:
+            // cath internal FSM programming error
+#ifndef NDEBUG
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:"));
+            OsTracePrint( KErrorLevel, iStateName[iState] );
+#endif 
+            OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::OnTxCompleteEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    switch ( iState )
+        {
+        case ESETAUTORATEPOLICY:
+            
+            // one (more) rate policy class has been set
+            ++iRatePolicyClass;
+            
+            if ( iRatePolicyClass <= iNumberOfPolicyClassesToConfigure )
+                {
+                // we haven't configured all the rate policy classes, yet
+                // so proceed with the next one by re-entering the current
+                // internal state
+                ChangeInternalState( aCtxImpl, ESETAUTORATEPOLICY );
+                }
+            else
+                {
+                // all rate policy classes have been set. We are done
+                ChangeInternalState( aCtxImpl, EFINIT );                
+                }
+
+            break;
+        default:
+            // cath internal FSM programming error
+#ifndef NDEBUG
+            OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:"));
+            OsTracePrint( KErrorLevel, iStateName[iState] );
+#endif             
+            OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// simulate macnotresponding error
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::OnAbortEvent( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( KWarningLevel, 
+        (TUint8*)("UMAC: WlanConfigureTxAutoRatePolicy::OnAbortEvent") );
+
+    DoErrorIndication( aCtxImpl, WHA::KErrorMacNotResponding );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::ChangeInternalState( 
+    WlanContextImpl& aCtxImpl, 
+    TState aNewState )
+    {
+    iState = aNewState;
+    Fsm( aCtxImpl, ESTATEENTRY );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::SetAutoRatePolicy( 
+    WlanContextImpl& aCtxImpl )
+    {
+    OsTracePrint( KUmacDetails, (TUint8*)
+        ("UMAC: WlanConfigureTxAutoRatePolicy::SetAutoRatePolicy") );
+
+    // retrieve reference to the stored rate policy information
+    const TTxRatePolicy& ratePolicy ( aCtxImpl.RatePolicy() );
+    // ... and to the stored auto rate policy
+    TTxAutoRatePolicy& autoRatePolicy ( aCtxImpl.AutoRatePolicy() );
+    // ... and to the stored HT MCS policy information
+    const THtMcsPolicy& htMcsPolicy ( aCtxImpl.HtMcsPolicy() );
+
+    // 1st clear
+    os_memset( iTxAutoRatePolicyMib, 0, KtxAutoRatePolicyMibLen );
+    
+    // set the mib contents. Note that because rate policy class IDs start from
+    // 1 and array indexes from 0 we need to subtract one from the rate policy
+    // class ID when accessing corresponding arrays
+    
+    iTxAutoRatePolicyMib->iBAndGRates = autoRatePolicy[iRatePolicyClass - 1];
+    iTxAutoRatePolicyMib->iTxRateClassId = iRatePolicyClass;
+    iTxAutoRatePolicyMib->iShortRetryLimit = 
+        ratePolicy.txRateClass[iRatePolicyClass - 1].shortRetryLimit;
+    iTxAutoRatePolicyMib->iLongRetryLimit = 
+        ratePolicy.txRateClass[iRatePolicyClass - 1].longRetryLimit;
+
+    os_memcpy( 
+        iTxAutoRatePolicyMib->iMcsSet,
+        &(htMcsPolicy[iRatePolicyClass - 1]),
+        sizeof( WHA::THtMcsSet ) );
+    
+    WlanWsaWriteMib& whaCmd = aCtxImpl.WsaWriteMib();
+    whaCmd.Set( 
+        aCtxImpl, 
+        WHA::KMibTxAutoRatePolicy, 
+        KtxAutoRatePolicyMibLen, 
+        iTxAutoRatePolicyMib );
+
+    // change global state: entry procedure triggers action
+    ChangeState( aCtxImpl, 
+        *this,              // prev state
+        whaCmd              // next state
+        );           
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void WlanConfigureTxAutoRatePolicy::Entry( 
+    WlanContextImpl& aCtxImpl )
+    {
+    if ( aCtxImpl.WsaCmdActive() )
+        {
+        // sanity checking code
+        OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ );
+        }
+
+    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 WlanConfigureTxAutoRatePolicy::Exit( 
+    WlanContextImpl& /*aCtxImpl*/ )
+    {
+    iState = EINIT;
+    os_free( iTxAutoRatePolicyMib );
+    iTxAutoRatePolicyMib = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+#ifndef NDEBUG 
+const TInt8* WlanConfigureTxAutoRatePolicy::GetStateName( 
+    TUint8& aLength ) const
+    {
+    aLength = sizeof( iName );
+    return iName;
+    }
+#endif