vpnengine/ikev1lib/src/ikev1keepalive.cpp
changeset 0 33413c0669b9
--- /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 <eikenv.h>
+#include <es_sock.h>
+#include <e32math.h>
+#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;
+        }
+    }
+