networkingtestandutils/ipprobe/src/sap.cpp
changeset 0 af10295192d8
child 21 abbed5a4b42a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/ipprobe/src/sap.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,194 @@
+// Copyright (c) 2004-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:
+// sap.cpp - 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();
+		}
+	}
+
+#ifdef TCPIP6_CAPABILITY
+TInt CProviderProbe::SecurityCheck(MProvdSecurityChecker *aChecker)
+	{
+	_LIT_SECURITY_POLICY_C1(KPolicyNetworkControl, ECapabilityNetworkControl);
+	return aChecker->CheckPolicy(KPolicyNetworkControl, "PROBE HOOK SAP");
+	}
+#endif