# HG changeset patch # User hgs # Date 1275642749 -10800 # Node ID a0fdcd0e4c567218b9cffb3b334eb86e9afad2c7 # Parent e717b8f55620b5fb554a945f96e0ccc54b350203 201022 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 41 % +* %version: 42 % */ #include "core_operation_get_available_iaps.h" @@ -1017,7 +1017,7 @@ } u8_t treshold_val = - static_cast(server_m->get_core_settings().rcp_improve_boundary()); + static_cast( server_m->get_device_settings().rcpi_trigger ); /** * Loop through the IAP list. @@ -1039,22 +1039,30 @@ iap->id ); u32_t* iap_id = new u32_t; + bool_t is_match_found( true_t ); if( iap_id ) { - if ( server_m->get_core_settings().is_iap_id_in_weak_list( iap->id) ) + if ( server_m->get_core_settings().is_iap_id_in_weak_list( iap->id ) ) { DEBUG( "core_operation_get_available_iaps_c::remove_matching_iaps() - IAP ID is in weak list" ); if ( ap_data.rcpi() > treshold_val ) { - DEBUG( "core_operation_get_available_iaps_c::remove_matching_iaps() - RCPI improved enough, remove IAP ID from weak list" ); + DEBUG1( "core_operation_get_available_iaps_c::remove_matching_iaps() - RCPI improved enough (%u), remove IAP ID from weak list", + ap_data.rcpi() ); *iap_id = iap->id; iap_id_list_m.append( iap_id ); iap_id = NULL; server_m->get_core_settings().remove_iap_id_from_weak_list( iap->id ); } + else + { + DEBUG2( "core_operation_get_available_iaps_c::remove_matching_iaps() - RCPI not improved enough (%u vs %u)", + ap_data.rcpi(), treshold_val ); + is_match_found = false_t; + } } else { @@ -1066,19 +1074,22 @@ /** Using a temporary pointer to guarantee list iterator working. */ core_iap_data_s* temp = iap; - iap = iap_data_list_m.next(); - core_error_e ret = iap_data_list_m.remove( temp ); - if( ret != core_error_ok ) + if( is_match_found ) { - if( iap ) + core_error_e ret = iap_data_list_m.remove( temp ); + if( ret != core_error_ok ) { - DEBUG1("core_operation_get_available_iaps_c::remove_matching_iaps() - error while removing IAP entry (%d)", - iap->id ); + if( iap ) + { + DEBUG1("core_operation_get_available_iaps_c::remove_matching_iaps() - error while removing IAP entry (%d)", + iap->id ); + } } + + delete temp; } - delete temp; temp = NULL; delete iap_id; iap_id = NULL; diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/conf/wlanengine.confml Binary file wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/conf/wlanengine.confml has changed diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -0,0 +1,134 @@ +/* +* Copyright (c) 2009-2010 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: +* This class implements a system tick based timer service. +* +*/ + +/* +* %version: 2 % +*/ + +#include "wlanticktimer.h" +#include "am_debug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer::CWlanTickTimer( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ) : + CActive( CActive::EPriorityStandard ), + iTimerExpiredCB( aTimerExpiredCB ), + iTimerCancelledCB( aTimerCancelledCB ), + iTimerErrorCB( aTimerErrorCB ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer* CWlanTickTimer::NewL( + const TCallBack& aTimerExpiredCB, + const TCallBack& aTimerCancelledCB, + const TCallBack& aTimerErrorCB ) + { + CWlanTickTimer* self = new (ELeave) CWlanTickTimer( + aTimerExpiredCB, + aTimerCancelledCB, + aTimerErrorCB ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanTickTimer::~CWlanTickTimer() + { + Cancel(); + iTimer.Close(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::After( + TUint aTicks ) + { + DEBUG1( "CWlanTickTimer::After() - aTicks: %u", + aTicks ); + + iTimer.AfterTicks( + iStatus, + aTicks ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::RunL() + { + DEBUG1( "CWlanTickTimer::RunL() - iStatus: %d", + iStatus.Int() ); + + switch( iStatus.Int() ) + { + case KErrNone: // Timer expired + iTimerExpiredCB.CallBack(); + break; + case KErrCancel: // Timer cancelled + iTimerCancelledCB.CallBack(); + break; + default: // Timer error code + iTimerErrorCB.CallBack(); + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TInt CWlanTickTimer::RunError( + TInt /* aError */ ) + { + DEBUG( "CWlanTickTimer::RunError()" ); + + return 0; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanTickTimer::DoCancel() + { + DEBUG( "CWlanTickTimer::DoCancel()" ); + + iTimer.Cancel(); + } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -29,7 +29,7 @@ { DEBUG( "CWlmScanRequest::NewL()" ); - CWlmScanRequest* self = new CWlmScanRequest( + CWlmScanRequest* self = new (ELeave) CWlmScanRequest( aClient ); CleanupStack::PushL( self ); self->ConstructL(); diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 105 % +* %version: 107 % */ #ifndef WLANCONTEXTIMPL_H @@ -945,7 +945,7 @@ * @since S60 3.2 * @return length of the frame body */ - inline const TUint16 ScanResponseFrameBodyLength() const; + inline TUint16 ScanResponseFrameBodyLength() const; /** * Stores the IE(s) to be included into the (re-)association request. @@ -1310,11 +1310,13 @@ * @param aQueueId Id of the queue/AC via which the frame will be * transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @return To which power management mode to change; if any at all */ inline TPowerMgmtModeChange OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ); + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType = E802Dot11FrameTypeData ); /** * To be called when accepting an Rx frame @@ -1333,6 +1335,16 @@ TDaType aDaType ); /** + * To be called when receiving the PS Mode Error indication + * + * Informs Dynamic Power Mode Manager about the indication. + * Determines the need to make a power mode transition. + * + * @return To which power management mode to change; if any at all + */ + inline TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * Sets the dynamic power mode transition algorithm parameters * * @since S60 3.1 @@ -1415,6 +1427,12 @@ inline void FreezePwrModeMgmtTrafficOverride(); /** + * Restores the Active mode parameters of dynamic power mode management + * back to their WLAN Mgmt Client provided values + */ + inline void RestorePwrModeMgmtParameters(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 @@ -1760,7 +1778,15 @@ * * @since S60 3.2 */ - void OnKeepAliveTimerTimeout(); + inline void OnKeepAliveTimerTimeout(); + + /** + * Are we currently in Voice over WLAN Call state + * + * @return ETrue if we are + * EFalse if we are not + */ + inline TBool InVoiceCallState() const; /** * Insert new RCPI value into the Signal Predictor. @@ -1804,13 +1830,27 @@ WHA::TRcpi aRcpiWarnLevel ); /** - * Adds a WLAN feature supported by us to the list of those supported - * features which are indicated in BSS membership selector + * Adds the specified WLAN feature supported by us to the list of those + * supported features which are indicated in BSS membership selector * * @param aFeature Feature to add */ void AddBssMembershipFeature( T802Dot11BssMembershipSelector aFeature ); - + + /** + * Removes the specified WLAN feature from our list of those supported + * features which are indicated in BSS membership selector + * + * @param aFeature Feature to remove + */ + void RemoveBssMembershipFeature( TUint8 aItem ); + + /** + * Clears (i.e. makes empty) our list of features which are indicated + * in BSS membership selector + */ + inline void ClearBssMembershipFeatureList(); + /** * Checks if the specified item is a WLAN feature indicated in BSS * membership selector and if it is supported by us diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 77 % +* %version: 79 % */ #include "umacconnectcontext.h" @@ -420,7 +420,7 @@ // // --------------------------------------------------------------------------- // -inline const TUint16 WlanContextImpl::ScanResponseFrameBodyLength() const +inline TUint16 WlanContextImpl::ScanResponseFrameBodyLength() const { return iConnectContext.iScanResponseFrameBodyLength; } @@ -1610,9 +1610,13 @@ // inline TPowerMgmtModeChange WlanContextImpl::OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ) + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ) { - return iDynamicPowerModeCntx.OnFrameTx( aQueueId, aEtherType ); + return iDynamicPowerModeCntx.OnFrameTx( + aQueueId, + aEtherType, + aDot11FrameType ); } // --------------------------------------------------------------------------- @@ -1636,6 +1640,15 @@ // // --------------------------------------------------------------------------- // +inline TPowerMgmtModeChange WlanContextImpl::OnPsModeErrorIndication() + { + return iDynamicPowerModeCntx.OnPsModeErrorIndication(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline void WlanContextImpl::SetPowerModeManagementParameters( TUint32 aToLightPsTimeout, TUint16 aToLightPsFrameThreshold, @@ -1693,6 +1706,15 @@ // // --------------------------------------------------------------------------- // +inline void WlanContextImpl::RestorePwrModeMgmtParameters() + { + iDynamicPowerModeCntx.RestoreActiveModeParameters(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline TBool WlanContextImpl::OnActiveToLightPsTimerTimeout() { return iDynamicPowerModeCntx.OnActiveToLightPsTimerTimeout(); @@ -2059,6 +2081,15 @@ // // --------------------------------------------------------------------------- // +inline TBool WlanContextImpl::InVoiceCallState() const + { + return iNullSendController.InVoiceCallState(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline TBool WlanContextImpl::InsertNewRcpiIntoPredictor( TInt64 aTimestamp, WHA::TRcpi aRcpi ) @@ -2100,6 +2131,18 @@ aRcpiWarnLevel ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanContextImpl::ClearBssMembershipFeatureList() + { + os_memset( + &iOurBssMembershipFeatureArray, + KUnallocated, + sizeof( iOurBssMembershipFeatureArray ) ); + } + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Associated.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Associated.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Associated.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 46 % +* %version: 47 % */ #ifndef WLANDOT11ASSOCIATED_H @@ -511,37 +511,6 @@ TBool aMulticastData ); /** - * Adds a multicast MAC address and starts to filter (Rx) multicast - * traffic sent to any other MAC addresses than those that have been - * specified using this method - * @param aCtxImpl statemachine context - * @param aMacAddr The address to be added - * @return ETrue if a state change occurred in the state machine - * EFalse otherwise - */ - virtual TBool AddMulticastAddr( - WlanContextImpl& aCtxImpl, - const TMacAddress& aMacAddr ); - - /** - * Removes a multicast MAC address from multicast (Rx) filtering - * configuration. So any packet that we receive and which has been sent - * to the multicast address in question is not accepted any more (i.e. - * it is filtered). - * However, if there are no addresses left in the multicast (Rx) filtering - * configuration after this remove, the multicast filtering is disabled - * and all (otherwise acceptable) multicast packets are accepted again. - * @param aCtxImpl statemachine context - * @param aMacAddr The address to be removed - * @return ETrue if a state change occurred in the state machine - * EFalse otherwise - */ - virtual TBool RemoveMulticastAddr( - WlanContextImpl& aCtxImpl, - TBool aRemoveAll, - const TMacAddress& aMacAddr ); - - /** * From MWlanUserEvent * Add/set (or replace) a broadcast WEP key * @@ -582,16 +551,6 @@ TUint32 aMaxTxMSDULifetime ); /** - * Sets the WHA::KMibDot11GroupAddressesTable MIB - * - * @param aCtxImpl statemachine context - * @return ETrue if a state change occurred in the state machine - * EFalse otherwise - */ - TBool SetGroupAddressesTableMib( - WlanContextImpl& aCtxImpl ); - - /** * If the power mgmt mode needs to be changed - based on * aPowerMgmtModeChange - proceeds with the necessary actions * diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 34 % +* %version: 35 % */ #ifndef WLANDOT11INFRASTRUCTUREMODE_H @@ -274,14 +274,6 @@ WHA::TRcpi aRcpi ); /** - * Indicates that the WLAN device has detected problems in the power - * save mode operation of the AP - * - * @param aCtxImpl global statemachine context - */ - virtual void DoPsModeErrorIndication( WlanContextImpl& aCtxImpl ); - - /** * Voice Call Entry timer timeout function * * @since S60 v3.2 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 57 % +* %version: 58 % */ #ifndef WLANDOT11STATE_H @@ -859,6 +859,37 @@ const TMacAddress& aMacAddr ); /** + * Adds a multicast MAC address and starts to filter (Rx) multicast + * traffic sent to any other MAC addresses than those that have been + * specified using this method + * @param aCtxImpl statemachine context + * @param aMacAddr The address to be added + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual TBool AddMulticastAddr( + WlanContextImpl& aCtxImpl, + const TMacAddress& aMacAddr ); + + /** + * Removes a multicast MAC address from multicast (Rx) filtering + * configuration. So any packet that we receive and which has been sent + * to the multicast address in question is not accepted any more (i.e. + * it is filtered). + * However, if there are no addresses left in the multicast (Rx) filtering + * configuration after this remove, the multicast filtering is disabled + * and all (otherwise acceptable) multicast packets are accepted again. + * @param aCtxImpl statemachine context + * @param aMacAddr The address to be removed + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual TBool RemoveMulticastAddr( + WlanContextImpl& aCtxImpl, + TBool aRemoveAll, + const TMacAddress& aMacAddr ); + + /** * Set transmission power level. * This has to be legal at the current region. * @param aCtxImpl statemachine context @@ -1122,6 +1153,16 @@ const TSnapHeader& aSnapHeader ); /** + * Sets the WHA::KMibDot11GroupAddressesTable MIB + * + * @param aCtxImpl statemachine context + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + TBool SetGroupAddressesTableMib( + WlanContextImpl& aCtxImpl ); + + /** * Sets the beacon lost count value * * @since S60 v3.1 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ #ifndef WLAN_ACTIVE_MODE_POWER_MODE_MGR @@ -26,13 +26,22 @@ class WlanContextImpl; + /** * Class implementing infrastructure mode dynamic power mode management * algorithm for Active mode (CAM) */ class WlanActiveModePowerModeMgr : public WlanPowerModeMgrBase - { - + { + +public: + /** + * Default Rx/Tx frame count threshold for considering change to Light + * PS mode. + * This value is used if another value hasn't been provided + */ + static const TUint KDefaultToLightPsFrameThreshold = 1; + public: /** Ctor */ @@ -62,6 +71,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -70,6 +80,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 4 % +* %version: 5 % */ // ----------------------------------------------------------------------------- @@ -27,6 +27,15 @@ TUint aToLightPsFrameThreshold, TUint16 aUapsdRxFrameLengthThreshold ) { + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanActiveModePowerModeMgr::SetParameters: " + "aToLightPsFrameThreshold: %d"), + aToLightPsFrameThreshold ); + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanActiveModePowerModeMgr::SetParameters: " + "aUapsdRxFrameLengthThreshold: %d"), + aUapsdRxFrameLengthThreshold ); + iToLightPsFrameThreshold = aToLightPsFrameThreshold; iUapsdRxFrameLengthThreshold = aUapsdRxFrameLengthThreshold; } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #ifndef WLAN_DEEP_PS_MODE_POWER_MODE_MGR @@ -42,6 +42,14 @@ virtual ~WlanDeepPsModePowerModeMgr(); /** + * Sets the dynamic power mode transition algorithm parameters + * + * @param aUapsdRxFrameLengthThreshold received frame + * payload length (in bytes) threshold in U-APSD network + */ + void SetParameters( TUint16 aUapsdRxFrameLengthThreshold ); + + /** * To be called when transmitting a frame * * @since S60 5.1 @@ -49,6 +57,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -57,6 +66,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** @@ -80,6 +90,15 @@ TUint aPayloadLength, TDaType aDaType ); + /** + * From WlanPowerModeMgrBase + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + /** * From WlanPowerModeMgrBase * Resets the state of the object diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 10 % +* %version: 11 % */ #ifndef C_WLANDOT11INFRASTRUCTURENORMALMODE_H @@ -54,6 +54,16 @@ WlanContextImpl& aCtxImpl ); /** + * Indicates that the WLAN device has detected problems in the power + * save mode operation of the AP + * + * @param aCtxImpl global statemachine context + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual void DoPsModeErrorIndication( WlanContextImpl& aCtxImpl ); + + /** * Active to Light PS timer timeout function * * @since S60 v5.1 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #ifndef WLAN_DYNAMIC_POWER_MODE_MGMT_CNTX @@ -66,11 +66,13 @@ * @since S60 3.1 * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @return To which power management mode to change; if any at all */ TPowerMgmtModeChange OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ); + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ); /** * To be called when accepting an Rx frame @@ -89,6 +91,14 @@ TDaType aDaType ); /** + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 @@ -194,6 +204,12 @@ */ void FreezeTrafficOverride(); + /** + * Restores the Ative mode parameters back to their WLAN Mgmt Client + * provided values + */ + inline void RestoreActiveModeParameters(); + private: /** @@ -322,7 +338,25 @@ * @return ETrue if Background AC traffic shall be ignored */ inline TBool StayInPsDespiteLegacyBackgroundTraffic() const; - + + /** + * Sets special parameters for the Active mode. + * To be used when switching to Active upen receiving PsModeError + * indication from WHA layer. + * The Wlan Mgmt Client provided Active mode parameters can be restored + * with RestoreActiveModeParameters() + */ + inline void SetPsModeErrorActiveModeParameters(); + + /** + * Sets special parameters for the Active mode. + * To be used when switching to Active upon transmitting our keep alive + * frame or an ARP frame. + * The Wlan Mgmt Client provided Active mode parameters can be restored + * with RestoreActiveModeParameters() + */ + inline void SetKeepAliveActiveModeParameters(); + // Prohibit copy constructor WlanDynamicPowerModeMgmtCntx( const WlanDynamicPowerModeMgmtCntx& ); @@ -331,7 +365,15 @@ ( const WlanDynamicPowerModeMgmtCntx& ); private: // Data - + + /** for backing up the parameters related to Active mode */ + struct SActiveParamsBackup + { + TUint32 iToLightPsTimeout; + TUint16 iToLightPsFrameThreshold; + TUint16 iUapsdRxFrameLengthThreshold; + }; + /** flag value to store state transition need internally */ TBool iStateChange; /** stores the flags defined below */ @@ -383,18 +425,27 @@ /** ToDeepPsTimer started */ static const TUint32 KToDeepPsTimerStarted = ( 1 << 10 ); - // time interval in microseconds after which transition from Active - // mode to Light PS mode is considered. + /** + * time interval in microseconds after which transition from Active + * mode to Light PS mode is considered. + */ TUint32 iToLightPsTimeout; - // time interval in microseconds after which the frame counter - // used when considering transition from Light PS to Active mode is reset. + /** + * time interval in microseconds after which the frame counter + * used when considering transition from Light PS to Active mode is reset. + */ TUint32 iToActiveTimeout; - // time interval in microseconds after which transition from Light PS - // mode to Deep PS mode is considered. + /** + * time interval in microseconds after which transition from Light PS + * mode to Deep PS mode is considered. + */ TUint32 iToDeepPsTimeout; - + + /** for backing up the parameters related to Active mode */ + SActiveParamsBackup iActiveParamsBackup; + /** currently active power management mode context */ WlanPowerModeMgrBase* iActiveCntx; /** context for active mode */ diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,9 +16,21 @@ */ /* -* %version: 5 % +* %version: 6 % */ +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::RestoreActiveModeParameters() + { + iToLightPsTimeout = iActiveParamsBackup.iToLightPsTimeout; + iActiveModeCntx.SetParameters( + iActiveParamsBackup.iToLightPsFrameThreshold, + iActiveParamsBackup.iUapsdRxFrameLengthThreshold ); + } + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -109,3 +121,37 @@ { return ( iFlags & KStayInPsDespiteLegacyBackgroundTraffic ); } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::SetPsModeErrorActiveModeParameters() + { + const TUint32 KToLightPsTimeout( 1000000 ); // 1 second + const TUint16 KToLightPsFrameThreshold( 4 ); + const TUint16 KUapsdRxFrameLengthThreshold( + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold ); + + iToLightPsTimeout = KToLightPsTimeout; + iActiveModeCntx.SetParameters( + KToLightPsFrameThreshold, + KUapsdRxFrameLengthThreshold ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::SetKeepAliveActiveModeParameters() + { + const TUint32 KToLightPsTimeout( 20000 ); // 20ms + const TUint16 KToLightPsFrameThreshold( 1 ); + const TUint16 KUapsdRxFrameLengthThreshold( + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold ); + + iToLightPsTimeout = KToLightPsTimeout; + iActiveModeCntx.SetParameters( + KToLightPsFrameThreshold, + KUapsdRxFrameLengthThreshold ); + } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #ifndef WLAN_LIGHT_PS_MODE_POWER_MODE_MGR @@ -65,6 +65,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -73,6 +74,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** @@ -98,6 +100,15 @@ /** * From WlanPowerModeMgrBase + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** + * From WlanPowerModeMgrBase * To be called upon Light PS to Active timer timeout * * @since S60 5.1 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #ifndef WLAN_NULL_SEND_CONTROLLER @@ -172,6 +172,14 @@ * @since S60 3.2 */ void OnKeepAliveTimerTimeout(); + + /** + * Are we currently in Voice over WLAN Call state + * + * @return ETrue if we are + * EFalse if we are not + */ + inline TBool InVoiceCallState() const; private: diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -17,7 +17,7 @@ */ /* -* %version: 10 % +* %version: 11 % */ // Default Voice Call Entry timeout @@ -38,7 +38,7 @@ // Default Keep Alive timeout // This value is used if no other value has been provided -const TUint32 KDefaultKeepAliveTimeout = 200000000; // 200 s +const TUint32 KDefaultKeepAliveTimeout = 60000000; // 60 s // Default value for frame payload length threashold of a potential // carrier of downlink Voice over WLAN Call data, which is erroneously @@ -221,3 +221,12 @@ // during a Voice Call } } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline TBool WlanNullSendController::InVoiceCallState() const + { + return static_cast(iFlags & KInVoiceCallState); + } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #ifndef WLAN_POWER_MODE_MGR_BASE_H @@ -32,6 +32,7 @@ class WlanContextImpl; + /** * Common base class for classes implementing dynamic power mode transition * algorithm between PS and active mode in infrastructure mode @@ -39,6 +40,10 @@ class WlanPowerModeMgrBase { public: + // Default frame payload length threshold value (in bytes) for U-APSD + static const TUint32 KDefaultUapsdRxFrameLengthThreshold = 400; + +public: /** Dtor */ virtual ~WlanPowerModeMgrBase(); @@ -51,6 +56,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -59,6 +65,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) = 0; /** @@ -83,6 +90,14 @@ TDaType aDaType ) = 0; /** + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 72 % +* %version: 73 % */ #include "config.h" @@ -104,10 +104,7 @@ os_memset( &iWHASettings, 0, sizeof( iWHASettings ) ); - os_memset( - &iOurBssMembershipFeatureArray, - KUnallocated, - sizeof( iOurBssMembershipFeatureArray ) ); + ClearBssMembershipFeatureList(); os_memset( &iHtBlockAckConfigure, @@ -1770,6 +1767,34 @@ // // ----------------------------------------------------------------------------- // +void WlanContextImpl::RemoveBssMembershipFeature( TUint8 aItem ) + { + TUint8 i ( 0 ); + + do + { + if ( aItem == iOurBssMembershipFeatureArray[i] ) + { + iOurBssMembershipFeatureArray[i] = KUnallocated; + + OsTracePrint( KUmacDetails, (TUint8*) + ("UMAC: WlanContextImpl::RemoveBssMembershipFeature: " + "feature %d removed"), + aItem ); + + break; + } + else + { + ++i; + } + } while ( i != KMaxNumOfWlanFeatures ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// TBool WlanContextImpl::BssMembershipFeatureSupported( TUint8 aItem ) const { TBool supported ( EFalse ); diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 96 % +* %version: 99 % */ #include "config.h" @@ -658,8 +658,8 @@ TUint nbrOfpacketsForMgmtClient ( 0 ); const TUint KMaxNbrOfPacketsForUsr ( 30 ); const TUint KMaxNbrOfPacketsForMgmtClient ( 10 ); - const TDataBuffer* packetsForUsr[KMaxNbrOfPacketsForUsr]; - const TDataBuffer* packetsForMgmtClient[KMaxNbrOfPacketsForMgmtClient]; + TDataBuffer* packetsForUsr[KMaxNbrOfPacketsForUsr]; + TDataBuffer* packetsForMgmtClient[KMaxNbrOfPacketsForMgmtClient]; // one byte past the last actual payload byte (so excluding the potentially // present security trailer) of the MPDU const TUint8* const KMpduPayloadEnd ( @@ -1006,8 +1006,7 @@ - aBuffer ); // buffer beginning // complete - const TDataBuffer* KMetaHdr ( metaHdr ); - aCtxImpl.iUmac.MgmtDataReceiveComplete( KMetaHdr, 1 ); + aCtxImpl.iUmac.MgmtDataReceiveComplete( metaHdr, 1 ); } else { @@ -1369,7 +1368,7 @@ if ( // our client has instructed us not the encrypt this frame under // any circumstances OR ( aDataBuffer.KeFlags() & TDataBuffer::KTxFrameMustNotBeEncrypted ) || - // no space is reserved for security header on this sw layer. It is + // no space is reserved for security trailer on this sw layer. It is // done on lower layers; when necessary. ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KNoSecHdrAndTrailer ) ) @@ -1996,7 +1995,7 @@ const TPowerMgmtModeChange KPowerMgmtModeChange ( aCtxImpl.OnFrameTx( queue_id, etherType ) ); - // if any change change is needed regarding our power mgmt mode, + // if any change is needed regarding our power mgmt mode, // proceed with it stateChange = PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); } @@ -2157,177 +2156,6 @@ // // --------------------------------------------------------------------------- // -TBool WlanDot11Associated::AddMulticastAddr( - WlanContextImpl& aCtxImpl, - const TMacAddress& aMacAddr ) - { - TBool stateTransitionOccurred( EFalse ); - - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): addr to be added:"), - aMacAddr); - - if ( aCtxImpl.MulticastFilteringDisAllowed() ) - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): Multicast filtering disallowed")); - - OnOidComplete( aCtxImpl, KErrGeneral ); - } - else - { - if ( aCtxImpl.WHASettings().iNumOfGroupTableEntrys > - aCtxImpl.MulticastAddressCount() ) - { - // wha layer is able to take in an address - - // 1st try to add the address to our own internal bookkeeping - WlanContextImpl::TGroupAddStatus addStatus = - aCtxImpl.AddMulticastAddress( aMacAddr ); - - switch ( addStatus ) - { - case WlanContextImpl::EOk: - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): Address will be added to the MIB")); - // the address needed to be added and adding went ok. - // Now update the group addresses MIB - stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); - break; - case WlanContextImpl::EAlreadyExists: - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): Address already exists")); - // the specified address already exists so there's no need - // to update the group addresses MIB - // just complete the request with OK status - OnOidComplete( aCtxImpl ); - stateTransitionOccurred = EFalse; - break; - case WlanContextImpl::EFull: - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): Internal address table full; disallow multicast filtering")); - // we are not able to take in any more addresses. - // We will totally disable the multicast filtering - // and we won't allow it to be enabled any more during - // the current nw connection - // - aCtxImpl.ResetMulticastAddresses(); - aCtxImpl.MulticastFilteringDisAllowed( ETrue ); - stateTransitionOccurred = - SetGroupAddressesTableMib( aCtxImpl ); - break; - default: - // programming error - OsTracePrint( KErrorLevel, (TUint8*) - ("UMAC: addStatus: %d"), addStatus ); - OsAssert( (TUint8*)("UMAC: panic"), - (TUint8*)(WLAN_FILE), __LINE__ ); - } - } - else - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::AddMulticastAddr(): WHA not able to accept address; disallow multicast filtering")); - // wha layer is not able to take in an address. Either this is one - // address too many, or it doesn't support even a single address. - // In either case we will totally disable the multicast filtering - // and we won't allow it to be enabled any more during the current - // nw connection - aCtxImpl.ResetMulticastAddresses(); - aCtxImpl.MulticastFilteringDisAllowed( ETrue ); - stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); - } - } - - // signal caller whether a state transition occurred or not - return stateTransitionOccurred; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TBool WlanDot11Associated::RemoveMulticastAddr( - WlanContextImpl& aCtxImpl, - TBool aRemoveAll, - const TMacAddress& aMacAddr ) - { - TBool stateTransitionOccurred( EFalse ); - - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::RemoveMulticastAddr(): addr to be removed:"), - aMacAddr); - - if ( aCtxImpl.MulticastFilteringDisAllowed() ) - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::RemoveMulticastAddr(): Multicast filtering disallowed")); - // filtering is not allowed currently so there can't be any addresses - // to remove. Just complete the request with OK status - OnOidComplete( aCtxImpl ); - } - else - { - if ( aRemoveAll ) - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::RemoveMulticastAddr(): remove all")); - // remove all addresses; naturally will also disable filtering - aCtxImpl.ResetMulticastAddresses(); - stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); - } - else - { - // 1st remove the specified address from our own internal - // bookkeeping, if it exists - if ( aCtxImpl.RemoveMulticastAddress( aMacAddr ) ) - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::RemoveMulticastAddr(): removing the specified address")); - // it existed, so update the group addresses MIB, too - stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); - } - else - { - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::RemoveMulticastAddr(): specified address doesn't exist, nothing to do")); - // it did't exist, so there's nothing to remove - // Just complete the request with OK status - OnOidComplete( aCtxImpl ); - } - } - } - - // signal caller whether a state transition occurred or not - return stateTransitionOccurred; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// TBool WlanDot11Associated::AddBroadcastWepKey( WlanContextImpl& aCtxImpl, TUint32 aKeyIndex, @@ -2395,89 +2223,6 @@ // // --------------------------------------------------------------------------- // -TBool WlanDot11Associated::SetGroupAddressesTableMib( - WlanContextImpl& aCtxImpl ) - { - const TMacAddress* multicastAddresses( NULL ); - const TUint32 nbrOfAddrs( - aCtxImpl.GetMulticastAddresses( multicastAddresses ) ); - - TUint32 mibLength( - // mib header length - WHA::Sdot11GroupAddressesTable::KHeaderSize - // + mib data length - + ( sizeof( TMacAddress ) * nbrOfAddrs ) ); - - // align length of MIB to 4-byte boundary - mibLength = Align4( mibLength ); - - OsTracePrint( - KWlmCmdDetails, - (TUint8*) - ("UMAC: WlanDot11Associated::SetGroupAddressesTableMib(): mibLength: %d"), - mibLength ); - - // allocate memory for the mib to write - WHA::Sdot11GroupAddressesTable* mib - = static_cast - (os_alloc( mibLength )); - - if ( !mib ) - { - // allocation failed - // simulate macnotresponding error - OsTracePrint( KWarningLevel, (TUint8*) - ("UMAC: WlanDot11Associated::SetGroupAddressesTableMib(): memory allocating failed") ); - return DoErrorIndication( aCtxImpl, WHA::KErrorMacNotResponding ); - } - - if ( nbrOfAddrs ) - { - // at least one address exists, so enable multicast address filtering - mib->iEnable = ETrue; - } - else - { - // no addresses, so disable filtering - mib->iEnable = EFalse; - OsTracePrint( KWlmCmdDetails, (TUint8*) - ("UMAC: WlanDot11Associated::SetGroupAddressesTableMib(): no addresses; disable filtering") ); - } - - mib->iNumOfAddrs = nbrOfAddrs; - - // copy the multicast addresses after the mib header - os_memcpy( mib->iAddrData, - reinterpret_cast(const_cast( - multicastAddresses)), - ( sizeof( TMacAddress ) * nbrOfAddrs ) ); - - WlanWsaWriteMib& wha_cmd = aCtxImpl.WsaWriteMib(); - - wha_cmd.Set( - aCtxImpl, - WHA::KMibDot11GroupAddressesTable, - mibLength, - mib ); - - // change global state: entry procedure triggers action - ChangeState( aCtxImpl, - *this, // prev state - wha_cmd, // next state - // the ACT - KCompleteManagementRequest - ); - - os_free( mib ); // release the allocated memory - - // signal caller that a state transition occurred - return ETrue; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// TBool WlanDot11Associated::PowerMgmtModeChange( WlanContextImpl& aCtxImpl, TPowerMgmtModeChange aPowerMgmtModeChange ) @@ -2490,7 +2235,7 @@ if ( aPowerMgmtModeChange == EToActive ) { - aCtxImpl.DesiredDot11PwrMgmtMode( WHA::KPsDisable ); + aCtxImpl.DesiredDot11PwrMgmtMode( WHA::KPsDisable ); } else if ( aPowerMgmtModeChange == EToLightPs ) { diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 63 % +* %version: 64 % */ #include "config.h" @@ -788,19 +788,6 @@ // // --------------------------------------------------------------------------- // -void WlanDot11InfrastructureMode::DoPsModeErrorIndication( - WlanContextImpl& aCtxImpl ) - { - OsTracePrint( KWlmIndication, (TUint8*) - ("UMAC: WlanDot11InfrastructureMode::DoPsModeErrorIndication") ); - - OnInDicationEvent( aCtxImpl, EPsModeError ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// TBool WlanDot11InfrastructureMode::OnVoiceCallEntryTimerTimeout( WlanContextImpl& aCtxImpl ) { @@ -925,6 +912,7 @@ TUint32 lengthOfFrame( 0 ); T802Dot11FrameControlTypeMask frameType( E802Dot11FrameTypeDataNull ); + WHA::TQueueId queue_id( WHA::ELegacy ); // copy Null Data frame to tx-buffer to correct offset // client doesn't need to take care of the tx buffer header space @@ -972,7 +960,7 @@ } // determine Tx queue - const WHA::TQueueId queue_id( QueueId( aCtxImpl, start_of_frame ) ); + queue_id = QueueId( aCtxImpl, start_of_frame ); // send the Null Data frame by pushing it to packet scheduler aCtxImpl.PushPacketToPacketScheduler( @@ -982,13 +970,24 @@ frameType, NULL, EFalse, - EFalse ); + EFalse, + ETrue ); } else { // we didn't get a Tx buffer so we can't submit a frame send request. status = EFalse; } - + + TUint16 KetherType( 0 ); // N/A in this case + // check if we need to change power mgmt mode; no matter whether we + // actually managed to send a frame or not + const TPowerMgmtModeChange KPowerMgmtModeChange ( + aCtxImpl.OnFrameTx( queue_id, KetherType, frameType ) ); + + // if any change is needed regarding our power mgmt mode, + // proceed with it + PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); + return status; } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 28 % +* %version: 29 % */ #include "config.h" @@ -137,6 +137,7 @@ // we are breaking an existing join so we have to reset some // state variables and settings aCtxImpl.CurrentDot11PwrMgmtMode( WHA::KPsDisable ); + aCtxImpl.RestorePwrModeMgmtParameters(); aCtxImpl.Reassociate( EFalse ); aCtxImpl.QosEnabled( EFalse ); aCtxImpl.UapsdEnabled( EFalse ); diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 86 % +* %version: 89 % */ #include "config.h" @@ -2684,8 +2684,7 @@ - aBuffer ); // buffer beginning // complete - const TDataBuffer* KMetaHdr ( metaHdr ); - aCtxImpl.iUmac.MgmtDataReceiveComplete( KMetaHdr, 1 ); + aCtxImpl.iUmac.MgmtDataReceiveComplete( metaHdr, 1 ); } else { @@ -3058,6 +3057,185 @@ return ret; } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanDot11State::AddMulticastAddr( + WlanContextImpl& aCtxImpl, + const TMacAddress& aMacAddr ) + { + TBool stateTransitionOccurred( EFalse ); + + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): addr to be added:"), + aMacAddr); + + if ( aCtxImpl.MulticastFilteringDisAllowed() ) + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): Multicast filtering " + "disallowed")); + + OnOidComplete( aCtxImpl, KErrGeneral ); + } + else + { + if ( aCtxImpl.WHASettings().iNumOfGroupTableEntrys > + aCtxImpl.MulticastAddressCount() ) + { + // wha layer is able to take in an address + + // 1st try to add the address to our own internal bookkeeping + WlanContextImpl::TGroupAddStatus addStatus = + aCtxImpl.AddMulticastAddress( aMacAddr ); + + switch ( addStatus ) + { + case WlanContextImpl::EOk: + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): Address " + "will be added to the MIB")); + // the address needed to be added and adding went ok. + // Now update the group addresses MIB + stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); + break; + case WlanContextImpl::EAlreadyExists: + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): Address " + "already exists")); + // the specified address already exists so there's no need + // to update the group addresses MIB + // just complete the request with OK status + OnOidComplete( aCtxImpl ); + stateTransitionOccurred = EFalse; + break; + case WlanContextImpl::EFull: + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): Internal " + "address table full; disallow multicast filtering")); + // we are not able to take in any more addresses. + // We will totally disable the multicast filtering + // and we won't allow it to be enabled any more during + // the current nw connection + // + aCtxImpl.ResetMulticastAddresses(); + aCtxImpl.MulticastFilteringDisAllowed( ETrue ); + stateTransitionOccurred = + SetGroupAddressesTableMib( aCtxImpl ); + break; + default: + // programming error + OsTracePrint( KErrorLevel, (TUint8*) + ("UMAC: addStatus: %d"), addStatus ); + OsAssert( (TUint8*)("UMAC: panic"), + (TUint8*)(WLAN_FILE), __LINE__ ); + } + } + else + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::AddMulticastAddr(): WHA not able to " + "accept address; disallow multicast filtering")); + // wha layer is not able to take in an address. Either this is one + // address too many, or it doesn't support even a single address. + // In either case we will totally disable the multicast filtering + // and we won't allow it to be enabled any more during the current + // nw connection + aCtxImpl.ResetMulticastAddresses(); + aCtxImpl.MulticastFilteringDisAllowed( ETrue ); + stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); + } + } + + // signal caller whether a state transition occurred or not + return stateTransitionOccurred; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanDot11State::RemoveMulticastAddr( + WlanContextImpl& aCtxImpl, + TBool aRemoveAll, + const TMacAddress& aMacAddr ) + { + TBool stateTransitionOccurred( EFalse ); + + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::RemoveMulticastAddr(): addr to be removed:"), + aMacAddr); + + if ( aCtxImpl.MulticastFilteringDisAllowed() ) + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::RemoveMulticastAddr(): Multicast filtering " + "disallowed")); + // filtering is not allowed currently so there can't be any addresses + // to remove. Just complete the request with OK status + OnOidComplete( aCtxImpl ); + } + else + { + if ( aRemoveAll ) + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::RemoveMulticastAddr(): remove all")); + // remove all addresses; naturally will also disable filtering + aCtxImpl.ResetMulticastAddresses(); + stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); + } + else + { + // 1st remove the specified address from our own internal + // bookkeeping, if it exists + if ( aCtxImpl.RemoveMulticastAddress( aMacAddr ) ) + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::RemoveMulticastAddr(): removing " + "the specified address")); + // it existed, so update the group addresses MIB, too + stateTransitionOccurred = SetGroupAddressesTableMib( aCtxImpl ); + } + else + { + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::RemoveMulticastAddr(): specified " + "address doesn't exist, nothing to do")); + // it did't exist, so there's nothing to remove + // Just complete the request with OK status + OnOidComplete( aCtxImpl ); + } + } + } + + // signal caller whether a state transition occurred or not + return stateTransitionOccurred; + } + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -3070,6 +3248,16 @@ OsTracePrint( KUmacDetails, (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect") ); + // 1st clear our BSS Membership feature list + aCtxImpl.ClearBssMembershipFeatureList(); + + if ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KHtOperation ) + { + // wlanpdd indicates HT support. Record that in our BSS Membership + // features + aCtxImpl.AddBssMembershipFeature( E802Dot11HtPhy ); + } + const SScanResponseFixedFields* scanResponseFixedFields = reinterpret_cast( aScanResponseFrameBody ); @@ -3121,9 +3309,6 @@ return EFalse; } - // network capabilities are met -> proceed - - // initialize element locator for locating IEs from the scan response // frame body WlanElementLocator elementLocator( @@ -3133,69 +3318,7 @@ TUint8 elementDatalength( 0 ); const TUint8* elementData( NULL ); - - //============================================= - // do we meet mandatory network rates - //============================================= - - // locate supported rates IE - if ( elementLocator.InformationElement( - E802Dot11SupportedRatesIE, - elementDatalength, - &elementData ) == WlanElementLocator::EWlanLocateOk ) - { - // ...and store it to our context - aCtxImpl.GetApSupportedRatesIE().SetIeData( - elementData, - elementDatalength ); - } - else - { - OsTracePrint( KWarningLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: supported rates IE not found -> abort") ); - - return EFalse; - } - - // locate extended supported rates information element - if ( elementLocator.InformationElement( - E802Dot11ExtendedRatesIE, - elementDatalength, - &elementData ) == WlanElementLocator::EWlanLocateOk ) - { - OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE present") ); - - // ...and store it to our context - aCtxImpl.GetApExtendedSupportedRatesIE().SetIeData( elementData, elementDatalength ); - - // check if we meet mandatory rates; in this case check also extended supported rates - if ( !AreSupportedRatesMet( aCtxImpl, ETrue ) ) - { - OsTracePrint( KWarningLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); - - return EFalse; - } - } - else - { - OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE not present") ); - - // check if we meet mandatory rates; in this case extended supported rates - // don't need to be checked - if ( !AreSupportedRatesMet( aCtxImpl, EFalse ) ) - { - OsTracePrint( KWarningLevel, - (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); - - return EFalse; - } - } - - // mandatory network rates are met -> proceed - + //============================================= // determine the channel of the network //============================================= @@ -3394,6 +3517,66 @@ } //============================================= + // do we meet mandatory network rates + //============================================= + + // locate supported rates IE + if ( elementLocator.InformationElement( + E802Dot11SupportedRatesIE, + elementDatalength, + &elementData ) == WlanElementLocator::EWlanLocateOk ) + { + // ...and store it to our context + aCtxImpl.GetApSupportedRatesIE().SetIeData( + elementData, + elementDatalength ); + } + else + { + OsTracePrint( KWarningLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: supported rates IE not found -> abort") ); + + return EFalse; + } + + // locate extended supported rates information element + if ( elementLocator.InformationElement( + E802Dot11ExtendedRatesIE, + elementDatalength, + &elementData ) == WlanElementLocator::EWlanLocateOk ) + { + OsTracePrint( KInfoLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE present") ); + + // ...and store it to our context + aCtxImpl.GetApExtendedSupportedRatesIE().SetIeData( elementData, elementDatalength ); + + // check if we meet mandatory rates; in this case check also extended supported rates + if ( !AreSupportedRatesMet( aCtxImpl, ETrue ) ) + { + OsTracePrint( KWarningLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); + + return EFalse; + } + } + else + { + OsTracePrint( KInfoLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE not present") ); + + // check if we meet mandatory rates; in this case extended supported rates + // don't need to be checked + if ( !AreSupportedRatesMet( aCtxImpl, EFalse ) ) + { + OsTracePrint( KWarningLevel, + (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); + + return EFalse; + } + } + + //============================================= // determine U-APSD usage for the ACs/Tx queues //============================================= DetermineAcUapsdUsage( aCtxImpl ); @@ -4091,6 +4274,91 @@ return EFalse; } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool WlanDot11State::SetGroupAddressesTableMib( + WlanContextImpl& aCtxImpl ) + { + const TMacAddress* multicastAddresses( NULL ); + const TUint32 nbrOfAddrs( + aCtxImpl.GetMulticastAddresses( multicastAddresses ) ); + + TUint32 mibLength( + // mib header length + WHA::Sdot11GroupAddressesTable::KHeaderSize + // + mib data length + + ( sizeof( TMacAddress ) * nbrOfAddrs ) ); + + // align length of MIB to 4-byte boundary + mibLength = Align4( mibLength ); + + OsTracePrint( + KWlmCmdDetails, + (TUint8*) + ("UMAC: WlanDot11State::SetGroupAddressesTableMib(): mibLength: %d"), + mibLength ); + + // allocate memory for the mib to write + WHA::Sdot11GroupAddressesTable* mib + = static_cast + (os_alloc( mibLength )); + + if ( !mib ) + { + // allocation failed + // simulate macnotresponding error + OsTracePrint( KWarningLevel, (TUint8*) + ("UMAC: WlanDot11State::SetGroupAddressesTableMib(): memory " + "allocation failed") ); + return DoErrorIndication( aCtxImpl, WHA::KErrorMacNotResponding ); + } + + if ( nbrOfAddrs ) + { + // at least one address exists, so enable multicast address filtering + mib->iEnable = ETrue; + } + else + { + // no addresses, so disable filtering + mib->iEnable = EFalse; + OsTracePrint( KWlmCmdDetails, (TUint8*) + ("UMAC: WlanDot11State::SetGroupAddressesTableMib(): no addresses; " + "disable filtering") ); + } + + mib->iNumOfAddrs = nbrOfAddrs; + + // copy the multicast addresses after the mib header + os_memcpy( mib->iAddrData, + reinterpret_cast(const_cast( + multicastAddresses)), + ( sizeof( TMacAddress ) * nbrOfAddrs ) ); + + WlanWsaWriteMib& wha_cmd = aCtxImpl.WsaWriteMib(); + + wha_cmd.Set( + aCtxImpl, + WHA::KMibDot11GroupAddressesTable, + mibLength, + mib ); + + // change global state: entry procedure triggers action + ChangeState( aCtxImpl, + *this, // prev state + wha_cmd, // next state + // the ACT + KCompleteManagementRequest + ); + + os_free( mib ); // release the allocated memory + + // signal caller that a state transition occurred + return ETrue; + } + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -4734,6 +5002,9 @@ // nw supported it. We achieve that by handling the target nw as // a non-HT nw aCtxImpl.HtSupportedByNw( EFalse ); + // in this case we need to remove HT also from our BSS membership + // feature list + aCtxImpl.RemoveBssMembershipFeature( E802Dot11HtPhy ); OsTracePrint( KInfoLevel, (TUint8*) ("UMAC: WlanDot11State::HandleDot11n: TKIP as pairwise cipher " diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 29 % +* %version: 30 % */ #include "config.h" @@ -497,6 +497,9 @@ // Light PS is the initial desired PS mode configuration aCtxImpl.SetDesiredPsModeConfig( aCtxImpl.ClientLightPsModeConfig() ); + // also make sure that the dynamic power mode managemen parameters are in + // their WLAN Mgmt Client provided values + aCtxImpl.RestorePwrModeMgmtParameters(); // check do we meet the requirements for the network // and construct necessary objects for doing the connection diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacMacState.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacMacState.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacMacState.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 76 % +* %version: 77 % */ #include "config.h" @@ -97,13 +97,15 @@ // ----------------------------------------------------------------------------- // TBool WlanMacState::SetRcpiTriggerLevel( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, TUint32 /*aRcpiTrigger*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- @@ -111,7 +113,7 @@ // ----------------------------------------------------------------------------- // TBool WlanMacState::AddBroadcastWepKey( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, TUint32 /*aKeyIndex*/, TBool /*aUseAsDefaulKey*/, TUint32 /*aKeyLength*/, @@ -119,8 +121,11 @@ const TMacAddress& /*aMac*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- @@ -197,7 +202,7 @@ // --------------------------------------------------------------------------- // TBool WlanMacState::Connect( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, const TSSID& /*aSSID*/, const TMacAddress& /*aBSSID*/, TUint16 /*aAuthAlgorithmNbr*/, @@ -209,19 +214,25 @@ TUint16 /*aIeDataLength*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // -TBool WlanMacState::Disconnect( WlanContextImpl& /*aCtxImpl*/ ) +TBool WlanMacState::Disconnect( WlanContextImpl& aCtxImpl ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- @@ -321,7 +332,7 @@ // ----------------------------------------------------------------------------- // TBool WlanMacState::StartIBSS( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, const TSSID& /*aSSID*/, TUint32 /*aBeaconInterval*/, TUint32 /*aAtim*/, @@ -329,8 +340,11 @@ TEncryptionStatus /*aEncryptionStatus*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- @@ -366,8 +380,7 @@ TUint32 /*aMaxChannelTime*/, TBool /*aSplitScan*/ ) { - OnOidComplete( aCtxImpl, KErrGeneral ); - + OnOidComplete( aCtxImpl, KErrNotSupported ); return EFalse; // no state change } @@ -400,7 +413,7 @@ // ----------------------------------------------------------------------------- // TBool WlanMacState::Configure( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, TUint32 /*aRTSThreshold*/, TUint32 /*aMaxTxMSDULifetime*/, TUint32 /*aVoiceCallEntryTimeout*/, @@ -413,8 +426,11 @@ TUint32 /*aSpMinIndicationInterval*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- @@ -580,14 +596,17 @@ // ----------------------------------------------------------------------------- // TBool WlanMacState::ConfigureTxQueueIfNecessary( - WlanContextImpl& /*aCtxImpl*/, - TQueueId /*aQueueId*/, - TUint16 /*aMediumTime*/, - TUint32 /*aMaxTxMSDULifetime*/ ) + WlanContextImpl& aCtxImpl, + TQueueId /*aQueueId*/, + TUint16 /*aMediumTime*/, + TUint32 /*aMaxTxMSDULifetime*/ ) { // not supported in default handler +#ifndef NDEBUG OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); - return EFalse; +#endif + OnOidComplete( aCtxImpl, KErrNotSupported ); + return EFalse; // no state change } // ----------------------------------------------------------------------------- diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 23 % +* %version: 24 % */ #include "config.h" @@ -171,14 +171,7 @@ ("UMAC: WlanWsaConfigure::Entry: iMcsFeedback: %d"), aCtxImpl.WHASettings().iHtCapabilities.iMcsFeedback ); } -#endif - - if ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KHtOperation ) - { - // wlanpdd indicates HT support. Record that in our BSS Membership - // features - aCtxImpl.AddBssMembershipFeature( E802Dot11HtPhy ); - } +#endif } // ----------------------------------------------------------------------------- diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 13 % +* %version: 14 % */ #include "config.h" @@ -24,11 +24,6 @@ #include "UmacContextImpl.h" -// Default Rx/Tx frame count threshold for considering change to Light PS mode. -// This value is used if another value hasn't been provided -const TUint KDefaultToLightPsFrameThreshold = 1; - - // ================= MEMBER FUNCTIONS ======================= // --------------------------------------------------------------------------- @@ -57,6 +52,7 @@ WlanContextImpl& /*aCtxImpl*/, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) { if ( aEtherType == KEapolType || @@ -69,7 +65,7 @@ } else { - if ( aIgnoreThisFrame ) + if ( aIgnoreThisFrame || aDot11FrameType == E802Dot11FrameTypeDataNull ) { // for these frames we don't increment the Tx counter diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #include "config.h" @@ -42,32 +42,53 @@ { } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDeepPsModePowerModeMgr::SetParameters( + TUint16 aUapsdRxFrameLengthThreshold ) + { + iUapsdRxFrameLengthThreshold = aUapsdRxFrameLengthThreshold; + } + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnFrameTx( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, - TBool /*aIgnoreThisFrame*/ ) + T802Dot11FrameControlTypeMask aDot11FrameType, + TBool aIgnoreThisFrame ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); if ( aEtherType == KEapolType || - aEtherType == KWaiType ) + aEtherType == KWaiType || + aDot11FrameType == E802Dot11FrameTypeDataNull || + ( aEtherType == KArpType && + !(aCtxImpl.UapsdUsedForVoice() && aCtxImpl.InVoiceCallState()) ) ) { powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: EAPOL or WAI frame; change to Active") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: EAPOL, WAI or keep " + "alive frame or ARP in non- U-APSD WoWLAN call state; change to " + "Active") ); } - else + else if ( !aIgnoreThisFrame ) { powerMgmtModeChange = EToLightPs; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: change to Light PS") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: change to Light" + " PS") ); + } + else + { + // no action needed } return powerMgmtModeChange; @@ -78,11 +99,11 @@ // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnFrameRx( - WlanContextImpl& /*aCtxImpl*/, - WHA::TQueueId /*aAccessCategory*/, + WlanContextImpl& aCtxImpl, + WHA::TQueueId aAccessCategory, TUint16 aEtherType, - TBool /*aIgnoreThisFrame*/, - TUint /*aPayloadLength*/, + TBool aIgnoreThisFrame, + TUint aPayloadLength, TDaType aDaType ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); @@ -93,22 +114,36 @@ powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: EAPOL or WAI frame; change to Active") ); - } - else if ( aDaType == EBroadcastAddress ) - { - // no action needed - - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: bcast frame; no state change") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: EAPOL or WAI frame;" + " change to Active") ); } else { - powerMgmtModeChange = EToLightPs; + if ( CountThisFrame( + aCtxImpl, + aAccessCategory, + aEtherType, + aIgnoreThisFrame, + aPayloadLength, + iUapsdRxFrameLengthThreshold, + aDaType ) ) + { + powerMgmtModeChange = EToLightPs; - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: change to Light PS") ); + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: change to Light" + " PS") ); + } } - return powerMgmtModeChange; + return powerMgmtModeChange; } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnPsModeErrorIndication() + { + return EToActive; + } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -17,7 +17,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #include "config.h" @@ -56,6 +56,28 @@ // // --------------------------------------------------------------------------- // +void WlanDot11InfrastructureNormalMode::DoPsModeErrorIndication( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( KWlmIndication, (TUint8*) + ("UMAC: WlanDot11InfrastructureMode::DoPsModeErrorIndication") ); + + // as the lower layers indicate that there is a problem with the PS + // operation of the current AP, we want to be in CAM mode for as long + // as there's data activity. So, check if we need a mode change to be + // in CAM now + const TPowerMgmtModeChange KPowerMgmtModeChange ( + aCtxImpl.OnPsModeErrorIndication() ); + + // if any change is needed regarding our power mgmt mode, + // proceed with it + PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanDot11InfrastructureNormalMode::OnActiveToLightPsTimerTimeout( WlanContextImpl& aCtxImpl ) { diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #include "config.h" @@ -55,6 +55,11 @@ iActiveCntx( NULL ), iWlanContextImpl( aWlanCtxImpl ) { + iActiveParamsBackup.iToLightPsTimeout = KDefaultToLightPsTimeout; + iActiveParamsBackup.iToLightPsFrameThreshold = + WlanActiveModePowerModeMgr::KDefaultToLightPsFrameThreshold; + iActiveParamsBackup.iUapsdRxFrameLengthThreshold = + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold; os_memset( iIgnoreTraffic, 0, sizeof( iIgnoreTraffic ) ); } @@ -158,7 +163,8 @@ // TPowerMgmtModeChange WlanDynamicPowerModeMgmtCntx::OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ) + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); @@ -172,13 +178,23 @@ iWlanContextImpl, aQueueId, aEtherType, + aDot11FrameType, iIgnoreTraffic[aQueueId] ); if ( powerMgmtModeChange != ENoChange ) { + iStateChange = ETrue; + // as we will do a mode change, cancel any possibly running // power mode management timers CancelTimeouts(); + + if ( aDot11FrameType == E802Dot11FrameTypeDataNull || + aEtherType == KArpType ) + { + // modify temporarily the Active mode parameters + SetKeepAliveActiveModeParameters(); + } } } else @@ -230,6 +246,8 @@ if ( powerMgmtModeChange != ENoChange ) { + iStateChange = ETrue; + // as we will do a mode change, cancel any possibly running // power mode management timers CancelTimeouts(); @@ -260,6 +278,57 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication() + { + TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); + + if ( iActiveCntx ) + { + // we have an active context, i.e. we are doing power mode mgmt + + if ( !iStateChange ) + { + powerMgmtModeChange = iActiveCntx->OnPsModeErrorIndication(); + + if ( powerMgmtModeChange != ENoChange ) + { + iStateChange = ETrue; + + // as we will do a mode change, cancel any possibly running + // power mode management timers + CancelTimeouts(); + + // modify temporarily the Active mode parameters + SetPsModeErrorActiveModeParameters(); + } + } + else + { + // state change already signalled from this power mode context, + // don't do it more than once. No action needed + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication: " + "statechange already signalled") ); + } + } + else + { + // dynamic power mode mgmt is not active => "No change" will be + // returned. No action needed + } + + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication: " + "statechange: %d"), + powerMgmtModeChange ); + + return powerMgmtModeChange; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout() { if ( ( iActiveCntx == &iActiveModeCntx ) && @@ -274,6 +343,11 @@ ("UMAC: WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout: change state: %d"), iStateChange ); + // make sure that the WLAN Mgmt Client provided Active mode + // parameter values are again used the next time by default + // + RestoreActiveModeParameters(); + if ( !iStateChange ) { RegisterToLightPsTimeout(); @@ -292,6 +366,11 @@ // In all these cases the timeout is not relevant and we take no action OsTracePrint( KPwrStateTransition, (TUint8*) ("UMAC: WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout: not relevant timeout") ); + + // however, make sure that the WLAN Mgmt Client provided Active mode + // parameter values are again used the next time by default + // + RestoreActiveModeParameters(); } return iStateChange; @@ -406,6 +485,15 @@ aToActiveFrameThreshold, aToDeepPsFrameThreshold, aUapsdRxFrameLengthThreshold ); + + iDeepPsModeCntx.SetParameters( aUapsdRxFrameLengthThreshold ); + + // take also a backup of the Active mode parameters + // + iActiveParamsBackup.iToLightPsTimeout = aToLightPsTimeout; + iActiveParamsBackup.iToLightPsFrameThreshold = aToLightPsFrameThreshold; + iActiveParamsBackup.iUapsdRxFrameLengthThreshold = + aUapsdRxFrameLengthThreshold; } // --------------------------------------------------------------------------- diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #include "config.h" @@ -59,49 +59,54 @@ // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanLightPsModePowerModeMgr::OnFrameTx( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); if ( aEtherType == KEapolType || - aEtherType == KWaiType ) + aEtherType == KWaiType || + aDot11FrameType == E802Dot11FrameTypeDataNull || + ( aEtherType == KArpType && + !(aCtxImpl.UapsdUsedForVoice() && aCtxImpl.InVoiceCallState())) ) { powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: EAPOL or WAI frame; change to Active") ); + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: EAPOL, WAI or keep " + "alive frame or ARP in non- U-APSD WoWLAN call state; change to " + "Active") ); + } + else if ( !aIgnoreThisFrame ) + { + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: count this frame") ); + + ++iToActiveFrameCount; + ++iToDeepPsFrameCount; + + if ( iToActiveFrameCount >= iToActiveFrameThreshold ) + { + powerMgmtModeChange = EToActive; + + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: threshold " + "exceeded; change to Active") ); + } } else { - if ( !aIgnoreThisFrame ) - { - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: count this frame") ); - - ++iToActiveFrameCount; - ++iToDeepPsFrameCount; - - if ( iToActiveFrameCount >= iToActiveFrameThreshold ) - { - powerMgmtModeChange = EToActive; - - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: threshold exceeded; change to Active") ); - } - } - else - { - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: do no count this frame") ); - - // no further action needed - } + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: do not count " + "this frame") ); + + // no action needed } - return powerMgmtModeChange; + return powerMgmtModeChange; } // --------------------------------------------------------------------------- @@ -157,6 +162,15 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanLightPsModePowerModeMgr::OnPsModeErrorIndication() + { + return EToActive; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanLightPsModePowerModeMgr::OnLightPsToActiveTimerTimeout( WlanContextImpl& aCtxImpl ) { diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 15 % +* %version: 16 % */ #include "config.h" @@ -397,32 +397,17 @@ iFlags &= ~KKeepAliveTimerArmed; - TUint32 KTimeAfterLatestTx ( - static_cast(os_systemTime() - iLatestTx) ); - - if ( KTimeAfterLatestTx >= iKeepAliveTimeout ) + // request a regular Null Data frame to be sent + // however, if there is a frame Tx (of any frame) already pending OR + // we use U-APSD for Voice and we are on a VoWLAN call + // we won't request a new frame to be sent. + if ( !iWlanContextImpl.UnsentTxPackets() && + !( iWlanContextImpl.UapsdUsedForVoice() && InVoiceCallState() ) ) { - // request a regular Null Data frame to be sent - - // however, if there is a frame Tx (of any frame) already pending, - // we won't request a new frame to be sent. - if ( !iWlanContextImpl.UnsentTxPackets() ) + if ( !iNullSender.TxNullDataFrame( iWlanContextImpl, EFalse ) ) { - if ( !iNullSender.TxNullDataFrame( iWlanContextImpl, EFalse ) ) - { - // frame was not sent because we didn't get a Tx buffer. - // In this case we'll skip the sending - // However, we need to re-arm the timer to trigger the next - // Null Data frame sending - RegisterKeepAliveTimeout( iKeepAliveTimeout ); - } - } - else - { - // frame Tx already pending, so we don't ask a Null Data to be sent - OsTracePrint( KUmacDetails, (TUint8*) - ("UMAC: WlanNullSendController::OnKeepAliveTimerTimeout: frame Tx already pending. New Null Data Tx request skipped") ); - + // frame was not sent because we didn't get a Tx buffer. + // In this case we'll skip the sending // However, we need to re-arm the timer to trigger the next // Null Data frame sending RegisterKeepAliveTimeout( iKeepAliveTimeout ); @@ -430,9 +415,15 @@ } else { - // No need to send keep alive; yet. Re-arm the timer with - // a suitable timeout relative to the time of the latest frame Tx - RegisterKeepAliveTimeout( iKeepAliveTimeout - KTimeAfterLatestTx ); + // we don't ask a Null Data to be sent + OsTracePrint( KUmacDetails, (TUint8*) + ("UMAC: WlanNullSendController::OnKeepAliveTimerTimeout: frame Tx " + "already pending OR U-APSD used for Voice and we are in VoWLAN" + "call => Null Data Tx request skipped") ); + + // However, we need to re-arm the timer to trigger the next + // Null Data frame sending + RegisterKeepAliveTimeout( iKeepAliveTimeout ); } } diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,16 +16,13 @@ */ /* -* %version: 8 % +* %version: 9 % */ #include "config.h" #include "umacpowermodemgrbase.h" #include "UmacContextImpl.h" -// Default frame payload length threshold value (in bytes) for U-APSD -const TUint32 KUapsdRxFrameLengthThreshold = 400; - // ================= MEMBER FUNCTIONS ======================= @@ -34,7 +31,7 @@ // --------------------------------------------------------------------------- // WlanPowerModeMgrBase::WlanPowerModeMgrBase() : - iUapsdRxFrameLengthThreshold( KUapsdRxFrameLengthThreshold ) + iUapsdRxFrameLengthThreshold( KDefaultUapsdRxFrameLengthThreshold ) { } @@ -50,6 +47,15 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanPowerModeMgrBase::OnPsModeErrorIndication() + { + return ENoChange; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanPowerModeMgrBase::OnActiveToLightPsTimerTimeout() { return EFalse; diff -r e717b8f55620 -r a0fdcd0e4c56 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Tue May 25 16:07:06 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Fri Jun 04 12:12:29 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 59 % +* %version: 61 % */ #include "WlLddWlanLddConfig.h" @@ -41,7 +41,8 @@ const TUint32 KDmaTxMemSize = 4096; // equals to 1 MMU page on most systems // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // #ifndef RD_WLAN_DDK @@ -271,6 +272,9 @@ } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// // If an error occurs in this method, we set iPdd to NULL to prevent // PDD object destruction in base class (DLogicalChannelBase) destructor. // DLogicalChannelBase destructor gets called as this logical channel instance @@ -606,10 +610,11 @@ // --------------------------------------------------------------------------- -// +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode // --------------------------------------------------------------------------- // -TAny* DWlanLogicalChannel::DoControlFast( TInt aFunction, TAny* param ) +TAny* DWlanLogicalChannel::DoControlFast( TInt aFunction, TAny* aParam ) { TAny* ret( NULL ); TBool triggerTx ( EFalse ); @@ -621,9 +626,6 @@ iClient)); TraceDump(WLM_CMD_DETAILS, (("WLANLDD: function: 0x%x"), aFunction)); - // Note! We are executing in the context of the client's thread, but - // in supervisor mode - // acquire mutex // Enter critical section before requesting the mutex as // we are executing in the context of a user mode thread @@ -633,86 +635,37 @@ #else iOsa->MutexAcquire(); #endif - NKern::ThreadLeaveCS(); TraceDump(MUTEX, (("WLANLDD: DWlanLogicalChannel::DoControlFast: mutex acquired"))); - switch ( aFunction ) + if ( iUnit == KUnitWlan ) + { + ret = OnMgmtSideControlFast( aFunction, aParam ); + } + else if ( iUnit == KUnitEthernet ) { - case RPcmNetCardIf::EControlFastAllocTxBuffer: - ret = iEthernetFrameMemMngr->AllocTxBuffer( - reinterpret_cast(param) ); - - if ( !ret && iAddTxFrameAllowed ) - { - iAddTxFrameAllowed = EFalse; - - TraceDump( NWSA_TX, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: stop flow from protocol stack") ); - } - break; - - case RPcmNetCardIf::EControlFastAddTxFrame: - { -#ifndef NDEBUG - if ( !iAddTxFrameAllowed ) - { - TraceDump(ERROR_LEVEL, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: WARNING: AddTxFrame req. when flow ctrl is on")); - } + ret = OnEthernetSideControlFast( aFunction, aParam, triggerTx ); + } + else + { + // unknown unit +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, + ("WLANLDD: DWlanLogicalChannel::DoControlFast: unknown unit")); + TraceDump(ERROR_LEVEL, (("WLANLDD: aFunction: %d"), aFunction)); + TraceDump(ERROR_LEVEL, (("WLANLDD: unit: %d"), iUnit)); + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); #endif - if ( iEthernetFrameMemMngr->AllTxQueuesEmpty() ) - { - triggerTx = ETrue; - } - - TDataBuffer* discardFrame ( NULL ); - - ret = reinterpret_cast(iEthernetFrameMemMngr->AddTxFrame( - reinterpret_cast(param), - discardFrame, - iUmac.UserDataTxEnabled() )); - - if ( discardFrame ) - { - TraceDump( NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::DoControlFast: have to drop tx frame of UP: %d"), - reinterpret_cast(param)->UserPriority()) ); - - iEthernetFrameMemMngr->FreeTxPacket( discardFrame ); - } - - if ( !ret ) - { - iAddTxFrameAllowed = EFalse; - - TraceDump( NWSA_TX, - ("WLANLDD: DWlanLogicalChannel::DoControlFast: stop flow from protocol stack") ); - } - break; - } - default: -#ifndef NDEBUG - TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), - aFunction)); - os_assert( - (TUint8*)("WLANLDD: panic"), - (TUint8*)(WLAN_FILE), - __LINE__ ); -#endif - break; } // release mutex - // Enter critical section before releasing the mutex as - // we are executing in the context of a user mode thread - NKern::ThreadEnterCS(); #ifndef RD_WLAN_DDK Kern::MutexSignal( iMutex ); #else iOsa->MutexRelease(); #endif + // and exit from critical section NKern::ThreadLeaveCS(); TraceDump(MUTEX, @@ -728,7 +681,7 @@ // the lower priority thread will get paused and the higher priority // thread will get scheduled (to execute the DFC), we don't want the // higher priority thread to need to wait for the mutex. So we - // released the mutex first in this code block and after that enque + // released the mutex first in this code block and after that enqueue // the DFC request. if ( !( iFlags & KTxTriggerArmed ) ) { @@ -741,6 +694,162 @@ } // --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TAny* DWlanLogicalChannel::OnMgmtSideControlFast( + TInt aFunction, + TAny* aParam ) + { + TAny* ret( NULL ); + + switch ( aFunction ) + { + // ========================================================== + // Get Rx frame + // ========================================================== + case RWlanLogicalChannel::EWlanControlFastGetRxFrame: + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->GetRxFrame( + reinterpret_cast(aParam) ); + } + break; + // ========================================================== + // Unknown request + // ========================================================== + default: +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), + aFunction)); + os_assert( + (TUint8*)("WLANLDD: panic"), + (TUint8*)(WLAN_FILE), + __LINE__ ); +#endif + break; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Note! This method is executed in the context of the user mode client +// thread, but in supervisor mode +// --------------------------------------------------------------------------- +// +TAny* DWlanLogicalChannel::OnEthernetSideControlFast( + TInt aFunction, + TAny* aParam, + TBool& aTriggerTx ) + { + TAny* ret( NULL ); + aTriggerTx = EFalse; + + switch ( aFunction ) + { + // ========================================================== + // Alloc Tx buffer + // ========================================================== + case RPcmNetCardIf::EControlFastAllocTxBuffer: + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->AllocTxBuffer( + reinterpret_cast(aParam) ); + } + + if ( !ret && iAddTxFrameAllowed ) + { + iAddTxFrameAllowed = EFalse; + + TraceDump( NWSA_TX, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "stop flow from protocol stack") ); + } + break; + // ========================================================== + // Add Tx frame + // ========================================================== + case RPcmNetCardIf::EControlFastAddTxFrame: + { +#ifndef NDEBUG + if ( !iAddTxFrameAllowed ) + { + TraceDump(ERROR_LEVEL, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "WARNING: AddTxFrame req. when flow ctrl is on")); + } +#endif + if ( iEthernetFrameMemMngr && aParam ) + { + if ( iEthernetFrameMemMngr->AllTxQueuesEmpty() ) + { + aTriggerTx = ETrue; + } + + TDataBuffer* discardFrame ( NULL ); + + ret = reinterpret_cast( + iEthernetFrameMemMngr->AddTxFrame( + reinterpret_cast(aParam), + discardFrame, + iUmac.UserDataTxEnabled() )); + + if ( discardFrame ) + { + TraceDump( NWSA_TX_DETAILS, + (("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "have to drop tx frame of UP: %d"), + reinterpret_cast( + aParam)->UserPriority()) ); + + iEthernetFrameMemMngr->FreeTxPacket( discardFrame ); + aTriggerTx = EFalse; + } + } + + if ( !ret ) + { + iAddTxFrameAllowed = EFalse; + + TraceDump( NWSA_TX, + ("WLANLDD: DWlanLogicalChannel::OnEthernetSideControlFast: " + "stop flow from protocol stack") ); + } + break; + } + // ========================================================== + // Get Rx frame + // ========================================================== + case RPcmNetCardIf::EControlFastGetRxFrame: + { + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->GetRxFrame( + reinterpret_cast(aParam) ); + } + } + break; + // ========================================================== + // Unknown request + // ========================================================== + default: +#ifndef NDEBUG + TraceDump(ERROR_LEVEL, (("WLANLDD: unknown request: %d"), + aFunction)); + os_assert( + (TUint8*)("WLANLDD: panic"), + (TUint8*)(WLAN_FILE), + __LINE__ ); +#endif + break; + } // switch + + return ret; + } + +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // @@ -748,7 +857,7 @@ { if ( iUnit == KUnitWlan ) { - if ( aMask & ( 1 << EWlanRequestNotify ) ) + if ( aMask & ( 1 << RWlanLogicalChannel::EWlanRequestNotify ) ) { TraceDump(INFO_LEVEL, ("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side notify cancel")); @@ -758,7 +867,7 @@ iClient, iWlanRequestNotifyStatus, KErrServerTerminated ); iWlanRequestNotifyStatus = NULL; } - else if ( aMask & ( 1 << EWlanRequestFrame ) ) + else if ( aMask & ( 1 << RWlanLogicalChannel::EWlanRequestFrame ) ) { TraceDump(INFO_LEVEL, ("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side frame read cancel")); @@ -770,7 +879,8 @@ else { TraceDump(ERROR_LEVEL, - (("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side unhandled mask panic: 0x%08x"), + (("WLANLDD: DWlanLogicalChannel::DoCancel: mgmt side " + "unhandled mask panic: 0x%08x"), aMask)); os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } @@ -798,7 +908,8 @@ else { TraceDump(ERROR_LEVEL, - (("WLANLDD: DWlanLogicalChannel::DoCancel: user side unhandled mask panic: 0x%08x"), + (("WLANLDD: DWlanLogicalChannel::DoCancel: user side " + "unhandled mask panic: 0x%08x"), aMask)); os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } @@ -816,11 +927,13 @@ // --------------------------------------------------------------------------- // TBool DWlanLogicalChannel::ProtocolStackDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { - if ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( aBufferStart, - aNumOfBuffers ) ) + if ( iEthernetFrameMemMngr && + iEthernetFrameMemMngr->OnEthernetFrameRxComplete( + aBufferStart, + aNumOfBuffers ) ) { Kern::RequestComplete( iClient, iEthernetReceiveFrameStatus, KErrNone ); iEthernetReceiveFrameStatus = NULL; @@ -903,13 +1016,17 @@ TraceDump(UMAC_PROTO_CALLBACK, (("WLANLDD: aCompletionCode: %d"), aCompletionCode)); - iEthernetFrameMemMngr->FreeTxPacket( aMetaHeader ); + if ( iEthernetFrameMemMngr ) + { + iEthernetFrameMemMngr->FreeTxPacket( aMetaHeader ); + } TxProtocolStackData(); if ( !iAddTxFrameAllowed ) { - if ( iResumeTxStatus && + if ( iResumeTxStatus && + iEthernetFrameMemMngr && iEthernetFrameMemMngr->ResumeClientTx( iUmac.UserDataTxEnabled() ) ) { @@ -980,18 +1097,24 @@ // void DWlanLogicalChannel::TxManagementData() { - TDataBuffer* buffer = iEthernetFrameMemMngr->OnWriteEthernetFrame(); - - if ( !buffer ) + TDataBuffer* buffer( NULL ); + + if ( iEthernetFrameMemMngr ) { - TraceDump(ERROR_LEVEL, - ("WLANLDD: DWlanLogicalChannel::TxManagementData: " - "panic, no buffer")); - os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + buffer = iEthernetFrameMemMngr->OnWriteEthernetFrame(); + } + + if ( buffer ) + { + iUmac.WriteMgmtFrame( *buffer ); } else { - iUmac.WriteMgmtFrame( *buffer ); +#ifndef NDEBUG + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); +#endif + Kern::RequestComplete( + iClient, iWlanSendFrameStatus, KErrGeneral ); } } @@ -1001,7 +1124,7 @@ // void DWlanLogicalChannel::TxProtocolStackData() { -#ifndef NDEBUG +#ifndef NDEBUG TUint packetsSubmitted ( 0 ); #endif @@ -1049,7 +1172,13 @@ // TBool DWlanLogicalChannel::OnReadEthernetFrameRequest() { - const TBool ret = iEthernetFrameMemMngr->OnReadRequest(); + TBool ret( EFalse ); + + if ( iEthernetFrameMemMngr ) + { + ret = iEthernetFrameMemMngr->OnReadRequest(); + } + return ret; } @@ -1451,17 +1580,17 @@ switch ( aReqNo ) { - case EWlanInitSystem: + case RWlanLogicalChannel::EWlanInitSystem: // bootup the chip and the system iWlanGeneralRequestStatus = aStatus; InitSystem( a1, sizeof(TOpenParam) ); break; - case EWlanFinitSystem: + case RWlanLogicalChannel::EWlanFinitSystem: // power down the chip and the system iWlanGeneralRequestStatus = aStatus; FinitSystem(); break; - case EWlanCommand: + case RWlanLogicalChannel::EWlanCommand: // management command iWlanGeneralRequestStatus = aStatus; @@ -1502,13 +1631,13 @@ output_buffer.iData, output_buffer.iLen ); break; - case EWlanRequestNotify: + case RWlanLogicalChannel::EWlanRequestNotify: // store the USER mode indication address; iIndicationBuffer = static_cast(a1); iWlanRequestNotifyStatus = aStatus; IndicationRequest( static_cast(a1) ); break; - case EWlanRequestFrame: + case RWlanLogicalChannel::EWlanRequestFrame: if ( OnReadEthernetFrameRequest() ) { // rx data to be completed exists @@ -1525,7 +1654,7 @@ iWlanReceiveFrameStatus = aStatus; } break; - case EWlanRequestSend: + case RWlanLogicalChannel::EWlanRequestSend: iWlanSendFrameStatus = aStatus; TxManagementData(); @@ -1728,7 +1857,7 @@ TAny* /*a2*/ ) { TInt ret( KErrNone ); - if ( aFunction == EWlanSvControlInitBuffers ) + if ( aFunction == RWlanLogicalChannel::EWlanSvControlInitBuffers ) { // initiliaze buffers for wlan mgmt client data xfer if ( a1 ) @@ -1749,7 +1878,7 @@ os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } } - else if ( aFunction == EWlanSvControlFreeBuffers ) + else if ( aFunction == RWlanLogicalChannel::EWlanSvControlFreeBuffers ) { // free wlan mgmt client data xfer buffers OnReleaseEthernetFrameBuffers(); @@ -1891,13 +2020,16 @@ if ( iEthernetFrameMemMngr ) { TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aEthernetFrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aEthernetFrameTxOffset: %d"), aEthernetFrameTxOffset )); TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aDot11FrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aDot11FrameTxOffset: %d"), aDot11FrameTxOffset )); TraceDump(NWSA_TX_DETAILS, - (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: aSnapFrameTxOffset: %d"), + (("WLANLDD: DWlanLogicalChannel::SetMgmtSideTxOffsets: " + "aSnapFrameTxOffset: %d"), aSnapFrameTxOffset )); iEthernetFrameMemMngr->SetTxOffsets( @@ -1934,12 +2066,13 @@ // --------------------------------------------------------------------------- // void DWlanLogicalChannel::MgmtDataReceiveComplete( - const TDataBuffer*& aBufferStart, + TDataBuffer*& aBufferStart, TUint32 aNumOfBuffers ) { - if ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( - aBufferStart, - aNumOfBuffers ) ) + if ( iEthernetFrameMemMngr && + ( iEthernetFrameMemMngr->OnEthernetFrameRxComplete( + aBufferStart, + aNumOfBuffers ) ) ) { Kern::RequestComplete( iClient, iWlanReceiveFrameStatus, KErrNone ); iWlanReceiveFrameStatus = NULL; @@ -2174,23 +2307,32 @@ void DWlanLogicalChannel::ReleaseIndicationListEntry( TIndicationListEntry* aEntry ) { - aEntry->next = NULL; - - if ( !iFreeIndicationListHead ) + if ( aEntry ) { - iFreeIndicationListHead = aEntry; + aEntry->next = NULL; + + if ( !iFreeIndicationListHead ) + { + iFreeIndicationListHead = aEntry; + } + else + { + TIndicationListEntry* tmp = iFreeIndicationListHead; + + while ( tmp->next ) + { + tmp = tmp->next; + } + + tmp->next = aEntry; + } } +#ifndef NDEBUG else { - TIndicationListEntry* tmp = iFreeIndicationListHead; - - while ( tmp->next ) - { - tmp = tmp->next; - } - - tmp->next = aEntry; + os_assert( (TUint8*)("WLANLDD: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); } +#endif } // ---------------------------------------------------------------------------