diff -r 000000000000 -r 33413c0669b9 vpnengine/ikev2lib/src/ikev2plugin.cpp --- /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 +#include + +#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; + } + }