--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlannwif/src/NifWLMServerIf.cpp Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,437 @@
+/*
+* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: Implements interaction with WLMServer for Admission control purpose
+*
+*/
+
+/*
+* %version: 7 %
+*/
+
+#include "NifWLMServerIf.h"
+#include "WlanProto.h"
+#include "am_debug.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::NewL
+// -----------------------------------------------------------------------------
+//
+CLANNifWLMServerPerAC* CLANNifWLMServerPerAC::NewL(
+ TWlmAccessClass aAccessClass,
+ TUint aInactivityTime,
+ TBool aIsAutomaticMgmt )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::NewL()" );
+ CLANNifWLMServerPerAC* self =
+ new (ELeave) CLANNifWLMServerPerAC( aAccessClass, aInactivityTime, aIsAutomaticMgmt );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::CLANNifWLMServerPerAC
+// -----------------------------------------------------------------------------
+//
+CLANNifWLMServerPerAC::CLANNifWLMServerPerAC(
+ TWlmAccessClass aAccessClass,
+ TUint aInactivityTime,
+ TBool aIsAutomaticMgmt ):
+ CActive( CActive::EPriorityStandard ),
+ iAccessClass( aAccessClass ),
+ iTrafficMode( EWlmAcTrafficModeAutomatic ),
+ iTrafficStatus( EWlmAcTrafficStatusAdmitted ),
+ iContext( ETSCreateRequest ),
+ iIsTsCreated( EFalse ),
+ iTsId( 0 ),
+ iTsParams( KACtoUP[iAccessClass] ),
+ iTsStatus( EWlanTrafficStreamStatusActive ),
+ iTsInactivityTime( aInactivityTime ),
+ iTsDelOrigTime( 0 ),
+ iTsDelRemainTime( 0 ),
+ iTsDelStartTime( 0 ),
+ iIsAutomaticMgmt( aIsAutomaticMgmt )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::CLANNifWLMServerPerAC()" );
+
+ CActiveScheduler::Add(this);
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::~CLANNifWLMServerPerAC
+// -----------------------------------------------------------------------------
+//
+CLANNifWLMServerPerAC::~CLANNifWLMServerPerAC()
+ {
+ DEBUG( "CLANNifWLMServerPerAC::~CLANNifWLMServerPerAC()" );
+
+ Cancel();
+ iTsDelTimer.Close();
+ iWlmServer.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::ConstructL()
+ {
+ DEBUG( "CLANNifWLMServerPerAC::ConstructL()" );
+
+ User::LeaveIfError( iWlmServer.Connect() );
+ User::LeaveIfError( iTsDelTimer.CreateLocal() );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::IsAdmitted
+// -----------------------------------------------------------------------------
+//
+TBool CLANNifWLMServerPerAC::IsAdmitted()
+ {
+ return ( iTrafficStatus == EWlmAcTrafficStatusAdmitted );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::SetTrafficMode
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::SetTrafficMode(
+ TWlmAcTrafficMode aMode )
+ {
+ iTrafficMode = aMode;
+
+ if( aMode == EWlmAcTrafficModeAutomatic )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::SetTrafficMode() - traffic mode set to automatic for AC %u",
+ iAccessClass );
+ }
+ else if( aMode == EWlmAcTrafficModeManual )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::SetTrafficMode() - traffic mode set to manual for AC %u",
+ iAccessClass );
+
+ // If mode is changed from automatic to manual, it means NIF's
+ // traffic streams for this AC have been deleted.
+
+ Cancel();
+ iIsTsCreated = EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::SetTrafficStatus
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::SetTrafficStatus(
+ TWlmAcTrafficStatus aStatus )
+ {
+ iTrafficStatus = aStatus;
+
+ if( aStatus == EWlmAcTrafficStatusAdmitted )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::SetTrafficStatus() - traffic admitted on AC %u",
+ iAccessClass );
+ }
+ else if( aStatus == EWlmAcTrafficModeManual )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::SetTrafficStatus() - traffic NOT admitted on AC %u",
+ iAccessClass );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::SuspendInactivityTimer
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::SuspendInactivityTimer()
+ {
+ if( !iIsTsCreated )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::SuspendInactivityTimer() - no traffic stream created, nothing to suspend" );
+
+ return;
+ }
+
+ if( !IsActive() )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::SuspendInactivityTimer() - timer is already suspended" );
+
+ return;
+ }
+
+ DEBUG1( "CLANNifWLMServerPerAC::SuspendInactivityTimer() - AC: %u",
+ iAccessClass );
+
+ //First, cancel the running timer
+ Cancel();
+
+ TTime time;
+ time.UniversalTime();
+ TTimeIntervalMicroSeconds difference;
+ difference = time.MicroSecondsFrom( iTsDelStartTime );
+ iTsDelRemainTime = iTsDelRemainTime.Int() - difference.Int64();
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::ResumeInactivityTimer
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::ResumeInactivityTimer()
+ {
+ if( !iIsTsCreated )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::ResumeInactivityTimer() - no traffic stream created, nothing to resume" );
+
+ return;
+ }
+
+ if( IsActive() )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::ResumeInactivityTimer() - timer is already resumed" );
+
+ return;
+ }
+
+ DEBUG2( "CLANNifWLMServerPerAC::ResumeInactivityTimer() - AC: %u, remaining time(us): %u",
+ iAccessClass, iTsDelRemainTime.Int() );
+
+ //Remember the time the timer is started
+ iTsDelStartTime.UniversalTime();
+ iTsDelTimer.After(iStatus, iTsDelRemainTime);
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::OnFrameSend
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::OnFrameSend()
+ {
+ DEBUG6( "CLanLinkCommon::OnFrameSend() - iAccessClass: %u, iTrafficStatus: %u, iTrafficMode: %u, iIsTsCreated: %u, iIsAutomaticMgmt: %u, IsActive(): %u",
+ iAccessClass, iTrafficStatus, iTrafficMode, iIsTsCreated, iIsAutomaticMgmt, IsActive() );
+
+ if( iIsAutomaticMgmt &&
+ iTrafficStatus == EWlmAcTrafficStatusNotAdmitted &&
+ iTrafficMode == EWlmAcTrafficModeAutomatic &&
+ !iIsTsCreated &&
+ !IsActive() )
+ {
+ DEBUG1( "CLanLinkCommon::OnFrameSend() - requesting a virtual traffic stream for AC %u",
+ iAccessClass );
+
+ iWlmServer.CreateTrafficStream(
+ iStatus,
+ iTsParams,
+ ETrue,
+ iTsId,
+ iTsStatus );
+ iContext = ETSCreateRequest;
+ SetActive();
+ }
+ else if( iIsTsCreated )
+ {
+ // Refresh the inactivity timer.
+
+ Cancel();
+ iTsDelRemainTime = iTsDelOrigTime;
+ iTsDelStartTime.UniversalTime();
+ iTsDelTimer.After( iStatus, iTsDelOrigTime );
+ SetActive();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::OnFrameReceive
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::OnFrameReceive()
+ {
+ DEBUG6( "CLanLinkCommon::OnFrameReceive() - iAccessClass: %u, iTrafficStatus: %u, iTrafficMode: %u, iIsTsCreated: %u, iIsAutomaticMgmt: %u, IsActive(): %u",
+ iAccessClass, iTrafficStatus, iTrafficMode, iIsTsCreated, iIsAutomaticMgmt, IsActive() );
+
+ if( iIsTsCreated &&
+ IsActive() )
+ {
+ // Refresh the inactivity timer.
+
+ Cancel();
+ iTsDelRemainTime = iTsDelOrigTime;
+ iTsDelStartTime.UniversalTime();
+ iTsDelTimer.After( iStatus, iTsDelOrigTime );
+ SetActive();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::RunL
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::RunL()
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::RunL() - iStatus: %d",
+ iStatus.Int() );
+
+ if( iContext == ETSCreateRequest )
+ {
+ if( iStatus.Int() == KErrNone )
+ {
+ DEBUG1("CLANNifWLMServerPerAC::RunL() - virtual traffic stream successfully created for AC %u",
+ iAccessClass );
+
+ iIsTsCreated = ETrue;
+
+ // Start the inactivity timer.
+ iTsDelOrigTime = iTsDelRemainTime = iTsInactivityTime;
+ iTsDelStartTime.UniversalTime();
+ iContext = ETSDelTimer;
+ iTsDelTimer.After( iStatus, iTsDelOrigTime );
+ SetActive();
+ }
+ else
+ {
+ DEBUG2("CLANNifWLMServerPerAC::RunL() - virtual traffic stream creation for AC %u failed with %d",
+ iAccessClass, iStatus.Int() );
+
+ iIsTsCreated = EFalse;
+ }
+ }
+ else if( iContext == ETSDelTimer )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::RunL() - inactivity timer expired for AC %u, deleting the virtual traffic stream",
+ iAccessClass );
+
+ iWlmServer.DeleteTrafficStream( iStatus, iTsId );
+ User::WaitForRequest( iStatus );
+
+ iIsTsCreated = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CLANNifWLMServerPerAC::RunError(
+ TInt /* aError */ )
+ {
+ DEBUG( "CLANNifWLMServerPerAC::RunError()" );
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerPerAC::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerPerAC::DoCancel()
+ {
+ if( iContext == ETSCreateRequest )
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::DoCancel() - cancelling TS create request for AC %u",
+ iAccessClass );
+
+ iWlmServer.CancelCreateTrafficStream();
+ }
+ else
+ {
+ DEBUG1( "CLANNifWLMServerPerAC::DoCancel() - cancelling TS delete timer for AC %u",
+ iAccessClass );
+
+ iTsDelTimer.Cancel();
+ }
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::CLANNifWLMServerCommon
+// -----------------------------------------------------------------------------
+//
+CLANNifWLMServerCommon::CLANNifWLMServerCommon(
+ CLANLinkCommon* aLinkCommon ) :
+ iLinkCommon( aLinkCommon )
+ {
+ DEBUG( "CLANNifWLMServerCommon::CLANNifWLMServerCommon()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::~CLANNifWLMServerCommon
+// -----------------------------------------------------------------------------
+//
+CLANNifWLMServerCommon::~CLANNifWLMServerCommon()
+ {
+ DEBUG( "CLANNifWLMServerCommon::~CLANNifWLMServerCommon" );
+
+ iWlmServer.CancelNotifies();
+ iWlmServer.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerCommon::ConstructL()
+ {
+ DEBUG( "CLANNifWLMServerCommon::ConstructL()" );
+
+ User::LeaveIfError( iWlmServer.Connect() );
+ iWlmServer.ActivateNotifiesL(
+ *this,
+ EWlmNotifyAcTrafficModeChanged | EWlmNotifyAcTrafficStatusChanged );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::GetAcTrafficStatus
+// -----------------------------------------------------------------------------
+//
+TInt CLANNifWLMServerCommon::GetAcTrafficStatus(
+ TWlmAcTrafficStatusArray& aArray )
+ {
+ DEBUG( "CLANNifWLMServerCommon::GetAcTrafficStatus()" );
+
+ return iWlmServer.GetAcTrafficStatus( aArray );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::AccessClassTrafficModeChanged
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerCommon::AccessClassTrafficModeChanged(
+ TWlmAccessClass aAccessClass,
+ TWlmAcTrafficMode aMode )
+ {
+ DEBUG( "CLANNifWLMServerCommon::AccessClassTrafficModeChanged()" );
+
+ iLinkCommon->AcTrafficModeChanged(
+ aAccessClass, aMode );
+ }
+
+// -----------------------------------------------------------------------------
+// CLANNifWLMServerCommon::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CLANNifWLMServerCommon::AccessClassTrafficStatusChanged(
+ TWlmAccessClass aAccessClass,
+ TWlmAcTrafficStatus aStatus )
+ {
+ DEBUG( "CLANNifWLMServerCommon::AccessClassTrafficStatusChanged()" );
+
+ iLinkCommon->AcTrafficStatusChanged(
+ aAccessClass, aStatus );
+ }