diff -r 000000000000 -r 1bce908db942 natfw/natfwicecandidatehandler/src/cicecheckprioritizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwicecandidatehandler/src/cicecheckprioritizer.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,160 @@ +/* +* Copyright (c) 2006-2007 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: +* +*/ + + + + +#include "natfwcandidate.h" +#include "natfwcandidatepair.h" +#include "cicecheckprioritizer.h" +#include "ciceconnectivitycheck.h" +#include "icecandidatehandlerlogs.h" + +/** variables used in priority calculation */ +const TUint64 K2ToPowerOf32 = 2^32; +const TUint64 KNumValTwo = 2; + +// ======== MEMBER FUNCTIONS ======== + + +CIceCheckPrioritizer::CIceCheckPrioritizer() + { + __ICEDP( "CIceCheckPrioritizer::CIceCheckPrioritizer" ) + } + + +CIceCheckPrioritizer* CIceCheckPrioritizer::NewL() + { + __ICEDP( "CIceCheckPrioritizer::NewL" ) + + CIceCheckPrioritizer* self = CIceCheckPrioritizer::NewLC(); + CleanupStack::Pop( self ); + + return self; + } + + +CIceCheckPrioritizer* CIceCheckPrioritizer::NewLC() + { + __ICEDP( "CIceCheckPrioritizer::NewLC" ) + + CIceCheckPrioritizer* self = new( ELeave ) CIceCheckPrioritizer(); + CleanupStack::PushL( self ); + + return self; + } + + +CIceCheckPrioritizer::~CIceCheckPrioritizer() + { + __ICEDP( "CIceCheckPrioritizer::~CIceCheckPrioritizer" ) + } + + +// --------------------------------------------------------------------------- +// CIceCheckPrioritizer::PrioritizePair +// --------------------------------------------------------------------------- +// +void CIceCheckPrioritizer::PrioritizePair( CNATFWCandidatePair& aPair, + TNATFWIceRole aCurrentRole ) const + { + __ICEDP( "CIceCheckPrioritizer::PrioritizePair" ) + + /* + ICE-17, section 5.7.2. + Let G be the priority for the candidate provided by the controlling + agent. Let D be the priority for the candidate provided by the + controlled agent. The priority for a pair is computed as: + + pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0) + + Where G>D?1:0 is an expression whose value is 1 if G is greater than + D, and 0 otherwise. This formula ensures a unique priority for each + pair. + */ + TUint64 controllingPri( 0 ); + TUint64 controlledPri( 0 ); + if ( EIceRoleControlling == aCurrentRole ) + { + controllingPri = aPair.LocalCandidate().Priority(); + controlledPri = aPair.RemoteCandidate().Priority(); + } + else + { + controlledPri = aPair.LocalCandidate().Priority(); + controllingPri = aPair.RemoteCandidate().Priority(); + } + + TUint64 pairPri = K2ToPowerOf32 * Min( controllingPri, controlledPri ) + + KNumValTwo * Max( controllingPri, controlledPri ) + + ( + ( controllingPri > controlledPri ) ? TUint64( 1 ) : TUint64( 0 ) + ); + + aPair.SetPriority( pairPri ); + } + + +// --------------------------------------------------------------------------- +// CIceCheckPrioritizer::PrioritizePairs +// --------------------------------------------------------------------------- +// +void CIceCheckPrioritizer::PrioritizePairs( + RPointerArray& aPairs, + TNATFWIceRole aCurrentRole ) const + { + __ICEDP( "CIceCheckPrioritizer::PrioritizePairs" ) + + TInt ind( aPairs.Count() ); + while ( ind-- ) + { + PrioritizePair( *aPairs[ind], aCurrentRole ); + } + } + + +// --------------------------------------------------------------------------- +// CIceCheckPrioritizer::PrioritizeCheck +// --------------------------------------------------------------------------- +// +void CIceCheckPrioritizer::PrioritizeCheck( + CIceConnectivityCheck& aCheck, TNATFWIceRole aCurrentRole ) const + { + __ICEDP( "CIceCheckPrioritizer::PrioritizeCheck" ) + + PrioritizePair( + const_cast( aCheck.CandidatePair() ), + aCurrentRole ); + } + + +// --------------------------------------------------------------------------- +// CIceCheckPrioritizer::PrioritizeChecks +// --------------------------------------------------------------------------- +// +void CIceCheckPrioritizer::PrioritizeChecks( + RPointerArray& aChecks, + TNATFWIceRole aCurrentRole ) const + { + __ICEDP( "CIceCheckPrioritizer::PrioritizeChecks" ) + + TInt ind( aChecks.Count() ); + while ( ind-- ) + { + PrioritizeCheck( *aChecks[ind], aCurrentRole ); + } + }