wlan_bearer/wlanldd/wlan_common/umac_common/src/umaceventdispatcher.cpp
changeset 0 c40eb8fe8501
--- /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;
+    }