diff -r 000000000000 -r 857a3e953887 nettools/conntest/probe/src/sap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nettools/conntest/probe/src/sap.cpp Thu Dec 17 08:39:25 2009 +0200 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2002-2006 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: Packet probe hook +* +*/ + +#include "sap.h" + + +CProviderProbe::CProviderProbe(CProtocolProbe* aProtocol) : iProtocol(aProtocol) + { +// __DECLARE_NAME(_S("CProviderProbe")); + iQueueLimit = 8000; + } + +CProviderProbe::~CProviderProbe() + { + if (iProtocol) + iProtocol->CancelSAP(this); + } + +void CProviderProbe::Start() + { + } + +TInt CProviderProbe::GetOption(TUint /*aLevel*/, TUint /*aName*/, TDes8& /*aOption*/) const + { + return KErrNotSupported; + } + +TInt CProviderProbe::SetOption(TUint /*aLevel*/, TUint /*aName*/, const TDesC8& /*aOption*/) + { +// return KErrNotSupported; + return KErrNone; + } + +void CProviderProbe::Ioctl(TUint /*level*/,TUint /*name*/,TDes8* /*anOption*/) + { + Panic(EProbePanic_NotSupported); + } + +void CProviderProbe::CancelIoctl(TUint /*aLevel*/,TUint /*aName*/) + { + Panic(EProbePanic_NotSupported); + } + + +TUint CProviderProbe::Write(const TDesC8 &/*aDesc*/, TUint /*aOptions*/, TSockAddr* /*aAddr*/) + { + // For now, Write does nothing on probe socket + return 1; + } + +void CProviderProbe::Shutdown(TCloseType /*option*/,const TDesC8& /*aDisconnectionData*/) + { + Panic(EProbePanic_NotSupported); + } + +void CProviderProbe::Shutdown(TCloseType aOption) + { + switch(aOption) + { + case EStopInput: + iInputStopped = ETrue; + iRecvQ.Free(); + iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone + break; + + case EStopOutput: + iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone + break; + + default: + if (aOption != EImmediate) + iSocket->CanClose(); + } + } + +TInt CProviderProbe::SetLocalName(TSockAddr &/*aAddr*/) + { + return 0; // Ignore silently + } + +void CProviderProbe::AutoBind() + { + // Ignore silently + } + +// CProviderProbe::Error +// ********************* +// Soft errors are not immediately reported to the socket server. +// A soft error is indicated by a zero aOperationMask. +// +// The socket error can be cleared by calling this routing with +// aError == KErrNone. +// +void CProviderProbe::Error(TInt aError, TUint aOperationMask) + { + if (aError <= KErrNone && !FatalState()) + { + if (aError == KErrNone) + iErrorMask = aOperationMask; + else + iErrorMask |= aOperationMask; + if (iSocket && aOperationMask) + iSocket->Error(aError, aOperationMask); + } + } + +// +// CProviderProbe::Process() +// ************************* +// Process incoming data from the protocol object. +// +void CProviderProbe::Process(RMBufChain& aPacket, CProtocolBase * /*aSourceProtocol*/) + { + // iInputStopped is set at ShutDown() and no packets should be coming + // from the protocol after that. However, without knowing the exact + // details of the process model/threads, it could be possible that + // a Process() call has been initiated by the protocol and interrupted + // before the shutdown, thus there may be a need for this iInputStopped + // flag, although I would prefer to do without... NEED TO VERIFY IF + // iInputStopped is really needed!!! -- msa + // + if(!(iInputStopped || + (iErrorMask & (MSocketNotify::EErrorFatal|MSocketNotify::EErrorConnect|MSocketNotify::EErrorRecv)))) + { + iQueueLimit -= RMBufPacketBase::PeekInfoInChain(aPacket)->iLength; + iRecvQ.Append(aPacket); + iSocket->NewData(1); + } + else + aPacket.Free(); + } + +// CProviderProbe::IsReceiving +// *************************** +// +TBool CProviderProbe::IsReceiving(const RMBufPktInfo & /*aInfo*/) + { + if (iQueueLimit < 0) + { + // Receive Queue limit is full, cannot receive this packet + iPacketsDropped++; + return FALSE; + } + return TRUE; + } + + +// CProviderProbe::GetData +// *********************** +void CProviderProbe::GetData(TDes8 &aDesc, TUint aOptions, TSockAddr *anAddr) + { + RMBufPacketBase packet; + if (!iRecvQ.Remove(packet)) + Panic(EProbePanic_NoData); + + const RMBufPktInfo *const info = packet.Unpack(); + + packet.CopyOut(aDesc, 0); + + if (anAddr!=NULL) + *anAddr = info->iSrcAddr; + + if (aOptions & KSockReadPeek) + { + packet.Pack(); + iRecvQ.Prepend(packet); + iSocket->NewData(1); + } + else + { + iQueueLimit += info->iLength; // Allow more packets in.. + packet.Free(); + } + }