diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/umaceventdispatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umaceventdispatcher.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2005-2008 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: Event dispatcher that is used to serialize MAC prototocl +* statemachine access +* +*/ + +/* +* %version: 27 % +*/ + +#include "config.h" +#include "umaceventdispatcher.h" + +#include "umaceventdispatcherclient.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +WlanEventDispatcher::WlanEventDispatcher( + MWlanEventDispatcherClient& aEventDispatcherClient ) + : iEventDispatcherClient( aEventDispatcherClient ), + iCommandCompletionRegistered ( EFalse ), iDisableChannelMask( 0 ), + iOid( NULL ), iInternalEvents( 0 ) + { + }; + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanEventDispatcher::Dispatch() + { + TBool state_transition_event( EFalse ); + + if ( iInternalEvents ) + { + OsTracePrint( KEventDispatcher, (TUint8*) + ("UMAC: WlanEventDispatcher::Dispatch(): dispatch internal event") ); + + state_transition_event = DispatchInternalEvent(); + } + if ( !state_transition_event ) + { + if ( iCommandCompletionRegistered ) + { + OsTracePrint( KEventDispatcher, (TUint8*) + ("UMAC: WlanEventDispatcher::Dispatch(): dispatch WHA command completion") ); + + state_transition_event = DispatchCommandCompletionEvent(); + } + if ( !state_transition_event ) + { + if (// oid exists + iOid + // AND channel is NOT disabled + && (!(iDisableChannelMask & KOidChannel)) ) + { + OsTracePrint( KEventDispatcher, (TUint8*) + ("UMAC: WlanEventDispatcher::Dispatch(): dispatch OID") ); + + state_transition_event = DispatchOidEvent(); + } + } + } + return state_transition_event; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void WlanEventDispatcher::Register( + WHA::TCompleteCommandId aCompleteCommandId, + WHA::TStatus aStatus, + const WHA::UCommandCompletionParams& aCommandCompletionParams ) + { + if ( iCommandCompletionRegistered ) + { + OsTracePrint( KEventDispatcher, (TUint8*) + ("UMAC: WlanEventDispatcher::Register(): register cmd completion when one is already registered") ); + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + iWhaCommandCompletionParams.iId = aCompleteCommandId; + iWhaCommandCompletionParams.iStatus = aStatus; + iWhaCommandCompletionParams.iParams = aCommandCompletionParams; + + iCommandCompletionRegistered = ETrue; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanEventDispatcher::DispatchInternalEvent() + { + TBool ret ( EFalse ); + + if ( iInternalEvents & KAcParamUpdate ) + { + iInternalEvents &= ~KAcParamUpdate; + ret = iEventDispatcherClient.OnInternalEvent( KAcParamUpdate ); + } + else if ( iInternalEvents & KPowerMgmtTransition ) + { + iInternalEvents &= ~KPowerMgmtTransition; + ret = iEventDispatcherClient.OnInternalEvent( KPowerMgmtTransition ); + } + else if ( iInternalEvents & KTimeout) + { + iInternalEvents &= ~KTimeout; + ret = iEventDispatcherClient.OnInternalEvent( KTimeout ); + } + else if ( iInternalEvents & KVoiceCallEntryTimerTimeout) + { + iInternalEvents &= ~KVoiceCallEntryTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( + KVoiceCallEntryTimerTimeout ); + } + else if ( iInternalEvents & KNullTimerTimeout) + { + iInternalEvents &= ~KNullTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( KNullTimerTimeout ); + } + else if ( iInternalEvents & KNoVoiceTimerTimeout) + { + iInternalEvents &= ~KNoVoiceTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( KNoVoiceTimerTimeout ); + } + else if ( iInternalEvents & KKeepAliveTimerTimeout) + { + iInternalEvents &= ~KKeepAliveTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( KKeepAliveTimerTimeout ); + } + else if ( iInternalEvents & KActiveToLightPsTimerTimeout) + { + iInternalEvents &= ~KActiveToLightPsTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( + KActiveToLightPsTimerTimeout ); + } + else if ( iInternalEvents & KLightPsToActiveTimerTimeout) + { + iInternalEvents &= ~KLightPsToActiveTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( + KLightPsToActiveTimerTimeout ); + } + else if ( iInternalEvents & KLightPsToDeepPsTimerTimeout) + { + iInternalEvents &= ~KLightPsToDeepPsTimerTimeout; + ret = iEventDispatcherClient.OnInternalEvent( + KLightPsToDeepPsTimerTimeout ); + } + else if ( iInternalEvents & KSetCtsToSelf) + { + iInternalEvents &= ~KSetCtsToSelf; + ret = iEventDispatcherClient.OnInternalEvent( KSetCtsToSelf ); + } + else if ( iInternalEvents & KSetRcpiTriggerLevel ) + { + iInternalEvents &= ~KSetRcpiTriggerLevel; + ret = iEventDispatcherClient.OnInternalEvent( KSetRcpiTriggerLevel ); + } + else if ( iInternalEvents & KSetHtBssOperation ) + { + iInternalEvents &= ~KSetHtBssOperation; + ret = iEventDispatcherClient.OnInternalEvent( KSetHtBssOperation ); + } + else + { + // programming error + OsTracePrint( KErrorLevel, + (TUint8*)("UMAC: iInternalEvents"), iInternalEvents ); + OsAssert((TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanEventDispatcher::DispatchCommandCompletionEvent() + { + // make a local copy of the completion parameters + const TCommandResp resp ( iWhaCommandCompletionParams ); + // clear the event flag + iCommandCompletionRegistered = EFalse; + + // handle the event + return ( iEventDispatcherClient.OnWhaCommandComplete( + resp.iId, + resp.iStatus, + resp.iParams )); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanEventDispatcher::DispatchOidEvent() + { + TBool ret ( EFalse ); + switch ( iOid->oid_id ) + { + case E802_11_CONFIGURE: + ret = iEventDispatcherClient.HandleConfigure( iOid ); + break; + case E802_11_CONNECT: + ret = iEventDispatcherClient.HandleConnect( iOid ); + break; + case E802_11_START_IBSS: + ret = iEventDispatcherClient.HandleStartIBSS( iOid ); + break; + case E802_11_SCAN: + ret = iEventDispatcherClient.HandleScan( iOid ); + break; + case E802_11_STOP_SCAN: + ret = iEventDispatcherClient.HandleStopScan(); + break; + case E802_11_DISCONNECT: + ret = iEventDispatcherClient.HandleDisconnect(); + break; + case E802_11_SET_POWER_MODE: + ret = iEventDispatcherClient.HandleSetPowerMode( iOid ); + break; + case E802_11_SET_RCPI_TRIGGER_LEVEL: + ret = iEventDispatcherClient.HandleSetRcpiTriggerLevel( iOid ); + break; + case E802_11_SET_TX_POWER_LEVEL: + ret = iEventDispatcherClient.HandleSetTxPowerLevel( iOid ); + break; + case E802_11_GET_LAST_RCPI: + ret = iEventDispatcherClient.HandleGetLastRcpi(); + break; + case E802_11_DISABLE_USER_DATA: + ret = iEventDispatcherClient.HandleDisableUserData(); + break; + case E802_11_ENABLE_USER_DATA: + ret = iEventDispatcherClient.HandleEnableUserData(); + break; + case E802_11_ADD_CIPHER_KEY: + ret = iEventDispatcherClient.HandleAddCipherKey( iOid ); + break; + case E802_11_ADD_MULTICAST_ADDR: + ret = iEventDispatcherClient.HandleAddMulticastAddr( iOid ); + break; + case E802_11_REMOVE_MULTICAST_ADDR: + ret = iEventDispatcherClient.HandleRemoveMulticastAddr( iOid ); + break; + case E802_11_CONFIGURE_BSS_LOST: + ret = iEventDispatcherClient.HandleConfigureBssLost( iOid ); + break; + case E802_11_SET_TX_RATE_ADAPT_PARAMS: + ret = iEventDispatcherClient.HandleSetTxRateAdaptParams( iOid ); + break; + case E802_11_CONFIGURE_TX_RATE_POLICIES: + ret = iEventDispatcherClient.HandleConfigureTxRatePolicies( iOid ); + break; + case E802_11_SET_POWER_MODE_MGMT_PARAMS: + ret = iEventDispatcherClient.HandleSetPowerModeMgmtParams( iOid ); + break; + case E802_11_CONFIGURE_PWR_MODE_MGMT_TRAFFIC_OVERRIDE: + ret = iEventDispatcherClient.HandleConfigurePwrModeMgmtTrafficOverride( iOid ); + break; + case E802_11_GET_FRAME_STATISTICS: + ret = iEventDispatcherClient.HandleGetFrameStatistics(); + break; + case E802_11_CONFIGURE_UAPSD: + ret = iEventDispatcherClient.HandleConfigureUapsd( iOid ); + break; + case E802_11_CONFIGURE_TX_QUEUE: + ret = iEventDispatcherClient.HandleConfigureTxQueue( iOid ); + break; + case E802_11_GET_MAC_ADDRESS: + ret = iEventDispatcherClient.HandleGetMacAddress(); + break; + case E802_11_CONFIGURE_ARP_IP_ADDRESS_FILTERING: + ret = iEventDispatcherClient.HandleConfigureArpIpAddressFiltering( iOid ); + break; + case E802_11_CONFIGURE_HT_BLOCK_ACK: + ret = iEventDispatcherClient.HandleConfigureHtBlockAck( iOid ); + break; + case E802_11_CONFIGURE_PROPRIETARY_SNAP_HDR: + ret = iEventDispatcherClient.HandleConfigureProprietarySnapHdr( + iOid ); + break; + default: + // catch programming error + OsTracePrint( KErrorLevel, (TUint8*) + ("UMAC: OID: 0x%08x"), iOid->oid_id ); + OsAssert((TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + break; + } + + // mark as used + iOid = NULL; + return ret; + }