diff -r 000000000000 -r af10295192d8 linklayercontrol/nullagt/TS_nullagt/src/Nullagentreconnect.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayercontrol/nullagt/TS_nullagt/src/Nullagentreconnect.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,162 @@ +// 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: +// Contain the implementation of the class for this null agent test +// +// + +#include "NullAgentTestSteps.h" +#include "dummynifvar.h" +#include "in_sock.h" + +CTestStepNullAgtReconnect::CTestStepNullAgtReconnect(TPtrC aName) +{ + iTestStepName=aName; +} + +enum TVerdict CTestStepNullAgtReconnect::doTestStepL(void) +{ + __UHEAP_MARK; + + TRequestStatus status; // status of asynchronous ops + TInt r; // the result of various operations + + RSocketServ server; // connection paraphanelia + RConnection connection; + RSocket commandSocket, dataSocket; + + TInetAddr commandDest; + commandDest.SetAddress(KDummyNifLocalAddressBase + 4); + commandDest.SetPort(KDummyNifCmdPort); + TInetAddr dataDest; + dataDest.SetAddress(KDummyNifLocalAddressBase + 4); + dataDest.SetPort(KPortNo); + + TBuf8 buffer; + + /* START THE CONNECTION WE WILL USE */ + + r = server.Connect(); + TESTEL(r == KErrNone, r); + CleanupClosePushL(server); + + r = connection.Open(server, KAfInet); + TESTEL(r == KErrNone, r); + CleanupClosePushL(connection); + + connection.Start(status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + /* OPEN 2 SOCKETS - ONE FOR COMMANDS AND ONE FOR TRAFFIC */ + + // to send commands to the dummy nif we need to send pseudo-traffic which + // it will interpret as a command... hence all the socket stuff that follows + + // open a udp socket to send the command to the dummy nif + r = commandSocket.Open(server, KAfInet, KSockDatagram, KProtocolInetUdp); + TESTEL(r == KErrNone, r); + CleanupClosePushL(commandSocket); + TESTL(commandSocket.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone); + // set the source port number - otherwise will panic cos it's zero + r = commandSocket.SetLocalPort(KDummyNifCmdPort); + TESTEL(r == KErrNone, r); + + // open another socket to send data later on + r = dataSocket.Open(server, KAfInet, KSockDatagram, KProtocolInetUdp); + TESTEL(r == KErrNone, r); + CleanupClosePushL(dataSocket); + TESTL(dataSocket.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone); + r = dataSocket.SetLocalPort(KPortNo); + TESTEL(r == KErrNone, r); + + /* SEND SOME LOOPBACK TRAFFIC */ + + buffer.SetMax(); + buffer.FillZ(); + buffer[0] = (TUint8) 0x8; // ICMP type = 8 + buffer[1] = (TUint8) 0x0; // ICMP code = 0 + buffer[2] = (TUint8) 0xF7; // ICMP checksum high byte + buffer[3] = (TUint8) 0xFF; // ICMP checksum low byte + + dataSocket.SendTo(buffer, dataDest, 0, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + buffer.Zero(); + dataSocket.RecvFrom(buffer, dataDest, 0, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + /* SEND THE SPECIAL COMMAND PACKET TO THE DUMMY NIF TO FORCE A RECONNECT */ + + buffer.SetMax(); + buffer.FillZ(); + buffer[0] = (TUint8) KForceReconnect; + + commandSocket.SendTo(buffer, commandDest, 0, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + /* WAIT A WHILE TO LET THE RECONNECT HAPPEN (OR NOT IF DIALOG APPEARS AND USER DOESN'T RESPOND!) */ + + User::After(10000000); + + /* SEND MORE LOOPBACK TRAFFIC ON THE DATA SOCKET */ + + // the idea is that reconnect does not lead to an erroring of the sockets - the stack should + // not see that the rug was pulled out. + + buffer.SetMax(); + buffer.FillZ(); + buffer[0] = (TUint8) 0x8; // ICMP type = 8 + buffer[1] = (TUint8) 0x0; // ICMP code = 0 + buffer[2] = (TUint8) 0xF7; // ICMP checksum high byte + buffer[3] = (TUint8) 0xFF; // ICMP checksum low byte + + dataSocket.SendTo(buffer, dataDest, 0, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + buffer.Zero(); + dataSocket.RecvFrom(buffer, dataDest, 0, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + + /* CLOSE EVERYTHING DOWN */ + + // close the data socket + dataSocket.Shutdown(RSocket::ENormal, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + CleanupStack::Pop(&dataSocket); + + // close the command socket + commandSocket.Shutdown(RSocket::ENormal, status); + User::WaitForRequest(status); + TESTEL(status.Int() == KErrNone, status.Int()); + CleanupStack::Pop(&commandSocket); + + // force the destruction of the connection - if the reconnect hasn't completed yet it will be cancelled + r = connection.Stop(); + TESTEL(r == KErrNone, r); + CleanupStack::Pop(&connection); + + // close the socket server + server.Close(); + CleanupStack::Pop(&server); + + __UHEAP_MARKEND; + + return iTestStepResult; +}