diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp --- /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(&(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(i) ) ); + + OsTracePrint( + KUmacDetails, (TUint8*) + ("UMAC: WlanDot11SoftReset::ContinueDot11StateTraversal: average data frame total Tx delay in microsecs: %d"), + aCtxImpl.AverageTotalTxDelay( static_cast(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; + }