diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11DisassociationPending.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11DisassociationPending.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,360 @@ +/* +* Copyright (c) 2002-2007 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 UmacDot11DisassociationPending class +* +*/ + +/* +* %version: 22 % +*/ + +#include "config.h" +#include "UmacDot11DisassociationPending.h" +#include "UmacContextImpl.h" + +#ifndef NDEBUG +const TInt8 WlanDot11DisassociationPending::iName[] = "dot11-disassociationpending"; + +const TUint8 WlanDot11DisassociationPending::iStateName + [ESTATEMAX][KMaxStateStringLength] = + { + {"EINIT"}, + {"ETXDISASSOCIATIONFRAME"}, + {"EWAIT4PUSHPACKET"}, + {"ECONTINUEDOT11TRAVERSE"} + }; + +const TUint8 WlanDot11DisassociationPending::iEventName + [EEVENTMAX][KMaxEventStringLength] = + { + {"ESTATEENTRY"}, + {"ETXPACKETCOMPLETE"}, + {"ETX_SCHEDULER_FULL"}, + {"EPUSHPACKET"} + }; +#endif + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +WlanDot11DisassociationPending::WlanDot11DisassociationPending() + : iState( EINIT ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +WlanDot11DisassociationPending::~WlanDot11DisassociationPending() + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::Entry( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( + KUmacProtocolState | KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::Entry()")); + + if ( aCtxImpl.WsaCmdActive() ) + { + // sanity checking code + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + // no need to do event dispatching as this + // thing is triggered by the user and + // is executed synchronously as we only do OID completion + // at the end of reassociation process + // Additionally we don't execute any asynchronous WHA commands + // from here so disassociation protocol does not include multiple + // this object entry method executions + + if ( iState == EINIT ) + { + // this is the start of the the FSM actions + Fsm( aCtxImpl, ESTATEENTRY ); + } + else + { + // implementation error see comment block above why +#ifndef NDEBUG + OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state:")); + OsTracePrint( KErrorLevel, iStateName[iState] ); +#endif + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// completion method called when packet has been sent from the WLAN device +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::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*/ ) + { + OsTracePrint( + KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::OnPacketSendComplete")); + + aCtxImpl.OnTxCompleted( aRate, + static_cast(aStatus == WHA::KSuccess), + aQueueId, + aRequestedRate ); + + if ( aPacketId == E802Dot11FrameTypeDisassociation ) + { + // disassociation tx message has been sent from the WLAN device + // No matter whether the sending was successful or not we will proceed + // with our roaming actions + + Fsm( aCtxImpl, ETXPACKETCOMPLETE ); + } + } + +#ifndef NDEBUG +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +const TInt8* WlanDot11DisassociationPending::GetStateName( TUint8& aLength ) const + { + aLength = sizeof( iName ); + return iName; + } +#endif + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::Exit( WlanContextImpl& /*aCtxImpl*/ ) + { + OsTracePrint( + KUmacProtocolState, + (TUint8*)("UMAC: WlanDot11DisassociationPending::Exit()")); + + // we are departing this dot11state to another dot11state (dot11synchronize) + // we simple reset our local FSM for the next time... + iState = EINIT; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::Fsm( + WlanContextImpl& aCtxImpl, + TEvent aEvent ) + { +#ifndef NDEBUG + OsTracePrint( + KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::Fsm(): event: ")); + OsTracePrint( KUmacAssoc, iEventName[aEvent] ); + OsTracePrint( + KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::Fsm(): state: ")); + OsTracePrint( KUmacAssoc, iStateName[iState] ); +#endif + + switch ( aEvent ) + { + case ESTATEENTRY: + OnStateEntryEvent( aCtxImpl ); + break; + case ETXPACKETCOMPLETE: + OnTxCompleteEvent( aCtxImpl ); + break; + case ETX_SCHEDULER_FULL: + OnTxSchedulerFullEvent( aCtxImpl ); + break; + case EPUSHPACKET: + OnPushPacketEvent( aCtxImpl ); + break; + default: + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// Handler for state entry event. +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::OnStateEntryEvent( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( + KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::OnStateEntryEvent()")); + + switch ( iState ) + { + case EINIT: + // continue with the state traversal + ChangeInternalState( aCtxImpl, ETXDISASSOCIATIONFRAME ); + break; + case ETXDISASSOCIATIONFRAME: + if ( !TxDisassociate( + aCtxImpl, + E802Dot11ReasonDisAssocStationLeft, + ETrue ) ) + { + // tx of dot11 disassociate frame failed + // because packet scheduler was full + // or because we didn't get a Tx buffer + // so we enter to a wait state + Fsm( aCtxImpl, ETX_SCHEDULER_FULL ); + } + break; + case EWAIT4PUSHPACKET: + // nothing to do here than wait + break; + case ECONTINUEDOT11TRAVERSE: + ContinueDot11StateTraversal( aCtxImpl ); + break; + default: + // programming error + OsTracePrint( KErrorLevel, + (TUint8*)("UMAC: state: %d"), iState); + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + break; + } + } + +// ----------------------------------------------------------------------------- +// Handler for tx complete event. +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::OnTxCompleteEvent( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( + KUmacAssoc, + (TUint8*)("UMAC: WlanDot11DisassociationPending::OnTxCompleteEvent()")); + + if ( iState == ETXDISASSOCIATIONFRAME ) + { + + // disassociate frame has been sent + // continue state traversal + ChangeInternalState( aCtxImpl, ECONTINUEDOT11TRAVERSE ); + } + else + { + // programming error + OsTracePrint( KErrorLevel, (TUint8*)("UMAC: state: %d"), iState); + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + +// ----------------------------------------------------------------------------- +// Handler for scheduler full event upon trying to tx dot11 disassociate frame +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::OnTxSchedulerFullEvent( + WlanContextImpl& aCtxImpl ) + { + // change state + OsTracePrint( KWarningLevel | KUmacAssoc, (TUint8*) + ("UMAC: WlanDot11DisassociationPending::OnTxSchedulerFullEvent:packet scheduler full during disassociation process") ); + + ChangeInternalState( aCtxImpl, EWAIT4PUSHPACKET ); + } + +// ----------------------------------------------------------------------------- +// Handler for push packet to packet scheduler possible event +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::OnPushPacketEvent( + WlanContextImpl& aCtxImpl ) + { + if ( iState == EWAIT4PUSHPACKET ) + { + ChangeInternalState( aCtxImpl, ETXDISASSOCIATIONFRAME ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::ContinueDot11StateTraversal( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( + KUmacAssoc, + (TUint8*) + ("UMAC: WlanDot11DisassociationPending::ContinueDot11StateTraversal()")); + + // proceed to synchronize state... + ChangeState( aCtxImpl, + *this, // prev state + aCtxImpl.iStates.iSynchronizeState // next state + ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::ChangeInternalState( + WlanContextImpl& aCtxImpl, + TState aNewState ) + { +#ifndef NDEBUG + OsTracePrint( + KUmacDetails, + (TUint8*) + ("UMAC: WlanDot11DisassociationPending::ChangeInternalState(): old state:")); + OsTracePrint( KUmacAssoc, iStateName[iState] ); + OsTracePrint( + KUmacDetails, + (TUint8*) + ("UMAC: WlanDot11DisassociationPending::ChangeInternalState(): new state:")); + OsTracePrint( KUmacAssoc, iStateName[aNewState] ); +#endif + + iState = aNewState; + Fsm( aCtxImpl, ESTATEENTRY ); + } + +// ----------------------------------------------------------------------------- +// packet sceduler notification that a packet push is guaranteed to succeed +// ----------------------------------------------------------------------------- +// +void WlanDot11DisassociationPending::OnPacketPushPossible( + WlanContextImpl& aCtxImpl ) + { + // feed a critter to the fsm + Fsm( aCtxImpl, EPUSHPACKET ); + }