networkcontrol/ipnetworklayer/src/IPProtoTierManager.cpp
changeset 0 af10295192d8
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // IPProto Tier Manager
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file
       
    20  @internalComponent
       
    21 */
       
    22 
       
    23 #include <comms-infras/ss_log.h>
       
    24 #include <comms-infras/ss_coreprstates.h>
       
    25 #include <comms-infras/ss_corepractivities.h>
       
    26 #include <comms-infras/coretiermanagerstates.h>
       
    27 #include <comms-infras/coretiermanageractivities.h>
       
    28 #include <comms-infras/coretiernotificationactivity.h>
       
    29 #include <comms-infras/coretiernotificationstates.h>
       
    30 #include "IPProtoTierManager.h"
       
    31 #include "IPProtoTierManagerSelector.h"
       
    32 #include <comms-infras/ss_metaconnprov.h>
       
    33 #include <in_sock.h>
       
    34 
       
    35 #ifdef SYMBIAN_TRACE_ENABLE
       
    36 #define KIPProtoTierMgrTag KESockMetaConnectionTag
       
    37 // _LIT8(KIPProtoTierMgrSubTag, "ipprototiermgr");
       
    38 #endif // SYMBIAN_TRACE_ENABLE
       
    39 
       
    40 using namespace Messages;
       
    41 using namespace MeshMachine;
       
    42 using namespace ESock;
       
    43 using namespace NetStateMachine;
       
    44 using namespace TMActivities;
       
    45 using namespace CorePanics;
       
    46 
       
    47 //-=========================================================
       
    48 // Panics
       
    49 #ifdef _DEBUG
       
    50 _LIT (KIpProtoTMPanic,"IpProtoTMPanic");
       
    51 #endif
       
    52 
       
    53 
       
    54 //This transition creates a link between legacy NetMCpr & legacy CLinkPrefsSelector
       
    55 DEFINE_SMELEMENT(IpProtoTMStates::TSelectProvider, NetStateMachine::MStateTransition, IpProtoTMStates::TContext)
       
    56 void IpProtoTMStates::TSelectProvider::DoL()
       
    57 	{
       
    58 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KIpProtoTMPanic, KPanicNoActivity));
       
    59 	CSelectProviderActivity* act = static_cast<CSelectProviderActivity*>(iContext.iNodeActivity);
       
    60 	
       
    61 	//Create selector
       
    62 	act->iSelector = iContext.Node().DoCreateProviderSelectorL(message_cast<TCFSelector::TSimpleSelect>(iContext.iMessage).iSelectionPrefs);
       
    63 	
       
    64 	TBool isItLegacyMcpr = EFalse;
       
    65 	
       
    66 	//First assumption: At this layer (IpProto) all SelectProvider requests are always comming from MCprs.
       
    67 #if !defined(__GCCXML__)
       
    68 	CMetaConnectionProviderBase& mcpr = mnode_cast<CMetaConnectionProviderBase>(address_cast<TNodeId>(iContext.iSender).Node());
       
    69 #else
       
    70 	CMetaConnectionProviderBase& mcpr =
       
    71 		reinterpret_cast<CMetaConnectionProviderBase&>(address_cast<TNodeId>(iContext.iSender).Node());
       
    72 #endif
       
    73 
       
    74 	//Second assumption: All MCprs at an upper layer (above IpProto) use the Instance() to indicate that they are legacy.
       
    75 	if (mcpr.ProviderInfo().Instance() !=0) 
       
    76 		{ //We have a legacy provider above us
       
    77 		ASSERT(mcpr.ProviderInfo().TierId() == TUid::Uid(KAfInet)); //Here we can partially test the second assumption
       
    78 
       
    79 		ASimpleSelectorBase& baseselector = static_cast<ASimpleSelectorBase&>(*act->iSelector);
       
    80 		if (baseselector.TypeId() == CLinkPrefsSelector::KUid)
       
    81 			{
       
    82 			CLinkPrefsSelector& selector = static_cast<CLinkPrefsSelector&>(*act->iSelector);
       
    83 			selector.iLegacyMCpr = &mcpr;
       
    84 			isItLegacyMcpr = ETrue;
       
    85 			}
       
    86 		}
       
    87 	
       
    88 	if (!isItLegacyMcpr)
       
    89 		{
       
    90 		//A 399 selection is ongoing. Note: this code is intentionally not generic and needs to be reworking.
       
    91 		AIpProtoSelectorBase& currentSelector = static_cast<AIpProtoSelectorBase&>(*act->iSelector);
       
    92 		currentSelector.iNetworkMCpr = &mcpr;
       
    93 		
       
    94 		if (iContext.ActivityId() == ESock::ECFActivityConnectionStartRecovery)
       
    95 			{
       
    96 			currentSelector.iReselection = ETrue;
       
    97 			}
       
    98 		}
       
    99 	
       
   100 	ISelectionNotify selectionNotify(act,act->InterfaceVTable());
       
   101 	act->iSelector->SelectL(selectionNotify);
       
   102 	//Do not do any further processing here as selectors may be returning synchronously (via ISelectionNotify).
       
   103 	}
       
   104 
       
   105 DEFINE_SMELEMENT(IpProtoTMStates::TSelectProviderConnPrefList, NetStateMachine::MStateTransition, IpProtoTMStates::TContext)
       
   106 void IpProtoTMStates::TSelectProviderConnPrefList::DoL()
       
   107 	{
       
   108 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KIpProtoTMPanic, KPanicNoActivity));
       
   109 	CSelectProviderActivity* act = static_cast<CSelectProviderActivity*>(iContext.iNodeActivity);
       
   110 
       
   111 	//Create selector
       
   112 	//If a ConnPrefList is being used we know what kind of Selector to use
       
   113 	//(as only one kind supports it) so we can create it without calling
       
   114 	//the intermidiate DoCreateProviderSelectorL
       
   115 	act->iSelector = new (ELeave) CIpProtoProviderSelectorConnPrefList(message_cast<TCFSelector::TSelect>(iContext.iMessage).iConnPrefList); 
       
   116 
       
   117 	//First assumption: At this layer (IpProto) all SelectProvider requests are always comming from MCprs.
       
   118 #if !defined(__GCCXML__)
       
   119 	CMetaConnectionProviderBase& mcpr = mnode_cast<CMetaConnectionProviderBase>(address_cast<TNodeId>(iContext.iSender).Node());
       
   120 #else
       
   121 	CMetaConnectionProviderBase& mcpr =
       
   122 		reinterpret_cast<CMetaConnectionProviderBase&>(address_cast<TNodeId>(iContext.iSender).Node());
       
   123 #endif
       
   124 		
       
   125 	if (mcpr.ProviderInfo().Instance() !=0) 
       
   126 		{ //We have a legacy provider above us
       
   127 		ASSERT(mcpr.ProviderInfo().TierId() == TUid::Uid(KAfInet)); //Here we can partially test the second assumption
       
   128 
       
   129 		ASimpleSelectorBase& baseselector = static_cast<ASimpleSelectorBase&>(*act->iSelector);
       
   130 		if (baseselector.TypeId() == CLinkPrefsSelector::KUid)
       
   131 			{
       
   132 			CLinkPrefsSelector& selector = static_cast<CLinkPrefsSelector&>(*act->iSelector);
       
   133 			selector.iLegacyMCpr = &mcpr;
       
   134 			}
       
   135 		}
       
   136 	else
       
   137 		{
       
   138 		//A 399 selection is ongoing. Note: this code is intentionally not generic and needs to be reworking.
       
   139 		AIpProtoSelectorBase& currentSelector = static_cast<AIpProtoSelectorBase&>(*act->iSelector);
       
   140 		currentSelector.iNetworkMCpr = &mcpr;
       
   141 		
       
   142 		if (iContext.ActivityId() == ESock::ECFActivityConnectionStartRecovery)
       
   143 			{
       
   144 			currentSelector.iReselection = ETrue;
       
   145 			}
       
   146 		}
       
   147 	
       
   148 	ISelectionNotify selectionNotify(act,act->InterfaceVTable());
       
   149 	act->iSelector->SelectL(selectionNotify);
       
   150 	//Do not do any further processing here as selectors may be returning synchronously (via ISelectionNotify).
       
   151 	}
       
   152 
       
   153 namespace IpProtoTMSelectProviderActivity
       
   154 { //Simple parallel activity provider selection, waits untill selection completes (via ISelectionNotify), then gets destroyed
       
   155 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivitySelect, IpProtoTMSelectProvider, TCFSelector::TSimpleSelect, CSelectProviderActivity::NewL)
       
   156 	FIRST_NODEACTIVITY_ENTRY(TMStates::TAwaitingSelectProvider, MeshMachine::TNoTag)
       
   157 	NODEACTIVITY_ENTRY(KNoTag, IpProtoTMStates::TSelectProvider, CoreStates::TNeverAccept, MeshMachine::TNoTag)
       
   158 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   159 NODEACTIVITY_END()
       
   160 }
       
   161 
       
   162 namespace IpProtoTMSelectProviderConnPrefListActivity
       
   163 { //Simple parallel activity provider selection, waits untill selection completes (via ISelectionNotify), then gets destroyed
       
   164 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivitySelect, IpProtoTMSelectConnPrefListProvider, TCFSelector::TSelect, CSelectProviderActivity::NewL)
       
   165 	FIRST_NODEACTIVITY_ENTRY(TMStates::TAwaitingSelectProviderSuper, MeshMachine::TNoTag)
       
   166 	NODEACTIVITY_ENTRY(KNoTag, IpProtoTMStates::TSelectProviderConnPrefList, CoreStates::TNeverAccept, MeshMachine::TNoTag)
       
   167 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   168 NODEACTIVITY_END()
       
   169 }
       
   170 
       
   171 namespace IpProtoTMActivities
       
   172 {
       
   173 DECLARE_DEFINE_ACTIVITY_MAP(stateMap)
       
   174 	ACTIVITY_MAP_ENTRY(IpProtoTMSelectProviderActivity,IpProtoTMSelectProvider)
       
   175 	ACTIVITY_MAP_ENTRY(IpProtoTMSelectProviderConnPrefListActivity,IpProtoTMSelectConnPrefListProvider)
       
   176 ACTIVITY_MAP_END_BASE(TMActivities, coreTMActivities)
       
   177 }
       
   178 
       
   179 
       
   180 CIPProtoTierManager* CIPProtoTierManager::NewL(ESock::CTierManagerFactoryBase& aFactory)
       
   181 	{
       
   182  	return new (ELeave) CIPProtoTierManager(aFactory, IpProtoTMActivities::stateMap::Self());
       
   183 	}
       
   184 
       
   185 CIPProtoTierManager::CIPProtoTierManager(ESock::CTierManagerFactoryBase& aFactory,
       
   186                                          const MeshMachine::TNodeActivityMap& aActivityMap)
       
   187 :	CCoreTierManager(aFactory,aActivityMap)
       
   188 	{
       
   189 	LOG_NODE_CREATE(KIPProtoTierMgrTag, CIPProtoTierManager);
       
   190 	}
       
   191 
       
   192 CIPProtoTierManager::~CIPProtoTierManager()
       
   193 	{
       
   194 	LOG_NODE_DESTROY(KIPProtoTierMgrTag, CIPProtoTierManager);
       
   195 	}
       
   196 
       
   197 ESock::MProviderSelector* CIPProtoTierManager::DoCreateProviderSelectorL(const Meta::SMetaData& aSelectionPreferences)
       
   198 	{
       
   199     return TIpProtoProviderSelectorFactory::NewSelectorL(aSelectionPreferences);
       
   200 	}
       
   201 
       
   202 void CIPProtoTierManager::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
       
   203 	{
       
   204    	TNodeContext<CIPProtoTierManager> ctx(*this, aMessage, aSender, aRecipient);
       
   205    	CCoreTierManager::Received(ctx);
       
   206     User::LeaveIfError(ctx.iReturn);
       
   207 	}
       
   208 
       
   209 
       
   210