usbmgmt/usbmgr/device/classdrivers/ncm/classcontroller/src/ncmconnectionmanager.cpp
branchRCL_3
changeset 15 f92a4f87e424
equal deleted inserted replaced
14:d3e8e7d462dd 15:f92a4f87e424
       
     1 /*
       
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 /**
       
    19  * @file
       
    20  * @internalComponent
       
    21  */
       
    22 
       
    23 #ifndef OVERDUMMY_NCMCC
       
    24 #include <commdbconnpref.h>
       
    25 #include <es_enum.h>
       
    26 #endif // OVERDUMMY_NCMCC
       
    27 
       
    28 #include <usb/usbncm.h>
       
    29 #include <nifvar.h>
       
    30 #include <cdbcols.h>
       
    31 #include <commdb.h>
       
    32 
       
    33 #include "ncmconnectionmanager.h"
       
    34 #include "ncmiapprogresswatcher.h"
       
    35 #include "ncmiapreader.h"
       
    36 #include "ncmdhcpnotifwatcher.h"
       
    37 
       
    38 #ifdef OVERDUMMY_NCMCC
       
    39 #include <usb/testncmcc/dummy_ncminternalsrv.h>
       
    40 #else
       
    41 #include "ncminternalsrv.h"
       
    42 #endif // OVERDUMMY_NCMCC
       
    43 
       
    44 #include "ncmclasscontroller.h"
       
    45 #include "ncmconnectionmanagerobserver.h"
       
    46 #include "ncmconnectionmanagerhelper.h"
       
    47 
       
    48 // For OST tracing
       
    49 #include "OstTraceDefinitions.h"
       
    50 #ifdef OST_TRACE_COMPILER_IN_USE
       
    51 #include "ncmconnectionmanagerTraces.h"
       
    52 #endif
       
    53 
       
    54 using namespace UsbNcm;
       
    55 
       
    56 #if defined(_DEBUG)
       
    57 _LIT(KNcmConnManagerPanic, "UsbNcmCM"); // must be <=16 chars
       
    58 #endif
       
    59 
       
    60 extern const TUint KEthernetFrameSize;
       
    61 
       
    62 // Panic codes
       
    63 enum TNcmCMPanicCode
       
    64 	{
       
    65 	ENcmCMPanicOutstandingRequestFromDevice = 1,
       
    66     ENcmCMPanicNoRegisteredWatcher = 2,
       
    67 	ENcmCMEndMark
       
    68 	};
       
    69 
       
    70 /**
       
    71  * Constructs a CNcmConnectionManager object.
       
    72  * @param[in]   aObserver, NCM connection observer
       
    73  * @param[in]   aHostMacAddress, the NCM interface MAC address
       
    74  * @param[in]   aDataBufferSize, the EndPoint buffer size
       
    75  * @param[in]   aNcmInternalSvr, the NCM internal server
       
    76  * @return      Ownership of a new CNcmConnectionManager object
       
    77  */
       
    78 CNcmConnectionManager* CNcmConnectionManager::NewL(
       
    79         MNcmConnectionManagerObserver& aObserver,
       
    80         const TNcmMacAddress& aMacAddress, TUint aDataBufferSize,
       
    81         RNcmInternalSrv&   aNcmInternalSvr)
       
    82 	{	
       
    83 	OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_NEWL_ENTRY);
       
    84 	
       
    85 	CNcmConnectionManager* self = new (ELeave) CNcmConnectionManager(aObserver,
       
    86             aMacAddress, aDataBufferSize, aNcmInternalSvr);
       
    87 	CleanupStack::PushL(self);
       
    88 	self->ConstructL();
       
    89 	CleanupStack::Pop(self);
       
    90 	
       
    91 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_NEWL_EXIT);
       
    92 	return self;
       
    93 	}
       
    94 
       
    95 /**
       
    96  * Method to perform second phase construction.
       
    97  */
       
    98 void CNcmConnectionManager::ConstructL()
       
    99 	{
       
   100 	OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_CONSTRUCTL_ENTRY);
       
   101 	
       
   102 	TInt err = RProperty::Define(KUsbmanSvrUid, KKeyNcmSharedState, RProperty::EInt,
       
   103 		KAllowAllPolicy, KCommDDPolicy);
       
   104     
       
   105     if (KErrNone != err)
       
   106         {
       
   107         OstTrace1( TRACE_ERROR, CNCMCONNECTIONMANAGER_CONSTRUCTL, "Define NCM shared state P&S key fail: err=%d", err );
       
   108         User::Leave(err);
       
   109         }
       
   110 	
       
   111 	User::LeaveIfError(iProperty.Attach(KUsbmanSvrUid, KKeyNcmSharedState));
       
   112 	User::LeaveIfError(iProperty.Set(ENcmStateIntial));
       
   113 
       
   114 	User::LeaveIfError(iSocketServ.Connect());
       
   115 	User::LeaveIfError(iConnection.Open(iSocketServ));
       
   116 
       
   117 	iIapPrgrsWatcher = new (ELeave) CNcmIapProgressWatcher(*this, iConnection);
       
   118 	iConnManHelper = new  (ELeave) CNcmConnectionManHelper(*this, iConnection);
       
   119 	iDhcpNotifWatcher = new  (ELeave) CNcmDhcpNotifWatcher(*this, iNcmInternalSvr);
       
   120 	iIapReader = new  (ELeave) CNcmIapReader(*this, iConnPref);
       
   121 	
       
   122 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_CONSTRUCTL_EXIT);
       
   123 	}
       
   124 
       
   125 /**
       
   126  * Called when NCM connection starting attempt completed
       
   127  */
       
   128 void CNcmConnectionManager::HandleConnectionCompleteL()
       
   129     {
       
   130     OstTraceFunctionEntry0( CNCMCONNECTIONMANAGER_HANDLECONNECTIONCOMPLETEL_ENTRY );
       
   131     OstTrace0(TRACE_NORMAL, CNCMCONNECTIONMANAGER_HANDLECONNECTIONCOMPLETEL_CHANGE_MTU, "About to change default MTU size!");
       
   132     // Change default MTU size
       
   133     SetCustomMtuL();
       
   134 
       
   135     OstTrace0(TRACE_NORMAL, CNCMCONNECTIONMANAGER_HANDLECONNECTIONCOMPLETEL_CONN_NCM_INTERNAL_SVR, "About to connect to internal NCM server!");
       
   136     
       
   137     // Connect to internal server in packet driver            
       
   138     User::LeaveIfError(iNcmInternalSvr.Connect());
       
   139 
       
   140     iNcmInternalSvr.TransferBufferSize(iDataBufferSize);
       
   141     iNcmInternalSvr.SetIapId(iConnPref.IapId());
       
   142     iDhcpNotifWatcher->StartL();
       
   143     OstTraceFunctionExit0( CNCMCONNECTIONMANAGER_HANDLECONNECTIONCOMPLETEL_EXIT );
       
   144     }
       
   145 
       
   146 /**
       
   147  * Destructor.
       
   148  */
       
   149 CNcmConnectionManager::~CNcmConnectionManager()
       
   150 	{
       
   151 	OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_CNCMCONNECTIONMANAGER_DESTRUCTOR_ENTRY);
       
   152 	
       
   153 	delete iIapReader;
       
   154     delete iDhcpNotifWatcher;
       
   155 	delete iConnManHelper;
       
   156 	delete iIapPrgrsWatcher;
       
   157 	
       
   158 	iConnection.Close();
       
   159 	iSocketServ.Close();
       
   160 	iProperty.Close();
       
   161 	
       
   162     RProperty::Delete(KKeyNcmSharedState);
       
   163     
       
   164 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_CNCMCONNECTIONMANAGER_DESTRUCTOR_EXIT);
       
   165 	}
       
   166 
       
   167 /**
       
   168  * Constructor.
       
   169  * @param[in]   aObserver, NCM connection observer
       
   170  * @param[in]   aHostMacAddress, the NCM interface MAC address
       
   171  * @param[in]   aDataBufferSize, the EndPoint buffer size
       
   172  * @param[in]   aNcmInternalSvr, the NCM internal server
       
   173  */
       
   174 CNcmConnectionManager::CNcmConnectionManager(MNcmConnectionManagerObserver& aObserver, 
       
   175         const TNcmMacAddress& aHostMacAddress, TUint aDataBufferSize,
       
   176         RNcmInternalSrv&   aNcmInternalSvr):
       
   177         iConnMgrObserver(aObserver),
       
   178         iHostMacAddress(aHostMacAddress), iDataBufferSize(aDataBufferSize),
       
   179         iNcmInternalSvr(aNcmInternalSvr)
       
   180 	{
       
   181 	// No implementation needed.
       
   182 	}
       
   183 
       
   184 /**
       
   185  *Called by class controller to start the connection building process.
       
   186  *@param    aStatus, reference to ncm class controller's iStatus 
       
   187  */
       
   188 void CNcmConnectionManager::Start(TRequestStatus& aStatus)
       
   189 	{
       
   190 	OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_START_ENTRY);
       
   191 	
       
   192 	__ASSERT_DEBUG(!iReportStatus, 
       
   193 		User::Panic(KNcmConnManagerPanic, ENcmCMPanicOutstandingRequestFromDevice));
       
   194 	
       
   195 	aStatus = KRequestPending;
       
   196 	iReportStatus = &aStatus;
       
   197 
       
   198 	Reset();
       
   199 	
       
   200 	// Preparing IAP information	
       
   201 	iIapReader->Start();
       
   202 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_START_EXIT);
       
   203 	}
       
   204 
       
   205 /**
       
   206  * Cancel ongoing starting attempt
       
   207  */
       
   208 void CNcmConnectionManager::StartCancel()
       
   209     {
       
   210     OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_STARTCANCEL_ENTRY);
       
   211     
       
   212     __ASSERT_DEBUG(iReportStatus, 
       
   213         User::Panic(KNcmConnManagerPanic, ENcmCMPanicNoRegisteredWatcher));
       
   214     
       
   215     Stop();
       
   216     
       
   217     User::RequestComplete(iReportStatus, KErrCancel);
       
   218     
       
   219     OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_STARTCANCEL_EXIT);
       
   220     }
       
   221 
       
   222 /**
       
   223  * Called by class controller to stop the connection.
       
   224  */
       
   225 void CNcmConnectionManager::Stop()
       
   226 	{
       
   227     OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_STOP_ENTRY);
       
   228     
       
   229     // Cancel any current ongoing operations
       
   230     Reset();
       
   231     
       
   232     // Reset shared state
       
   233     iProperty.Set(ENcmStateIntial);
       
   234 	
       
   235 	iConnManHelper->Stop();
       
   236 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_STOP_EXIT);
       
   237 	}
       
   238 
       
   239 /**
       
   240  * Reset conneciton manager itself
       
   241  */
       
   242 void CNcmConnectionManager::Reset()
       
   243 	{
       
   244     OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_RESET_ENTRY);
       
   245     
       
   246 	iConnComplete = EFalse;
       
   247 	
       
   248 	iIapReader->Cancel();
       
   249 	iDhcpNotifWatcher->Cancel();
       
   250 	iIapPrgrsWatcher->Cancel();
       
   251 	iConnManHelper->Cancel();
       
   252 	
       
   253 	OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_RESET_EXIT);
       
   254 	}
       
   255 /**
       
   256  * Change the default MTU size on NCM networking connection
       
   257  */
       
   258 void CNcmConnectionManager::SetCustomMtuL()
       
   259     {    
       
   260     OstTraceFunctionEntry0(CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_ENTRY);
       
   261     
       
   262     RSocket socket;
       
   263     User::LeaveIfError(socket.Open(iSocketServ, KAfInet, KSockStream, KProtocolInetTcp,
       
   264             iConnection));
       
   265 
       
   266     TPckgBuf<TSoInet6InterfaceInfo> interfaceInfo;
       
   267     TPckgBuf<TConnInterfaceName> interfaceName;
       
   268     
       
   269     TUint cnt = 0;
       
   270     iConnection.EnumerateConnections(cnt); // Count all underlying interfaces
       
   271     
       
   272     TUint iap = iConnPref.IapId();
       
   273     TInt index = 1;
       
   274     for (index = 1; index <= cnt; index++)
       
   275         {
       
   276         TConnectionInfoBuf info;
       
   277         iConnection.GetConnectionInfo(index, info);
       
   278         if (info().iIapId == iap)
       
   279             {
       
   280             break;
       
   281             }
       
   282         }
       
   283     
       
   284     if (index > cnt)
       
   285         {
       
   286         OstTrace0( TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL, "Can not find an interface based on NCM!" );
       
   287         User::Leave(KErrNotFound);
       
   288         }
       
   289     
       
   290     interfaceName().iIndex = index;    
       
   291     OstTraceExt2( TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_INTER_INFO, ";cnt=%d;interfaceName().iIndex=%u", cnt, interfaceName().iIndex );
       
   292     User::LeaveIfError(iConnection.Control(KCOLProvider, KConnGetInterfaceName, interfaceName));
       
   293     OstTraceExt3( TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_NEW_MTU_SIZE, ";Interface Name=%S, ;current MTU=%d. MTU size will be changed to %d!", interfaceName().iName, interfaceInfo().iMtu, KEthernetFrameSize);
       
   294         
       
   295     TInt err = socket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
       
   296     if (err != KErrNone)
       
   297         {
       
   298         OstTrace1(TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_START_INTER_ENUM, "Failed to set KSoInetEnumInterfaces option [%d]", err);
       
   299         User::LeaveIfError(err);              
       
   300         }
       
   301         
       
   302     err = KErrNotFound;
       
   303     while (socket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, interfaceInfo) == KErrNone)
       
   304         {
       
   305         OstTraceExt1(TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_INTER_NAME, "InterfaceInfo().iName = %S", interfaceInfo().iName);
       
   306         OstTrace1(TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_INTER_MTU, "InterfaceInfo().iMtu = %d", interfaceInfo().iMtu);
       
   307         if (interfaceInfo().iName == interfaceName().iName)
       
   308             {
       
   309             // found the interface
       
   310             err = KErrNone;
       
   311             break;
       
   312             }
       
   313         }
       
   314     if (KErrNone != err)
       
   315         {
       
   316         OstTrace1(TRACE_ERROR, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_SEARCH_FAIL, "Can not find NCM connection: err=%x", err);
       
   317         User::LeaveIfError(err);
       
   318         }
       
   319     
       
   320     // Set new MTU size
       
   321     TPckgBuf<TSoInet6InterfaceInfo> newinterfaceInfo;
       
   322     newinterfaceInfo().iMtu = KEthernetFrameSize;	
       
   323     newinterfaceInfo().iDoPrefix = 0;
       
   324     newinterfaceInfo().iDoId = 0;
       
   325     newinterfaceInfo().iDoState = 0;
       
   326     newinterfaceInfo().iDoAnycast = 0;
       
   327     newinterfaceInfo().iDoProxy = 0;
       
   328     newinterfaceInfo().iAlias = interfaceInfo().iAlias;
       
   329     newinterfaceInfo().iDelete = interfaceInfo().iDelete;
       
   330     newinterfaceInfo().iState = interfaceInfo().iState;
       
   331     newinterfaceInfo().iSpeedMetric = interfaceInfo().iSpeedMetric;
       
   332     newinterfaceInfo().iFeatures = interfaceInfo().iFeatures;
       
   333     newinterfaceInfo().iTag = interfaceInfo().iTag;
       
   334     newinterfaceInfo().iName = interfaceInfo().iName;
       
   335     newinterfaceInfo().iSpeedMetric = interfaceInfo().iSpeedMetric;
       
   336     newinterfaceInfo().iFeatures = interfaceInfo().iFeatures;	
       
   337     newinterfaceInfo().iHwAddr = interfaceInfo().iHwAddr;
       
   338     newinterfaceInfo().iAddress = interfaceInfo().iAddress;
       
   339     newinterfaceInfo().iNetMask = interfaceInfo().iNetMask;
       
   340     newinterfaceInfo().iDefGate = interfaceInfo().iDefGate;
       
   341     newinterfaceInfo().iNameSer2 = interfaceInfo().iNameSer2;
       
   342     newinterfaceInfo().iNameSer1 = interfaceInfo().iNameSer1;
       
   343 	
       
   344     OstTrace0( TRACE_NORMAL, CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_PRE_SETMTU, "About to change the default MTU size." );
       
   345 	User::LeaveIfError(socket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl, newinterfaceInfo));
       
   346 
       
   347     socket.Close();
       
   348     
       
   349     OstTraceFunctionExit0(CNCMCONNECTIONMANAGER_SETCUSTOMMTUL_EXIT);
       
   350     }
       
   351 
       
   352 /**
       
   353  * Called by connection watcher when it detects the class fatal error.
       
   354  */
       
   355 void CNcmConnectionManager::MipsoHandleClassFatalError(TInt aError)
       
   356 	{
       
   357 	OstTraceFunctionEntryExt( CNCMCONNECTIONMANAGER_MIPSOHANDLECLASSFATALERROR_ENTRY, this );
       
   358 	
       
   359 	Reset();
       
   360 	
       
   361 	__ASSERT_DEBUG(!iReportStatus, User::Panic(KNcmConnManagerPanic, ENcmCMPanicOutstandingRequestFromDevice));
       
   362 		
       
   363 	OstTrace1(TRACE_ERROR, CNCMCONNECTIONMANAGER_MIPSOHANDLECLASSFATALERROR, "NCM connection fatal error occurs: %d", aError);
       
   364 	
       
   365 	iConnMgrObserver.McmoErrorIndication(aError);
       
   366 	
       
   367 	OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MIPSOHANDLECLASSFATALERROR_EXIT, this );
       
   368 	}
       
   369 
       
   370 /**
       
   371  * Called by connection help when it get notification the 
       
   372  * connection over NCM has been established.
       
   373  */
       
   374 void CNcmConnectionManager::MicoHandleConnectionComplete(TInt aError)
       
   375     {
       
   376     OstTraceFunctionEntryExt( CNCMCONNECTIONMANAGER_MICOHANDLECONNECTIONCOMPLETE_ENTRY, this );
       
   377     
       
   378     // Reset shared state
       
   379     iProperty.Set(ENcmStateIntial);
       
   380     
       
   381     if (KErrNone == aError)
       
   382         {
       
   383         TRAPD(err, HandleConnectionCompleteL());
       
   384         User::RequestComplete(iReportStatus, err);
       
   385         }
       
   386     else
       
   387         {
       
   388         // Leave if connection build failed
       
   389         User::RequestComplete(iReportStatus, aError);
       
   390         }
       
   391     
       
   392     OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MICOHANDLECONNECTIONCOMPLETE_EXIT, this );
       
   393     }
       
   394 
       
   395 /**
       
   396  * Called by DHCP notification watcher.
       
   397  * When the NCM internal server send DHCP request notification to 
       
   398  * the watcher, watcher call this function to do DHCP provisioning
       
   399  * for NCM connection.
       
   400  */
       
   401 void CNcmConnectionManager::MdnoHandleDhcpNotification(TInt aError)
       
   402     {
       
   403     OstTraceFunctionEntryExt( CNCMCONNECTIONMANAGER_MDNOHANDLEDHCPNOTIFICATION_ENTRY, this );
       
   404     if (KErrNone != aError)
       
   405         {
       
   406         // Report this failure to the observer
       
   407         // Finally this will report to usbman and NCM class will be stopped.
       
   408         iConnMgrObserver.McmoErrorIndication(aError);
       
   409         OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MDNOHANDLEDHCPNOTIFICATION_EXIT, this );
       
   410         return;
       
   411         }
       
   412     
       
   413     // Doing DHCP for NCM
       
   414     aError = KErrNone;
       
   415 
       
   416     // Configuring DHCP server to assign the IP address to PC(host)
       
   417     TRequestStatus stat;
       
   418     OstTrace0(TRACE_NORMAL, CNCMCONNECTIONMANAGER_MDNOHANDLEDHCPNOTIFICATION_CALL_IOCTL, "About to call to Ioctl()");
       
   419     
       
   420     TNcmMacAddress macAddr = iHostMacAddress;
       
   421     iConnection.Ioctl(KCOLConfiguration, KConnDhcpSetHwAddressParams, stat,
       
   422             &macAddr);
       
   423     User::WaitForRequest(stat);
       
   424     aError = stat.Int();
       
   425     OstTrace1( TRACE_NORMAL, CNCMCONNECTIONMANAGER_MDNOHANDLEDHCPNOTIFICATION_RETURN_IOCTL, "Return from Ioctl:aError=%d", aError );
       
   426     
       
   427     if (KErrNone == aError)
       
   428         {
       
   429         // Disable timer on interface and wont let interface coming down due to timer expiry.
       
   430         iConnection.SetOpt(KCOLProvider, KConnDisableTimers, ETrue);
       
   431         iIapPrgrsWatcher->Start();
       
   432         }
       
   433     else
       
   434         {
       
   435         // Silent stop the NCM connection. 
       
   436         iConnManHelper->Stop();
       
   437         
       
   438         // Report this failure to the observer
       
   439         // Finally this will report to usbman and NCM class will be stopped.
       
   440         iConnMgrObserver.McmoErrorIndication(aError);        
       
   441         }
       
   442     
       
   443     // Set DHCP result to NCM internal server
       
   444     iNcmInternalSvr.SetDhcpResult(aError);
       
   445     OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MDNOHANDLEDHCPNOTIFICATION_EXIT_DUP1, this );
       
   446     }
       
   447 
       
   448 /**
       
   449  * Called by IAP reader.
       
   450  * When IAP reader finished reading NCM IAP preference from CentRep,
       
   451  * it will call this function to start building ethernet connection
       
   452  * using NCM IAP configuration.
       
   453  */
       
   454 void CNcmConnectionManager::MicoHandleIAPReadingComplete(TInt aError)
       
   455     {
       
   456     OstTraceFunctionEntryExt( CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_ENTRY, this );
       
   457     if (KErrNone != aError)      
       
   458       {
       
   459       OstTrace1( TRACE_ERROR, CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_IAP_RESULT, "IAP reading failed with error;aError=%d", aError );
       
   460       User::RequestComplete(iReportStatus, aError);
       
   461       
       
   462       OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_EXIT, this );
       
   463       return;
       
   464       }
       
   465     
       
   466     aError = iProperty.Set(ENcmStartRequested);
       
   467     
       
   468     if (KErrNone != aError)
       
   469       {
       
   470       OstTrace1( TRACE_ERROR, CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_SET_SHARED_STATE, "Property set failed with error:;aError=%d", aError );
       
   471       User::RequestComplete(iReportStatus, aError);
       
   472 
       
   473       OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_EXIT_DUP1, this );
       
   474       return;
       
   475       }
       
   476 
       
   477     iConnManHelper->Start(iConnPref);
       
   478     OstTraceFunctionExit1( CNCMCONNECTIONMANAGER_MICOHANDLEIAPREADINGCOMPLETE_EXIT_DUP2, this );
       
   479     }