networkingtestandutils/ipprobe/src/prt.cpp
changeset 0 af10295192d8
child 21 abbed5a4b42a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/ipprobe/src/prt.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,154 @@
+// 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:
+// prt.cpp - Packet Probe Hook
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_prot_internal.h>
+#endif
+
+#include "family.h"
+#include "prt.h"
+#include "sap.h"
+#include "inet6log.h"
+
+
+CProtocolProbe::CProtocolProbe(TUint aId) : iId(aId)
+	{
+	LOG(Log::Printf(_L("Probe::CProtocolProbe()\r\n"));)
+	}
+
+void CProtocolProbe::InitL(TDesC& aTag)
+	{
+	LOG(Log::Printf(_L("Probe::InitL()\r\n"));)
+	CProtocolBase::InitL(aTag);
+	}
+
+
+void CProtocolProbe::StartL()
+	{
+	//	__ASSERT_DEBUG(iProtocol != NULL, User::Leave(KErrGeneral));
+	}
+
+CProtocolProbe::~CProtocolProbe()
+	{
+	LOG(Log::Printf(_L("Probe::~CProtocolProbe()\r\n"));)
+	}
+
+
+CProtocolProbe *CProtocolProbe::NewL(TUint aId)
+	{
+	return new (ELeave) CProtocolProbe(aId);
+	}
+
+void CProtocolProbe::FillIdentification(TServerProtocolDesc& anEntry, TUint aId)
+	{
+	anEntry.iName=_S("probe");
+	if (aId > 1)
+		anEntry.iName.AppendNum(aId-1);
+	anEntry.iAddrFamily = KAfProbe;
+	anEntry.iSockType = KSockDatagram;
+	anEntry.iProtocol = aId;
+	anEntry.iVersion = TVersion(1, 0, 0);
+	anEntry.iByteOrder = EBigEndian;
+	anEntry.iServiceInfo = KSIDatagram | KSIConnectionLess;
+	anEntry.iNamingServices = 0;
+	anEntry.iSecurity = KSocketNoSecurity;
+	anEntry.iMessageSize = 0xffff;
+	anEntry.iServiceTypeInfo = ESocketSupport;
+	anEntry.iNumSockets = KUnlimitedSockets;
+	}
+
+void CProtocolProbe::Identify(TServerProtocolDesc *aDesc) const
+	{
+	FillIdentification(*aDesc, iId);
+	}
+
+
+CServProviderBase* CProtocolProbe::NewSAPL(TUint aProtocol)
+	{
+	LOG(Log::Printf(_L("Probe::NewSAPL(%d)\r\n"), aProtocol);)
+
+	if (aProtocol != KSockDatagram)
+		User::Leave(KErrNotSupported);
+	CProviderProbe* sap = new (ELeave) CProviderProbe(this);
+	sap->iNext = iList;
+	iList = sap;
+	return sap;
+	}
+
+//
+// CProtocolProbe::CancelSAP
+// *************************
+// Disconnect SAP from the protocol
+//
+void CProtocolProbe::CancelSAP(const CServProviderBase* aSAP)
+	{
+	CProviderProbe **h, *sap;
+	for (h = &iList; (sap = *h) != NULL; h = &sap->iNext)
+		if (sap == aSAP)
+			{
+			*h = sap->iNext;
+			break;
+			}
+	}
+
+
+// CProtocolProbe::NetworkAttachedL
+// ********************************
+// When network becomes available, do the hooking!
+//
+void CProtocolProbe::NetworkAttachedL()
+	{
+	NetworkService()->BindL(this, MIp6Hook::BindPostHook());
+	NetworkService()->BindL(this, MIp6Hook::BindPostHook()+1);
+	}
+
+//
+//	CProtocolProbe::Deliver
+//	***********************
+//	Generate a copy of the packet to every bound provider
+//
+void CProtocolProbe::Deliver(RMBufChain &aPacket)
+	{
+	const RMBufPktInfo *const info = RMBufPacketBase::PeekInfoInChain(aPacket);
+
+	for (CProviderProbe* sap = iList; sap != NULL; sap = sap->iNext)
+		{
+		if (sap->IsReceiving(*info))
+			{
+			RMBufPacketBase copy;
+			TRAPD(err, copy.CopyPackedL(aPacket));
+			if (err == KErrNone)
+				sap->Process(copy, this);
+			else
+				copy.Free();
+			}
+		}
+	}
+
+
+TInt CProtocolProbe::Send(RMBufChain &aPacket, CProtocolBase* aSrc)
+	{
+	Deliver(aPacket);
+	return CProtocolPosthook::Send(aPacket, aSrc);
+	}
+
+void CProtocolProbe::Process(RMBufChain &aPacket, CProtocolBase* aSrc)
+	{
+	Deliver(aPacket);
+	CProtocolPosthook::Process(aPacket, aSrc);
+	}