diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacconfiguretxautoratepolicy.cpp --- /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 +#else +#include +#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( + 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