networkcontrol/ipnetworklayer/src/ipprotodeftscprstates.cpp
changeset 0 af10295192d8
child 5 1422c6cd3f0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/ipnetworklayer/src/ipprotodeftscprstates.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,476 @@
+// 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:
+// IPProto SubConnection Provider states/transitions
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <comms-infras/netcfgextprov.h>
+#include <networking/qos3gpp_subconparams.h>
+#include <cs_subconparams.h>
+#include <cs_subconevents.h>
+#include <comms-infras/corescpractivities.h>
+#include <comms-infras/linkmessages.h>		// for TLinkMessage
+#include "ipprotodeftscpr.h"
+#include "ipprotodeftscprstates.h"
+#include "ItfInfoConfigExt.h"
+#include <comms-infras/es_config.h>
+#include <es_panic.h>
+#include <comms-infras/ss_datamonitoringprovider.h>
+#include <comms-infras/ss_log.h>
+
+using namespace Messages;
+using namespace MeshMachine;
+using namespace ESock;
+using namespace NetStateMachine;
+using namespace IPProtoDeftSCpr;
+
+
+DEFINE_SMELEMENT(TStoreProvision, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TStoreProvision::DoL()
+	{
+	PRStates::TStoreProvision storeProvision(iContext);
+	storeProvision.DoL();			// set up iContext.Node().iProvisionConfig
+
+    // Allocate and add the data monitoring shared memory pointers the provisioning info
+	CIPProtoDeftSubConnectionProvider& node = iContext.Node();
+	TDataMonitoringSubConnProvisioningInfo* subConnProvisioningInfo = const_cast<TDataMonitoringSubConnProvisioningInfo*>(static_cast<const TDataMonitoringSubConnProvisioningInfo*>(node.AccessPointConfig().FindExtension(STypeId::CreateSTypeId(TDataMonitoringSubConnProvisioningInfo::iUid, TDataMonitoringSubConnProvisioningInfo::iId))));
+	ASSERT(subConnProvisioningInfo);
+
+#ifdef _DEBUG
+	_LIT8(KNote, "Note");
+	if (subConnProvisioningInfo->iDataVolumesPtr || subConnProvisioningInfo->iThresholdsPtr)
+		{
+		__CFLOG_VAR((KIPProtoDeftScprTag, KNote, _L8("IPProtoDeftSCpr %x:\tNOTE: data monitoring subconnection structure re-assigned"), &node));
+		}
+#endif
+	
+	// In the situation where there is an existing IPProtoSCPr in the ELeaving state (which has been
+	// stopped and has had a TDestroy sent to it) we can safely re-assign the pointers in the (shared)
+	// data monitoring subconnection structure from pointing to that IPProtoSCPr instance to this one.
+	// This is because the IP Shim Flow corresponding to that IPProtoSCPr should not be performing any
+	// data transfer, after having unbound from its lower flow and closed its binders in response to a
+	// TDataClientStop.  The structure itself is allocated in the CPR.
+
+	::new (subConnProvisioningInfo) TDataMonitoringSubConnProvisioningInfo(&node.iDataVolumes, &node.iThresholds);
+	}
+
+//-=========================================================
+// Data monitoring support
+//-=========================================================
+DEFINE_SMELEMENT(TAwaitingDataMonitoringNotification, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingDataMonitoringNotification::Accept()
+	{
+	return iContext.iMessage.IsMessage<TCFDataMonitoringNotification::TDataMonitoringNotification>();
+	}
+
+DEFINE_SMELEMENT(TProcessDataMonitoringNotification, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TProcessDataMonitoringNotification::DoL()
+	{
+	TCFDataMonitoringNotification::TDataMonitoringNotification& msg =
+		message_cast<TCFDataMonitoringNotification::TDataMonitoringNotification>(iContext.iMessage);
+
+	iContext.Node().DataNotificationL(msg);
+	}
+
+// NetCfgExtension Support
+//-=========================================================
+DEFINE_SMELEMENT(TAwaitingStateChangeOrCancel, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingStateChangeOrCancel::Accept()
+	{
+	return (iContext.iMessage.IsMessage<TCFMessage::TStateChange>() || iContext.iMessage.IsMessage<TEBase::TCancel>());
+	}
+
+DEFINE_SMELEMENT(TAwaitingStateChange, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingStateChange::Accept()
+    {
+    return (iContext.iMessage.IsMessage<TCFMessage::TStateChange>());
+    }
+
+DEFINE_SMELEMENT(TAwaitingConfigureNetwork, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingConfigureNetwork::Accept()
+	{
+	return iContext.iMessage.IsMessage<TCFIPProtoMessage::TConfigureNetwork>();
+	}
+
+DEFINE_SMELEMENT(TAwaitingNetworkConfiguredOrError, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingNetworkConfiguredOrError::Accept()
+	{
+	return (iContext.iMessage.IsMessage<TCFIPProtoMessage::TNetworkConfigured>()
+			||  iContext.iMessage.IsMessage<TEBase::TError>());
+	}
+
+DEFINE_SMELEMENT(TNoTagOrSwallowMessage, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNoTagOrSwallowMessage::TransitionTag()
+	{
+	const RMetaExtensionContainerC& mec = iContext.Node().AccessPointConfig();
+	const CNetCfgExtProvision* provision = static_cast<const CNetCfgExtProvision*>(mec.FindExtension(
+	        STypeId::CreateSTypeId(CNetCfgExtProvision::EUid, CNetCfgExtProvision::ETypeId)));
+	TCFMessage::TStateChange& msg = message_cast<TCFMessage::TStateChange>(iContext.iMessage);
+
+	if (provision && KLinkLayerOpen == msg.iStateChange.iStage)
+		{
+		return KSwallowMessage;
+		}
+	else
+		{
+		return KNoTag;
+		}
+	}
+
+DEFINE_SMELEMENT(TStopNetCfgExtOrNoTag, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TStopNetCfgExtOrNoTag::TransitionTag()
+	{
+	if (iContext.Node().iControl)
+		return KStopNetCfgExt;
+
+	return KNoTag;
+	}
+
+DEFINE_SMELEMENT(TNetworkConfiguredOrErrorTagOrCancelTagOrNoTag, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNetworkConfiguredOrErrorTagOrCancelTagOrNoTag::TransitionTag()
+	{
+	if (iContext.iMessage.IsMessage<TEBase::TCancel>())
+		{
+		iContext.iNodeActivity->SetError(KErrCancel);
+		return KCancelTag;
+		}
+					
+	TCFMessage::TStateChange& msg = message_cast<TCFMessage::TStateChange>(iContext.iMessage);
+
+	if (msg.iStateChange.iError != KErrNone)
+		{
+		iContext.iNodeActivity->SetError(msg.iStateChange.iError);
+		return KErrorTag;
+		}
+
+	if (msg.iStateChange.iStage == KLinkLayerOpen)
+		{
+		return KNetworkConfigured;
+		}
+
+	return KNoTag;
+	}
+
+DEFINE_SMELEMENT(TNetworkConfiguredOrErrorTagOrCancelTagOrNoTagBackward, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNetworkConfiguredOrErrorTagOrCancelTagOrNoTagBackward::TransitionTag()
+	{
+	TInt tag = IPProtoDeftSCpr::TNetworkConfiguredOrErrorTagOrCancelTagOrNoTag::TransitionTag();
+	if (tag == KNoTag)
+		return tag | NetStateMachine::EBackward;
+	return tag;
+	}
+
+DEFINE_SMELEMENT(TErrorTagOrNoTag, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TErrorTagOrNoTag::TransitionTag()
+	{
+	TEBase::TError *error = message_cast<TEBase::TError>(&iContext.iMessage);
+	if (error)
+		{
+		iContext.iNodeActivity->SetError(error->iValue);
+
+		return KErrorTag;
+		}
+	TCFIPProtoMessage::TNetworkConfigured* msg = message_cast<TCFIPProtoMessage::TNetworkConfigured>(&iContext.iMessage);
+
+	if (msg->iValue != KErrNone)
+		{
+		iContext.iNodeActivity->SetError(msg->iValue);
+
+		return KErrorTag;
+		}
+	return KNoTag;
+	}
+
+DEFINE_SMELEMENT(TNoTagOrConfigureNetwork, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNoTagOrConfigureNetwork::TransitionTag()
+	{
+	const RMetaExtensionContainerC& mec = iContext.Node().AccessPointConfig();
+	const CNetCfgExtProvision* provision = static_cast<const CNetCfgExtProvision*>(mec.FindExtension(
+	        STypeId::CreateSTypeId(CNetCfgExtProvision::EUid, CNetCfgExtProvision::ETypeId)));
+
+	if (provision)
+		{
+		return KConfigureNetwork;
+		}
+	else
+		{
+		return KNoTag;
+		}
+	}
+
+DEFINE_SMELEMENT(TNoTagOrProviderStoppedOrDaemonReleased, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNoTagOrProviderStoppedOrDaemonReleased::TransitionTag()
+    {
+    iContext.iNodeActivity->SetError(message_cast<TCFDataClient::TStop>(iContext.iMessage).iValue);
+    if (iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EStarted)) != NULL)
+        {
+        // At least one data client started 
+        if(iContext.Node().iControl)
+            {
+            return MeshMachine::KNoTag;
+            }
+        else
+            {
+            return KDaemonReleased;
+            }
+        }
+    return CoreNetStates::KProviderStopped;
+    }
+
+DEFINE_SMELEMENT(TDaemonReleasedStateChangedOrNoTagBackward, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TDaemonReleasedStateChangedOrNoTagBackward::TransitionTag()
+    {
+    TInt tag = IPProtoDeftSCpr::TDaemonReleasedStateChangedOrNoTag::TransitionTag();
+    if (tag == KNoTag)
+        return tag | NetStateMachine::EBackward;
+    return tag;
+    }
+
+DEFINE_SMELEMENT(TDaemonReleasedStateChangedOrNoTag, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TDaemonReleasedStateChangedOrNoTag::TransitionTag()
+    {
+    TCFMessage::TStateChange& msg = message_cast<TCFMessage::TStateChange>(iContext.iMessage);
+ 
+    if (msg.iStateChange.iStage == KConfigDaemonFinishedDeregistrationStop)
+        {
+        return KDaemonReleasedStateChanged;
+        }
+    return KNoTag;
+    }
+
+DEFINE_SMELEMENT(TConfigureNetwork, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TConfigureNetwork::DoL()
+	{
+	iContext.iNodeActivity->PostRequestTo(iContext.NodeId(), TCFIPProtoMessage::TConfigureNetwork().CRef());
+	}
+
+DEFINE_SMELEMENT(TSendNetworkConfigured, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TSendNetworkConfigured::DoL()
+	{
+	TCFIPProtoMessage::TNetworkConfigured resp(iContext.iNodeActivity->Error());
+	iContext.iNodeActivity->SetError(KErrNone);
+	iContext.iNodeActivity->PostToOriginators(resp);
+	}
+
+DEFINE_SMELEMENT(TStartNetCfgExt, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TStartNetCfgExt::DoL()
+	{
+	ASSERT(!iContext.Node().iNotify);
+	ASSERT(!iContext.Node().iControl);
+
+	iContext.Node().iNotify = CNetCfgExtNotify::NewL(&iContext.Node());
+	iContext.Node().iControl = CNifConfigurationControl::NewL(*iContext.Node().iNotify);
+	iContext.Node().iControl->ConfigureNetworkL();
+	}
+
+
+DEFINE_SMELEMENT(TStopNetCfgExt, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TStopNetCfgExt::DoL()
+	{
+	if(!iContext.Node().iControl) return;
+
+	iContext.Node().iControl->Deregister(EConfigDaemonDeregisterCauseStop);
+	}
+
+DEFINE_SMELEMENT(TStopNetCfgExtDelete, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TStopNetCfgExtDelete::DoL()
+    {
+    if(!iContext.Node().iControl)
+        {
+        return;
+        }
+    iContext.Node().iControl->AsyncDelete();
+    iContext.Node().iControl = NULL;
+ 
+    delete iContext.Node().iNotify;
+    iContext.Node().iNotify = NULL;
+    }
+
+DEFINE_SMELEMENT(TResetSentTo, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TResetSentTo::DoL()
+	{
+	iContext.iNodeActivity->ClearPostedTo();
+	}
+
+//-=========================================================
+// Ioctl Support
+//-=========================================================
+DEFINE_SMELEMENT(TAwaitingIoctlProcessed, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingIoctlProcessed::Accept()
+	{
+	return iContext.iMessage.IsMessage<TCFLegacyMessage::TLegacyRMessage2Processed>();
+	}
+
+void IPProtoDeftSCpr::TAwaitingIoctlProcessed::Cancel()
+	{
+	CIPProtoDeftSubConnectionProvider* node = static_cast<CIPProtoDeftSubConnectionProvider*>(&iContext.Node());
+	if (node->iControl)
+		{
+		node->iControl->CancelControl();
+		}
+
+	iContext.Activity()->SetError(KErrCancel);
+	}
+
+DEFINE_SMELEMENT(TNoTagOrTryNetCfgExt, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TNoTagOrTryNetCfgExt::TransitionTag()
+	{
+	TCFLegacyMessage::TLegacyRMessage2Processed& msg = message_cast<TCFLegacyMessage::TLegacyRMessage2Processed>(iContext.iMessage);
+	
+	if ((msg.iResponse.iType == ESock::TLegacyRMessage2Response::ENormal && msg.iResponse.iCode == KErrNone)
+		|| msg.iResponse.iType == ESock::TLegacyRMessage2Response::EPanic)
+		{
+		return KNoTag;
+		}
+	else
+		{
+		return KTryNetCfgExt;
+		}
+	}
+
+DEFINE_SMELEMENT(TTryServiceProviderOrTryNetCfgExt, NetStateMachine::MStateFork, IPProtoDeftSCpr::TContext)
+TInt IPProtoDeftSCpr::TTryServiceProviderOrTryNetCfgExt::TransitionTag()
+	{
+	MeshMachine::CNodeParallelMessageStoreActivityBase* act = static_cast<MeshMachine::CNodeParallelMessageStoreActivityBase*>(iContext.Activity());
+
+	ASSERT(act->Message().IsTypeOf(Meta::STypeId::CreateSTypeId(TCFSigLegacyRMessage2Ext::EUid, TCFSigLegacyRMessage2Ext::ETypeId)));
+	if ((static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage.Int0() == KCOLConfiguration
+			&& static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage.Int1() == KConnGetSipServerAddr))
+		{
+		return KTryServiceProvider;
+		}
+	else
+		{
+		return KTryNetCfgExt;
+		}
+	}
+
+DEFINE_SMELEMENT(TForwardToServiceProvider, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TForwardToServiceProvider::DoL()
+	{
+	ASSERT(iContext.iMessage.IsTypeOf(Meta::STypeId::CreateSTypeId(TCFSigLegacyRMessage2Ext::EUid, TCFSigLegacyRMessage2Ext::ETypeId)));
+	
+	MeshMachine::CNodeParallelMessageStoreActivityBase* act = static_cast<MeshMachine::CNodeParallelMessageStoreActivityBase*>(iContext.Activity());
+
+	TCFSigLegacyRMessage2Ext::RReadOnlyRMessage& ioctl(static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage);
+	RLegacyResponseMsg r(iContext, static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage, static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage.Int0());
+			
+	// currently only supporting configuration ioctls
+	if (ioctl.Int0() == KCOLConfiguration && ioctl.Int1() == KConnGetSipServerAddr)
+		{
+		TSipServerAddrBuf sipAddr;
+		if (ioctl.GetDesLengthL(2) != sipAddr.Length())
+			{
+			r.Panic(KESockClientPanic, EBadDescriptor);
+			act->ClearPostedTo();
+			return; // the sip address handlers will complete the message
+			}
+		}
+		
+	RNodeInterface* dc = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider));
+	
+	iContext.Activity()->PostRequestTo(*dc, iContext.iMessage);
+	}
+
+DEFINE_SMELEMENT(THandoffToNetCfgExt, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::THandoffToNetCfgExt::DoL()
+	{
+	ASSERT(iContext.Activity());
+	MeshMachine::CNodeParallelMessageStoreActivityBase* act = static_cast<MeshMachine::CNodeParallelMessageStoreActivityBase*>(iContext.Activity());
+
+	TCFSigLegacyRMessage2Ext::RReadOnlyRMessage& ioctl(static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage);
+	RLegacyResponseMsg r(iContext, static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage, static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage.Int0());
+
+	if (ioctl.Int0() == KCOLConfiguration && ioctl.Int1() == KConnGetSipServerAddr)
+		{
+		TCFSigLegacyRMessage2Ext::RReadOnlyRMessage& ioctl(static_cast<TCFSigLegacyRMessage2Ext&>(act->Message()).iMessage);
+		TSipServerAddrBuf sipAddr;
+		if (ioctl.GetDesLengthL(2) != sipAddr.Length())
+			{
+			r.Panic(KESockClientPanic, EBadDescriptor);
+			act->ClearPostedTo();
+			return; // the sip address handlers will complete the message
+			}
+		}
+		
+	if ((ioctl.Int0() == KCOLConfiguration && ioctl.Int1() == KConnGetSipServerAddr))
+		{
+		TSipServerAddrBuf sipBuf;
+		ioctl.ReadL( 2, sipBuf );
+
+		if( sipBuf().index != 0 )
+			{
+			r.Complete(KErrNotFound);
+			act->ClearPostedTo();
+			return;
+			}
+		}
+		
+	// IPProto returns KErrNotSupported if DHCP is not configured for the IAP
+	// so we want to make sure DHCP fallback is only ever tried once for index
+	// zero.  Otherwise, the last address index that the caller tries may return
+	// KErrNotSupported instead of the expected KErrNotFound.
+	if (iContext.Node().iControl)
+		{
+		iContext.Node().iControl->SendIoctlMessageL(r);
+		act->ClearPostedTo();
+		}
+	else
+		{
+		const RMetaExtensionContainerC& mec = iContext.Node().AccessPointConfig();
+		const CNetCfgExtProvision* provision = static_cast<const CNetCfgExtProvision*>(mec.FindExtension(
+				STypeId::CreateSTypeId(CNetCfgExtProvision::EUid, CNetCfgExtProvision::ETypeId)));
+
+		if (provision)
+			{
+			r.Complete(KErrNotReady);
+			act->ClearPostedTo();
+			}
+		else
+			{
+			r.Complete(KErrNotSupported);
+			act->ClearPostedTo();
+			}
+		}
+	}
+
+//
+// support for AgentEventNotification
+//
+DEFINE_SMELEMENT(TAwaitingAgentEventNotification, NetStateMachine::MState, IPProtoDeftSCpr::TContext)
+TBool IPProtoDeftSCpr::TAwaitingAgentEventNotification::Accept()
+	{
+	return iContext.iMessage.IsMessage<TLinkMessage::TAgentEventNotification>();
+	}
+
+DEFINE_SMELEMENT(TProcessAgentEvent, NetStateMachine::MStateTransition, IPProtoDeftSCpr::TContext)
+void IPProtoDeftSCpr::TProcessAgentEvent::DoL()
+	{
+	if (iContext.Node().iControl)
+		{
+		// AgentEventNotification originates from the AgentSCPr as a result of an AgentEvent()
+		// call from the Agent.  Although the message is generic, it was primarily created to pass the
+		// event ECurrentNetworkChangeEvent from the Agent towards the NetCfgExt for CDMA2000 support.
+		// The "aEventData" and "aSource" fields of the EventNotification() call are not used for this
+		// event, and hence are passed as null values.
+		TLinkMessage::TAgentEventNotification& msg = message_cast<TLinkMessage::TAgentEventNotification>(iContext.iMessage);
+		iContext.Node().iControl->EventNotification(TNetworkAdaptorEventType(msg.iValue1), msg.iValue2, KNullDesC8, NULL);
+		}
+	}
+