vpnengine/kmdserver/src/kmdserver.cpp
changeset 0 33413c0669b9
--- /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<CKmdServer*>( 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();        
+        }
+    }