diff -r 000000000000 -r 33413c0669b9 vpnengine/kmdserver/src/ikepluginsessionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/kmdserver/src/ikepluginsessionhandler.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,287 @@ +/* +* 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: Handler of an IKE protocol plugin session +* +*/ + + +#include + +#include "errorobserver.h" +#include "iachangeobserver.h" +#include "ikeconnectioninterface.h" +#include "ikedebug.h" +#include "ikepluginif.h" +#include "ikepluginsessionif.h" +#include "ikesocketdefs.h" +#include "internaladdress.h" + +// CLASS HEADER +#include "ikepluginsessionhandler.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CIkePluginSessionHandler* CIkePluginSessionHandler::NewLC( TUint32 aVpnIapId, + TUint32 aVpnNetId, + TUint32 aVpnInterfaceIndex, + IkeSocket::TIkeMajorVersion aIkeVersion, + IkeSocket::TIpVersion aIpVersion, + const TInetAddr& aDnsServerAddr, + CIkeConnectionInterface& aConnection, + MIkePluginIf& aIkePlugin, + MIkePluginSessionHandlerCallback& aCallback, + MIkeDebug& aDebug ) + { + CIkePluginSessionHandler* self = new (ELeave) CIkePluginSessionHandler( aVpnIapId, + aIkeVersion, + aIpVersion, + aCallback, + aDebug ); + CleanupStack::PushL( self ); + self->ConstructL( aVpnNetId, + aVpnInterfaceIndex, + aDnsServerAddr, + aConnection, + aIkePlugin ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CIkePluginSessionHandler::~CIkePluginSessionHandler() + { + Cancel(); + + delete iErrorObserver; + delete iIaChangeObserver; + delete iIkePluginSession; + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CIkePluginSessionHandler::CIkePluginSessionHandler( TUint32 aVpnIapId, + IkeSocket::TIkeMajorVersion aIkeVersion, + IkeSocket::TIpVersion aIpVersion, + MIkePluginSessionHandlerCallback& aCallback, + MIkeDebug& aDebug ) + : CActive( EPriorityStandard ), + iVpnIapId( aVpnIapId ), + iIkeVersion( aIkeVersion ), + iIpVersion( aIpVersion ), + iCallback( aCallback ), + iDebug( aDebug ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Second phase construction. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::ConstructL( TUint32 aVpnNetId, + TUint32 aVpnInterfaceIndex, + const TInetAddr& aDnsServerAddr, + CIkeConnectionInterface& aConnection, + MIkePluginIf& aIkePlugin ) + { + if ( iIkeDataInterface == NULL ) + { + iIkeDataInterface = &aConnection.OpenDataInterfaceL( iIkeVersion, + iIpVersion ); + } + + iIkePluginSession = aIkePlugin.CreateSessionL( iVpnIapId, + aVpnNetId, + aVpnInterfaceIndex, + *iIkeDataInterface ); + + iErrorObserver = CErrorObserver::NewL( *iIkePluginSession, + iCallback, + iDebug ); + + iIaChangeObserver = CIaChangeObserver::NewL( iVpnIapId, + aDnsServerAddr, + *iIkePluginSession, + iDebug ); + + DEBUG_LOG(_L("IKE plugin session created.")); + } + +// --------------------------------------------------------------------------- +// Starts negotiation with a remote host asynchronously. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::NegotiateWithHost( const CIkeData& aIkeData ) + { + __ASSERT_DEBUG( iState == EIdle, + User::Invariant() ); + iIkePluginSession->NegotiateWithHost( aIkeData, + iInternalAddress, + iStatus ); + SetActive(); + iState = ENegotiatingWithHost; + } + +// --------------------------------------------------------------------------- +// Cancels negotiation request. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::CancelNegotiateWithHost() + { + if ( iState == ENegotiatingWithHost && + IsActive() ) + { + Cancel(); + TVPNAddress empty; + iCallback.NegotiationStarted( KErrCancel, + empty ); + } + } + +// --------------------------------------------------------------------------- +// Deletes session. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::DeleteSession( TBool aSilentClose ) + { + iErrorObserver->Cancel(); + iIaChangeObserver->Cancel(); + + if ( iState == ENegotiated ) + { + // Delete session asynchronously. + iIkePluginSession->DeleteSession( aSilentClose, iStatus ); + SetActive(); + iState = EDeletingSession; + } + else if ( iState == EDeletingSession ) + { + // Session deletion is already in progress. Cancelling it deletes + // session silently. + CancelDeleteSession(); + } + else if ( iState == EIdle ) + { + // Session deletion can be requested, if negotiate request has failed. + // In this case, it is enough to complete request. + TRequestStatus* ownStatus = &iStatus; + *ownStatus = KRequestPending; + SetActive(); + + User::RequestComplete( ownStatus, KErrNone ); + } + else + { + ASSERT( EFalse ); + } + } + +// --------------------------------------------------------------------------- +// Cancels session deletion request. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::CancelDeleteSession() + { + if ( IsActive() ) + { + Cancel(); + iCallback.IkePluginSessionClosed( KErrCancel ); + } + } + +// --------------------------------------------------------------------------- +// Returns VPN IAP Id. +// --------------------------------------------------------------------------- +// +TInt CIkePluginSessionHandler::VpnIapId() const + { + return iVpnIapId; + } + +// --------------------------------------------------------------------------- +// From class CActive +// Handles completion of asynchronous request. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::RunL() + { + DEBUG_LOG2( _L("CIkePluginSessionHandler::RunL, iState=%d, iStatus=%d"), + iState, iStatus.Int() ); + + switch ( iState ) + { + case ENegotiatingWithHost: + if ( iStatus.Int() == KErrNone ) + { + iErrorObserver->StartObserving(); + iIaChangeObserver->StartObserving(); + iState = ENegotiated; + } + else + { + iState = EIdle; + } + // Ownership of internal address transferred. + iCallback.NegotiationStarted( iStatus.Int(), + iInternalAddress ); + break; + case EDeletingSession: // Fall through + case EIdle: + iState = EIdle; + iCallback.IkePluginSessionClosed( iStatus.Int() ); + break; + default: + ASSERT( EFalse ); + break; + } + } + +// --------------------------------------------------------------------------- +// From class CActive +// Handles cancellation of asynchronous request. +// --------------------------------------------------------------------------- +// +void CIkePluginSessionHandler::DoCancel() + { + DEBUG_LOG1( _L("CIkePluginSessionHandler::DoCancel, iState=%d"), + iState ); + + switch ( iState ) + { + case ENegotiatingWithHost: + iIkePluginSession->CancelNegotiateWithHost(); + iInternalAddress = TVPNAddress(); + // Session deletion is needed later, if negotiate request has + // already been completed from IKE plugin session. + iState = ENegotiated; + break; + case EDeletingSession: + iIkePluginSession->CancelDeleteSession(); + iState = EIdle; + break; + case EIdle: + break; + default: + ASSERT( EFalse ); + break; + } + }