summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/opcap.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index a9dc577..8ec4f47 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -1,463 +1,463 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer <mickey@Vanille.de> 3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer <mickey@Vanille.de>
4 =. 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28 28
29*/ 29*/
30 30
31#include "udp_ports.h" 31#include "udp_ports.h"
32#include "opcap.h" 32#include "opcap.h"
33 33
34/* OPIE */ 34/* OPIE */
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36using namespace Opie::Core; 36using namespace Opie::Core;
37 37
38/* QT */ 38/* QT */
39#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) 39#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects)
40#include <qsocketnotifier.h> 40#include <qsocketnotifier.h>
41#include <qobjectlist.h> 41#include <qobjectlist.h>
42 42
43/* STD */ 43/* STD */
44#include <sys/time.h> 44#include <sys/time.h>
45#include <sys/types.h> 45#include <sys/types.h>
46#include <assert.h> 46#include <assert.h>
47#include <unistd.h> 47#include <unistd.h>
48#include <string.h> 48#include <string.h>
49 49
50namespace Opie { 50namespace Opie {
51namespace Net { 51namespace Net {
52 52
53/*====================================================================================== 53/*======================================================================================
54 * OPacket 54 * OPacket
55 *======================================================================================*/ 55 *======================================================================================*/
56 56
57OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) 57OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent )
58 :QObject( parent, "Generic" ), _hdr( header ), _data( 0 ) 58 :QObject( parent, "Generic" ), _hdr( header ), _data( 0 )
59{ 59{
60 60
61 _data = new unsigned char[ header.len ]; 61 _data = new unsigned char[ header.len ];
62 assert( _data ); 62 assert( _data );
63 memcpy( const_cast<unsigned char*>(_data), data, header.len ); 63 memcpy( const_cast<unsigned char*>(_data), data, header.len );
64 // We have to copy the data structure here, because the 'data' pointer handed by libpcap 64 // We have to copy the data structure here, because the 'data' pointer handed by libpcap
65 // points to an internal region which is reused by lipcap. 65 // points to an internal region which is reused by lipcap.
66 odebug << "OPacket: Length = " << header.len << ", Caplen = " << header.caplen << oendl; 66 odebug << "OPacket: Length = " << header.len << ", Caplen = " << header.caplen << oendl;
67 _end = (unsigned char*) _data + header.len; 67 _end = (unsigned char*) _data + header.len;
68 68
69 switch ( datalink ) 69 switch ( datalink )
70 { 70 {
71 case DLT_EN10MB: 71 case DLT_EN10MB:
72 odebug << "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" << oendl; 72 odebug << "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" << oendl;
73 new OEthernetPacket( _end, (const struct ether_header*) _data, this ); 73 new OEthernetPacket( _end, (const struct ether_header*) _data, this );
74 break; 74 break;
75 75
76 case DLT_IEEE802_11: 76 case DLT_IEEE802_11:
77 odebug << "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" << oendl; 77 odebug << "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" << oendl;
78 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) _data, this ); 78 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) _data, this );
79 break; 79 break;
80 80
81 case DLT_PRISM_HEADER: 81 case DLT_PRISM_HEADER:
82 odebug << "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" << oendl; 82 odebug << "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" << oendl;
83 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) _data, this ); 83 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) _data, this );
84 break; 84 break;
85 85
86 default: 86 default:
87 owarn << "OPacket::OPacket(): Received Packet over unsupported datalink, type " << datalink << "!" << oendl; 87 owarn << "OPacket::OPacket(): Received Packet over unsupported datalink, type " << datalink << "!" << oendl;
88 } 88 }
89} 89}
90 90
91 91
92OPacket::~OPacket() 92OPacket::~OPacket()
93{ 93{
94 odebug << "~OPacket( " << name() << " )" << oendl; 94 odebug << "~OPacket( " << name() << " )" << oendl;
95 delete _data; 95 delete _data;
96} 96}
97 97
98 98
99timevalstruct OPacket::timeval() const 99timevalstruct OPacket::timeval() const
100{ 100{
101 return _hdr.ts; 101 return _hdr.ts;
102} 102}
103 103
104 104
105int OPacket::caplen() const 105int OPacket::caplen() const
106{ 106{
107 return _hdr.caplen; 107 return _hdr.caplen;
108} 108}
109 109
110 110
111void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) 111void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l )
112{ 112{
113 if (!l) return; 113 if (!l) return;
114 QObject* o = l->first(); 114 QObject* o = l->first();
115 while ( o ) 115 while ( o )
116 { 116 {
117 stats[o->name()]++; 117 stats[o->name()]++;
118 updateStats( stats, const_cast<QObjectList*>( o->children() ) ); 118 updateStats( stats, const_cast<QObjectList*>( o->children() ) );
119 o = l->next(); 119 o = l->next();
120 } 120 }
121} 121}
122 122
123 123
124QString OPacket::dumpStructure() const 124QString OPacket::dumpStructure() const
125{ 125{
126 return "[ |" + _dumpStructure( const_cast<QObjectList*>( this->children() ) ) + " ]"; 126 return "[ |" + _dumpStructure( const_cast<QObjectList*>( this->children() ) ) + " ]";
127} 127}
128 128
129 129
130QString OPacket::_dumpStructure( QObjectList* l ) const 130QString OPacket::_dumpStructure( QObjectList* l ) const
131{ 131{
132 if (!l) return QString::null; 132 if (!l) return QString::null;
133 QObject* o = l->first(); 133 QObject* o = l->first();
134 QString str(" "); 134 QString str(" ");
135 135
136 while ( o ) 136 while ( o )
137 { 137 {
138 str.append( o->name() ); 138 str.append( o->name() );
139 str.append( " |" ); 139 str.append( " |" );
140 str += _dumpStructure( const_cast<QObjectList*>( o->children() ) ); 140 str += _dumpStructure( const_cast<QObjectList*>( o->children() ) );
141 o = l->next(); 141 o = l->next();
142 } 142 }
143 return str; 143 return str;
144} 144}
145 145
146QString OPacket::dump( int bpl ) const 146QString OPacket::dump( int bpl ) const
147{ 147{
148 static int index = 0; 148 static int index = 0;
149 index++; 149 index++;
150 int len = _hdr.caplen; 150 int len = _hdr.caplen;
151 QString str; 151 QString str;
152 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); 152 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len );
153 str.append( "0000: " ); 153 str.append( "0000: " );
154 QString tmp; 154 QString tmp;
155 QString bytes; 155 QString bytes;
156 QString chars; 156 QString chars;
157 157
158 for ( int i = 0; i < len; ++i ) 158 for ( int i = 0; i < len; ++i )
159 { 159 {
160 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); 160 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp );
161 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); 161 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] );
162 else chars.append( '.' ); 162 else chars.append( '.' );
163 163
164 if ( !((i+1) % bpl) ) 164 if ( !((i+1) % bpl) )
165 { 165 {
166 str.append( bytes ); 166 str.append( bytes );
167 str.append( ' ' ); 167 str.append( ' ' );
168 str.append( chars ); 168 str.append( chars );
169 str.append( '\n' ); 169 str.append( '\n' );
170 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); 170 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp );
171 bytes = ""; 171 bytes = "";
172 chars = ""; 172 chars = "";
173 } 173 }
174 174
175 } 175 }
176 if ( (len % bpl) ) 176 if ( (len % bpl) )
177 { 177 {
178 str.append( bytes.leftJustify( 1 + 3*bpl ) ); 178 str.append( bytes.leftJustify( 1 + 3*bpl ) );
179 str.append( chars ); 179 str.append( chars );
180 } 180 }
181 str.append( '\n' ); 181 str.append( '\n' );
182 return str; 182 return str;
183} 183}
184 184
185 185
186int OPacket::len() const 186int OPacket::len() const
187{ 187{
188 return _hdr.len; 188 return _hdr.len;
189} 189}
190 190
191 191
192QTextStream& operator<<( QTextStream& s, const OPacket& p ) 192QTextStream& operator<<( QTextStream& s, const OPacket& p )
193{ 193{
194 s << p.dumpStructure(); 194 s << p.dumpStructure();
195} 195}
196 196
197 197
198/*====================================================================================== 198/*======================================================================================
199 * OEthernetPacket 199 * OEthernetPacket
200 *======================================================================================*/ 200 *======================================================================================*/
201 201
202OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) 202OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent )
203 :QObject( parent, "Ethernet" ), _ether( data ) 203 :QObject( parent, "Ethernet" ), _ether( data )
204{ 204{
205 205
206 odebug << "Source = " << sourceAddress().toString(); 206 odebug << "Source = " << sourceAddress().toString() << oendl;
207 odebug << "Destination = " << destinationAddress().toString(); 207 odebug << "Destination = " << destinationAddress().toString() << oendl;
208 208
209 if ( sourceAddress() == OMacAddress::broadcast ) 209 if ( sourceAddress() == OMacAddress::broadcast )
210 odebug << "Source is broadcast address" << oendl; 210 odebug << "Source is broadcast address" << oendl;
211 if ( destinationAddress() == OMacAddress::broadcast ) 211 if ( destinationAddress() == OMacAddress::broadcast )
212 odebug << "Destination is broadcast address" << oendl; 212 odebug << "Destination is broadcast address" << oendl;
213 213
214 switch ( type() ) 214 switch ( type() )
215 { 215 {
216 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; 216 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break;
217 case ETHERTYPE_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break; 217 case ETHERTYPE_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break;
218 case ETHERTYPE_REVARP: { odebug << "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" << oendl; break; } 218 case ETHERTYPE_REVARP: { odebug << "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" << oendl; break; }
219 default: odebug << "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" << oendl; 219 default: odebug << "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" << oendl;
220 } 220 }
221 221
222} 222}
223 223
224 224
225OEthernetPacket::~OEthernetPacket() 225OEthernetPacket::~OEthernetPacket()
226{ 226{
227} 227}
228 228
229 229
230OMacAddress OEthernetPacket::sourceAddress() const 230OMacAddress OEthernetPacket::sourceAddress() const
231{ 231{
232 return OMacAddress( _ether->ether_shost ); 232 return OMacAddress( _ether->ether_shost );
233} 233}
234 234
235 235
236OMacAddress OEthernetPacket::destinationAddress() const 236OMacAddress OEthernetPacket::destinationAddress() const
237{ 237{
238 return OMacAddress( _ether->ether_dhost ); 238 return OMacAddress( _ether->ether_dhost );
239} 239}
240 240
241int OEthernetPacket::type() const 241int OEthernetPacket::type() const
242{ 242{
243 return ntohs( _ether->ether_type ); 243 return ntohs( _ether->ether_type );
244} 244}
245 245
246 246
247/*====================================================================================== 247/*======================================================================================
248 * OIPPacket 248 * OIPPacket
249 *======================================================================================*/ 249 *======================================================================================*/
250 250
251 251
252OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) 252OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent )
253 :QObject( parent, "IP" ), _iphdr( data ) 253 :QObject( parent, "IP" ), _iphdr( data )
254{ 254{
255 odebug << "OIPPacket::OIPPacket(): decoding IP header..." << oendl; 255 odebug << "OIPPacket::OIPPacket(): decoding IP header..." << oendl;
256 256
257 odebug << "FromAddress = " << fromIPAddress().toString() << oendl; 257 odebug << "FromAddress = " << fromIPAddress().toString() << oendl;
258 odebug << " toAddress = " << toIPAddress().toString() << oendl; 258 odebug << " toAddress = " << toIPAddress().toString() << oendl;
259 259
260 switch ( protocol() ) 260 switch ( protocol() )
261 { 261 {
262 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; 262 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break;
263 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; 263 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break;
264 default: odebug << "OIPPacket::OIPPacket(): unknown IP protocol, type = " << protocol() << oendl; 264 default: odebug << "OIPPacket::OIPPacket(): unknown IP protocol, type = " << protocol() << oendl;
265 } 265 }
266 266
267} 267}
268 268
269OIPPacket::~OIPPacket() 269OIPPacket::~OIPPacket()
270{ 270{
271} 271}
272 272
273 273
274QHostAddress OIPPacket::fromIPAddress() const 274QHostAddress OIPPacket::fromIPAddress() const
275{ 275{
276 return EXTRACT_32BITS( &_iphdr->saddr ); 276 return EXTRACT_32BITS( &_iphdr->saddr );
277} 277}
278 278
279 279
280QHostAddress OIPPacket::toIPAddress() const 280QHostAddress OIPPacket::toIPAddress() const
281{ 281{
282 return EXTRACT_32BITS( &_iphdr->saddr ); 282 return EXTRACT_32BITS( &_iphdr->saddr );
283} 283}
284 284
285 285
286int OIPPacket::tos() const 286int OIPPacket::tos() const
287{ 287{
288 return _iphdr->tos; 288 return _iphdr->tos;
289} 289}
290 290
291 291
292int OIPPacket::len() const 292int OIPPacket::len() const
293{ 293{
294 return EXTRACT_16BITS( &_iphdr->tot_len ); 294 return EXTRACT_16BITS( &_iphdr->tot_len );
295} 295}
296 296
297 297
298int OIPPacket::id() const 298int OIPPacket::id() const
299{ 299{
300 return EXTRACT_16BITS( &_iphdr->id ); 300 return EXTRACT_16BITS( &_iphdr->id );
301} 301}
302 302
303 303
304int OIPPacket::offset() const 304int OIPPacket::offset() const
305{ 305{
306 return EXTRACT_16BITS( &_iphdr->frag_off ); 306 return EXTRACT_16BITS( &_iphdr->frag_off );
307} 307}
308 308
309 309
310int OIPPacket::ttl() const 310int OIPPacket::ttl() const
311{ 311{
312 return _iphdr->ttl; 312 return _iphdr->ttl;
313} 313}
314 314
315 315
316int OIPPacket::protocol() const 316int OIPPacket::protocol() const
317{ 317{
318 return _iphdr->protocol; 318 return _iphdr->protocol;
319} 319}
320 320
321 321
322int OIPPacket::checksum() const 322int OIPPacket::checksum() const
323{ 323{
324 return EXTRACT_16BITS( &_iphdr->check ); 324 return EXTRACT_16BITS( &_iphdr->check );
325} 325}
326 326
327/*====================================================================================== 327/*======================================================================================
328 * OARPPacket 328 * OARPPacket
329 *======================================================================================*/ 329 *======================================================================================*/
330 330
331 331
332OARPPacket::OARPPacket( const unsigned char* end, const struct myarphdr* data, QObject* parent ) 332OARPPacket::OARPPacket( const unsigned char* end, const struct myarphdr* data, QObject* parent )
333 :QObject( parent, "ARP" ), _arphdr( data ) 333 :QObject( parent, "ARP" ), _arphdr( data )
334{ 334{
335 odebug << "OARPPacket::OARPPacket(): decoding ARP header..." << oendl; 335 odebug << "OARPPacket::OARPPacket(): decoding ARP header..." << oendl;
336 odebug << "ARP type seems to be " << EXTRACT_16BITS( &_arphdr->ar_op ) << " = " << type() << oendl; 336 odebug << "ARP type seems to be " << EXTRACT_16BITS( &_arphdr->ar_op ) << " = " << type() << oendl;
337 odebug << "Sender: MAC " << senderMacAddress().toString() << " = IP " << senderIPV4Address().toString() << oendl; 337 odebug << "Sender: MAC " << senderMacAddress().toString() << " = IP " << senderIPV4Address().toString() << oendl;
338 odebug << "Target: MAC " << targetMacAddress().toString() << " = IP " << targetIPV4Address().toString() << oendl; 338 odebug << "Target: MAC " << targetMacAddress().toString() << " = IP " << targetIPV4Address().toString() << oendl;
339} 339}
340 340
341 341
342OARPPacket::~OARPPacket() 342OARPPacket::~OARPPacket()
343{ 343{
344} 344}
345 345
346 346
347QString OARPPacket::type() const 347QString OARPPacket::type() const
348{ 348{
349 switch ( EXTRACT_16BITS( &_arphdr->ar_op ) ) 349 switch ( EXTRACT_16BITS( &_arphdr->ar_op ) )
350 { 350 {
351 case 1: return "REQUEST"; 351 case 1: return "REQUEST";
352 case 2: return "REPLY"; 352 case 2: return "REPLY";
353 case 3: return "RREQUEST"; 353 case 3: return "RREQUEST";
354 case 4: return "RREPLY"; 354 case 4: return "RREPLY";
355 case 8: return "InREQUEST"; 355 case 8: return "InREQUEST";
356 case 9: return "InREPLY"; 356 case 9: return "InREPLY";
357 case 10: return "NAK"; 357 case 10: return "NAK";
358 default: owarn << "OARPPacket::type(): invalid ARP type!" << oendl; return "<unknown>"; 358 default: owarn << "OARPPacket::type(): invalid ARP type!" << oendl; return "<unknown>";
359 } 359 }
360} 360}
361 361
362 362
363QHostAddress OARPPacket::senderIPV4Address() const 363QHostAddress OARPPacket::senderIPV4Address() const
364{ 364{
365 return EXTRACT_32BITS( &_arphdr->ar_sip ); 365 return EXTRACT_32BITS( &_arphdr->ar_sip );
366} 366}
367 367
368 368
369QHostAddress OARPPacket::targetIPV4Address() const 369QHostAddress OARPPacket::targetIPV4Address() const
370{ 370{
371 return EXTRACT_32BITS( &_arphdr->ar_tip ); 371 return EXTRACT_32BITS( &_arphdr->ar_tip );
372} 372}
373 373
374 374
375OMacAddress OARPPacket::senderMacAddress() const 375OMacAddress OARPPacket::senderMacAddress() const
376{ 376{
377 return OMacAddress( _arphdr->ar_sha ); 377 return OMacAddress( _arphdr->ar_sha );
378} 378}
379 379
380 380
381OMacAddress OARPPacket::targetMacAddress() const 381OMacAddress OARPPacket::targetMacAddress() const
382{ 382{
383 return OMacAddress( _arphdr->ar_tha ); 383 return OMacAddress( _arphdr->ar_tha );
384} 384}
385 385
386 386
387/*====================================================================================== 387/*======================================================================================
388 * OUDPPacket 388 * OUDPPacket
389 *======================================================================================*/ 389 *======================================================================================*/
390 390
391 391
392OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) 392OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent )
393 :QObject( parent, "UDP" ), _udphdr( data ) 393 :QObject( parent, "UDP" ), _udphdr( data )
394 394
395{ 395{
396 odebug << "OUDPPacket::OUDPPacket(): decoding UDP header..." << oendl; 396 odebug << "OUDPPacket::OUDPPacket(): decoding UDP header..." << oendl;
397 odebug << "fromPort = " << fromPort() << oendl; 397 odebug << "fromPort = " << fromPort() << oendl;
398 odebug << " toPort = " << toPort() << oendl; 398 odebug << " toPort = " << toPort() << oendl;
399 399
400 // TODO: Make this a case or a hash if we know more udp protocols 400 // TODO: Make this a case or a hash if we know more udp protocols
401 401
402 if ( fromPort() == UDP_PORT_BOOTPS || fromPort() == UDP_PORT_BOOTPC || 402 if ( fromPort() == UDP_PORT_BOOTPS || fromPort() == UDP_PORT_BOOTPC ||
403 toPort() == UDP_PORT_BOOTPS || toPort() == UDP_PORT_BOOTPC ) 403 toPort() == UDP_PORT_BOOTPS || toPort() == UDP_PORT_BOOTPC )
404 { 404 {
405 odebug << "seems to be part of a DHCP conversation => creating DHCP packet." << oendl; 405 odebug << "seems to be part of a DHCP conversation => creating DHCP packet." << oendl;
406 new ODHCPPacket( end, (const struct dhcp_packet*) (data+1), this ); 406 new ODHCPPacket( end, (const struct dhcp_packet*) (data+1), this );
407 } 407 }
408} 408}
409 409
410 410
411OUDPPacket::~OUDPPacket() 411OUDPPacket::~OUDPPacket()
412{ 412{
413} 413}
414 414
415 415
416int OUDPPacket::fromPort() const 416int OUDPPacket::fromPort() const
417{ 417{
418 return EXTRACT_16BITS( &_udphdr->source ); 418 return EXTRACT_16BITS( &_udphdr->source );
419} 419}
420 420
421 421
422int OUDPPacket::toPort() const 422int OUDPPacket::toPort() const
423{ 423{
424 return EXTRACT_16BITS( &_udphdr->dest ); 424 return EXTRACT_16BITS( &_udphdr->dest );
425} 425}
426 426
427 427
428int OUDPPacket::length() const 428int OUDPPacket::length() const
429{ 429{
430 return EXTRACT_16BITS( &_udphdr->len ); 430 return EXTRACT_16BITS( &_udphdr->len );
431} 431}
432 432
433 433
434int OUDPPacket::checksum() const 434int OUDPPacket::checksum() const
435{ 435{
436 return EXTRACT_16BITS( &_udphdr->check ); 436 return EXTRACT_16BITS( &_udphdr->check );
437} 437}
438 438
439 439
440/*====================================================================================== 440/*======================================================================================
441 * ODHCPPacket 441 * ODHCPPacket
442 *======================================================================================*/ 442 *======================================================================================*/
443 443
444 444
445ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) 445ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent )
446 :QObject( parent, "DHCP" ), _dhcphdr( data ) 446 :QObject( parent, "DHCP" ), _dhcphdr( data )
447 447
448{ 448{
449 odebug << "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." << oendl; 449 odebug << "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." << oendl;
450 odebug << "DHCP opcode seems to be " << _dhcphdr->op << ": " << ( isRequest() ? "REQUEST" : "REPLY" ) << oendl; 450 odebug << "DHCP opcode seems to be " << _dhcphdr->op << ": " << ( isRequest() ? "REQUEST" : "REPLY" ) << oendl;
451 odebug << "clientAddress = " << clientAddress().toString() << oendl; 451 odebug << "clientAddress = " << clientAddress().toString() << oendl;
452 odebug << " yourAddress = " << yourAddress().toString() << oendl; 452 odebug << " yourAddress = " << yourAddress().toString() << oendl;
453 odebug << "serverAddress = " << serverAddress().toString() << oendl; 453 odebug << "serverAddress = " << serverAddress().toString() << oendl;
454 odebug << " relayAddress = " << relayAddress().toString() << oendl; 454 odebug << " relayAddress = " << relayAddress().toString() << oendl;
455 odebug << "parsing DHCP options..." << oendl; 455 odebug << "parsing DHCP options..." << oendl;
456 456
457 _type = 0; 457 _type = 0;
458 458
459 const unsigned char* option = &_dhcphdr->options[4]; 459 const unsigned char* option = &_dhcphdr->options[4];
460 char tag = -1; 460 char tag = -1;
461 char len = -1; 461 char len = -1;
462 462
463 while ( ( tag = *option++ ) != -1 /* end of option field */ ) 463 while ( ( tag = *option++ ) != -1 /* end of option field */ )