diff -r 000000000000 -r af10295192d8 networkingtestandutils/ipprobe/src/prt.cpp --- /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 +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#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); + }