--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwstunturnclient/src/natfwbindingimplementationbase.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,225 @@
+/*
+* 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 "natfwbindingimplementationbase.h"
+#include "mstunbindingobserver.h"
+#include "stunturnclientlogs.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+const TReal KAlpha = 0.125; // alpha = 1/8 RFC 2988
+const TReal KBeta = 0.25; // beta = 1/4 RFC 2988
+
+const TReal KAlphaRemainder = 1 - KAlpha; // 1 - alpha = 7/8 (0.875) RFC 2988 2.3
+const TReal KBetaRemainder = 1 - KBeta; // 1 - beta = 3/4 (0.75) RFC 2988 2.3
+
+const TInt KRTTVARFactor = 4; // RFC 2988 2.3
+
+
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CBindingImplementation::CBindingImplementation( MSTUNBindingObserver& aClient,
+ CBinding& aBinding,
+ RSocket& aSocket ) :
+ CSTUNTimerUser( aClient.TimerProvider() ),
+ iClient( &aClient ),
+ iBinding( aBinding ),
+ iSocket( &aSocket ),
+ iDummyIP( KAFUnspec )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Default constructor - overloaded
+// ---------------------------------------------------------------------------
+//
+CBindingImplementation::CBindingImplementation( MSTUNBindingObserver& aClient,
+ CBinding& aBinding,
+ TUint aStreamId,
+ TUint aConnectionId,
+ MNcmConnectionMultiplexer* aMux ) :
+ CSTUNTimerUser( aClient.TimerProvider() ),
+ iClient( &aClient ),
+ iBinding( aBinding ),
+ iStreamId( aStreamId ),
+ iConnectionId( aConnectionId ),
+ iMux( aMux ),
+ iDummyIP( KAFUnspec )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::SendRequestL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::SendRequestL()
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::SendRequestL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::SendRequestL( const TInetAddr& /*aDestAddr*/,
+ TBool /*aAddFingerprint*/,
+ TUint /*aRTvalue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::AllocateRequestL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::AllocateRequestL( TUint /*aRtoValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::StoreAddressL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::StoreAddressL(
+ const TInetAddr& /*ReflexiveAddr*/, const TInetAddr& /*aRelayAddr*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::RelayAddr
+// ---------------------------------------------------------------------------
+//
+const TInetAddr& CBindingImplementation::RelayAddr() const
+ {
+ return iDummyIP;
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::SetActiveDestinationRequestL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::SetActiveDestinationRequestL(
+ const TInetAddr& /*aRemoteAddr*/, TUint32& /*aTimerValue*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::ConnectRequestL
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::ConnectRequestL( const TInetAddr& /*aRemoteAddr*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// ---------------------------------------------------------------------------
+// CBindingImplementation::NewRTTSampleMeasured
+// ---------------------------------------------------------------------------
+//
+void CBindingImplementation::NewRTTSampleMeasured( TInt64& aRTTSample,
+ TBool aRetransmitted )
+ {
+ __STUNTURNCLIENT( "CBindingImplementation::NewRTTSampleMeasured" )
+
+ if ( aRetransmitted )
+ {
+ // If segment was retransmitted use backed off RTO for next segment
+ iRetransmitInterval = I64INT( aRTTSample );
+ }
+ else
+ {
+ CalculateNewRTO( aRTTSample );
+ iRetransmitInterval = I64INT( iRTO );
+ }
+
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::NewRTTSampleMeasured - iRetransmitInterval:", iRetransmitInterval )
+ }
+
+// -----------------------------------------------------------------------------
+// CBindingImplementation::CalculateNewRTO
+// -----------------------------------------------------------------------------
+//
+void CBindingImplementation::CalculateNewRTO( TInt64& aRTTSample )
+ {
+ __STUNTURNCLIENT( "CBindingImplementation::RemoveAddress" )
+
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - New RTT Sample:", aRTTSample )
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - current iRTTVAR:", iRTTVAR )
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - current iSRTT:", iSRTT )
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - current iRTO:", iRTO )
+
+ if ( iFirstRTOCalculated )
+ {
+ /*
+ RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R'|
+ SRTT <- (1 - alpha) * SRTT + alpha * R'
+ RTO <- SRTT + max (G, K*RTTVAR)
+ */
+
+ TInt64 diff = Abs( iSRTT - aRTTSample );
+
+ iRTTVAR = TInt64( ( KBetaRemainder * iRTTVAR ) + ( KBeta * diff ) );
+
+ iSRTT = TInt64( ( KAlphaRemainder * iSRTT ) + ( KAlpha * aRTTSample ) );
+
+ // rfc2988 if the K*RTTVAR term in the RTO calculation equals zero,
+ // the variance term MUST be rounded to G seconds
+ TInt64 rttvar( 0 );
+ rttvar = ( 0 == iRTTVAR ) ? 1 : iRTTVAR;
+
+ iRTO = iSRTT + ( KRTTVARFactor * rttvar );
+ }
+ else
+ {
+ /*
+ (2.2) When the first RTT measurement R is made
+ SRTT <- R
+ RTTVAR <- R/2
+ RTO <- SRTT + max (G, K*RTTVAR)
+ */
+
+ iSRTT = aRTTSample;
+ iRTTVAR = aRTTSample / TInt64( 2 );
+ iRTO = iSRTT + ( TInt64( 4 ) * iRTTVAR );
+
+ iFirstRTOCalculated = ETrue;
+ }
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - new iRTTVAR:", iRTTVAR )
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - new iSRTT:", iSRTT )
+ __STUNTURNCLIENT_INT1( "CBindingImplementation::CalculateNewRTO - new iRTO:", iRTO )
+ }
+
+
+// -----------------------------------------------------------------------------
+// CBindingImplementation::CancelRetransmission
+// -----------------------------------------------------------------------------
+//
+void CBindingImplementation::CancelRetransmission()
+ {
+ return;
+ }
+
+
+// End of file
+