author | hgs |
Thu, 08 Jul 2010 15:21:49 +0530 | |
changeset 39 | 45fd446095e6 |
parent 37 | 052078dda061 |
child 58 | 8d540f55e491 |
permissions | -rw-r--r-- |
37 | 1 |
/* |
2 |
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). |
|
3 |
* All rights reserved. |
|
4 |
* This component and the accompanying materials are made available |
|
5 |
* under the terms of "Eclipse Public License v1.0" |
|
6 |
* which accompanies this distribution, and is available |
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 |
* |
|
9 |
* Initial Contributors: |
|
10 |
* Nokia Corporation - initial contribution. |
|
11 |
* |
|
12 |
* Contributors: |
|
13 |
* |
|
14 |
* Description: Packet probe hook |
|
15 |
* |
|
16 |
*/ |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
17 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
18 |
#include <e32std.h> |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
19 |
#include <e32base.h> |
37 | 20 |
#include <f32file.h> |
21 |
#include <e32svr.h> |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
22 |
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
23 |
#include <es_prot_internal.h> |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
24 |
#endif |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
25 |
|
37 | 26 |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
27 |
#include "family.h" |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
28 |
#include "prt.h" |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
29 |
#include "sap.h" |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
30 |
#include "inet6log.h" |
37 | 31 |
_LIT(KTcpDumpFolder, "tcpdump\\"); |
32 |
_LIT(KProbeDumpFile, "probe.cap"); |
|
33 |
_LIT(KLogFolder, "c:\\logs\\"); |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
34 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
35 |
|
37 | 36 |
CProtocolProbe::CProtocolProbe(TUint aId) : |
37 |
iId(aId), |
|
38 |
iDumpCb(CActive::EPriorityStandard), |
|
39 |
iFileServerOpen(EFalse), |
|
40 |
iFileOpen(EFalse), |
|
41 |
iBufCreated(EFalse) |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
42 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
43 |
LOG(Log::Printf(_L("Probe::CProtocolProbe()\r\n"));) |
37 | 44 |
iTimeOrigin.UniversalTime(); |
45 |
||
46 |
TCallBack cbFunc(DumpCb, this); |
|
47 |
iDumpCb.Set(cbFunc); |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
48 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
49 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
50 |
void CProtocolProbe::InitL(TDesC& aTag) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
51 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
52 |
LOG(Log::Printf(_L("Probe::InitL()\r\n"));) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
53 |
CProtocolBase::InitL(aTag); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
54 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
55 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
56 |
void CProtocolProbe::StartL() |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
57 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
58 |
// __ASSERT_DEBUG(iProtocol != NULL, User::Leave(KErrGeneral)); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
59 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
60 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
61 |
CProtocolProbe::~CProtocolProbe() |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
62 |
{ |
37 | 63 |
LOG(Log::Printf(_L("Probe::~CProtocolProbe()\r\n"));) |
64 |
if(iFileOpen) |
|
65 |
{ |
|
66 |
iFile.Close(); |
|
67 |
iFileOpen = EFalse; |
|
68 |
} |
|
69 |
if(iFileServerOpen) |
|
70 |
{ |
|
71 |
iFs.Close(); |
|
72 |
iFileServerOpen = EFalse; |
|
73 |
} |
|
74 |
if(iBufCreated) |
|
75 |
{ |
|
76 |
iBuf.Close(); |
|
77 |
iBufCreated = EFalse; |
|
78 |
} |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
79 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
80 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
81 |
CProtocolProbe *CProtocolProbe::NewL(TUint aId) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
82 |
{ |
37 | 83 |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
84 |
return new (ELeave) CProtocolProbe(aId); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
85 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
86 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
87 |
void CProtocolProbe::FillIdentification(TServerProtocolDesc& anEntry, TUint aId) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
88 |
{ |
37 | 89 |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
90 |
anEntry.iName=_S("probe"); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
91 |
if (aId > 1) |
37 | 92 |
{ |
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
93 |
anEntry.iName.AppendNum(aId-1); |
37 | 94 |
} |
95 |
||
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
96 |
anEntry.iAddrFamily = KAfProbe; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
97 |
anEntry.iSockType = KSockDatagram; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
98 |
anEntry.iProtocol = aId; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
99 |
anEntry.iVersion = TVersion(1, 0, 0); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
100 |
anEntry.iByteOrder = EBigEndian; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
101 |
anEntry.iServiceInfo = KSIDatagram | KSIConnectionLess; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
102 |
anEntry.iNamingServices = 0; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
103 |
anEntry.iSecurity = KSocketNoSecurity; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
104 |
anEntry.iMessageSize = 0xffff; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
105 |
anEntry.iServiceTypeInfo = ESocketSupport; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
106 |
anEntry.iNumSockets = KUnlimitedSockets; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
107 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
108 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
109 |
void CProtocolProbe::Identify(TServerProtocolDesc *aDesc) const |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
110 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
111 |
FillIdentification(*aDesc, iId); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
112 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
113 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
114 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
115 |
CServProviderBase* CProtocolProbe::NewSAPL(TUint aProtocol) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
116 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
117 |
LOG(Log::Printf(_L("Probe::NewSAPL(%d)\r\n"), aProtocol);) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
118 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
119 |
if (aProtocol != KSockDatagram) |
37 | 120 |
{ |
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
121 |
User::Leave(KErrNotSupported); |
37 | 122 |
} |
123 |
||
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
124 |
CProviderProbe* sap = new (ELeave) CProviderProbe(this); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
125 |
sap->iNext = iList; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
126 |
iList = sap; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
127 |
return sap; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
128 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
129 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
130 |
// |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
131 |
// CProtocolProbe::CancelSAP |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
132 |
// ************************* |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
133 |
// Disconnect SAP from the protocol |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
134 |
// |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
135 |
void CProtocolProbe::CancelSAP(const CServProviderBase* aSAP) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
136 |
{ |
37 | 137 |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
138 |
CProviderProbe **h, *sap; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
139 |
for (h = &iList; (sap = *h) != NULL; h = &sap->iNext) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
140 |
if (sap == aSAP) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
141 |
{ |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
142 |
*h = sap->iNext; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
143 |
break; |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
144 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
145 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
146 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
147 |
// CProtocolProbe::NetworkAttachedL |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
148 |
// ******************************** |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
149 |
// When network becomes available, do the hooking! |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
150 |
// |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
151 |
void CProtocolProbe::NetworkAttachedL() |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
152 |
{ |
37 | 153 |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
154 |
NetworkService()->BindL(this, MIp6Hook::BindPostHook()); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
155 |
NetworkService()->BindL(this, MIp6Hook::BindPostHook()+1); |
37 | 156 |
|
157 |
// initialise dump file |
|
158 |
if(iFileOpen) |
|
159 |
{ |
|
160 |
iFile.Close(); |
|
161 |
iFileOpen = EFalse; |
|
162 |
} |
|
163 |
if(iFileServerOpen) |
|
164 |
{ |
|
165 |
iFs.Close(); |
|
166 |
iFileServerOpen = EFalse; |
|
167 |
} |
|
168 |
||
169 |
User::LeaveIfError(iFs.Connect()); |
|
170 |
iFileServerOpen = ETrue; |
|
171 |
TBuf<50> filename; |
|
172 |
filename.Append(KLogFolder); |
|
173 |
filename.Append(KTcpDumpFolder); |
|
174 |
filename.Append(KProbeDumpFile); |
|
175 |
User::LeaveIfError(iFile.Replace(iFs, filename, EFileWrite)); |
|
176 |
iFileOpen = ETrue; |
|
177 |
||
178 |
// allocate buffer |
|
179 |
if(!iBufCreated) |
|
180 |
{ |
|
181 |
const TInt KMaxBufferSize = 65535; |
|
182 |
iBuf.CreateL(KMaxBufferSize); |
|
183 |
iBufCreated = ETrue; |
|
184 |
} |
|
185 |
||
186 |
LibcapDumpFileHeader(); |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
187 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
188 |
|
37 | 189 |
void CProtocolProbe::Queue(RMBufChain &aPacket) |
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
190 |
// |
37 | 191 |
// Takes a copy of aPacket, adds it to the queue and triggers the callback |
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
192 |
// |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
193 |
{ |
37 | 194 |
|
195 |
RMBufPacketBase copy; |
|
196 |
TRAPD(err, copy.CopyPackedL(aPacket)); |
|
197 |
if (err == KErrNone) |
|
198 |
{ |
|
199 |
||
200 |
// |
|
201 |
// Calculate packet time-stamp |
|
202 |
// |
|
203 |
TTime newTime; |
|
204 |
newTime.UniversalTime(); |
|
205 |
TTimeIntervalMicroSeconds interval = newTime.MicroSecondsFrom(iTimeOrigin); |
|
206 |
||
207 |
const TInt KMicrosInASecond = 1000000; |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
208 |
|
37 | 209 |
//TUint32 micros = interval.Int64().Low(); |
210 |
TUint32 micros = I64LOW(interval.Int64());//.Low(); x.Low() -> I64LOW(x) |
|
211 |
TUint32 secs = micros / KMicrosInASecond; |
|
212 |
micros -= (secs * KMicrosInASecond); |
|
213 |
||
214 |
// |
|
215 |
// Reuse the protocol and flags fields of |
|
216 |
// RMBufPktInfo to store the time-stamp |
|
217 |
// |
|
218 |
RMBufPktInfo* info = RMBufPacket::PeekInfoInChain(copy); |
|
219 |
info->iProtocol = static_cast<TInt>(secs); |
|
220 |
info->iFlags = static_cast<TUint>(micros); |
|
221 |
||
222 |
iQueue.Append(copy); |
|
223 |
iDumpCb.CallBack(); |
|
224 |
} |
|
225 |
else |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
226 |
{ |
37 | 227 |
copy.Free(); |
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
228 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
229 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
230 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
231 |
|
37 | 232 |
// |
233 |
// CProtocolProbe::Dump |
|
234 |
// *********************** |
|
235 |
// Log the packet to file |
|
236 |
// |
|
237 |
void CProtocolProbe::Dump(RMBufChain &aPacket) |
|
238 |
{ |
|
239 |
||
240 |
RMBufPacket packet; |
|
241 |
packet.Assign(aPacket); |
|
242 |
RMBufPktInfo* info = packet.Unpack(); |
|
243 |
||
244 |
TUint32 secs = static_cast<TUint32>(info->iProtocol); |
|
245 |
TUint32 micros = static_cast<TUint32>(info->iFlags); |
|
246 |
||
247 |
iBuf.SetMax(); |
|
248 |
packet.CopyOut(iBuf, 0); |
|
249 |
if(iBuf.Length() != info->iLength) |
|
250 |
{ |
|
251 |
iBuf.SetLength(info->iLength); |
|
252 |
} |
|
253 |
LibcapDump(iBuf, secs, micros); |
|
254 |
packet.Free(); |
|
255 |
} |
|
256 |
||
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
257 |
TInt CProtocolProbe::Send(RMBufChain &aPacket, CProtocolBase* aSrc) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
258 |
{ |
37 | 259 |
|
260 |
Queue(aPacket); |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
261 |
return CProtocolPosthook::Send(aPacket, aSrc); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
262 |
} |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
263 |
|
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
264 |
void CProtocolProbe::Process(RMBufChain &aPacket, CProtocolBase* aSrc) |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
265 |
{ |
37 | 266 |
|
267 |
Queue(aPacket); |
|
0
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
268 |
CProtocolPosthook::Process(aPacket, aSrc); |
af10295192d8
Revision: 201004
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff
changeset
|
269 |
} |
37 | 270 |
|
271 |
void CProtocolProbe::LibcapDumpFileHeader() |
|
272 |
// |
|
273 |
// Dump file header in a format compatible with Libcap |
|
274 |
// |
|
275 |
// Format is: |
|
276 |
// |
|
277 |
// struct FileHeader |
|
278 |
// { |
|
279 |
// TUint32 magic; |
|
280 |
// TUint16 version_major; |
|
281 |
// TUint16 version_minor; |
|
282 |
// TUint32 thiszone; /* gmt to local correction */ |
|
283 |
// TUint32 sigfigs; /* accuracy of timestamps */ |
|
284 |
// TUint32 snaplen; /* max length saved portion of each pkt */ |
|
285 |
// TUint32 linktype; /* data link type (LINKTYPE_*) */ |
|
286 |
// }; |
|
287 |
// |
|
288 |
// Note LINKTYPE specified in libpcap/bpf/net/bpf.h (see www.tcpdump.org) |
|
289 |
// |
|
290 |
{ |
|
291 |
||
292 |
TBuf8<sizeof(TUint32)*5+sizeof(TUint16)*2> fileHeader; |
|
293 |
*((TUint32*) &(fileHeader.Ptr()[0])) = 0xa1b2c3d4; |
|
294 |
*((TUint16*) &(fileHeader.Ptr()[4])) = 0x02; |
|
295 |
*((TUint16*) &(fileHeader.Ptr()[6])) = 0x04; |
|
296 |
*((TUint32*) &(fileHeader.Ptr()[8])) = 0x00; |
|
297 |
*((TUint32*) &(fileHeader.Ptr()[12])) = 0x00; |
|
298 |
*((TUint32*) &(fileHeader.Ptr()[16])) = 0xffff; |
|
299 |
*((TUint32*) &(fileHeader.Ptr()[20])) = 12; // DLT_RAW 12 /* raw IP */ |
|
300 |
fileHeader.SetLength(fileHeader.MaxLength()); |
|
301 |
||
302 |
iFile.Write(fileHeader); |
|
303 |
} |
|
304 |
||
305 |
void CProtocolProbe::LibcapDump(const TDesC8& aBuffer, TUint32 aTimeStampSecs, TUint32 aTimeStampMicros) |
|
306 |
// |
|
307 |
// Dumps a packet in a format compatbible with Libcap |
|
308 |
// |
|
309 |
// For each record the format is: |
|
310 |
// |
|
311 |
// struct record |
|
312 |
// { |
|
313 |
// TUint32 sec; /* time stamp - secs*/ |
|
314 |
// TUint32 usec; /* time stamp - microsecs*/ |
|
315 |
// TUint32 captureLen; /* length packet captured */ |
|
316 |
// TUint32 packetLen; /* total length of packet*/ |
|
317 |
// }; |
|
318 |
// |
|
319 |
// Byte ordering of the header is little endian |
|
320 |
// Byte ordering of the packet is network byte order (big endian) |
|
321 |
// |
|
322 |
{ |
|
323 |
||
324 |
TBuf8<sizeof(TUint32)*4> recordHeader; |
|
325 |
recordHeader.FillZ(); |
|
326 |
||
327 |
*((TUint32*) &(recordHeader.Ptr()[0])) = aTimeStampSecs; |
|
328 |
*((TUint32*) &(recordHeader.Ptr()[4])) = aTimeStampMicros; |
|
329 |
*((TUint32*) &(recordHeader.Ptr()[8])) = aBuffer.Length(); |
|
330 |
*((TUint32*) &(recordHeader.Ptr()[12])) = aBuffer.Length(); |
|
331 |
recordHeader.SetLength(recordHeader.MaxLength()); |
|
332 |
||
333 |
iFile.Write(recordHeader); |
|
334 |
iFile.Write(aBuffer); |
|
335 |
} |
|
336 |
||
337 |
||
338 |
||
339 |
TInt CProtocolProbe::DumpCb(TAny* aThisPtr) |
|
340 |
// |
|
341 |
// Callback function - calls DumpQueuedPackets() |
|
342 |
// |
|
343 |
{ |
|
344 |
||
345 |
CProtocolProbe* self = static_cast<CProtocolProbe*>(aThisPtr); |
|
346 |
self->DumpQueuedPackets(); |
|
347 |
return KErrNone; |
|
348 |
} |
|
349 |
||
350 |
void CProtocolProbe::DumpQueuedPackets() |
|
351 |
// |
|
352 |
// Dumps all packets on the queue to the log file |
|
353 |
// |
|
354 |
{ |
|
355 |
||
356 |
RMBufPacketBase packet; |
|
357 |
while(iQueue.Remove(packet)) |
|
358 |
{ |
|
359 |
Dump(packet); |
|
360 |
} |
|
361 |
} |