diff -r 000000000000 -r 33413c0669b9 vpnengine/kmdserver/src/kmdserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/kmdserver/src/kmdserver.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2008-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: KMD server +* +*/ + + +// INTERNAL INCLUDES +#include "ikedebug.h" +#include "ikeplugindefs.h" +#include "ikepluginhandler.h" +#include "kmddebuglogger.h" +#include "kmdeventlogger.h" +#include "kmdsession.h" +#include "secpolreader.h" +#include "vpnconnection.h" + +// CLASS HEADER +#include "kmdserver.h" + +const TUint CKmdServer::iKmdServerRangeCount = 2; + +const TInt CKmdServer::iKmdServerRanges[iKmdServerRangeCount] = + { + CKmdServer::KKmdStartConnection, + CKmdServer::KKmdCancelResolveAddress+1 + }; + +const TUint8 CKmdServer::iKmdServerElementIndex[iKmdServerRangeCount] = + { + 0, + CPolicyServer::ENotSupported + }; + +const CPolicyServer::TPolicyElement CKmdServer::iKmdServerElements[] = + { + {_INIT_SECURITY_POLICY_C1(ECapabilityNetworkControl), + CPolicyServer::EFailClient}, + }; + +const CPolicyServer::TPolicy CKmdServer::iKmdServerPolicy = + { + 0, // All connect attempts are checked + iKmdServerRangeCount, // Count of ranges + iKmdServerRanges, // 0-6, 7... + iKmdServerElementIndex, // Only range 0-6 are checked + iKmdServerElements // The list of policy elements + }; + +const TInt KIkeV1PluginHandlerIndex( 0 ); +const TInt KIkeV2PluginHandlerIndex( 1 ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CKmdServer* CKmdServer::NewL() + { + CKmdServer* self = new ( ELeave ) CKmdServer; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CKmdServer::~CKmdServer() + { + iIpsecPolicyServ.Close(); + iVpnConnections.ResetAndDestroy(); + iVpnConnections.Close(); + delete iIkePluginHandlers[0]; + delete iIkePluginHandlers[1]; + delete iSecpolReader; + delete iEventLogger; + +#ifdef _DEBUG + if ( iDebugLogger != NULL ) + { + iDebugLogger->LogWrite(_L("KMD server stopped.")); + } +#endif + delete iDebugLogger; + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CKmdServer::CKmdServer() : + CPolicyServer( EPriorityStandard, iKmdServerPolicy ) + { + } + +// --------------------------------------------------------------------------- +// Second phase construction. +// --------------------------------------------------------------------------- +// +void CKmdServer::ConstructL() + { + iDebugLogger = CKmdDebugLogger::NewL(); + +#ifdef _DEBUG + iDebugLogger->LogWrite(_L("------------------------------------------------------")); + iDebugLogger->LogWrite(_L("Starting KMD server.")); + iDebugLogger->LogWrite(_L("------------------------------------------------------")); +#endif + + User::LeaveIfError( iIpsecPolicyServ.Connect() ); + iEventLogger = CKmdEventLogger::NewL( *iDebugLogger ); + iSecpolReader = CSecpolReader::NewL( *iEventLogger, + *iDebugLogger ); + iIkePluginHandlers[KIkeV1PluginHandlerIndex] = CIkePluginHandler::NewL( KIkeV1, + *iEventLogger, + *iDebugLogger ); + iIkePluginHandlers[KIkeV2PluginHandlerIndex] = CIkePluginHandler::NewL( KIkeV2, + *iEventLogger, + *iDebugLogger ); + + StartL( KKmdServerName ); + +#ifdef _DEBUG + iDebugLogger->LogWrite(_L("KMD server started.")); +#endif + } + +// --------------------------------------------------------------------------- +// Information that KMD session has been closed. +// --------------------------------------------------------------------------- +// +void CKmdServer::KmdSessionClosed() + { + iSessionCount--; + __ASSERT_DEBUG(iSessionCount >= 0, User::Invariant()); + + StopKmdServer(); + } + +// --------------------------------------------------------------------------- +// Creates VPN connection object. +// --------------------------------------------------------------------------- +// +CVpnConnection& CKmdServer::CreateVpnConnectionL(TUint32 aVpnIapId) + { +#ifndef _DEBUG + for ( TInt i = 0; i < iVpnConnections.Count(); ++i ) + { + __ASSERT_DEBUG( iVpnConnections[i]->VpnIapId() != aVpnIapId, User::Invariant() ); + } +#endif //_DEBUG + + CVpnConnection* newConnection = CVpnConnection::NewLC( aVpnIapId, + *this, + *iDebugLogger ); + User::LeaveIfError( iVpnConnections.Append( newConnection ) ); + CleanupStack::Pop( newConnection ); + + return *newConnection; + } + +// --------------------------------------------------------------------------- +// Gets VPN connection object. +// --------------------------------------------------------------------------- +// +CVpnConnection& CKmdServer::GetVpnConnectionL( TUint32 aVpnIapId ) + { + CVpnConnection* connection = NULL; + for ( TInt i = 0; i < iVpnConnections.Count(); ++i ) + { + CVpnConnection* c = iVpnConnections[i]; + if ( c->VpnIapId() == aVpnIapId ) + { + connection = c; + break; + } + } + + if ( connection == NULL ) + { + User::Leave( KErrNotFound ); + } + return *connection; + } + +// --------------------------------------------------------------------------- +// Deletes VPN connection object. +// --------------------------------------------------------------------------- +// +void CKmdServer::DeleteVpnConnection( TUint32 aVpnIapId ) + { + TInt connectionCount = iVpnConnections.Count(); + for ( TInt i = 0; i < connectionCount; ++i ) + { + CVpnConnection* c = iVpnConnections[i]; + if ( c->VpnIapId() == aVpnIapId ) + { + iVpnConnections.Remove( i ); + delete c; + break; + } + } + + StopKmdServer(); + } + +// --------------------------------------------------------------------------- +// Creates IKE plugin session. +// --------------------------------------------------------------------------- +// +CIkePluginSessionHandler& CKmdServer::CreateIkePluginSessionL( TInt aIkeVersion, + IkeSocket::TIpVersion aIpVersion, + CIkeConnectionInterface& aConnection, + TUint32 aVpnIapId, + TUint32 aVpnNetId, + TUint32 aVpnInterfaceIndex, + const TInetAddr& aDnsServerAddr, + MIkePluginSessionHandlerCallback& aCallback ) + { + TInt index( 0 ); + switch ( aIkeVersion ) + { + case KIkeV1: + { + index = KIkeV1PluginHandlerIndex; + break; + } + case KIkeV2: + { + index = KIkeV2PluginHandlerIndex; + break; + } + default: + { + ASSERT( EFalse ); + } + } + return iIkePluginHandlers[index]->CreateIkePluginSessionL( aVpnIapId, + aVpnNetId, + aVpnInterfaceIndex, + aIpVersion, + aDnsServerAddr, + aConnection, + aCallback ); + } + +// --------------------------------------------------------------------------- +// Deletes IKE plugin session. +// --------------------------------------------------------------------------- +// +void CKmdServer::DeleteIkePluginSession( TInt aIkeVersion, + TUint32 aVpnIapId ) + { + TInt index( 0 ); + switch ( aIkeVersion ) + { + case KIkeV1: + { + index = KIkeV1PluginHandlerIndex; + break; + } + case KIkeV2: + { + index = KIkeV2PluginHandlerIndex; + break; + } + default: + { + ASSERT( EFalse ); + break; + } + } + iIkePluginHandlers[index]->DeleteIkePluginSession( aVpnIapId ); + } + +// --------------------------------------------------------------------------- +// Returns debug trace interface. +// --------------------------------------------------------------------------- +// +MIkeDebug& CKmdServer::Debug() + { + __ASSERT_DEBUG( iDebugLogger != NULL, + User::Invariant() ); + + return *iDebugLogger; + } + +// --------------------------------------------------------------------------- +// Creates a server-side session object. +// --------------------------------------------------------------------------- +// +CSession2* CKmdServer::NewSessionL( const TVersion& /*aVersion*/, + const RMessage2& /*aMessage*/) const + { + CKmdSession* session = CKmdSession::NewL( *const_cast( this ), + *iDebugLogger ); + iSessionCount++; + return session; + } + +// --------------------------------------------------------------------------- +// Stops KMD server if there exist neither client sessions nor active +// connections. +// --------------------------------------------------------------------------- +// +void CKmdServer::StopKmdServer() + { + if ( iSessionCount == 0 && + iVpnConnections.Count() == 0 ) + { + // Stop scheduluder that was started by RunServerL(). + CActiveScheduler::Stop(); + } + }