vpnengine/ikev2lib/src/ikev2plugin.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev2lib/src/ikev2plugin.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,139 @@
+/*
+* Copyright (c) 2003-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:   IKEv2 protocol plugin
+*
+*/
+
+#include <random.h>
+#include <in_sock.h>
+
+#include "ikev2plugin.h"
+#include "ikedebug.h"
+#include "ikev2pluginsession.h"
+#include "ipsecpolicyutil.h"
+
+
+EXPORT_C MIkePluginIf* Ikev2PlugInL( MKmdEventLoggerIf& aEventLogger,
+                                     MIkeDebug& aDebug )
+    {
+    return CIkev2PlugIn::NewL(aEventLogger, aDebug);
+    }
+
+CIkev2PlugIn* CIkev2PlugIn::NewL( MKmdEventLoggerIf& aEventLogger,
+                                  MIkeDebug& aDebug )
+    {
+    CIkev2PlugIn* self = new (ELeave) CIkev2PlugIn(aEventLogger, aDebug);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+    
+
+CIkev2PlugIn::CIkev2PlugIn( MKmdEventLoggerIf& aEventLogger,
+                            MIkeDebug& aDebug )
+: iEventLogger(aEventLogger), iDebug(aDebug)
+    {
+    }
+
+
+void CIkev2PlugIn::ConstructL()
+    {    
+    iPfKeySocketIf = CPFKeySocketIf::NewL(this, iDebug);    
+    iIpsecPolicyUtil = CIpsecPolicyUtil::NewL();
+    }
+    
+    
+CIkev2PlugIn::~CIkev2PlugIn()
+    {
+    delete iIpsecPolicyUtil;
+    delete iPfKeySocketIf;
+    
+    __ASSERT_DEBUG( iPluginSessions.Count() == 0,
+                    User::Invariant() );       
+    iPluginSessions.Close();    	  
+    }
+
+
+MIkePluginSessionIf* CIkev2PlugIn::CreateSessionL( TUint32 aVpnIapId,
+                                                   TUint32 aVpnNetId,
+                                                   TUint32 aVpnInterfaceIndex,
+                                                   MIkeDataInterface& aIkeDataInterface )
+    {
+    CIkev2PluginSession* pluginSession = CIkev2PluginSession::NewL( aVpnIapId,
+                                                                    aVpnNetId,
+                                                                    aVpnInterfaceIndex,
+                                                                    aIkeDataInterface,
+                                                                    *this,
+                                                                    *iPfKeySocketIf,
+                                                                    *iIpsecPolicyUtil,
+                                                                    iEventLogger,
+                                                                    iDebug ); 
+    TInt err = iPluginSessions.Append( pluginSession );
+    
+    if ( err != KErrNone )
+        {
+        delete pluginSession;
+        pluginSession = NULL;
+        User::Leave( err );
+        }
+    
+    return pluginSession;    
+    }
+
+void CIkev2PlugIn::PluginSessionDeleted(const MIkePluginSessionIf* aDeletedSession)
+    {
+    for (TInt i = 0; i < iPluginSessions.Count(); ++i)
+        {
+            if (iPluginSessions[i] == aDeletedSession)
+                {
+                iPluginSessions.Remove(i);
+                }
+        }
+    }
+
+void CIkev2PlugIn::PfkeyMessageReceived( const TPfkeyMessage& aPfkeyMessage )
+    {    
+    switch ( aPfkeyMessage.iBase.iMsg->sadb_msg_type )
+        {
+        case SADB_ADD: // Fall through
+        case SADB_ACQUIRE:
+            {
+            for ( TInt i=0; i< iPluginSessions.Count(); i++ )
+                {
+                if ( iPluginSessions[i]->MatchDestinationAddress( aPfkeyMessage.iDstAddr.Address() ) )                
+                    {
+                    iPluginSessions[i]->PfkeyMessageReceived( aPfkeyMessage );
+                    break;
+                    }
+                }
+            break;
+            }
+            
+        case SADB_EXPIRE:
+            {
+            for ( TInt i=0; i< iPluginSessions.Count(); i++ )
+                {
+                if ( iPluginSessions[i]->MatchDestinationAddress( aPfkeyMessage.iSrcAddr.Address() ) )                
+                    {
+                    iPluginSessions[i]->PfkeyMessageReceived( aPfkeyMessage );
+                    break;
+                    }
+                }
+            break;                        
+            }
+        default:
+            break;
+        }        
+    }