networkcontrol/iptransportlayer/src/ipscpr.cpp
changeset 0 af10295192d8
child 19 3652a10b304a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/iptransportlayer/src/ipscpr.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,268 @@
+// Copyright (c) 2006-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:
+// IP SubConnection Provider implementation
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "ipscpr.h"
+#include "ipdeftbasescpr.h"
+#include "ipscprlog.h"
+#include "ipscprstates.h"
+#include <comms-infras/ss_log.h>
+#include "IPMessages.h"
+
+#include <comms-infras/ss_msgintercept.h>
+#include <elements/nm_signatures.h>
+#include <comms-infras/ss_nodemessages_factory.h>
+
+#if defined __FLOG_ACTIVE || defined SYMBIAN_TRACE_ENABLE
+	#define KIPSCprTag KESockSubConnectionTag
+	//_LIT8(KIPSCprSubTag, "ipscpr");
+#endif
+
+using namespace MeshMachine;
+using namespace Messages;
+using namespace ESock;
+using namespace NetStateMachine;
+
+//We reserve space for two preallocated activities that may start concurrently on the SCPR
+//node: destroy and data client stop.
+static const TUint KDefaultMaxPreallocatedActivityCount = 2;
+static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>);
+static const TUint KIPSCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize;
+
+namespace IPSCprAddressUpdate
+{
+DECLARE_DEFINE_NODEACTIVITY(IPDeftSCprBaseActivities::ECFActivityAddressUpdate, IPSCprAddressUpdate, TCFIPMessage::TDataClientRouted)
+	NODEACTIVITY_ENTRY(KNoTag, IPBaseSCprStates::TStoreAddressUpdate, IPBaseSCprStates::TAwaitingAddressUpdate, IpSCprStates::TNoTagOrDoNothingTag)
+	THROUGH_NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TCreateAddressInfoBundle, MeshMachine::TNoTag)
+	NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TSendSelfStart, CoreNetStates::TAwaitingStarted, IpSCprStates::TDoNothingTag)
+	LAST_NODEACTIVITY_ENTRY(IpSCprStates::KDoNothingTag, MeshMachine::TDoNothing)
+NODEACTIVITY_END()
+}
+
+#ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+namespace IPSCprParamsRequest
+{
+DECLARE_DEFINE_NODEACTIVITY(ECFActivityParamRequest, IPSCprSetParams, TCFScpr::TParamsRequest)
+	FIRST_NODEACTIVITY_ENTRY(SCprStates::TAwaitingParamRequest, CoreNetStates::TNoTagOrBearerPresent)
+	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TPassToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TBearerPresent)
+	LAST_NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TStoreParamsAndPostToOriginators)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, SCprStates::TStoreAndRespondWithCurrentParams)
+NODEACTIVITY_END()
+}
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+namespace IPSCprApplyRequest
+{
+DECLARE_DEFINE_NODEACTIVITY(ECFActivityApplyChanges, IpSCprApplyReq, TCFScpr::TApplyRequest)
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	FIRST_NODEACTIVITY_ENTRY(PRStates::TAwaitingApplyRequest, IpSCprStates::TNoTagOrSendApplyResponseOrErrorTag)
+	THROUGH_NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TCreateAddressInfoBundleFromJoiningClient, MeshMachine::TNoTag)
+	NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TSendSelfStart, CoreNetStates::TAwaitingStarted, MeshMachine::TNoTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, PRStates::TSendApplyResponse)
+	LAST_NODEACTIVITY_ENTRY(SCprActivities::Apply::ESendApplyResponse, PRStates::TSendApplyResponse)
+#else
+	FIRST_NODEACTIVITY_ENTRY(SCprStates::TAwaitingApplyRequest, IpSCprStates::TNoTagOrSendApplyResponseOrErrorTag)
+	THROUGH_NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TCreateAddressInfoBundleFromJoiningClient, MeshMachine::TNoTag)
+	NODEACTIVITY_ENTRY(KNoTag, IpSCprStates::TSendSelfStart, CoreNetStates::TAwaitingStarted, MeshMachine::TNoTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, SCprStates::TSendApplyResponse)
+	LAST_NODEACTIVITY_ENTRY(SCprActivities::Apply::ESendApplyResponse, SCprStates::TSendApplyResponse)
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TRaiseActivityError)
+NODEACTIVITY_END()
+}
+
+namespace IPSCprStartActivity
+{
+//TODO perhaps get this from a header file since its used in a number of places - see ss_subconn.cpp
+typedef MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse> TAwaitingApplyResponseOrError;
+
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, IPSCprStart, TCFServiceProvider::TStart, PRActivities::CStartActivity::NewL)
+    FIRST_NODEACTIVITY_ENTRY(MeshMachine::TAwaitingMessageState<TCFServiceProvider::TStart>, IpSCprStates::TNoTagOrBearerPresentBlockedByStopOrBindTo)
+	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TBindSelfToPresentBearer, CoreNetStates::TAwaitingBindToComplete, MeshMachine::TTag<CoreNetStates::KBearerPresent>)
+
+	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendNoBearer, MeshMachine::TAwaitingMessageState<TCFControlProvider::TBearer>, MeshMachine::TTag<CoreNetStates::KBearerPresent>)
+
+	//[401TODO] RZ: this tuple is the only thing that distinguishes this activity from the core although, the core should look
+	//like this one - i.e.: sending params down on start is every scpr's bussiness.
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, PRStates::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, IpSCprStates::TNoTagOrAlreadyStarted)
+#else
+	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, IpSCprStates::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, IpSCprStates::TNoTagOrAlreadyStarted)
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TStartServiceProviderRetry, CoreNetStates::TAwaitingStarted, MeshMachine::TNoTag)
+    NODEACTIVITY_ENTRY(CoreNetStates::KAlreadyStarted,CoreNetStates::TSendApplyRequest, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendStarted)
+	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TRaiseActivityError)
+NODEACTIVITY_END()
+}
+
+
+namespace IPSCprActivities
+{
+DECLARE_DEFINE_ACTIVITY_MAP(activityMap)
+    ACTIVITY_MAP_ENTRY(IPSCprAddressUpdate, IPSCprAddressUpdate)
+    ACTIVITY_MAP_ENTRY(IPSCprApplyRequest, IpSCprApplyReq)
+    ACTIVITY_MAP_ENTRY(IPSCprStartActivity, IPSCprStart)
+#ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	ACTIVITY_MAP_ENTRY(IPSCprParamsRequest, IPSCprSetParams)
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ACTIVITY_MAP_END_BASE(IPDeftBaseSCprActivities, ipdeftbasescprActivityMap)
+}
+//-=========================================================
+//
+// CIpSubConnectionProvider methods
+//
+//-=========================================================
+CIpSubConnectionProvider* CIpSubConnectionProvider::NewL(CIpSubConnectionProviderFactory& aFactory)
+/**
+Construct a new IP SubConnection Provider Object
+
+@params aFactory factory that create this object
+@param aConnProvider Connection Provider associated with this object
+*/
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::NewL")));
+	CIpSubConnectionProvider* self = new (ELeave) CIpSubConnectionProvider(aFactory);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+	return self;
+	}
+
+
+CIpSubConnectionProvider::~CIpSubConnectionProvider()
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::~CIpSubConnectionProvider [%08x]"), this));
+    LOG_NODE_DESTROY(KIPSCprTag, CIpSubConnectionProvider);
+    }
+
+
+CIpSubConnectionProvider::CIpSubConnectionProvider(ESock::CSubConnectionProviderFactoryBase& aFactory)
+:CIpSubConnectionProviderBase(aFactory, IPSCprActivities::activityMap::Self())
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::CIpSubConnectionProvider [%08x]"), this));
+    LOG_NODE_CREATE(KIPSCprTag, CIpSubConnectionProvider);
+    }
+
+void CIpSubConnectionProvider::ConstructL()
+/**
+IP SubConnection Provider Second Phase Constructor
+*/
+	{
+    CIpSubConnectionProviderBase::ConstructL(KIPSCPRPreallocatedActivityBufferSize);
+	}
+
+RNodeInterface* CIpSubConnectionProvider::NewClientInterfaceL(const TClientType& aClientType, TAny* /*aClientInfo*/)
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::NewClientInterfaceL [%08x]"), this));
+
+    if (aClientType.Type() & TCFClientType::EData)
+        {
+        return new (ELeave) RIPDataClientNodeInterface();
+        }
+
+    return CCoreSubConnectionProvider::NewClientInterfaceL(aClientType);
+    }
+
+
+void CIpSubConnectionProvider::Received(TNodeContextBase& aContext)
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::Received [%08x]"), this));
+
+    Messages::TNodeSignal::TMessageId noPeerIds[] = {
+        TCFFactory::TPeerFoundOrCreated::Id(),
+        TCFPeer::TJoinRequest::Id(),
+        Messages::TNodeSignal::TMessageId()
+        };
+
+    MeshMachine::AMMNodeBase::Received(noPeerIds, aContext);
+	MeshMachine::AMMNodeBase::PostReceived(aContext);
+	}
+
+void CIpSubConnectionProvider::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::ReceivedL [%08x]"), this));
+	ESOCK_DEBUG_MESSAGE_INTERCEPT(aSender, aMessage, aRecipient);
+	IpSCprStates::TContext ctx(*this, aMessage, aSender, aRecipient);
+    CIpSubConnectionProvider::Received(ctx);
+    User::LeaveIfError(ctx.iReturn);
+	}
+
+TInt CIpSubConnectionProvider::AddressCompletionValidation(RIPDataClientNodeInterface& aDataClient)
+/**
+Helper function to check for presence of source  and destionation address in DataClient Node Interface
+
+@param aDataClient Data Client
+*/
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("CIpSubConnectionProvider::AddressCompletionValidation [%08x]"), this));
+
+	TUint addrFamily = aDataClient.iCliSrcAddr.Family();
+
+	if( addrFamily != KAfInet6 && addrFamily != KAfInet)
+		{
+		__IPCPRLOG(IpCprLog::Printf(_L("Source Address not defined")));
+		return KErrNotReady;
+		}
+
+	addrFamily = aDataClient.iCliSrcAddr.Family();
+	if( addrFamily != KAfInet6 && addrFamily != KAfInet)
+		{
+		__IPCPRLOG(IpCprLog::Printf(_L("Destination Address not defined")));
+		return KErrNotReady;
+		}
+
+	return KErrNone;
+	}
+
+CSubConIPAddressInfoParamSet* CIpSubConnectionProvider::InitBundleL()
+/**
+Helper function to initialize param bundle
+*/
+	{
+	CSubConIPAddressInfoParamSet* retValue(NULL);
+
+	// create family
+	RCFParameterFamilyBundleC& bundle = GetOrCreateParameterBundleL();
+	RParameterFamily family=bundle.FindFamily(KSubConIPAddressInfoFamily);
+	if ( family.IsNull() ) 
+		{
+		__IPCPRLOG(IpCprLog::Printf(_L("SubConIPAddressInfoFamily is created")));
+		//family = bundle.CreateFamilyL(KSubConIPAddressInfoFamily); //PJLEFT
+		RCFParameterFamilyBundle newBundle;
+		newBundle.CreateL();
+		newBundle.Open(iParameterBundle);
+		family = newBundle.CreateFamilyL(KSubConIPAddressInfoFamily);
+		retValue = CSubConIPAddressInfoParamSet::NewL(family, RParameterFamily::ERequested);
+		newBundle.Close();
+		}
+	else
+		{
+		// get param set
+		STypeId typeId = STypeId::CreateSTypeId( CSubConIPAddressInfoParamSet::EUid,
+						CSubConIPAddressInfoParamSet::ETypeId );
+		retValue = static_cast<CSubConIPAddressInfoParamSet*>
+			(family.FindParameterSet(typeId,RParameterFamily::ERequested));
+		}
+
+	return retValue;
+	}