void CRconn::Stop() { DEBUG_INFO("CRconn::Stop\n"); Cancel(); const TInt err = iConn.Stop(); if (err) { DEBUG_INFO("CRconn::Stop err=%d\n", err); } }
// --------------------------------------------------------- // RHssInterface::StopConnectionL // --------------------------------------------------------- // TInt RHssInterface::StopConnectionL( const TUint aIapId, const TUint aNetworkId ) { DEBUG( "RHssInterface::StopConnectionL()" ); TInt ret( KErrNone ); RSocketServ socketServ; RConnection conn; User::LeaveIfError( socketServ.Connect() ); CleanupClosePushL( socketServ ); // Open connection User::LeaveIfError( conn.Open(socketServ) ); CleanupClosePushL( conn ); TConnectionInfo info; info.iIapId = aIapId; info.iNetId = aNetworkId; TInt err = conn.Attach( TPckg< TConnectionInfo >( info ), RConnection::EAttachTypeNormal ); DEBUG1( "RHssInterface::conn.Attach: %d", err ); if ( err == KErrNone ) { ret = conn.Stop( RConnection::EStopAuthoritative ); DEBUG1( "RHssInterface::connection.Stop: %d", ret ); } /* Note: In previous version, tried to PopAndDestroy conn (RConnection) * from cleanup stack... * => Somehow this broke Sniffer connection opening, no idea why. */ CleanupStack::Pop( &conn ); conn.Close(); CleanupStack::PopAndDestroy( &socketServ ); return ret; }
enum TVerdict CTestStepNullAgtLoopbackTest::doTestStepL(void) { __UHEAP_MARK; TInt r; // the result of various operations TRequestStatus status; // status of asynchronous ops RSocketServ server; // connection paraphanelia RConnection connection; RSocket socket; TInetAddr dest; dest.SetAddress(KDummyNifLocalAddressBase + 4); dest.SetPort(KPortNo); TBuf8<KBufferLength> buffer; // connect to the socket server r = server.Connect(); TESTEL(r == KErrNone, r); CleanupClosePushL(server); // this is why we needed a socket server... r = connection.Open(server, KAfInet); TESTEL(r == KErrNone, r); CleanupClosePushL(connection); // start the connection up (outgoing) connection.Start(status); User::WaitForRequest(status); TESTEL(status.Int() == KErrNone, status.Int()); // open a udp socket r = socket.Open(server, KAfInet, KSockDatagram, KProtocolInetUdp); TESTEL(r == KErrNone, r); CleanupClosePushL(socket); TESTL(socket.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone); // set the source port number - otherwise will panic cos it's zero r = socket.SetLocalPort(KPortNo); TESTEL(r == KErrNone, r); // build some data to send on the socket // this is an ICMP ping request apparently 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 // NB the rest of the buffer is zero // hence the checksum (0xFFFF - 0x800) since 0x8 // is the only non-zero element of the buffer // send the data out over the socket socket.SendTo(buffer, dest, 0, status); User::WaitForRequest(status); TESTEL(status.Int() == KErrNone, status.Int()); buffer.Zero(); // I expect to get the data looped back from the dummy NIF socket.RecvFrom(buffer, dest, 0, status); User::WaitForRequest(status); TESTEL(status.Int() == KErrNone, status.Int()); // check that what we sent is what we got back if (status.Int() == KErrNone) { // 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); } // close the socket socket.Shutdown(RSocket::ENormal, status); User::WaitForRequest(status); TESTEL(status.Int() == KErrNone, status.Int()); CleanupStack::Pop(); // force the destruction of the connection r = connection.Stop(); TESTEL(r == KErrNone, r); CleanupStack::Pop(); // close the socket server server.Close(); CleanupStack::Pop(); __UHEAP_MARKEND; return iTestStepResult; }