datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionStep.cpp
changeset 0 dfb7c4ff071f
child 21 4ccf8e394726
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionStep.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,2146 @@
+// Copyright (c) 2002-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:
+// This contains TE_RConnectionStep class which is
+// the base class for all the RConnection multihoming test steps.
+// Contains methods which simplify the API to RConnection, RSocket and 
+// RHostResolver to be used by derived classes. This abstraction means 
+// that the API can continue to evolve as it has done for a while without 
+// impacting a large number of test cases - just alter this parent class.
+//
+//
+
+/**
+ @file
+*/
+#include "TE_RConnectionStep.h"
+#include <commdbconnpref.h>
+#include <dummynifvar.h>
+#include <c32root.h>
+#include <comms-infras/esocktestutils.h>
+#include <cs_subconparams.h> 
+#include <cs_subconevents.h>
+#include <ecom/ecom.h>
+#include <e32cons.h>
+#include <comms-infras/es_commsdataobject.h>
+#include <commdbconnpref.h>
+#include <commsdattypeinfov1_1.h>
+#include <comms-infras/connectionqueryset.h>
+
+#ifdef SYMBIAN_OLD_EXPORT_LOCATION
+#include <naptinterface.h>
+#else
+//after the header file relocation this header won't be exported, so it needs to be a user include.
+#include "naptinterface.h"
+#endif
+
+#include <simtsy.h>
+
+_LIT(KSimtsyName,"SIM");
+
+TE_RConnectionStep::TE_RConnectionStep()
+/**
+ * Constructor for TS_RConnectonStep(). Does nothing.
+ * @param none
+ * @return doesn't it is a constructor
+ */
+{
+}
+
+TE_RConnectionStep::~TE_RConnectionStep()
+/**
+ * Destructor for TE_RConnectionStep(). Does nothing.
+ */
+{ 
+	CActiveScheduler::Install(NULL);
+	delete iScheduler;
+}	
+
+enum TVerdict TE_RConnectionStep::doTestStepPreambleL(void)
+/**
+ * Preamble called before every single test case which is derived from TE_RConnectionStep (unless overridden of course). Sets up addresses and other values to be used by the test code proper. Waits for any remaining interfaces from previous tests to close.
+ * @param none
+ * @return success (EPass) or failure (EFail) of initialisation
+ */
+{
+	enum TVerdict result = EPass;
+	_LIT(KPhbkSyncCMI, "phbsync.cmi");
+	if (StartC32WithCMISuppressions(KPhbkSyncCMI) != KErrNone)
+    	{
+    	return EFail;
+    	}
+	iScheduler = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iScheduler);
+	/*
+	 * Load the config from the .ini file
+	 */
+
+	if (KErrNone != ReadIniFile())
+		result = EFail;
+	
+	iDummyNifSendAddr.SetAddress(KDummyNifLocalAddressBase + KDummyHungryNifReservedHostId);
+	iDummyNifSendAddr.SetPort(iEchoPortNum);
+	iHungryNifSendAddr.SetAddress(KDummyNifLocalAddressBase + KDummyHungryNifReservedHostId);
+	iHungryNifSendAddr.SetPort(iEchoPortNum);
+		 	 	
+	_LIT(KNaptStatusCheck, "On");
+	if (iNaptStatus.Compare(KNaptStatusCheck)!=0)
+		{
+		// Wait for all of the interfaces to close down
+		RSocketServ ss;
+		
+		ss.Connect();
+		CleanupClosePushL(ss);
+
+		if (KErrNone != WaitForAllInterfacesToCloseL(ss))
+			{
+			INFO_PRINTF1(_L("Previous test case has left connections up that have not closed. Stopping them."));
+			TBuf<200> errDesc;
+			TInt err;
+			if ((err = ESockTestUtils::StopAllInterfaces(errDesc)) == KErrNone)
+				result = EPass;
+			else
+				{
+				INFO_PRINTF3(_L("StopAllInterfaces() err=%d\n%S"), err, &errDesc);
+				result = EFail;
+			}
+			}
+		ss.Close();
+		CleanupStack::Pop();
+		}
+
+	return result;
+}
+
+enum TVerdict TE_RConnectionStep::doTestStepPostambleL(void)
+{
+	
+	if( iStatus && iStatus->IsActive() )
+		{
+		iStatus->Cancel();
+		}
+	delete iStatus;
+	iStatus = NULL;
+	CActiveScheduler::Install(NULL);
+	REComSession::FinalClose();
+	
+	return EPass;
+}
+
+TInt TE_RConnectionStep::ReadIniFile(void)
+/**
+ * Opens the .ini file, reads the contents into some class members and then closes the file again
+ * @return system wide error code
+ */
+{
+	TInt result = KErrNone;
+
+	TPtrC filename(_L("c:\\rconnectiontest.ini"));
+	TBuf<64> tempBuf; // 16 is enough for an IP addr and the separating dots
+	TPtrC temp(0,NULL);
+
+
+	// this opens the file and loads everything in
+	// LoadConfig(filename);
+
+	// set the IAP values in the class members
+	_LIT(KIapSection, "IAP");
+	_LIT(KDummyNifIapKey, "DummyNifIapNumber");
+	_LIT(KNtRasIapOnlyShortTimerKey, "DummyNifOnlyShortTimerIapNumber");
+	_LIT(KDummyNifLongTimeoutIapKey, "DummyNifLongTimeoutIapNumber");
+	_LIT(KDummyNifTwoBinderIapKey, "DummyNifTwoBinderIapNumber");
+	_LIT(KHungryNifLongTimeoutIapKey, "HungryNifLongTimeoutIapNumber");
+	_LIT(KHungryNifIapKey, "HungryNifIapNumber");
+	_LIT(KDefaultIapKey, "DefaultIapNumber");
+	_LIT(KBadNtRasIapKey, "BadNtRasIapNumber");
+	_LIT(KMissingNifIapKey, "MissingNifIapNumber");
+	_LIT(KTestNifIapKey, "TestNifIapNumber");
+	_LIT(KDummyNifAgentIap, "DummyNifAgentIapNumber");
+	_LIT(KSimTSYIap, "SimTSYIapNumber");
+	_LIT(KStaticDnsDynamicAddr, "StaticDnsDynamicAddr");
+
+	if (!(GetIntFromConfig(KIapSection, KDummyNifIapKey, iDummyNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KDummyNifLongTimeoutIapKey, iDummyNifLongTimeoutIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KDummyNifTwoBinderIapKey, iDummyNifTwoBinderIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KHungryNifLongTimeoutIapKey, iHungryNifLongTimeoutIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KHungryNifIapKey, iHungryNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KDefaultIapKey, iDefaultIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KNtRasIapOnlyShortTimerKey, iNtRasIapOnlyShortTimer)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KBadNtRasIapKey, iBadNtRasIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KMissingNifIapKey, iMissingNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KTestNifIapKey, iTestNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KDummyNifAgentIap, iDummyNifAgentIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KSimTSYIap, iSimTSYIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KStaticDnsDynamicAddr, iStaticDnsDynamicAddr)))
+		result = KErrNotFound;
+
+
+	// IAP numbers specifically used by the all interface notification tests
+	_LIT(KAinIapSection, "AINIAPs");
+	_LIT(KSecondHungryNifIapKey, "SecondHungryNifNumber");
+	_LIT(KThirdHungryNifIapKey, "ThirdHungryNifNumber");
+	_LIT(KSecondDummyNifIapKey, "SecondDummyNifNumber");
+	_LIT(KThirdDummyNifIapKey, "ThirdDummyNifNumber");
+	_LIT(KFourthDummyNifIapKey, "FourthDummyNifNumber");
+	_LIT(KFifthDummyNifIapKey, "FifthDummyNifNumber");
+	_LIT(KFNaptPublicIapKey, "NaptPublicIapNumber");
+	_LIT(KFNaptPrivateIapKey, "NaptPrivateIapNumber");
+	
+
+	if (!(GetIntFromConfig(KAinIapSection, KSecondHungryNifIapKey, iSecondHungryNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KAinIapSection, KThirdHungryNifIapKey, iThirdHungryNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KAinIapSection, KSecondDummyNifIapKey, iSecondDummyNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KAinIapSection, KThirdDummyNifIapKey, iThirdDummyNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KAinIapSection, KFourthDummyNifIapKey, iFourthDummyNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KAinIapSection, KFifthDummyNifIapKey, iFifthDummyNifIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KFNaptPublicIapKey, iNaptPublicIap)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KIapSection, KFNaptPrivateIapKey, iNaptPrivateIap)))
+		result = KErrNotFound;
+
+	// set the timeout values in the class members
+	_LIT(KTimeoutSection, "Timeouts");
+	_LIT(KShortTimeoutKey, "ShortTimeout");
+	_LIT(KMediumTimeoutKey, "MediumTimeout");
+	_LIT(KLongTimeoutKey, "LongTimeout");
+	
+	if (!(GetIntFromConfig(KTimeoutSection, KShortTimeoutKey, iShortTimeout)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KTimeoutSection, KMediumTimeoutKey, iMediumTimeout)))
+		result = KErrNotFound;
+	if (!(GetIntFromConfig(KTimeoutSection, KLongTimeoutKey, iLongTimeout)))
+		result = KErrNotFound;
+	
+	// other general set up stuff
+	_LIT(KGeneralSection, "General");
+	_LIT(KInterfaceName, "Interface");
+	if (!(GetStringFromConfig(KGeneralSection, KInterfaceName, temp)))
+		result = KErrNotFound;
+	iInterfaceName.Copy(temp);
+	
+	_LIT(KNameServerAddr, "NameServerAddr");
+	if (!GetStringFromConfig(KGeneralSection, KNameServerAddr, temp))
+		result = KErrNotFound;
+	iNameServerAddr.Input(temp);
+
+	_LIT(KEchoPortKey, "EchoPort");
+	if (!(GetIntFromConfig(KGeneralSection, KEchoPortKey, iEchoPortNum)))
+		result = KErrNotFound;
+	_LIT(KNaptTestServerPort, "NaptTestServerPort");
+	if (!(GetIntFromConfig(KGeneralSection, KNaptTestServerPort, iNaptTestServerPort)))
+		result = KErrNotFound;
+
+	// set the address which we should connect TCP sockets to (addr of TCP echo server)
+	_LIT(KTcpConfigSection, "TCP Config");
+	_LIT(KTcpSendAddrKey, "TcpSendAddress");
+	if (!GetStringFromConfig(KTcpConfigSection, KTcpSendAddrKey, temp))
+		result = KErrNotFound;
+	iEchoServerAddr.Input(temp);
+	// set it's port to the echo port
+	iEchoServerAddr.SetPort(iEchoPortNum);
+	
+	// Napt
+	_LIT(KNaptTestServer, "NaptTestServer");
+	if (!GetStringFromConfig(KGeneralSection, KNaptTestServer, temp))
+		result = KErrNotFound;
+	iNaptTestServAddr.Input(temp);
+	// set it's port to the NaptTestServer port
+	iNaptTestServAddr.SetPort(iNaptTestServerPort);
+
+	// the name which we will attempt to resolve many many times
+	_LIT(KTestNameKey, "TestName");
+	if (!GetStringFromConfig(KTcpConfigSection, KTestNameKey, temp))
+		result = KErrNotFound;
+	iTestName = temp;
+
+	// the address which we will pass in when using GetByAddress()
+	_LIT(KLookupAddressKey, "LookupAddress");
+	if (!GetStringFromConfig(KGeneralSection, KLookupAddressKey, temp))
+		result = KErrNotFound;
+	iLookupAddress.Input(temp);
+	
+	_LIT(KNaptStatus, "NaptStatus");
+	if (!GetStringFromConfig(KGeneralSection, KNaptStatus, iNaptStatus))
+		result = KErrNotFound;
+
+	return result;
+}
+
+TInt TE_RConnectionStep::OpenSocketServer(RSocketServ& ss)
+/**
+ * Opens the socket server that is pointed to
+ * @param ss the socket server to open
+ * @return system wide error code
+ */
+    {
+    INFO_PRINTF1(_L("Opening Socket server"));
+	return (ss.Connect());
+    }
+
+void TE_RConnectionStep::CloseSocketServer(RSocketServ& ss)
+/**
+ * Closes the socket server that is pointed to
+ * @param ss the socket server to close
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Closing Socket server"));
+	ss.Close(); // Close() inherited from RHandleBase?
+}
+
+TInt TE_RConnectionStep::OpenConnection(RConnection& conn, RSocketServ& ss)
+/**
+ * Open the connection using the socket server too
+ * @param conn the connection to open
+ * @param ss the socket server within which the connection is to be opened
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Opening Connection"));
+	return (conn.Open(ss));
+}
+
+TInt TE_RConnectionStep::OpenConnection(RConnection& conn, RSocketServ& ss, TName& name)
+/**
+ * Open the connection (passing the name provided)
+ * @param conn - the connection to open
+ * @param ss - the socket server within which the connection is to be opened
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Opening Connection"));
+	return (conn.Open(ss, name));
+}
+
+TInt TE_RConnectionStep::StartConnection(RConnection& conn)
+/**
+ * Start a connection using the default comm db settings
+ * @param conn the connection to start
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	conn.Start(status);
+	INFO_PRINTF1(_L("Starting Connection"));
+	User::WaitForRequest(status);
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::StartConnectionSynchronous(RConnection& conn)
+/**
+ * Start a connection using the default comm db settings (using the synchronous call)
+ * @param conn - the connection to start
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Starting Connection"));
+	return (conn.Start());
+}
+
+void TE_RConnectionStep::StartConnectionAsynchronous(RConnection& conn, TRequestStatus& status)
+/**
+ * Start a connection using the default comm db settings (returning before it completes)
+ * @param conn - the connection to start
+ * @param system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Starting Connection"));
+	conn.Start(status);
+}
+
+TInt TE_RConnectionStep::StartConnectionWithOverrides(RConnection& conn, TInt iap)
+/**
+ * Start a connection on the IAP as specified by the param, do this by 
+ * building some database overrides.
+ * @param conn - the connection to start
+ * @param iap - which IAP to create the connection over
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	
+	TCommDbConnPref prefs;
+	prefs.SetIapId(iap);
+	prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+	conn.Start(prefs, status);
+	INFO_PRINTF1(_L("Starting Connection with over rides"));
+	User::WaitForRequest(status);
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::StartConnectionWithOverridesSynchronous(RConnection& conn, TInt iap)
+/**
+ * Start a connection on the IAP as specified by the param, do this by building some 
+ * database overrides. Use the synchronous start method
+ * @param conn - the connection to start
+ * @param iap - which IAP to create the connection over
+ * @return system wide error code
+ */
+{
+	TCommDbConnPref prefs;
+	prefs.SetIapId(iap);
+	INFO_PRINTF1(_L("Starting Connection with over rides"));
+	prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+	return (conn.Start(prefs));
+}
+
+void TE_RConnectionStep::StartConnectionWithOverridesAsynchronous(RConnection& conn, TCommDbConnPref& aPrefs, TInt iap, TRequestStatus& status)
+/**
+ * Start a connection on the IAP as specified by the param - return before it completes
+ * @param conn - the connection to start
+ * @param iap - which IAP to create the connection over
+ * @return system wide error code
+ */
+{
+	aPrefs.SetIapId(iap);
+	aPrefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+	INFO_PRINTF1(_L("Starting Connection with over rides"));
+	conn.Start(aPrefs, status);
+}
+
+
+
+void TE_RConnectionStep::CloseConnection(RConnection& conn)
+/**
+ * Close a connection
+ * @param conn the connection to close
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Closing Connection "));
+	conn.Close();
+}
+
+
+TInt TE_RConnectionStep::StopConnection(RConnection& conn)
+/**
+ * Force the connection to stop and remove the interface no matter what other connections are using it
+ * @param conn the connection to stop
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Stopping Connection "));
+	return (conn.Stop());
+}
+
+TInt TE_RConnectionStep::EnumerateConnections(RConnection& conn, TUint& num)
+/**
+ * Read how many connections (==interfaces?) exist at the moment
+ * @param conn - to be used to read the count
+ * @param num - on completion holds the number of connections
+ * @return system wide error code
+ */
+{
+	return (conn.EnumerateConnections(num));
+}
+
+TInt TE_RConnectionStep::GetTimeoutValues(RConnection& conn, TTimeoutValues &timeouts)
+/**
+ * Read the timeout values from commdb
+ * @param conn - the connection to read the values from
+ * @param timeouts - where to put the timeout vals
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Getting Timeout Values"));
+	TInt ret = KErrNone;
+	TInt tmp;
+	if (KErrNone != (tmp = conn.GetIntSetting(_L("ModemBearer\\LastSessionClosedTimeout"), timeouts.iShortTimeout)))
+		ret = tmp;
+	if (KErrNone != (tmp = conn.GetIntSetting(_L("ModemBearer\\LastSocketClosedTimeout"), timeouts.iMediumTimeout)))
+		ret = tmp;
+	if (KErrNone != (tmp = conn.GetIntSetting(_L("ModemBearer\\LastSocketActivityTimeout"), timeouts.iLongTimeout)))
+		ret = tmp;
+
+	return ret;
+}
+
+TInt TE_RConnectionStep::AttachNormal(RConnection& conn, const TDesC8& info)
+/**
+ * Attach the connection supplied to the one described by the info
+ * @param conn - the connection to be attached to something
+ * @param info - the details of the connection to attach to
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Attach Normal"));
+	return conn.Attach(info, RConnection::EAttachTypeNormal);
+}
+
+TInt TE_RConnectionStep::AttachMonitor(RConnection& conn, const TDesC8& info)
+/**
+ * Attach the connection supplied to the one described by the info (as a monitor)
+ * @param conn - the connection to be attached to something
+ * @param info - the details of the connection to attach to
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Attach Monitor"));
+	return conn.Attach(info, RConnection::EAttachTypeMonitor);
+}
+
+void TE_RConnectionStep::ProgressNotification(RConnection& conn, TRequestStatus& status, 
+											  TNifProgressBuf& progress, TUint aSelectedProgress)
+/**
+ * Request notification when the progress changed to that supplied
+ * @param conn - the connection we are interested in the progress of
+ * @param status - the status variable which should be updated eventually
+ * @param aSelectedProgress - the progress we want
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Progress Notification "));
+	conn.ProgressNotification(progress, status, aSelectedProgress);
+}
+
+void TE_RConnectionStep::ProgressNotification(RConnection& conn, TRequestStatus& status, 
+											  TNifProgressBuf& progress)
+/**
+ * Request notification of the next progress change
+ * @param conn - the connection whose status we are interested in
+ * @param status - the status variable that should be updated
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Progress Notification "));
+	conn.ProgressNotification(progress, status);
+}
+
+void TE_RConnectionStep::CancelProgressNotification(RConnection& conn)
+/**
+ * Cancel the notification of progress changes
+ * @param conn - the connection to cancel progress notification for
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Cancel Connection Progress Notification "));
+	conn.CancelProgressNotification();
+}
+
+TInt TE_RConnectionStep::Progress(RConnection& conn, TNifProgress& progress)
+/**
+ * Read the current progress state
+ * @param conn - the connection to read the progress of
+ * @param progress - where to put the read progress
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Progress"));
+	return conn.Progress(progress);
+}
+
+TInt TE_RConnectionStep::LastProgressError(RConnection& conn, TNifProgress& progress)
+/**
+ * Get the last progress error
+ * @param conn - the connection we are interested in
+ * @param progress - where to put the progress value (the error)
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Connection Last Progress Error"));
+	return conn.LastProgressError(progress);
+}
+
+TInt TE_RConnectionStep::GetConnectionInfo(RConnection& conn, TUint index, TDes8& aConnectionInfo)
+/**
+ * Read back the information about a particular connection (using the enumeration functionality)
+ * @param conn - the connection to use to access the info
+ * @param index - the index of the connection we want to find out about
+ * @param aConnectionInfo - where to write the info into
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Get Connection info "));
+	return conn.GetConnectionInfo(index, aConnectionInfo);
+}
+
+TInt TE_RConnectionStep::GetInfo(RConnection& conn, TPckgBuf<TConnectionInfo>& info)
+/**
+ * Read the info about this connection from comm db
+ * @param conn - the connection to read info about
+ * @param info - where to write the info to
+ * @return system wide error code
+ */
+{
+	_LIT(KIapTableIdDes, "IAP\\Id" );
+	_LIT(KIapTableIapNetworkDes, "IAP\\IAPNetwork" );
+
+	TInt ret = KErrNone;
+	ret = conn.GetIntSetting(KIapTableIdDes, info().iIapId);
+
+	const CommsDat::TMDBElementId KIapTableIdFieldId = KCDTIdIAPRecord | KCDTIdRecordTag;
+	const CommsDat::TMDBElementId KTapTableIapNetworkId = KCDTIdIAPNetwork;
+
+	if (ret == KErrNone)
+		{
+		ret = conn.GetIntSetting(KIapTableIapNetworkDes, info().iNetId);
+		}
+
+	ESock::XConnectionQuerySet* querySet = NULL;
+	if ( ret == KErrNone )
+		{
+		TRAP(ret, querySet = ESock::XConnectionQuerySet::NewL() );
+		}
+
+	if ( ret == KErrNone )
+		{
+		TRAP(ret, ESock::XUintQuery::NewL(KIapTableIdFieldId, *querySet) );
+		}
+
+	if ( ret == KErrNone )
+		{
+		TRAP(ret, ESock::XUintQuery::NewL(KTapTableIapNetworkId, *querySet) );
+		}
+
+	ESock::CConnectionQuerySet* connectionQuerySet = NULL;
+	if ( ret == KErrNone )
+		{
+		TRAP(ret, connectionQuerySet = ESock::CConnectionQuerySet::NewL(querySet) );
+		}
+
+	if ( ret == KErrNone )
+		{
+		querySet = NULL;
+		}
+
+	if ( ret == KErrNone )
+		{
+		ret = conn.GetParameters( *connectionQuerySet );
+		}
+
+	if ( ret == KErrNone )
+		{
+		TBool match = EFalse;
+		ESock::XConnectionQuerySet& outputQuerySet = connectionQuerySet->DataObject();
+		ESock::XUintQuery* iapTableIdQuery = static_cast<ESock::XUintQuery*>(outputQuerySet.FindQuery( KIapTableIdFieldId ));
+		ESock::XUintQuery* iapTableNetworkQuery = static_cast<ESock::XUintQuery*>(outputQuerySet.FindQuery( KTapTableIapNetworkId ));
+
+		match = ( iapTableIdQuery
+			&& iapTableNetworkQuery
+			&& iapTableIdQuery->Error() == KErrNone
+			&& iapTableNetworkQuery->Error() == KErrNone
+			&& iapTableIdQuery->IsQueryAnswered()
+			&& iapTableNetworkQuery->IsQueryAnswered()
+			&& iapTableIdQuery->Data() == info().iIapId
+			&& iapTableNetworkQuery->Data() == info().iNetId
+			);
+
+		if ( !match )
+			{
+			ret = KErrGeneral;
+			}
+		}
+
+	delete querySet;
+	delete connectionQuerySet;
+
+	REComSession::FinalClose();
+	return ret;
+}
+
+TInt TE_RConnectionStep::OpenUdpSocketL(RSocket& sock, RSocketServ& ss)
+/**
+ * Open a UDP socket within the supplied socket server. No connection is 
+ * specified so let the system implicitly decide which to use
+ * @param sock - the socket to open
+ * @param ss - the socket server
+ * @return system wide error code
+ */
+{
+	TInt err = KErrNone;
+	TInt ret = KErrNone;
+	
+	INFO_PRINTF1(_L("Opening Implicit UDP Socket"));
+
+	err = sock.Open(ss, KAfInet, KSockDatagram, KProtocolInetUdp);
+	TESTEL(KErrNone == ret, ret);
+	if (err != KErrNone)
+		ret = err;
+	
+	err = sock.SetOpt(KSoReuseAddr, KSolInetIp, 1);
+	TESTEL(err == KErrNone, err);
+	if (err != KErrNone)
+		ret = err;
+
+	err = sock.SetLocalPort(iEchoPortNum); 
+	TESTEL(err == KErrNone, err);
+	if (err != KErrNone)
+		ret = err;
+
+	return ret;
+}
+
+TInt TE_RConnectionStep::OpenUdpSocketExplicitL(RSocket& sock, RSocketServ& ss, RConnection& conn)
+/**
+ * Open a UDP socket with the supplied socket server. Associate it 
+ * with the specified connection.
+ * @param sock - the socket to open
+ * @param ss - the socket server
+ * @param conn - the connection to associate it with
+ * @return system wide error code
+ */
+{
+	TInt err;
+	TInt ret = KErrNone;
+	INFO_PRINTF1(_L("Opening Explicit UDP Socket"));
+
+	err = sock.Open(ss, KAfInet, KSockDatagram, KProtocolInetUdp, conn);
+	TESTEL(KErrNone == err, err);
+	if (err != KErrNone)
+		ret = err;
+
+	err = sock.SetOpt(KSoReuseAddr, KSolInetIp, 1); 
+	TESTEL(err == KErrNone, err);
+	if (err != KErrNone)
+		ret = err;
+
+	err = sock.SetLocalPort(iEchoPortNum); 
+	TESTEL(err == KErrNone, err);
+	if (err != KErrNone)
+		ret = err;
+	
+	return ret;
+}
+
+void TE_RConnectionStep::DestroyUdpSocket(RSocket& sock)
+/**
+ * Destroys the supplied socket
+ * @param sock - the socket to destroy
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Closing Socket"));
+	sock.Close();
+}
+
+TInt TE_RConnectionStep::OpenTcpSocket(RSocket& sock, RSocketServ& ss)
+/**
+ * Open a TCP socket within the supplied socket server. No connection is 
+ * specified so let the system implicitly decide which to use
+ * @param sock - the socket to open
+ * @param ss - the socket server
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Opening Implicit TCP Socket"));
+	return (sock.Open(ss, KAfInet, KSockStream, KProtocolInetTcp));
+}
+
+TInt TE_RConnectionStep::OpenTcpSocketExplicit(RSocket& sock, RSocketServ& ss, RConnection& conn)
+/**
+ * Open a TCP socket within the supplied socket server. Associate it with 
+ * the specified connection.
+ * @param sock - the socket to open
+ * @param ss - the socket server
+ * @param conn - the connection to associate it with
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Opening Explicit TCP Socket"));
+	return (sock.Open(ss, KAfInet, KSockStream, KProtocolInetTcp, conn));
+}
+
+TInt TE_RConnectionStep::ConnectTcpSocket(RSocket& sock, TSockAddr& addr)
+/**
+ * Connect the supplied TCP socket to the destination socket
+ * @param sock - the socket to connect up
+ * @param addr - the address of the destination to connect up to
+ */
+{
+	TRequestStatus status;
+	INFO_PRINTF1(_L("Connecting TCP Socket"));
+	sock.Connect(addr, status);
+	User::WaitForRequest(status);
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::ConnectFourTcpSockets(RSocket& sock1, RSocket& sock2, RSocket& sock3, RSocket& sock4, TSockAddr& dest)
+/**
+ * Connect the supplied TCP sockets to the destination socket
+ * @param sock1 - the first of the sockets to connect up
+ * @param sock2 - the second of the sockets to connect up
+ * @param sock3 - the third of the sockets to connect up
+ * @param sock4 - the fourth of the sockets to connect up
+ * @param dest - the address of the destination to connect up to
+ */
+{
+	TRequestStatus status[4];
+	INFO_PRINTF1(_L("Connecting TCP Socket"));
+	sock1.Connect(dest, status[0]);
+	INFO_PRINTF1(_L("Connecting TCP Socket"));
+	sock2.Connect(dest, status[1]);
+	INFO_PRINTF1(_L("Connecting TCP Socket"));
+	sock3.Connect(dest, status[2]);
+	INFO_PRINTF1(_L("Connecting TCP Socket"));
+	sock4.Connect(dest, status[3]);
+
+	// To avoid stray events we need (a) four signals and (b) all four sockets to have completed - as always it doesn't matter if the
+	// four signals aren't actually from these sockets, eg if lower priority things are completing
+	TInt signalsOutstanding = 4;
+	TBool allConnected;
+	do
+		{
+		User::WaitForAnyRequest();
+		--signalsOutstanding;
+		allConnected = (status[0].Int() != KRequestPending) && (status[1].Int() != KRequestPending) &&
+							(status[2].Int() != KRequestPending) && (status[3].Int() != KRequestPending);
+		} while(signalsOutstanding > 0 || !allConnected);
+
+	// If other requests complete while we're waiting for ours then have to re-add their signals
+	while(signalsOutstanding < 0)
+		{
+		TRequestStatus status;
+		TRequestStatus* dummyStatus = &status;
+		User::RequestComplete(dummyStatus, KErrNone);
+		++signalsOutstanding;
+		}
+
+	if (status[0].Int() != KErrNone)
+		return status[0].Int();
+	if (status[1].Int() != KErrNone)
+		return status[1].Int();
+	if (status[2].Int() != KErrNone)
+		return status[2].Int();
+	if (status[3].Int() != KErrNone)
+		return status[3].Int();
+
+	return KErrNone;
+}
+
+TInt TE_RConnectionStep::DestroyTcpSocket(RSocket& sock)
+/**
+ * Destroys the supplied socket
+ * @param sock - the socket to destroy
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	INFO_PRINTF1(_L("Shutting down TCP Socket"));
+	sock.Shutdown(RSocket::EImmediate, status);
+	User::WaitForRequest(status);
+	sock.Close();
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::OpenNullSocket(RSocket& sock, RSocketServ& ss)
+/**
+ * Open a socket but not associated to any protocol
+ * @param sock - the socket to open
+ * @param ss - the socket server to use
+ * @return system wide error code
+ */
+{
+	INFO_PRINTF1(_L("Open Null Socket"));
+	return (sock.Open(ss));
+}
+
+TInt TE_RConnectionStep::TransferSocket(RSocket& source, RSocket& target, RSocketServ& ss)
+/**
+ * Transfer a socket to another socket
+ * @param source - the socket to transfer from
+ * @param target - the socket to transfer to
+ * @param ss - the socket server the original socket is in
+ * @return system wide error code
+ */
+{
+	//-- note that RSocket::Transfer() operation since 8.1b shall be additionally enabled by 
+	//-- setting KSOEnableTransfer socket option with appropriate capabilities set for the 
+	//-- process that "pulls" the socket. It shall be done before calling this function.
+	TName name;
+
+	source.Name(name);
+
+	return target.Transfer(ss, name);
+}
+
+
+TInt TE_RConnectionStep::OpenHostResolver(RHostResolver& hr, RSocketServ& ss)
+/**
+ * Open a host resolver within the supplied socket server. No connection is 
+ * specified sp let the system decide which to use
+ * @param hr - the host resolver to open
+ * @param ss - the socket server to use
+ * @return system wide error code
+ */
+{
+	return (hr.Open(ss, KAfInet, KProtocolInetTcp));
+}
+
+TInt TE_RConnectionStep::OpenHostResolverExplicit(RHostResolver& hr, RSocketServ& ss, RConnection& conn)
+/**
+ * Open a host resolver within the supplied socket server. Associate it with 
+ * the specified connection
+ * @param hr - the host resolver to open
+ * @param ss - the socket server to use
+ * @param conn - the connection to associate it with
+ * @return system wide error code
+ */
+{
+	return (hr.Open(ss, KAfInet, KProtocolInetUdp, conn));
+}
+
+TInt TE_RConnectionStep::MakeNameRequest(RHostResolver& hr, const TDesC& aName)
+/**
+ * Make a name request
+ * @param hr - the host resolver to make the request with
+ * @param aName - the name to resolve
+ * @return system wide error code
+ */
+{	
+	TRequestStatus status;
+	TNameEntry result;
+	INFO_PRINTF1(_L("Performing Asynchronous GetByName()"));
+	hr.GetByName(aName, result, status);
+	User::WaitForRequest(status);
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::MakeSynchronousNameRequest(RHostResolver& hr, const TDesC& aName)
+/**
+ * Make a name request using the synchronous method
+ * @param hr - the host resolver to make the request with
+ * @param aName - the name to resolve
+ * @return system wide error code
+ */
+{
+	TNameEntry result;
+	INFO_PRINTF1(_L("Performing Synchronous GetByName()"));
+	return (hr.GetByName(aName, result));
+}
+
+TInt TE_RConnectionStep::MakeAddressRequest(RHostResolver& hr, const TSockAddr& addr)
+/**
+ * Make a request FOR a name using GetByAddress()
+ * @param hr - the host resolver to use
+ * @param addr - the address to pass in
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	TNameEntry name;
+	INFO_PRINTF1(_L("Performing Asynchronous GetByAddress()"));
+	hr.GetByAddress(addr, name, status);
+	User::WaitForRequest(status);
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::MakeSynchronousAddressRequest(RHostResolver& hr, const TSockAddr& addr)
+/**
+ * Make a request FOR a name using GetByAddress() [use the synchronous version]
+ * @param hr - the host resolver to use
+ * @param addr - the address to pass in
+ * @return system wide error code
+ */
+{
+	TNameEntry name;
+	INFO_PRINTF1(_L("Performing Synchronous GetByAddress()"));
+	return (hr.GetByAddress(addr, name));
+}
+
+void TE_RConnectionStep::DestroyHostResolver(RHostResolver& hr)
+/**
+ * Destroy the supplied host resolver
+ * @param hr - the host resolver to destroy
+ * @return system wide error code
+ */
+{
+	hr.Close();
+}
+
+TInt TE_RConnectionStep::SendUdpData(RSocket& aSock, TSockAddr& aDest, TUint aPayloadSize)
+/**
+ * Send UDP data (an ICMP packet) over the socket specified to the address specified.
+ * @param aSock The socket to use for the send
+ * @param aDest The destination to send the data to
+ * @param aPayloadSize The size of the packet to send
+ * @return system wide error code
+ */
+{
+	TBuf8<KMaxBufferLength> buffer;
+	TRequestStatus status;
+
+	// construct an ICMP packet to send on the socket
+	buffer.SetMax();
+	buffer.FillZ();
+	buffer[0] = (TUint8) 0x08; // ICMP type = 8
+	buffer[1] = (TUint8) 0x00; // ICMP code = 0
+	buffer[2] = (TUint8) 0xF7; // ICMP checksum high byte
+	buffer[3] = (TUint8) 0xFF; // ICMP checksum low byte
+	buffer[13] = (TUint8) 0xFE;
+	// NB the rest of the buffer is zero
+	// hence the checksum (0xFFFF - 0x800) since 0x8
+	// is the only non-zero element of the buffer
+
+	// set the length of the data to be sent to that specified (payload size!)
+	buffer.SetLength(aPayloadSize);
+
+	// send the data out over the socket
+	aSock.SendTo(buffer, aDest, 0, status);
+	User::WaitForRequest(status);
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::RecvUdpData(RSocket& aSock, TSockAddr& aDest, TUint aPayloadSize)
+/**
+ * Receive UDP packet from the network
+ * @param aSock The socket to receive the packet on
+ * @param aDest The address to receive the packet from
+ * @param aPayloadSize The size of the packet to receive
+ * @return system wide error code
+ */
+{
+	TBuf8<KMaxBufferLength> buffer;
+	TRequestStatus status;
+	TInt timeoutInSecs = 10;
+	RTimer timer;
+	TRequestStatus timerStatus;
+
+	// Create a timer so that we dont rely on being errored by esock alone
+	TInt ret;
+	if ((ret = timer.CreateLocal()) != KErrNone)
+	{
+		INFO_PRINTF2(_L("RTimer::CreateLocal() returned %d"), ret);
+		timer.Close(); // from looking at impl shouldn't do any harm to call Close() here
+		return ret;
+	}
+
+	timer.After(timerStatus, timeoutInSecs * 1000000);
+
+	buffer.Zero();
+	buffer.SetLength(aPayloadSize);
+
+	aSock.RecvFrom(buffer, aDest, 0, status);
+	User::WaitForRequest(status, timerStatus);
+
+	// Timer expired, cancel the read
+	if(timerStatus != KRequestPending)
+		{
+		aSock.CancelAll();
+		User::WaitForRequest(status);
+		timer.Close();
+		return KErrTimedOut;
+		}
+	// otherwise cancel the timer
+	timer.Cancel();
+	User::WaitForRequest(timerStatus);
+	timer.Close();
+
+	// don't use TESTEL here as the test case may be expecting us to fail and that's ok...
+	if (status != KErrNone)
+		return status.Int();
+	else
+	{   // check that what we sent is what we got back
+		// if the receive times out and we access buffer we get a panic
+		TEST(buffer[0] == 0x08);
+		TEST(buffer[1] == 0x00);
+		TEST(buffer[2] == 0xF7);
+		TEST(buffer[3] == 0xFF);
+	}
+
+	return KErrNone;
+}
+
+TInt TE_RConnectionStep::TestUdpDataPathL(RSocket& aSock, TSockAddr& aDest, TUint aPayloadSize)
+/**
+ * Sends data to the address specified (dest) and expects to receive it looped back unchanged
+ * @param aSock The socket to send the data over (and receive it over)
+ * @param aDest The destination to send the traffic to
+ * @param aPayloadSize The amount of data to sent (defaults to KBufferLength)
+ * @return system wide error code
+ */
+{
+	TInt err;
+	INFO_PRINTF1(_L("Sending UDP Data"));
+	err = SendUdpData(aSock, aDest, aPayloadSize);
+	if (err != KErrNone)
+		return err;
+
+	INFO_PRINTF1(_L("Receiving UDP Data"));
+	err = RecvUdpData(aSock, aDest, aPayloadSize);
+	// don't use TESTEL here as the test case may be expecting us to fail and that's ok...
+	return err;
+}
+
+TInt TE_RConnectionStep::SendTcpData(RSocket& aSock)
+/**
+ * Send TCP data over the socket specified to the address specified.
+ * @param aSock The socket to use for the send
+ * @param aPayloadSize The size of the packet to send
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	TBuf8<KBufferLength> buffer;
+
+	// build some data to send
+	buffer.SetMax();
+	buffer.FillZ();
+	buffer[0] = (TUint8) 0x08; // ICMP type = 8;
+	buffer[1] = (TUint8) 0x00; // ICMP code = 0;
+	buffer[2] = (TUint8) 0xF7; // ICMP checksum high byte
+	buffer[3] = (TUint8) 0xFF; // ICMP checksum low byte
+
+	// send the data
+	aSock.Send(buffer, 0, status);
+	User::WaitForRequest(status);
+
+	return status.Int();
+}
+
+TInt TE_RConnectionStep::RecvTcpData(RSocket& aSock)
+/**
+ * Receive TCP packet from the network
+ * @param aSock The socket to receive the packet on
+ * @param aPayloadSize The size of the packet to receive
+ * @return system wide error code
+ */
+{
+	TRequestStatus status;
+	TBuf8<KBufferLength> buffer;
+	buffer.Zero();
+
+	// hopefully get the same data back that was sent
+	aSock.Recv(buffer, 0, status);
+	User::WaitForRequest(status);
+
+	if (status != KErrNone)
+		return status.Int();
+	else
+	{	// check that what we sent is what we got back
+		// if the receive times out and we access the buffer we get a panic
+		TEST(buffer[0] == 0x08);
+		TEST(buffer[1] == 0x00);
+		TEST(buffer[2] == 0xF7);
+		TEST(buffer[3] == 0xFF);
+	}
+
+	return KErrNone;
+}
+
+TInt TE_RConnectionStep::TestTcpDataPathL(RSocket& sock)
+/**
+ * Sends data and expects to receive it looped back unchanged
+ * @param sock The socket to send the data over (and receive it over)
+ * @param aPayloadSize The amount of data to sent (defaults to KBufferLength)
+ * @return system wide error code
+ * @note there is no address parameter, the socket must already be connected
+ */
+{
+	TInt err;
+
+	err = SendTcpData(sock);
+	if (err != KErrNone)
+		return err;
+
+	err = RecvTcpData(sock);
+
+	return err;
+}
+
+TInt TE_RConnectionStep::NumberOfInterfacesL(RSocketServ& ss)
+/**
+ * Return a count of interfaces in this socket server.
+ * Can be used even if this socket server has no open connections (because it 
+ * temporarily opens one!).
+ * @param ss - the interesting socket server to count in
+ * @return number of interfaces, or it might leave
+ */
+{
+	TInt err;
+	RConnection conn;
+	TUint numOfConnections;
+
+	err = OpenConnection(conn, ss);
+	TESTEL(KErrNone == err, err);
+	CleanupClosePushL(conn);
+
+	err = EnumerateConnections(conn, numOfConnections);
+	TESTEL(KErrNone == err, err);
+
+	CloseConnection(conn);
+	CleanupStack::Pop();
+
+	return numOfConnections;
+}
+
+TInt TE_RConnectionStep::TimeUntilRequestComplete(TRequestStatus& status, TTimeIntervalSeconds& timeElapsed)
+/**
+ * Wait for the status to change. Count how long it takes.
+ * @param status - the status which we need to wait for it to change
+ * @param timeElapsed - the time it took (in seconds)
+ * @return system wide error code
+ */
+{
+	TTime time1, time2;
+
+	time1.HomeTime();
+
+	User::WaitForRequest(status);
+		
+	time2.HomeTime();
+	time2.SecondsFrom(time1, timeElapsed);
+
+	return (status.Int());
+}
+
+TInt TE_RConnectionStep::RequestInterfaceDownL(RConnection& conn, RSocketServ& ss)
+/**
+ * Sends a special packet to the dummy nif telling it to signal that the interface is down
+ * @param conn The connection to signal
+ * @param ss The socket server that the connection is within
+ * @return system wide error code
+ */
+{
+	TInt err = KErrNone;
+	TRequestStatus status;
+
+	TBuf8<KBufferLength> buffer;
+
+	RSocket sock;
+	TInetAddr dest;
+
+	err = OpenUdpSocketExplicitL(sock, ss, conn);
+	TESTEL(KErrNone == err, err);
+	CleanupClosePushL(sock);
+
+	//err = sock.SetLocalPort(KDummyNifCmdPort);
+	//TESTEL(KErrNone == err, err);
+
+	dest.SetAddress(KDummyNifLocalAddressBase + 4);
+	dest.SetPort(KDummyNifCmdPort);
+
+	buffer.SetMax();
+	buffer.FillZ();
+	buffer[0] = (TUint8) KForceDisconnect;
+
+	sock.SendTo(buffer, dest, 0, status);
+	User::WaitForRequest(status);
+	TESTEL(KErrNone == status.Int(), status.Int());
+
+	buffer.Zero();
+	// I expect some sort of response
+	// this fails - possibly ok as the interface might have gone already??
+	//sock.RecvFrom(buffer, dest, 0, status);
+	//User::WaitForRequest(status);
+	//TESTEL(KErrNone == status.Int(), status.Int());
+
+	DestroyUdpSocket(sock);
+	CleanupStack::Pop();
+
+	return err;
+}
+
+TInt TE_RConnectionStep::RequestSetStausL(RConnection& conn, RSocketServ& ss, TSubConnectionUniqueId aSubConnId)
+/**
+ * Sends a special packet to the dummy nif allowing the setting of the connection progress
+ * @param conn The connection to signal
+ * @param ss The socket server that the connection is within
+ * @return system wide error code
+ */
+{
+	TInt err = KErrNone;
+	TRequestStatus status;
+
+	TBuf8<KBufferLength> buffer;
+
+	RSocket sock;
+	TInetAddr dest;
+
+	err = OpenUdpSocketExplicitL(sock, ss, conn);
+	TESTEL(KErrNone == err, err);
+	CleanupClosePushL(sock);
+
+	dest.SetAddress(KDummyNifLocalAddressBase + 4);
+	dest.SetPort(KDummyNifCmdPort);
+
+	buffer.SetMax();
+	buffer.FillZ();
+	buffer[0] = (TUint8) KForceFinishedSelection;
+	buffer[1] = (TUint8) aSubConnId;
+	
+	sock.SendTo(buffer, dest, 0, status);
+	User::WaitForRequest(status);
+	TESTEL(KErrNone == status.Int(), status.Int());
+
+	buffer.Zero();
+
+	DestroyUdpSocket(sock);
+	CleanupStack::Pop();
+
+	return err;
+}
+
+
+TInt TE_RConnectionStep::WaitForAllInterfacesToCloseL(RSocketServ& ss, TTimeIntervalSeconds aMaxSecsToWait)
+/*
+ * Sit around waiting for all the interfaces to die (essentially poll every now 
+ * and again until there are zero interfaces in this socket server left)
+ * @param ss Socket Server session to use
+ * @param aMaxSecsToWait maximum number of seconds to wait for the interface to come down.
+ * @return system wide error code
+ */
+	{
+	TInt err;
+	TUint numOfConnections;
+	TInt count = 0;
+	const TInt KOneSecond = 1000000;
+
+	RConnection conn;
+
+	err = OpenConnection(conn, ss);
+	TESTEL(KErrNone == err, err);
+	CleanupClosePushL(conn);
+
+	err = EnumerateConnections(conn, numOfConnections);
+	TESTEL(KErrNone == err, err);
+
+	while ((0 != numOfConnections) && (count < aMaxSecsToWait.Int()))
+	{
+		count++;
+		User::After(KOneSecond); // wait a bit, a second sounds good
+		err = EnumerateConnections(conn, numOfConnections);
+	}
+
+	CloseConnection(conn);
+	CleanupStack::Pop();
+
+	if (numOfConnections != 0)
+		{
+		return KErrTimedOut;
+		}
+
+	return KErrNone;
+	}
+
+void TE_RConnectionStep::PerformDummyStartAttachOperationsL(RSocketServ& ss, TPckgBuf<TConnectionInfo>& info)
+/*
+ * Do some attached and starts. One monitor, one normal and one actual interface.
+ * Close in two different orders.
+ * @param ss - the socket server to do this in
+ * @param info - some info
+ * @return system wide error code
+ */
+{
+	TInt err;
+
+	RConnection conn1, conn2, conn3;
+
+	TInt count;
+
+	for (count=0; count<2; count++)
+	{
+		// attach one as a monitor
+		err = OpenConnection(conn1, ss);
+		TESTEL(KErrNone == err, err);
+		CleanupClosePushL(conn1);
+		err = AttachMonitor(conn1, info);
+		TESTEL(KErrNone == err, err);
+
+		// attach one normally
+		err = OpenConnection(conn2, ss);
+		TESTEL(KErrNone == err, err);
+		CleanupClosePushL(conn2);
+		err = AttachNormal(conn2, info);
+		TESTEL(KErrNone == err, err);
+
+		// create an actual interface (maybe?)
+		err = OpenConnection(conn3, ss);
+		TESTEL(KErrNone == err, err);
+		CleanupClosePushL(conn3);
+		err = StartConnectionWithOverrides(conn3, iDummyNifIap);
+		TESTEL(KErrNone == err, err);
+
+		if (count == 0)
+		{
+			// On first time thru close the interfaces in reverse order
+			CloseConnection(conn3);
+			CleanupStack::Pop();
+			CloseConnection(conn2);
+			CleanupStack::Pop();
+			CloseConnection(conn1);
+			CleanupStack::Pop();
+		}
+		else
+		{
+			// Second time thru close in a different order (fwd order)
+			CloseConnection(conn1);
+			CleanupStack::Pop(3);
+			CleanupClosePushL(conn3); // sneaky.... put them back on in the 
+			CleanupClosePushL(conn2); // order that is easier for us below...
+			CloseConnection(conn2);
+			CleanupStack::Pop();
+			CloseConnection(conn3);
+			CleanupStack::Pop();
+		}
+	}
+}
+
+void TE_RConnectionStep::AllInterfaceNotification(RConnection& conn, TRequestStatus& status, TDes8& aNotification)
+/**
+ * Requests all interface notification
+ * @param conn The connection to use to request notification
+ * @param status Asynchronous status of the request
+ * @param aNotification The descriptor which the notification is to be written into
+ * @return nothing
+ */
+	{
+	conn.AllInterfaceNotification(aNotification, status);
+	}
+
+void TE_RConnectionStep::CancelAllInterfaceNotificationL(RConnection& conn)
+/**
+ * Cancels outstanding request for all interface notification
+ * @param conn The connection on which to cancel the request
+ * @return nothing
+ */
+	{
+	conn.CancelAllInterfaceNotification();
+	}
+
+void TE_RConnectionStep::CheckInterfaceNotificationL(TRequestStatus& status, TInterfaceNotificationBuf& info, TConnInterfaceState interfaceState, RConnection* sourceConnection)
+/**
+ * Checks for particular connection interface state
+ * @param status Asynchronous status of request
+ * @param info Buffer which info will be written into
+ * @param interfaceState Also will be updated and then monitored
+ * @param sourceConnection Connection which all this relates to
+ * @return nothing
+ */
+	// checks for particular connection interface state
+	{
+	// wait for completion - to ensure that monitoring actually occurs
+	User::WaitForRequest(status);
+
+	// check request completed OK
+	TESTEL(status.Int() == KErrNone, status.Int());
+
+	// check connection state is as expected
+	TESTEL(info().iState == interfaceState, info().iState);
+
+	if(NULL != sourceConnection)
+		{
+		CheckConnectionInfoL(*sourceConnection,info().iConnectionInfo);
+		}
+	}
+
+void TE_RConnectionStep::CheckConnectionInfoL(RConnection& connection, TConnectionInfo& info)
+/**
+ * Checks connection info with the expected
+ * @param connection The connection all this relates to
+ * @param info The info to compare with the actual settings for connection
+ * @return nothing
+ */
+	{
+	TInt err;
+	TUint32 connIapId;
+	TUint32 connNetId;
+
+	// get settings for the connection
+	err = connection.GetIntSetting(_L("IAP\\Id"), connIapId);
+	TESTEL(err == KErrNone, err);
+	err = connection.GetIntSetting(_L("IAP\\IAPNetwork"), connNetId);
+	TESTEL(err == KErrNone, err);
+
+	// check IAP Id matches
+	TESTEL(info.iIapId == connIapId, info.iIapId);
+	// check Network Id matches
+	TESTEL(info.iNetId == connNetId, info.iNetId);
+	}
+
+TInt TE_RConnectionStep::EnumerateClients(RConnection& aConn, TUint aIndex, TUint& aCount)
+/*
+ * Count how many clients there are
+ * @param aConn The connection to use to enumerate the clients
+ * @param aIndex The index to use
+ * @param aCount The count of how many clients there are
+ * @return system wide error code
+ */
+	{
+
+	TInt err(KErrNone);
+
+	TConnEnumArgBuf args;
+	args().iIndex = aIndex;
+	err = aConn.Control(KCOLConnection, KCoEnumerateConnectionClients, args);
+	aCount = args().iCount;
+	
+	return err;
+	}
+
+TInt TE_RConnectionStep::GetConnectionClientInfo(RConnection& aConn, TUint aIndex, TConnectionClientInfo& aClientInfo)
+/**
+ * Get the information about a client
+ * @param aConn The connection to use
+ * @param aIndex The index to use
+ * @param aClientInfo Where to write the information to
+ * @return system wide error code
+ */
+	{
+
+	TInt err(KErrNone);
+
+	TConnGetClientInfoArgBuf args;
+	args().iIndex = aIndex;
+	err = aConn.Control(KCOLConnection, KCoGetConnectionClientInfo, args);
+	aClientInfo = args().iClientInfo;
+
+	return err;
+	}
+
+TInt TE_RConnectionStep::EnumerateSockets(RConnection& aConn, TUint aIndex, TUint& aCount)
+/**
+ * Count how many sockets there are
+ * @param aConn The connection to use
+ * @param aIndex The index to use
+ * @param aCount The count of how many sockets there are
+ * @return system wide error code
+ */
+	{
+
+	TInt err(KErrNone);
+
+	TConnEnumArgBuf args;
+	args().iIndex = aIndex;
+	err = aConn.Control(KCOLConnection, KCoEnumerateConnectionSockets, args);
+	aCount = args().iCount;
+
+	return err;
+	}
+
+TInt TE_RConnectionStep::GetConnectionSocketInfo(RConnection& aConn, TUint aIndex, TConnectionSocketInfo& aSocketInfo)
+/**
+ * Get the information about a socket
+ * @param aConn The connection to use
+ * @param aIndex The index to use
+ * @param aSocketInfo Where to write the information to
+ * @return system wide error code
+ */
+	{
+
+	TInt err(KErrNone);
+
+	TConnGetSocketInfoArgBuf args;
+	args().iIndex = aIndex;
+	err = aConn.Control(KCOLConnection, KCoGetConnectionSocketInfo, args);
+	aSocketInfo = args().iSocketInfo;
+
+	return err;
+	}
+	
+TInt TE_RConnectionStep::LoadNapt(RSocket& aNaptsock,RSocket& aTestServSock, RSocketServ& aSockServer)
+/**
+ * Load Napt.Provide TInterfaceLockInfo information 
+ * @param naptsock - the napt socket to open
+ * @param ss - the socket server
+ * @param testServSock - socket connected to test server
+ * @return system wide error code
+ */
+	{
+	const TInt netMaskLength   = 8;
+    TInt err(KErrNone);
+     	
+    err = aNaptsock.Open(aSockServer,_L("napt"));
+    if(err != KErrNone)
+    	{
+      	INFO_PRINTF2(_L("Load NAPT failed with error: %d."),err);
+      	return err;
+		}
+            
+    _LIT(KInterfaceName,"ipcp::comm");
+    _LIT(KInterfaceName1,"eth");
+    TUint32 testaddr = GetInterfaceAddress(aTestServSock,KInterfaceName());
+     	     
+    TPckgBuf <TInterfaceLockInfo> info;    
+	info().iPublicIap  = iNaptPublicIap;  
+	info().iPrivateIap = iNaptPrivateIap;  
+    TInetAddr::Cast	(info().iPrivateIp).SetV4MappedAddress(iNaptTestServAddr.Address()); 
+    TInetAddr::Cast(info().iPublicIp).SetV4MappedAddress(testaddr) ; 
+    info().iNetmaskLength = netMaskLength; 
+    info().iIfIndex = GetInterfaceIndexL(aTestServSock, KInterfaceName1());
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION	
+ 	info().iUplinkAccess = ETrue;
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+    
+	err = aNaptsock.SetOpt(KSoNaptSetup,KSolNapt,info);
+	if(err != KErrNone)
+    	{
+      	INFO_PRINTF2(_L("Set Option for NAPT failed with error: %d."),err);
+      	return err;
+		} 
+	return err;
+	}
+
+TInt TE_RConnectionStep::ProdQoSL(RConnection& aConn, RSocketServ& aSs)
+/**
+ * If you want to use the primary context on a NIF, GUQoS will drop the first packet you send (as it won't yet be aware of the primary). So call this method which sends a packet (thus prodding GUQoS into life).
+ * @param aConn A connection to send the packet over (should really be an interface supporting multiple contexts!)
+ * @param aSs A socket server within which the connection was created
+ * @return system wide error code
+ */
+{
+	TInt err;
+	RSocket sock;
+
+	err = OpenUdpSocketExplicitL(sock, aSs, aConn);
+	TESTEL(KErrNone == err, err);
+
+	err = SendUdpData(sock, iEchoServerAddr, KSmallBufferLength);
+	TESTEL(KErrNone == err, err);
+	CleanupClosePushL(sock);
+
+	DestroyUdpSocket(sock);
+	CleanupStack::Pop(&sock);
+
+	User::After(KOneSecondDelay);
+
+	return err; // will always be KErrNone if we reach here
+}
+
+/**
+ * Waits idefinitely until a relevant (specified) progress notification is received. 
+ * All other progress notifications are ignored.
+ * On return, aProgress contains the requested progress.
+ * @param aConn A connection to wait on for a progress.
+ * @param aStatus progress notification request status.
+ * @param aProgress a buffer for the relevant progress.
+ * @param aRelevantProgress a progress to wait for.
+ */
+void TE_RConnectionStep::WaitForRelevantProgress(RConnection& aConn, TNifProgressBuf& aProgress, TInt aRelevantProgress)
+	{
+	TRequestStatus reqStatus;
+		
+	for(;;) // WINS compiler generates a warning if while(ETrue) is used.
+		{
+		aConn.ProgressNotification(aProgress, reqStatus);
+		User::WaitForRequest(reqStatus);				
+		if(aRelevantProgress == aProgress().iStage)
+			{	
+			break;			
+			}
+		}
+	}
+	
+TUint32 TE_RConnectionStep::GetInterfaceAddress(RSocket& sock,const TDesC& aFName)
+/**
+ * Get interface gloabal Ip Address
+ * @param sock - socket connection
+ * @param aFName - interface name
+ * @return Ip address
+ */
+{ 
+	TName address;
+	TBool isSiteLocal,isLinkLocal;
+	TInt retVal = -1;
+	
+	TPckgBuf<TSoInetInterfaceInfo> info; 
+	 
+ 	retVal = sock.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
+ 	TESTEL(retVal == KErrNone, retVal);
+ 	
+    retVal = sock.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info);
+    TESTEL(retVal == KErrNone, retVal);
+            
+   	while(retVal==KErrNone)
+		 {
+	 	 info().iAddress.Output(address);
+				
+		 isSiteLocal = info().iAddress.IsSiteLocal();	
+		 isLinkLocal = info().iAddress.IsLinkLocal();
+	
+		 TInt str = info().iName.Find(aFName);
+		 if((str == KErrNone) && (isSiteLocal == EFalse) && (isLinkLocal == EFalse))
+		    {
+	         INFO_PRINTF2(_L("Interface address obtained: %S."),&address);
+		     break;
+			}
+		  
+		  retVal = sock.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info);
+	      }
+
+	return info().iAddress.Address();
+}
+
+TUint32 TE_RConnectionStep::GetInterfaceIndexL(RSocket& sock,const TDesC& aFName)
+/**
+ * Get interface index
+ * @param sock - socket connection
+ * @param aFName - interface name
+ * @return Interface index
+ */
+{ 
+    TPckgBuf<TSoInetInterfaceInfo> interfaceInfo; 
+    TPckgBuf<TSoInetIfQuery> queryInfo;
+    
+    TName address;
+    TInt retVal = KErrNotFound;
+
+    retVal = sock.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
+    TESTEL(retVal == KErrNone, retVal);
+    
+    retVal = sock.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, interfaceInfo);
+    TESTEL(retVal == KErrNone, retVal);
+            
+    while(retVal==KErrNone)
+         {
+         TInt str = interfaceInfo().iName.Find(aFName);
+         if(str == KErrNone)
+            {
+            queryInfo().iName = interfaceInfo().iName;
+            break;
+            }
+          retVal = sock.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, interfaceInfo);
+          }
+    TESTEL(retVal == KErrNone, retVal);
+    
+    retVal = sock.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, queryInfo);
+    TESTEL(retVal == KErrNone, retVal);
+    
+    return queryInfo().iIndex;
+}
+
+
+
+/*
+ * Now the stuff for the peculiar tests that need to use QoS
+ */
+
+TE_RConnectionQoSStep::TE_RConnectionQoSStep() : TE_RConnectionStep()
+/**
+ * Constructor for TE_RConnectionQoSStep, an abstract class derived from by any steps dealing with QoS. Must use two phase construction.
+ */
+{
+}
+
+void TE_RConnectionQoSStep::Log( TRefByValue<const TDesC16> format, ... )
+	{
+	VA_LIST aList;
+	VA_START( aList, format );
+
+	// decode formated data for display on console
+	TBuf <MAX_LOG_LINE_LENGTH> LineBuf;
+	LineBuf.AppendFormatList( format, aList );
+
+	INFO_PRINTF1(LineBuf);
+
+	VA_END( aList ); 
+	}
+
+
+
+
+
+TE_RConnectionQoSStep::TS_QosChannel::TS_QosChannel(TE_RConnectionQoSStep& aTestStep)
+:iTestStep(aTestStep)
+/**
+ * Constructor for TE_RConnectionQoSStep, an abstract class derived from by any steps dealing with QoS. Must use two phase construction.
+ */
+{
+}
+
+
+TE_RConnectionQoSStep::TS_QosChannel::~TS_QosChannel()
+/**
+ * Destructor for ~TS_QosChannel
+ */
+{
+}
+
+void TE_RConnectionQoSStep::TS_QosChannel::ConstructL()
+/**
+ * Second phase constructor for TE_RConnectionQoSStep derived classes.
+ * @param none
+ * @return nothing
+ */
+{
+}
+
+
+TInt TE_RConnectionQoSStep::TS_QosChannel::Open(RSocketServ& aServer, RConnection& aConnection)
+{
+	return iChannel.Open(aServer, RSubConnection::ECreateNew, aConnection);
+}
+
+
+TInt TE_RConnectionQoSStep::TS_QosChannel::Add(RSocket aSocket)
+{
+	TRequestStatus subconnReqStat;
+	iChannel.Add(aSocket, subconnReqStat);
+	User::WaitForRequest(subconnReqStat);
+	return subconnReqStat.Int();
+}
+
+TInt TE_RConnectionQoSStep::TS_QosChannel::Close()
+{
+	iChannel.Close();
+	REComSession::FinalClose();
+	return KErrNone;
+}
+
+TInt TE_RConnectionQoSStep::TS_QosChannel::SetQoSParametersL()
+/**
+ * Set up a standard set of QoS parameters to be used by derived classes
+ * @param aParameters Where to write the standard parameters to
+ * @return system wide error code
+ */
+{
+	TInt err = KErrNone;
+	//------------------------------------
+	//1. Initialise QoS params structure;
+	//------------------------------------
+	//create a container for QoS sub connection parameters (Param bundle takes ownership)
+	RSubConParameterBundle subconnParams;
+	CleanupClosePushL(subconnParams);
+
+	CSubConParameterFamily* family = CSubConParameterFamily::NewL(subconnParams, KSubConQoSFamily);
+
+	//create the generic set
+	CSubConQosGenericParamSet* subConQosGenParSet = CSubConQosGenericParamSet::NewL(*family, CSubConParameterFamily::ERequested);
+	
+	//Qos mapping extracted from ipcpr.cpp MapGenericParamsFromESockToPRTL(...)
+
+	//1. TokenRateUplink
+	//NO MAPPING for subConQosGenParSet->SetTokenRateUplink(1024);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetTokenRateUplink(TUint32 aRate);
+
+	//2. TokenBucketSizeUplink
+	//Mapping based on:
+	//	TInt uplinkBandwidth = generic->GetUplinkBandwidth();
+	//  params.SetTokenBucketSizeUplink((TUint32)uplinkBandwidth);
+	subConQosGenParSet->SetUplinkBandwidth(896);
+	
+	//3. MaxTransferRateUplink
+	//Mapping based on:
+	//  TInt upLinkMaximumBurstSize = generic->GetUpLinkMaximumBurstSize();
+	//  params.SetMaxTransferRateUplink((TUint32)upLinkMaximumBurstSize);
+	subConQosGenParSet->SetUpLinkMaximumBurstSize(1024);
+	
+	//4. MaxPacketSizeUplink
+	//Mapping based on:
+	//	TInt upLinkMaximumPacketSize = generic->GetUpLinkMaximumPacketSize();
+	//	params.SetMaxPacketSizeUplink((TUint32)upLinkMaximumPacketSize);
+	subConQosGenParSet->SetUpLinkMaximumPacketSize(735);
+	
+	//5. MinPolicedUnitUplink
+	//Mapping based on:
+	//	TInt upLinkDelayVariation = generic->GetUpLinkDelayVariation();
+	//	params.SetMinPolicedUnitUplink((TUint32)upLinkDelayVariation);
+	subConQosGenParSet->SetUpLinkDelayVariation(0);
+	
+	//6. DelayUplink
+	//Mapping based on:
+	//	TInt upLinkDelay = generic->GetUpLinkDelay();
+	//	params.SetDelayUplink((TUint32)upLinkDelay);
+	subConQosGenParSet->SetUpLinkDelay(0);
+
+	//7. PriorityUplink
+	//Mapping based on:
+	//	TInt upLinkPriority = generic->GetUpLinkPriority();
+	//	params.SetPriorityUplink((TUint16)upLinkPriority);
+	subConQosGenParSet->SetUpLinkPriority(3);
+	
+	//8. DropModeUplink
+	//NO MAPPING for subConQosGenParSet->SetDropModeUplink(KPfqosDropTail);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetDropModeUplink(TUint8 aDropMode);
+
+	//9. TokenRateDownlink
+	//NO MAPPING for subConQosGenParSet->SetTokenRateDownlink(1024);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetTokenRateDownlink(TUint32 aRate);
+	
+	//10. TokenBucketSizeDownlink
+	//Mapping based on:
+	//	TInt downlinkBandwidth = generic->GetDownlinkBandwidth();
+	//	params.SetTokenBucketSizeDownlink((TUint32)downlinkBandwidth);
+	subConQosGenParSet->SetDownlinkBandwidth(768);
+	
+	//11. MaxTransferRateDownlink
+	//Mapping based on:
+	//	TInt downLinkMaximumBurstSize = generic->GetDownLinkMaximumBurstSize();
+	//	params.SetMaxTransferRateDownlink((TUint32)downLinkMaximumBurstSize);
+	subConQosGenParSet->SetDownLinkMaximumBurstSize(1024);
+	
+	//12. MaxPacketSizeDownlink
+	//Mapping based on:
+	//	TInt downLinkMaximumPacketSize = generic->GetDownLinkMaximumPacketSize();
+	//	params.SetMaxPacketSizeDownlink((TUint32)downLinkMaximumPacketSize);
+	subConQosGenParSet->SetDownLinkMaximumPacketSize(512);
+	
+	//13. MinPolicedUnitDownlink
+	//Mapping based on:
+	//	TInt downLinkDelayVariation = generic->GetDownLinkDelayVariation();
+	//	params.SetMinPolicedUnitDownlink((TUint32)downLinkDelayVariation);
+	subConQosGenParSet->SetDownLinkDelayVariation(300);
+	
+	//14. DelayDownlink
+	//Mapping based on:
+	//	TInt downLinkDelay = generic->GetDownLinkDelay();
+	//	params.SetDelayDownlink((TUint32)downLinkDelay);
+	subConQosGenParSet->SetDownLinkDelay(200);
+	
+	//15. PriorityDownlink
+	//Mapping based on:
+	//	TInt downLinkPriority = generic->GetDownLinkPriority();
+	//	params.SetPriorityDownlink((TUint16)downLinkPriority);
+	subConQosGenParSet->SetDownLinkPriority(128);
+	
+	//16. DropModeDownlink
+	//NO MAPPING for subConQosGenParSet->SetDropModeDownlink(KPfqosDropTail);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetDropModeDownlink(TUint8 aDropMode);
+	
+	//17. AdaptationPriority
+	//NO MAPPING for subConQosGenParSet->SetAdaptationPriority(KQoSLowestPriority);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetAdaptationPriority(TUint8 aPriority);
+	
+	//17. AdaptationPriority
+	//NO MAPPING for subConQosGenParSet->SetAdaptMode(EFalse);
+	//mapping commented out from MapGenericParamsFromESockToPRTL:
+	//params.SetAdaptMode(TBool aCanAdapt);
+	
+	//------------------------------------
+	//2. Subscribe for QoS Params notification
+	//------------------------------------
+	TNotificationEventBuf subconnNotifBuf;
+	TRequestStatus subconnReqStat;
+	RSubConnection::TEventFilter subconnEventFilter(
+				    KSubConnGenericEventsImplUid,
+				    KSubConGenericEventParamsGranted | 
+				    KSubConGenericEventParamsChanged |
+				    KSubConGenericEventParamsRejected );
+	iChannel.EventNotification(subconnNotifBuf, 
+				&subconnEventFilter, 1, subconnReqStat);
+
+	//------------------------------------
+	//3. Set the QoS Parameters
+	//------------------------------------
+	User::LeaveIfError(iChannel.SetParameters(subconnParams));
+
+	//------------------------------------
+	//4. Receive & Process the event (expecting KSubConGenericEventParamsGranted)
+	//------------------------------------
+	User::WaitForRequest(subconnReqStat);
+	User::LeaveIfError(subconnReqStat.Int());
+
+	
+	switch (subconnNotifBuf.Id())
+	{
+	case KSubConGenericEventParamsGranted:
+			iTestStep.Log(_L("CSubConGenericEventParamsGranted received"));
+			break;
+		case KSubConGenericEventParamsChanged:
+			iTestStep.Log(_L("CSubConGenericEventParamsChanged received"));
+			break;
+		case KSubConGenericEventParamsRejected:
+			iTestStep.Log(_L("CSubConGenericEventParamsRejected received"));
+			err = KErrNotSupported;
+			break;
+		default:
+			iTestStep.Log(_L("unknown event received.  Id=%d"),subconnNotifBuf.Id());
+			err = KErrNotSupported;
+			break;
+	}
+
+	subconnParams.Close();
+	CleanupStack::Pop(&subconnParams);
+
+	return err;
+}
+
+ 
+CStatus::CStatus():CActive(0)
+{
+	CActiveScheduler::Add(this);
+	SetActive();
+}
+
+CStatus::~CStatus()
+{
+	Cancel();
+}
+
+TInt TE_RConnectionSimTsyDataStep::NTRasThreadFunction(TAny* /*aThreadData*/)
+	{
+	_LIT(KCsyName,"LOOPBACK.CSY");
+	_LIT(KPortName,"LOOPBACK::1");
+	_LIT8(KServerText,"SERVER");
+
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	if (!cleanup)
+		{
+		return KErrNoMemory;
+		}
+
+	RCommServ commServ;
+	TInt ret = commServ.Connect();
+	if (KErrNone != ret)
+		{
+		return ret;
+		}
+	
+	ret = commServ.LoadCommModule(KCsyName);
+	if(KErrNone == ret)
+		{
+		RComm comm;
+		ret = comm.Open(commServ, KPortName, ECommShared);
+		if(KErrNone == ret)
+			{
+			TBuf8<6> readBuf;
+			TRequestStatus stat0;
+			comm.Read(stat0, readBuf);
+			User::WaitForRequest(stat0);
+
+			comm.Write(stat0, KServerText);
+			User::WaitForRequest(stat0);
+			}
+		comm.Close();
+		}
+	commServ.Close();
+	delete cleanup;
+	return ret;
+	}
+
+TInt TE_RConnectionSimTsyDataStep::StartNTRasSimulation()
+	{
+	const TInt KStackSize=0x8000;
+	const TInt KHeapSize=0x8000;
+	const TInt KMaxHeapSize=0x80000;
+	TInt res = KErrNone ;
+	_LIT(KNtRasName,"NTRasEmulation");
+
+	RThread t;
+	res=t.Create(KNtRasName, NTRasThreadFunction,
+					KStackSize,KHeapSize,KMaxHeapSize,NULL);
+	t.Resume();
+	t.Close();
+
+	return res;
+	}
+
+enum TVerdict TE_RConnectionSimTsyDataStep::doTestStepPreambleL()
+	{
+	_LIT(KPhbkSyncCMI, "phbsync.cmi");
+	if (StartC32WithCMISuppressions(KPhbkSyncCMI) != KErrNone)
+    	{
+    	return EFail;
+    	}
+				
+	// Wait for all of the interfaces to close down		 
+	RSocketServ ss;		
+	User::LeaveIfError(ss.Connect());
+	CleanupClosePushL(ss);
+
+	if (KErrNone != WaitForAllInterfacesToCloseL(ss))
+		{
+		INFO_PRINTF1(_L("Previous test case has left connections up that have not closed. Stopping them."));
+		TBuf<200> errDesc;
+		TInt err;
+		if ((err = ESockTestUtils::StopAllInterfaces(errDesc)) != KErrNone)
+			{
+			INFO_PRINTF3(_L("StopAllInterfaces() err=%d\n%S"), err, &errDesc);
+			CleanupStack::PopAndDestroy(&ss);
+			return EFail;
+			}			
+		}	
+	CleanupStack::PopAndDestroy(&ss);	
+	
+	TInt ret = RProperty::Set(KUidPSSimTsyCategory, KPSSimTsyTestNumber, 0);
+	if (ret != KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed resetting"));
+		User::Leave(ret);
+		}
+
+	ret = iTelServer.Connect();
+	if (ret!=KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed to connect to telephony server"));
+		User::Leave(ret);
+		}
+	
+   	ret=iTelServer.LoadPhoneModule(KSimtsyName);
+	if (ret!=KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed to load phone module"));
+		iTelServer.Close();
+		User::Leave(ret);
+		}
+
+	ret=iPhone.Open(iTelServer,KPhoneName) ;
+	if (ret!=KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed to open phone module"));
+		iTelServer.UnloadPhoneModule(KSimtsyName);
+		iTelServer.Close();
+		User::Leave(ret);
+		}
+	ret=iPhone.Initialise();
+	if (ret!=KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed to initialise the phone"));
+		iPhone.Close();
+		iTelServer.UnloadPhoneModule(KSimtsyName);
+		iTelServer.Close();
+		User::Leave(ret);
+		}
+
+	RPhone::TCaps phoneCaps;
+	ret = iPhone.GetCaps(phoneCaps) ;
+	if ((KErrNone != ret) || !(phoneCaps.iFlags & RPhone::KCapsData))
+		{
+		INFO_PRINTF2(_L("This phone does not support data calls (caps=0x%x)"), phoneCaps.iFlags);
+		iPhone.Close();
+		iTelServer.UnloadPhoneModule(KSimtsyName);
+		iTelServer.Close();
+		User::Leave(ret);
+		}
+
+	return TestStepResult();
+	}
+
+enum TVerdict TE_RConnectionSimTsyDataStep::doTestStepPostambleL()
+	{
+	REComSession::FinalClose();
+	iPhone.Close();
+	iTelServer.UnloadPhoneModule(KSimtsyName);
+	iTelServer.Close();
+
+	__UHEAP_MARKEND;
+	return TestStepResult();	
+	}
+