--- a/networkingtestandutils/ipprobe/src/prt.cpp Tue Aug 31 16:45:15 2010 +0300
+++ b/networkingtestandutils/ipprobe/src/prt.cpp Wed Sep 01 12:33:58 2010 +0100
@@ -1,50 +1,34 @@
-/*
-* Copyright (c) 2009-2010 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
-*
-*/
+// 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>
-#include <f32file.h>
-#include <e32svr.h>
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <es_prot_internal.h>
#endif
-
#include "family.h"
#include "prt.h"
#include "sap.h"
#include "inet6log.h"
-_LIT(KTcpDumpFolder, "tcpdump\\");
-_LIT(KProbeDumpFile, "probe.cap");
-_LIT(KLogFolder, "c:\\logs\\");
-CProtocolProbe::CProtocolProbe(TUint aId) :
-iId(aId),
-iDumpCb(CActive::EPriorityStandard),
-iFileServerOpen(EFalse),
-iFileOpen(EFalse),
-iBufCreated(EFalse)
+CProtocolProbe::CProtocolProbe(TUint aId) : iId(aId)
{
LOG(Log::Printf(_L("Probe::CProtocolProbe()\r\n"));)
- iTimeOrigin.UniversalTime();
-
- TCallBack cbFunc(DumpCb, this);
- iDumpCb.Set(cbFunc);
}
void CProtocolProbe::InitL(TDesC& aTag)
@@ -53,6 +37,7 @@
CProtocolBase::InitL(aTag);
}
+
void CProtocolProbe::StartL()
{
// __ASSERT_DEBUG(iProtocol != NULL, User::Leave(KErrGeneral));
@@ -60,39 +45,20 @@
CProtocolProbe::~CProtocolProbe()
{
- LOG(Log::Printf(_L("Probe::~CProtocolProbe()\r\n"));)
- if(iFileOpen)
- {
- iFile.Close();
- iFileOpen = EFalse;
- }
- if(iFileServerOpen)
- {
- iFs.Close();
- iFileServerOpen = EFalse;
- }
- if(iBufCreated)
- {
- iBuf.Close();
- iBufCreated = EFalse;
- }
+ 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;
@@ -117,10 +83,7 @@
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;
@@ -134,7 +97,6 @@
//
void CProtocolProbe::CancelSAP(const CServProviderBase* aSAP)
{
-
CProviderProbe **h, *sap;
for (h = &iList; (sap = *h) != NULL; h = &sap->iNext)
if (sap == aSAP)
@@ -144,218 +106,49 @@
}
}
+
// CProtocolProbe::NetworkAttachedL
// ********************************
// When network becomes available, do the hooking!
//
void CProtocolProbe::NetworkAttachedL()
{
-
NetworkService()->BindL(this, MIp6Hook::BindPostHook());
NetworkService()->BindL(this, MIp6Hook::BindPostHook()+1);
-
- // initialise dump file
- if(iFileOpen)
- {
- iFile.Close();
- iFileOpen = EFalse;
- }
- if(iFileServerOpen)
- {
- iFs.Close();
- iFileServerOpen = EFalse;
- }
-
- User::LeaveIfError(iFs.Connect());
- iFileServerOpen = ETrue;
- TBuf<50> filename;
- filename.Append(KLogFolder);
- filename.Append(KTcpDumpFolder);
- filename.Append(KProbeDumpFile);
- User::LeaveIfError(iFile.Replace(iFs, filename, EFileWrite));
- iFileOpen = ETrue;
-
- // allocate buffer
- if(!iBufCreated)
- {
- const TInt KMaxBufferSize = 65535;
- iBuf.CreateL(KMaxBufferSize);
- iBufCreated = ETrue;
- }
-
- LibcapDumpFileHeader();
}
-void CProtocolProbe::Queue(RMBufChain &aPacket)
//
-// Takes a copy of aPacket, adds it to the queue and triggers the callback
+// CProtocolProbe::Deliver
+// ***********************
+// Generate a copy of the packet to every bound provider
//
+void CProtocolProbe::Deliver(RMBufChain &aPacket)
{
-
- RMBufPacketBase copy;
- TRAPD(err, copy.CopyPackedL(aPacket));
- if (err == KErrNone)
- {
-
- //
- // Calculate packet time-stamp
- //
- TTime newTime;
- newTime.UniversalTime();
- TTimeIntervalMicroSeconds interval = newTime.MicroSecondsFrom(iTimeOrigin);
-
- const TInt KMicrosInASecond = 1000000;
+ const RMBufPktInfo *const info = RMBufPacketBase::PeekInfoInChain(aPacket);
- //TUint32 micros = interval.Int64().Low();
- TUint32 micros = I64LOW(interval.Int64());//.Low(); x.Low() -> I64LOW(x)
- TUint32 secs = micros / KMicrosInASecond;
- micros -= (secs * KMicrosInASecond);
-
- //
- // Reuse the protocol and flags fields of
- // RMBufPktInfo to store the time-stamp
- //
- RMBufPktInfo* info = RMBufPacket::PeekInfoInChain(copy);
- info->iProtocol = static_cast<TInt>(secs);
- info->iFlags = static_cast<TUint>(micros);
-
- iQueue.Append(copy);
- iDumpCb.CallBack();
- }
- else
+ for (CProviderProbe* sap = iList; sap != NULL; sap = sap->iNext)
{
- copy.Free();
+ if (sap->IsReceiving(*info))
+ {
+ RMBufPacketBase copy;
+ TRAPD(err, copy.CopyPackedL(aPacket));
+ if (err == KErrNone)
+ sap->Process(copy, this);
+ else
+ copy.Free();
+ }
}
}
-//
-// CProtocolProbe::Dump
-// ***********************
-// Log the packet to file
-//
-void CProtocolProbe::Dump(RMBufChain &aPacket)
- {
-
- RMBufPacket packet;
- packet.Assign(aPacket);
- RMBufPktInfo* info = packet.Unpack();
-
- TUint32 secs = static_cast<TUint32>(info->iProtocol);
- TUint32 micros = static_cast<TUint32>(info->iFlags);
-
- iBuf.SetMax();
- packet.CopyOut(iBuf, 0);
- if(iBuf.Length() != info->iLength)
- {
- iBuf.SetLength(info->iLength);
- }
- LibcapDump(iBuf, secs, micros);
- packet.Free();
- }
-
TInt CProtocolProbe::Send(RMBufChain &aPacket, CProtocolBase* aSrc)
{
-
- Queue(aPacket);
+ Deliver(aPacket);
return CProtocolPosthook::Send(aPacket, aSrc);
}
void CProtocolProbe::Process(RMBufChain &aPacket, CProtocolBase* aSrc)
{
-
- Queue(aPacket);
+ Deliver(aPacket);
CProtocolPosthook::Process(aPacket, aSrc);
}
-
-void CProtocolProbe::LibcapDumpFileHeader()
-//
-// Dump file header in a format compatible with Libcap
-//
-// Format is:
-//
-// struct FileHeader
-// {
-// TUint32 magic;
-// TUint16 version_major;
-// TUint16 version_minor;
-// TUint32 thiszone; /* gmt to local correction */
-// TUint32 sigfigs; /* accuracy of timestamps */
-// TUint32 snaplen; /* max length saved portion of each pkt */
-// TUint32 linktype; /* data link type (LINKTYPE_*) */
-// };
-//
-// Note LINKTYPE specified in libpcap/bpf/net/bpf.h (see www.tcpdump.org)
-//
- {
-
- TBuf8<sizeof(TUint32)*5+sizeof(TUint16)*2> fileHeader;
- *((TUint32*) &(fileHeader.Ptr()[0])) = 0xa1b2c3d4;
- *((TUint16*) &(fileHeader.Ptr()[4])) = 0x02;
- *((TUint16*) &(fileHeader.Ptr()[6])) = 0x04;
- *((TUint32*) &(fileHeader.Ptr()[8])) = 0x00;
- *((TUint32*) &(fileHeader.Ptr()[12])) = 0x00;
- *((TUint32*) &(fileHeader.Ptr()[16])) = 0xffff;
- *((TUint32*) &(fileHeader.Ptr()[20])) = 12; // DLT_RAW 12 /* raw IP */
- fileHeader.SetLength(fileHeader.MaxLength());
-
- iFile.Write(fileHeader);
- }
-
-void CProtocolProbe::LibcapDump(const TDesC8& aBuffer, TUint32 aTimeStampSecs, TUint32 aTimeStampMicros)
-//
-// Dumps a packet in a format compatbible with Libcap
-//
-// For each record the format is:
-//
-// struct record
-// {
-// TUint32 sec; /* time stamp - secs*/
-// TUint32 usec; /* time stamp - microsecs*/
-// TUint32 captureLen; /* length packet captured */
-// TUint32 packetLen; /* total length of packet*/
-// };
-//
-// Byte ordering of the header is little endian
-// Byte ordering of the packet is network byte order (big endian)
-//
- {
-
- TBuf8<sizeof(TUint32)*4> recordHeader;
- recordHeader.FillZ();
-
- *((TUint32*) &(recordHeader.Ptr()[0])) = aTimeStampSecs;
- *((TUint32*) &(recordHeader.Ptr()[4])) = aTimeStampMicros;
- *((TUint32*) &(recordHeader.Ptr()[8])) = aBuffer.Length();
- *((TUint32*) &(recordHeader.Ptr()[12])) = aBuffer.Length();
- recordHeader.SetLength(recordHeader.MaxLength());
-
- iFile.Write(recordHeader);
- iFile.Write(aBuffer);
- }
-
-
-
-TInt CProtocolProbe::DumpCb(TAny* aThisPtr)
-//
-// Callback function - calls DumpQueuedPackets()
-//
- {
-
- CProtocolProbe* self = static_cast<CProtocolProbe*>(aThisPtr);
- self->DumpQueuedPackets();
- return KErrNone;
- }
-
-void CProtocolProbe::DumpQueuedPackets()
-//
-// Dumps all packets on the queue to the log file
-//
- {
-
- RMBufPacketBase packet;
- while(iQueue.Remove(packet))
- {
- Dump(packet);
- }
- }