networkcontrol/ipnetworklayer/src/IPProtoCprStates.cpp
branchRCL_3
changeset 22 8d540f55e491
parent 21 abbed5a4b42a
equal deleted inserted replaced
21:abbed5a4b42a 22:8d540f55e491
    36 #include <comms-infras/ss_legacyinterfaces.h>
    36 #include <comms-infras/ss_legacyinterfaces.h>
    37 #include <comms-infras/simpleselectorbase.h>
    37 #include <comms-infras/simpleselectorbase.h>
    38 #include <commsdattypesv1_1_partner.h>
    38 #include <commsdattypesv1_1_partner.h>
    39 #include <es_prot_internal.h>
    39 #include <es_prot_internal.h>
    40 #include <elements/nm_messages_errorrecovery.h>
    40 #include <elements/nm_messages_errorrecovery.h>
       
    41 #include <es_enum_internal.h>
       
    42 #include "ItfInfoConfigExt.h"
    41 
    43 
    42 using namespace Messages;
    44 using namespace Messages;
    43 using namespace MeshMachine;
    45 using namespace MeshMachine;
    44 using namespace IpProtoCpr;
    46 using namespace IpProtoCpr;
    45 using namespace ESock;
    47 using namespace ESock;
   151 	// are not waiting for TStopped and in certain situations it would arrive after the node has been
   153 	// are not waiting for TStopped and in certain situations it would arrive after the node has been
   152 	// destroyed
   154 	// destroyed
   153 	if (iContext.Node().iTimerStopped)
   155 	if (iContext.Node().iTimerStopped)
   154 		{
   156 		{
   155 		TInt selfidx = iContext.iNodeActivity->FindOriginator(iContext.Node().SelfInterface());
   157 		TInt selfidx = iContext.iNodeActivity->FindOriginator(iContext.Node().SelfInterface());
   156 		ASSERT(selfidx != KErrNotFound);
   158 		if(selfidx != KErrNotFound)
   157 		iContext.iNodeActivity->RemoveOriginator(selfidx);
   159 			{
       
   160 			iContext.iNodeActivity->RemoveOriginator(selfidx);
       
   161 			}				
   158 		}
   162 		}
   159 		
   163 		
   160 	TInt stopCode = KErrCancel;
   164 	TInt stopCode = KErrCancel;
   161     MeshMachine::CNodeActivityBase* activity = iContext.iNodeActivity;
   165     MeshMachine::CNodeActivityBase* activity = iContext.iNodeActivity;
   162     
   166     
   281 	{
   285 	{
   282 	CoreNetStates::TAwaitingStart state(iContext);
   286 	CoreNetStates::TAwaitingStart state(iContext);
   283 	if (state.Accept())
   287 	if (state.Accept())
   284 		{
   288 		{
   285 		iContext.Node().DisableTimers();
   289 		iContext.Node().DisableTimers();
       
   290 		// Check if we have been re-started (i.e. a start request is processed immmediately after a stop request
       
   291 		// has been processed).  If so, we generate a special EInterfaceStarting notification towards ESock.
       
   292 		// This is to solve the problem where there is a missing EInterfaceDown/EInterfaceUp event sequence
       
   293 		// from AllInterfaceNotification in this scenario. 
       
   294 		if (iContext.Node().iStopped)
       
   295 		    {
       
   296             const TItfInfoConfigExt* ext = static_cast<const TItfInfoConfigExt*>(iContext.Node().AccessPointConfig().FindExtension(STypeId::CreateSTypeId(KIpProtoConfigExtUid, EItfInfoConfigExt)));
       
   297             if (ext)
       
   298                 {
       
   299                 TInterfaceNotification info = { ext->iConnectionInfo, TConnInterfaceState(EInterfaceRestarting) };
       
   300                 iContext.Node().Factory().InterfaceStateChange(TPckgC<TInterfaceNotification>(info));
       
   301                 }
       
   302 		    }
   286 		return ETrue;
   303 		return ETrue;
   287 		}
   304 		}
   288 	return EFalse;
   305 	return EFalse;
   289 	}
   306 	}
   290 
   307 
   377 	iContext.Node().EnableTimers();
   394 	iContext.Node().EnableTimers();
   378 	iContext.Node().SetUsageProfile(KConnProfileMedium);
   395 	iContext.Node().SetUsageProfile(KConnProfileMedium);
   379 	iContext.Node().SetTimerMode(CIPProtoConnectionProvider::ETimerMedium);
   396 	iContext.Node().SetTimerMode(CIPProtoConnectionProvider::ETimerMedium);
   380 
   397 
   381     iContext.Node().iTimerStopped = EFalse;
   398     iContext.Node().iTimerStopped = EFalse;
       
   399     iContext.Node().iTimerExpired = EFalse;
   382 	CoreNetStates::TSendStarted transition(iContext);
   400 	CoreNetStates::TSendStarted transition(iContext);
   383 	transition.DoL();
   401 	transition.DoL();
   384 	}
   402 	}
   385 
   403 
   386 DEFINE_SMELEMENT(IpProtoCpr::TProcessDataClientStatusChange, NetStateMachine::MStateTransition, IpProtoCpr::TContext)
   404 DEFINE_SMELEMENT(IpProtoCpr::TProcessDataClientStatusChange, NetStateMachine::MStateTransition, IpProtoCpr::TContext)
   407     	ASSERT(dmProvider); // Must always support this interface
   425     	ASSERT(dmProvider); // Must always support this interface
   408 
   426 
   409     	TCFMessage::TSubConnDataTransferred wholeConnMsg(KNifEMCompatibilityLayerEntireSubConnectionUid, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes);
   427     	TCFMessage::TSubConnDataTransferred wholeConnMsg(KNifEMCompatibilityLayerEntireSubConnectionUid, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes);
   410     	TCFMessage::TSubConnDataTransferred defaultSubConnMsg(KNifEMCompatibilityLayerFakeSubConnectionId, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes);
   428     	TCFMessage::TSubConnDataTransferred defaultSubConnMsg(KNifEMCompatibilityLayerFakeSubConnectionId, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes);
   411 
   429 
   412     	RNodeInterface* ctrlClient = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::ECtrl));
   430       // Sending data clent status change message to all the control clients
   413 		if(ctrlClient)
   431       TClientIter<TDefaultClientMatchPolicy> ccIter = iContext.Node().GetClientIter<TDefaultClientMatchPolicy>(TClientType(TCFClientType::ECtrl), TClientType(0, TCFClientType::ELeaving));        
   414 			{ // Can't send this if the client's gone
   432 	RNodeInterface* ctrlClient; 
   415 			ctrlClient->PostMessage(iContext.NodeId(), wholeConnMsg);
   433 	TBool ctrlClientPresent = false;
   416 			ctrlClient->PostMessage(iContext.NodeId(), defaultSubConnMsg);
   434 	while ((ctrlClient = ccIter++) != NULL)            
   417 
   435 	    {
   418 			iContext.Node().iSubConnEventDataSent = ETrue;
   436           //If any cntl clinet is present setting the variable ctrlClientPresent as true.
   419 			}
   437 	    ctrlClientPresent = true;
       
   438 	    ctrlClient->PostMessage(iContext.NodeId(), wholeConnMsg);    
       
   439 	    ctrlClient->PostMessage(iContext.NodeId(), defaultSubConnMsg); 
       
   440 	    }
       
   441 	if(ctrlClientPresent)
       
   442 	    {
       
   443 	    iContext.Node().iSubConnEventDataSent = ETrue;
       
   444 	    }
   420     	}
   445     	}
   421     }
   446     }
   422 
   447 
   423 DEFINE_SMELEMENT(TAwaitingIoctlMessage, NetStateMachine::MState, IpProtoCpr::TContext)
   448 DEFINE_SMELEMENT(TAwaitingIoctlMessage, NetStateMachine::MState, IpProtoCpr::TContext)
   424 TBool TAwaitingIoctlMessage::Accept()
   449 TBool TAwaitingIoctlMessage::Accept()