diff -r 000000000000 -r 33413c0669b9 vpnengine/ikev1lib/src/ikev1keepalive.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/ikev1lib/src/ikev1keepalive.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,189 @@ +/* +* Copyright (c) 2003-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: IKEv1 keep alive object +* +*/ + + +#include +#include +#include +#include "ikedebug.h" +#include "ikev1keepalive.h" +#include "ikev1pluginsession.h" + +_LIT8(KMsgContent, "\xff"); + +CIkeV1KeepAlive* CIkeV1KeepAlive::NewL( CIkev1PluginSession& aPluginSession, + TInt aPort, + TInetAddr& aDestAddr, + TInt NatKeepAlive, + TInt DpdKeepAlive, + MDpdHeartBeatEventHandler* aHandler, + TUint8 aDscp ) + { + CIkeV1KeepAlive* self = new (ELeave) CIkeV1KeepAlive( aPluginSession, + aPort, + aDestAddr, + NatKeepAlive, + DpdKeepAlive, + aHandler, + aDscp ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + + +CIkeV1KeepAlive::CIkeV1KeepAlive( CIkev1PluginSession& aPluginSession, + TInt aPort, + TInetAddr& aDestAddr, + TInt aNatKeepAlive, + TInt aDpdKeepAlive, + MDpdHeartBeatEventHandler* aHandler, + TUint8 aDscp ) + : CTimer( EPriorityStandard ), + iPluginSession( aPluginSession ), + iPort( aPort ), + iMsg( KMsgContent ) + { + iDestAddr = aDestAddr; + iNatKeepAlive = aNatKeepAlive; + iDpdKeepAlive = aDpdKeepAlive; + iCallback = aHandler; + iDscp = aDscp; + CActiveScheduler::Add( this ); + } + +//Destructor +CIkeV1KeepAlive::~CIkeV1KeepAlive() + { + Cancel(); + } + + +void CIkeV1KeepAlive::ConstructL() + { + // + // If NAT keepalive timoeut allocate (and initialize) a TIkeXmitBfr data buffer for + // NAT keepalive. Allocate a data buffer for special "Echo request" + // keepalive message, if proprietary "Nokia NAT Traversal is used". + // Start keep alive timer + // + CTimer::ConstructL(); + + if ( (iNatKeepAlive >= iDpdKeepAlive) && (iDpdKeepAlive != 0) && iCallback ) + iNatKeepAlive = 0; // Not needed + + if ( iNatKeepAlive ) + { + iDestAddr.SetPort(iPort); + + iRemainingTime = iNatKeepAlive; + if ( iCallback ) + iCurrDPDTimeLeft = iDpdKeepAlive - iNatKeepAlive; + else iDpdKeepAlive = 0; + } + else + { + iRemainingTime = iDpdKeepAlive; + } + + StartTimer(); + } + + +void CIkeV1KeepAlive::DoCancel() + { + CTimer::DoCancel(); + } + +void CIkeV1KeepAlive::RunL() + { + if ( iRemainingTime == 0 ) + { + TBool DpdEvent = EFalse; + if ( iDpdKeepAlive ) + { + if ( ( iCurrDPDTimeLeft == 0 ) && iCallback ) + { + // + // Call DPD event handler + // + DpdEvent = ETrue; + iCallback->EventHandlerL(); + iRemainingTime = iDpdKeepAlive; + } + } + + if ( iNatKeepAlive ) + { + // + // Send a NAT keepalive message(s) + // + if ( !DpdEvent ) + { + iPluginSession.SendNatKeepAliveL( iDestAddr, + iMsg, + iDscp ); + } + + iRemainingTime = iNatKeepAlive; + + if ( iDpdKeepAlive ) + { + if ( DpdEvent ) + { + iCurrDPDTimeLeft = iDpdKeepAlive - iNatKeepAlive; + } + else + { + if ( iCurrDPDTimeLeft < iNatKeepAlive ) + { + iRemainingTime = iCurrDPDTimeLeft; + iCurrDPDTimeLeft = 0; + } + else iCurrDPDTimeLeft -= iNatKeepAlive; + } + } + } + } + + StartTimer(); + } + +TInt CIkeV1KeepAlive::RunError(TInt /*aError*/) + { + return KErrNone; + } + +void CIkeV1KeepAlive::StartTimer() + { + if ( iRemainingTime > KMaxTInt/1000000 ) //To avoid overflowing the Timer + { + iRemainingTime -= KMaxTInt/1000000; + After(KMaxTInt); + } + else //No overflow + { + if ( iRemainingTime ) + { + After(iRemainingTime*1000000); + } + iRemainingTime = 0; + } + } +