author | mickeyl <mickeyl> | 2003-10-03 13:43:57 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-10-03 13:43:57 (UTC) |
commit | 9450f41ce6109fb9d22fca7b1c72c606fd37f5a7 (patch) (unidiff) | |
tree | f88ab19eaaff43d8f72abe773d60e318e9a9e314 | |
parent | 78b29c765dbe70faec614796a4d1421eaf0ec773 (diff) | |
download | opie-9450f41ce6109fb9d22fca7b1c72c606fd37f5a7.zip opie-9450f41ce6109fb9d22fca7b1c72c606fd37f5a7.tar.gz opie-9450f41ce6109fb9d22fca7b1c72c606fd37f5a7.tar.bz2 |
add defines for UDP-based protocols
detect DHCP and link it into the packet chain
-rw-r--r-- | libopie2/opienet/opcap.cpp | 33 | ||||
-rw-r--r-- | libopie2/opienet/udp_ports.h | 89 |
2 files changed, 112 insertions, 10 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp index cc8ce7f..f1f2b4b 100644 --- a/libopie2/opienet/opcap.cpp +++ b/libopie2/opienet/opcap.cpp | |||
@@ -1,1175 +1,1188 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2003 by the Wellenreiter team: | 3 | Copyright (C) 2003 by the Wellenreiter team: |
4 | Martin J. Muench <mjm@remote-exploit.org> | 4 | Martin J. Muench <mjm@remote-exploit.org> |
5 | Max Moser <mmo@remote-exploit.org | 5 | Max Moser <mmo@remote-exploit.org |
6 | Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 6 | Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
7 | =. | 7 | =. |
8 | .=l. | 8 | .=l. |
9 | .>+-= | 9 | .>+-= |
10 | _;:, .> :=|. This program is free software; you can | 10 | _;:, .> :=|. This program is free software; you can |
11 | .> <`_, > . <= redistribute it and/or modify it under | 11 | .> <`_, > . <= redistribute it and/or modify it under |
12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
13 | .="- .-=="i, .._ License as published by the Free Software | 13 | .="- .-=="i, .._ License as published by the Free Software |
14 | - . .-<_> .<> Foundation; either version 2 of the License, | 14 | - . .-<_> .<> Foundation; either version 2 of the License, |
15 | ._= =} : or (at your option) any later version. | 15 | ._= =} : or (at your option) any later version. |
16 | .%`+i> _;_. | 16 | .%`+i> _;_. |
17 | .i_,=:_. -<s. This program is distributed in the hope that | 17 | .i_,=:_. -<s. This program is distributed in the hope that |
18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
19 | : .. .:, . . . without even the implied warranty of | 19 | : .. .:, . . . without even the implied warranty of |
20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
22 | ..}^=.= = ; Library General Public License for more | 22 | ..}^=.= = ; Library General Public License for more |
23 | ++= -. .` .: details. | 23 | ++= -. .` .: details. |
24 | : = ...= . :.=- | 24 | : = ...= . :.=- |
25 | -. .:....=;==+<; You should have received a copy of the GNU | 25 | -. .:....=;==+<; You should have received a copy of the GNU |
26 | -_. . . )=. = Library General Public License along with | 26 | -_. . . )=. = Library General Public License along with |
27 | -- :-=` this library; see the file COPYING.LIB. | 27 | -- :-=` this library; see the file COPYING.LIB. |
28 | If not, write to the Free Software Foundation, | 28 | If not, write to the Free Software Foundation, |
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | 31 | ||
32 | */ | 32 | */ |
33 | 33 | ||
34 | /* OPIE */ | 34 | /* OPIE */ |
35 | 35 | ||
36 | #include <opie2/opcap.h> | 36 | #include <opie2/opcap.h> |
37 | 37 | ||
38 | /* QT */ | 38 | /* QT */ |
39 | 39 | ||
40 | #include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) | 40 | #include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) |
41 | #include <qsocketnotifier.h> | 41 | #include <qsocketnotifier.h> |
42 | #include <qobjectlist.h> | 42 | #include <qobjectlist.h> |
43 | 43 | ||
44 | #include "udp_ports.h" | ||
45 | |||
44 | /*====================================================================================== | 46 | /*====================================================================================== |
45 | * OPacket | 47 | * OPacket |
46 | *======================================================================================*/ | 48 | *======================================================================================*/ |
47 | 49 | ||
48 | OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) | 50 | OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) |
49 | :QObject( parent, "Generic" ), _hdr( header ), _data( data ) | 51 | :QObject( parent, "Generic" ), _hdr( header ), _data( data ) |
50 | { | 52 | { |
51 | //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); | 53 | //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); |
52 | 54 | ||
53 | _end = (unsigned char*) data + header.len; | 55 | _end = (unsigned char*) data + header.len; |
54 | //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); | 56 | //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); |
55 | 57 | ||
56 | switch ( datalink ) | 58 | switch ( datalink ) |
57 | { | 59 | { |
58 | case DLT_EN10MB: | 60 | case DLT_EN10MB: |
59 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); | 61 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); |
60 | new OEthernetPacket( _end, (const struct ether_header*) data, this ); | 62 | new OEthernetPacket( _end, (const struct ether_header*) data, this ); |
61 | break; | 63 | break; |
62 | 64 | ||
63 | case DLT_IEEE802_11: | 65 | case DLT_IEEE802_11: |
64 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); | 66 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); |
65 | new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); | 67 | new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); |
66 | break; | 68 | break; |
67 | 69 | ||
68 | case DLT_PRISM_HEADER: | 70 | case DLT_PRISM_HEADER: |
69 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" ); | 71 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" ); |
70 | new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this ); | 72 | new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this ); |
71 | break; | 73 | break; |
72 | 74 | ||
73 | default: | 75 | default: |
74 | qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink (type %d)!", datalink ); | 76 | qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink (type %d)!", datalink ); |
75 | } | 77 | } |
76 | } | 78 | } |
77 | 79 | ||
78 | 80 | ||
79 | OPacket::~OPacket() | 81 | OPacket::~OPacket() |
80 | { | 82 | { |
81 | } | 83 | } |
82 | 84 | ||
83 | 85 | ||
84 | timevalstruct OPacket::timeval() const | 86 | timevalstruct OPacket::timeval() const |
85 | { | 87 | { |
86 | return _hdr.ts; | 88 | return _hdr.ts; |
87 | } | 89 | } |
88 | 90 | ||
89 | 91 | ||
90 | int OPacket::caplen() const | 92 | int OPacket::caplen() const |
91 | { | 93 | { |
92 | return _hdr.caplen; | 94 | return _hdr.caplen; |
93 | } | 95 | } |
94 | 96 | ||
95 | 97 | ||
96 | void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) | 98 | void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) |
97 | { | 99 | { |
98 | if (!l) return; | 100 | if (!l) return; |
99 | QObject* o = l->first(); | 101 | QObject* o = l->first(); |
100 | while ( o ) | 102 | while ( o ) |
101 | { | 103 | { |
102 | stats[o->name()]++; | 104 | stats[o->name()]++; |
103 | updateStats( stats, const_cast<QObjectList*>( o->children() ) ); | 105 | updateStats( stats, const_cast<QObjectList*>( o->children() ) ); |
104 | o = l->next(); | 106 | o = l->next(); |
105 | } | 107 | } |
106 | } | 108 | } |
107 | 109 | ||
108 | 110 | ||
109 | QString OPacket::dump( int bpl ) const | 111 | QString OPacket::dump( int bpl ) const |
110 | { | 112 | { |
111 | static int index = 0; | 113 | static int index = 0; |
112 | index++; | 114 | index++; |
113 | int len = _hdr.caplen; | 115 | int len = _hdr.caplen; |
114 | QString str; | 116 | QString str; |
115 | str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); | 117 | str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); |
116 | str.append( "0000: " ); | 118 | str.append( "0000: " ); |
117 | QString tmp; | 119 | QString tmp; |
118 | QString bytes; | 120 | QString bytes; |
119 | QString chars; | 121 | QString chars; |
120 | 122 | ||
121 | for ( int i = 0; i < len; ++i ) | 123 | for ( int i = 0; i < len; ++i ) |
122 | { | 124 | { |
123 | tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); | 125 | tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); |
124 | if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); | 126 | if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); |
125 | else chars.append( '.' ); | 127 | else chars.append( '.' ); |
126 | 128 | ||
127 | if ( !((i+1) % bpl) ) | 129 | if ( !((i+1) % bpl) ) |
128 | { | 130 | { |
129 | str.append( bytes ); | 131 | str.append( bytes ); |
130 | str.append( ' ' ); | 132 | str.append( ' ' ); |
131 | str.append( chars ); | 133 | str.append( chars ); |
132 | str.append( '\n' ); | 134 | str.append( '\n' ); |
133 | tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); | 135 | tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); |
134 | bytes = ""; | 136 | bytes = ""; |
135 | chars = ""; | 137 | chars = ""; |
136 | } | 138 | } |
137 | 139 | ||
138 | } | 140 | } |
139 | if ( (len % bpl) ) | 141 | if ( (len % bpl) ) |
140 | { | 142 | { |
141 | str.append( bytes.leftJustify( 1 + 3*bpl ) ); | 143 | str.append( bytes.leftJustify( 1 + 3*bpl ) ); |
142 | str.append( chars ); | 144 | str.append( chars ); |
143 | } | 145 | } |
144 | str.append( '\n' ); | 146 | str.append( '\n' ); |
145 | return str; | 147 | return str; |
146 | } | 148 | } |
147 | 149 | ||
148 | 150 | ||
149 | int OPacket::len() const | 151 | int OPacket::len() const |
150 | { | 152 | { |
151 | return _hdr.len; | 153 | return _hdr.len; |
152 | } | 154 | } |
153 | 155 | ||
154 | 156 | ||
155 | /*====================================================================================== | 157 | /*====================================================================================== |
156 | * OEthernetPacket | 158 | * OEthernetPacket |
157 | *======================================================================================*/ | 159 | *======================================================================================*/ |
158 | 160 | ||
159 | OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) | 161 | OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) |
160 | :QObject( parent, "Ethernet" ), _ether( data ) | 162 | :QObject( parent, "Ethernet" ), _ether( data ) |
161 | { | 163 | { |
162 | 164 | ||
163 | qDebug( "Source = %s", (const char*) sourceAddress().toString() ); | 165 | qDebug( "Source = %s", (const char*) sourceAddress().toString() ); |
164 | qDebug( "Destination = %s", (const char*) destinationAddress().toString() ); | 166 | qDebug( "Destination = %s", (const char*) destinationAddress().toString() ); |
165 | 167 | ||
166 | if ( sourceAddress() == OMacAddress::broadcast ) | 168 | if ( sourceAddress() == OMacAddress::broadcast ) |
167 | qDebug( "Source is broadcast address" ); | 169 | qDebug( "Source is broadcast address" ); |
168 | if ( destinationAddress() == OMacAddress::broadcast ) | 170 | if ( destinationAddress() == OMacAddress::broadcast ) |
169 | qDebug( "Destination is broadcast address" ); | 171 | qDebug( "Destination is broadcast address" ); |
170 | 172 | ||
171 | switch ( type() ) | 173 | switch ( type() ) |
172 | { | 174 | { |
173 | case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; | 175 | case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; |
174 | case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } | 176 | case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } |
175 | case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } | 177 | case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } |
176 | default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); | 178 | default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); |
177 | } | 179 | } |
178 | 180 | ||
179 | } | 181 | } |
180 | 182 | ||
181 | 183 | ||
182 | OEthernetPacket::~OEthernetPacket() | 184 | OEthernetPacket::~OEthernetPacket() |
183 | { | 185 | { |
184 | } | 186 | } |
185 | 187 | ||
186 | 188 | ||
187 | OMacAddress OEthernetPacket::sourceAddress() const | 189 | OMacAddress OEthernetPacket::sourceAddress() const |
188 | { | 190 | { |
189 | return OMacAddress( _ether->ether_shost ); | 191 | return OMacAddress( _ether->ether_shost ); |
190 | } | 192 | } |
191 | 193 | ||
192 | 194 | ||
193 | OMacAddress OEthernetPacket::destinationAddress() const | 195 | OMacAddress OEthernetPacket::destinationAddress() const |
194 | { | 196 | { |
195 | return OMacAddress( _ether->ether_dhost ); | 197 | return OMacAddress( _ether->ether_dhost ); |
196 | } | 198 | } |
197 | 199 | ||
198 | int OEthernetPacket::type() const | 200 | int OEthernetPacket::type() const |
199 | { | 201 | { |
200 | return ntohs( _ether->ether_type ); | 202 | return ntohs( _ether->ether_type ); |
201 | } | 203 | } |
202 | 204 | ||
203 | 205 | ||
204 | /*====================================================================================== | 206 | /*====================================================================================== |
205 | * OIPPacket | 207 | * OIPPacket |
206 | *======================================================================================*/ | 208 | *======================================================================================*/ |
207 | 209 | ||
208 | 210 | ||
209 | OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) | 211 | OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) |
210 | :QObject( parent, "IP" ), _iphdr( data ) | 212 | :QObject( parent, "IP" ), _iphdr( data ) |
211 | { | 213 | { |
212 | qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); | 214 | qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); |
213 | 215 | ||
214 | //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) ); | 216 | //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) ); |
215 | //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) ); | 217 | //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) ); |
216 | 218 | ||
217 | qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() ); | 219 | qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() ); |
218 | qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); | 220 | qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); |
219 | 221 | ||
220 | switch ( protocol() ) | 222 | switch ( protocol() ) |
221 | { | 223 | { |
222 | case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; | 224 | case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; |
223 | case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; | 225 | case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; |
224 | default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); | 226 | default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); |
225 | } | 227 | } |
226 | 228 | ||
227 | } | 229 | } |
228 | 230 | ||
229 | OIPPacket::~OIPPacket() | 231 | OIPPacket::~OIPPacket() |
230 | { | 232 | { |
231 | } | 233 | } |
232 | 234 | ||
233 | 235 | ||
234 | QHostAddress OIPPacket::fromIPAddress() const | 236 | QHostAddress OIPPacket::fromIPAddress() const |
235 | { | 237 | { |
236 | return EXTRACT_32BITS( &_iphdr->saddr ); | 238 | return EXTRACT_32BITS( &_iphdr->saddr ); |
237 | } | 239 | } |
238 | 240 | ||
239 | 241 | ||
240 | QHostAddress OIPPacket::toIPAddress() const | 242 | QHostAddress OIPPacket::toIPAddress() const |
241 | { | 243 | { |
242 | return EXTRACT_32BITS( &_iphdr->saddr ); | 244 | return EXTRACT_32BITS( &_iphdr->saddr ); |
243 | } | 245 | } |
244 | 246 | ||
245 | 247 | ||
246 | int OIPPacket::tos() const | 248 | int OIPPacket::tos() const |
247 | { | 249 | { |
248 | return _iphdr->tos; | 250 | return _iphdr->tos; |
249 | } | 251 | } |
250 | 252 | ||
251 | 253 | ||
252 | int OIPPacket::len() const | 254 | int OIPPacket::len() const |
253 | { | 255 | { |
254 | return EXTRACT_16BITS( &_iphdr->tot_len ); | 256 | return EXTRACT_16BITS( &_iphdr->tot_len ); |
255 | } | 257 | } |
256 | 258 | ||
257 | 259 | ||
258 | int OIPPacket::id() const | 260 | int OIPPacket::id() const |
259 | { | 261 | { |
260 | return EXTRACT_16BITS( &_iphdr->id ); | 262 | return EXTRACT_16BITS( &_iphdr->id ); |
261 | } | 263 | } |
262 | 264 | ||
263 | 265 | ||
264 | int OIPPacket::offset() const | 266 | int OIPPacket::offset() const |
265 | { | 267 | { |
266 | return EXTRACT_16BITS( &_iphdr->frag_off ); | 268 | return EXTRACT_16BITS( &_iphdr->frag_off ); |
267 | } | 269 | } |
268 | 270 | ||
269 | 271 | ||
270 | int OIPPacket::ttl() const | 272 | int OIPPacket::ttl() const |
271 | { | 273 | { |
272 | return _iphdr->ttl; | 274 | return _iphdr->ttl; |
273 | } | 275 | } |
274 | 276 | ||
275 | 277 | ||
276 | int OIPPacket::protocol() const | 278 | int OIPPacket::protocol() const |
277 | { | 279 | { |
278 | return _iphdr->protocol; | 280 | return _iphdr->protocol; |
279 | } | 281 | } |
280 | 282 | ||
281 | 283 | ||
282 | int OIPPacket::checksum() const | 284 | int OIPPacket::checksum() const |
283 | { | 285 | { |
284 | return EXTRACT_16BITS( &_iphdr->check ); | 286 | return EXTRACT_16BITS( &_iphdr->check ); |
285 | } | 287 | } |
286 | 288 | ||
287 | /*====================================================================================== | 289 | /*====================================================================================== |
288 | * OARPPacket | 290 | * OARPPacket |
289 | *======================================================================================*/ | 291 | *======================================================================================*/ |
290 | 292 | ||
291 | 293 | ||
292 | OARPPacket::OARPPacket( const unsigned char* end, const struct myarphdr* data, QObject* parent ) | 294 | OARPPacket::OARPPacket( const unsigned char* end, const struct myarphdr* data, QObject* parent ) |
293 | :QObject( parent, "ARP" ), _arphdr( data ) | 295 | :QObject( parent, "ARP" ), _arphdr( data ) |
294 | { | 296 | { |
295 | qDebug( "OARPPacket::OARPPacket(): decoding ARP header..." ); | 297 | qDebug( "OARPPacket::OARPPacket(): decoding ARP header..." ); |
296 | qDebug( "ARP type seems to be %02d - '%s'", EXTRACT_16BITS( &_arphdr->ar_op ), (const char*) type() ); | 298 | qDebug( "ARP type seems to be %02d - '%s'", EXTRACT_16BITS( &_arphdr->ar_op ), (const char*) type() ); |
297 | qDebug( "Sender: MAC %s = IP %s", (const char*) senderMacAddress().toString(), (const char*) senderIPV4Address().toString() ); | 299 | qDebug( "Sender: MAC %s = IP %s", (const char*) senderMacAddress().toString(), (const char*) senderIPV4Address().toString() ); |
298 | qDebug( "Target: MAC %s = IP %s", (const char*) targetMacAddress().toString(), (const char*) targetIPV4Address().toString() ); | 300 | qDebug( "Target: MAC %s = IP %s", (const char*) targetMacAddress().toString(), (const char*) targetIPV4Address().toString() ); |
299 | } | 301 | } |
300 | 302 | ||
301 | 303 | ||
302 | OARPPacket::~OARPPacket() | 304 | OARPPacket::~OARPPacket() |
303 | { | 305 | { |
304 | } | 306 | } |
305 | 307 | ||
306 | 308 | ||
307 | QString OARPPacket::type() const | 309 | QString OARPPacket::type() const |
308 | { | 310 | { |
309 | switch ( EXTRACT_16BITS( &_arphdr->ar_op ) ) | 311 | switch ( EXTRACT_16BITS( &_arphdr->ar_op ) ) |
310 | { | 312 | { |
311 | case 1: return "REQUEST"; | 313 | case 1: return "REQUEST"; |
312 | case 2: return "REPLY"; | 314 | case 2: return "REPLY"; |
313 | case 3: return "RREQUEST"; | 315 | case 3: return "RREQUEST"; |
314 | case 4: return "RREPLY"; | 316 | case 4: return "RREPLY"; |
315 | case 8: return "InREQUEST"; | 317 | case 8: return "InREQUEST"; |
316 | case 9: return "InREPLY"; | 318 | case 9: return "InREPLY"; |
317 | case 10: return "NAK"; | 319 | case 10: return "NAK"; |
318 | default: qWarning( "OARPPacket::type(): invalid ARP type!" ); return "<unknown>"; | 320 | default: qWarning( "OARPPacket::type(): invalid ARP type!" ); return "<unknown>"; |
319 | } | 321 | } |
320 | } | 322 | } |
321 | 323 | ||
322 | 324 | ||
323 | QHostAddress OARPPacket::senderIPV4Address() const | 325 | QHostAddress OARPPacket::senderIPV4Address() const |
324 | { | 326 | { |
325 | return EXTRACT_32BITS( &_arphdr->ar_sip ); | 327 | return EXTRACT_32BITS( &_arphdr->ar_sip ); |
326 | } | 328 | } |
327 | 329 | ||
328 | 330 | ||
329 | QHostAddress OARPPacket::targetIPV4Address() const | 331 | QHostAddress OARPPacket::targetIPV4Address() const |
330 | { | 332 | { |
331 | return EXTRACT_32BITS( &_arphdr->ar_tip ); | 333 | return EXTRACT_32BITS( &_arphdr->ar_tip ); |
332 | } | 334 | } |
333 | 335 | ||
334 | 336 | ||
335 | OMacAddress OARPPacket::senderMacAddress() const | 337 | OMacAddress OARPPacket::senderMacAddress() const |
336 | { | 338 | { |
337 | return OMacAddress( _arphdr->ar_sha ); | 339 | return OMacAddress( _arphdr->ar_sha ); |
338 | } | 340 | } |
339 | 341 | ||
340 | 342 | ||
341 | OMacAddress OARPPacket::targetMacAddress() const | 343 | OMacAddress OARPPacket::targetMacAddress() const |
342 | { | 344 | { |
343 | return OMacAddress( _arphdr->ar_tha ); | 345 | return OMacAddress( _arphdr->ar_tha ); |
344 | } | 346 | } |
345 | 347 | ||
346 | 348 | ||
347 | /*====================================================================================== | 349 | /*====================================================================================== |
348 | * OUDPPacket | 350 | * OUDPPacket |
349 | *======================================================================================*/ | 351 | *======================================================================================*/ |
350 | 352 | ||
351 | 353 | ||
352 | OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) | 354 | OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) |
353 | :QObject( parent, "UDP" ), _udphdr( data ) | 355 | :QObject( parent, "UDP" ), _udphdr( data ) |
354 | 356 | ||
355 | { | 357 | { |
356 | qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); | 358 | qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); |
359 | qDebug( "fromPort = %d", fromPort() ); | ||
360 | qDebug( " toPort = %d", toPort() ); | ||
361 | |||
362 | // TODO: Make this a case or a hash if we know more udp protocols | ||
363 | |||
364 | if ( fromPort() == UDP_PORT_BOOTPS || fromPort() == UDP_PORT_BOOTPC || | ||
365 | toPort() == UDP_PORT_BOOTPS || toPort() == UDP_PORT_BOOTPC ) | ||
366 | { | ||
367 | qDebug( "seems to be part of a DHCP conversation => creating DHCP packet." ); | ||
368 | new ODHCPPacket( end, (const struct dhcp_packet*) (data+1), this ); | ||
369 | } | ||
357 | } | 370 | } |
358 | 371 | ||
359 | 372 | ||
360 | OUDPPacket::~OUDPPacket() | 373 | OUDPPacket::~OUDPPacket() |
361 | { | 374 | { |
362 | } | 375 | } |
363 | 376 | ||
364 | 377 | ||
365 | int OUDPPacket::fromPort() const | 378 | int OUDPPacket::fromPort() const |
366 | { | 379 | { |
367 | return _udphdr->source; | 380 | return EXTRACT_16BITS( &_udphdr->source ); |
368 | } | 381 | } |
369 | 382 | ||
370 | 383 | ||
371 | int OUDPPacket::toPort() const | 384 | int OUDPPacket::toPort() const |
372 | { | 385 | { |
373 | return _udphdr->dest; | 386 | return EXTRACT_16BITS( &_udphdr->dest ); |
374 | } | 387 | } |
375 | 388 | ||
376 | 389 | ||
377 | int OUDPPacket::length() const | 390 | int OUDPPacket::length() const |
378 | { | 391 | { |
379 | return _udphdr->len; | 392 | return EXTRACT_16BITS( &_udphdr->len ); |
380 | } | 393 | } |
381 | 394 | ||
382 | 395 | ||
383 | int OUDPPacket::checksum() const | 396 | int OUDPPacket::checksum() const |
384 | { | 397 | { |
385 | return _udphdr->check; | 398 | return EXTRACT_16BITS( &_udphdr->check ); |
386 | } | 399 | } |
387 | 400 | ||
388 | 401 | ||
389 | /*====================================================================================== | 402 | /*====================================================================================== |
390 | * ODHCPPacket | 403 | * ODHCPPacket |
391 | *======================================================================================*/ | 404 | *======================================================================================*/ |
392 | 405 | ||
393 | 406 | ||
394 | ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) | 407 | ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) |
395 | :QObject( parent, "DHCP" ), _dhcphdr( data ) | 408 | :QObject( parent, "DHCP" ), _dhcphdr( data ) |
396 | 409 | ||
397 | { | 410 | { |
398 | qDebug( "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." ); | 411 | qDebug( "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." ); |
399 | } | 412 | } |
400 | 413 | ||
401 | 414 | ||
402 | ODHCPPacket::~ODHCPPacket() | 415 | ODHCPPacket::~ODHCPPacket() |
403 | { | 416 | { |
404 | } | 417 | } |
405 | 418 | ||
406 | 419 | ||
407 | /*====================================================================================== | 420 | /*====================================================================================== |
408 | * OTCPPacket | 421 | * OTCPPacket |
409 | *======================================================================================*/ | 422 | *======================================================================================*/ |
410 | 423 | ||
411 | 424 | ||
412 | OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) | 425 | OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) |
413 | :QObject( parent, "TCP" ), _tcphdr( data ) | 426 | :QObject( parent, "TCP" ), _tcphdr( data ) |
414 | 427 | ||
415 | { | 428 | { |
416 | qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); | 429 | qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); |
417 | } | 430 | } |
418 | 431 | ||
419 | 432 | ||
420 | OTCPPacket::~OTCPPacket() | 433 | OTCPPacket::~OTCPPacket() |
421 | { | 434 | { |
422 | } | 435 | } |
423 | 436 | ||
424 | 437 | ||
425 | int OTCPPacket::fromPort() const | 438 | int OTCPPacket::fromPort() const |
426 | { | 439 | { |
427 | return _tcphdr->source; | 440 | return EXTRACT_16BITS( &_tcphdr->source ); |
428 | } | 441 | } |
429 | 442 | ||
430 | 443 | ||
431 | int OTCPPacket::toPort() const | 444 | int OTCPPacket::toPort() const |
432 | { | 445 | { |
433 | return _tcphdr->dest; | 446 | return EXTRACT_16BITS( &_tcphdr->dest ); |
434 | } | 447 | } |
435 | 448 | ||
436 | 449 | ||
437 | int OTCPPacket::seq() const | 450 | int OTCPPacket::seq() const |
438 | { | 451 | { |
439 | return _tcphdr->seq; | 452 | return EXTRACT_16BITS( &_tcphdr->seq ); |
440 | } | 453 | } |
441 | 454 | ||
442 | 455 | ||
443 | int OTCPPacket::ack() const | 456 | int OTCPPacket::ack() const |
444 | { | 457 | { |
445 | return _tcphdr->ack_seq; | 458 | return EXTRACT_16BITS( &_tcphdr->ack_seq ); |
446 | } | 459 | } |
447 | 460 | ||
448 | 461 | ||
449 | int OTCPPacket::window() const | 462 | int OTCPPacket::window() const |
450 | { | 463 | { |
451 | return _tcphdr->window; | 464 | return EXTRACT_16BITS( &_tcphdr->window ); |
452 | } | 465 | } |
453 | 466 | ||
454 | 467 | ||
455 | int OTCPPacket::checksum() const | 468 | int OTCPPacket::checksum() const |
456 | { | 469 | { |
457 | return _tcphdr->check; | 470 | return EXTRACT_16BITS( &_tcphdr->check ); |
458 | } | 471 | } |
459 | 472 | ||
460 | /*====================================================================================== | 473 | /*====================================================================================== |
461 | * OPrismHeaderPacket | 474 | * OPrismHeaderPacket |
462 | *======================================================================================*/ | 475 | *======================================================================================*/ |
463 | 476 | ||
464 | 477 | ||
465 | OPrismHeaderPacket::OPrismHeaderPacket( const unsigned char* end, const struct prism_hdr* data, QObject* parent ) | 478 | OPrismHeaderPacket::OPrismHeaderPacket( const unsigned char* end, const struct prism_hdr* data, QObject* parent ) |
466 | :QObject( parent, "Prism" ), _header( data ) | 479 | :QObject( parent, "Prism" ), _header( data ) |
467 | 480 | ||
468 | { | 481 | { |
469 | qDebug( "OPrismHeaderPacket::OPrismHeaderPacket(): decoding PRISM header..." ); | 482 | qDebug( "OPrismHeaderPacket::OPrismHeaderPacket(): decoding PRISM header..." ); |
470 | 483 | ||
471 | qDebug( "Signal Strength = %d", data->signal.data ); | 484 | qDebug( "Signal Strength = %d", data->signal.data ); |
472 | 485 | ||
473 | new OWaveLanPacket( end, (const struct ieee_802_11_header*) (data+1), this ); | 486 | new OWaveLanPacket( end, (const struct ieee_802_11_header*) (data+1), this ); |
474 | } | 487 | } |
475 | 488 | ||
476 | OPrismHeaderPacket::~OPrismHeaderPacket() | 489 | OPrismHeaderPacket::~OPrismHeaderPacket() |
477 | { | 490 | { |
478 | } | 491 | } |
479 | 492 | ||
480 | 493 | ||
481 | unsigned int OPrismHeaderPacket::signalStrength() const | 494 | unsigned int OPrismHeaderPacket::signalStrength() const |
482 | { | 495 | { |
483 | return _header->signal.data; | 496 | return _header->signal.data; |
484 | } | 497 | } |
485 | 498 | ||
486 | /*====================================================================================== | 499 | /*====================================================================================== |
487 | * OWaveLanPacket | 500 | * OWaveLanPacket |
488 | *======================================================================================*/ | 501 | *======================================================================================*/ |
489 | 502 | ||
490 | 503 | ||
491 | OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) | 504 | OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) |
492 | :QObject( parent, "802.11" ), _wlanhdr( data ) | 505 | :QObject( parent, "802.11" ), _wlanhdr( data ) |
493 | 506 | ||
494 | { | 507 | { |
495 | qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." ); | 508 | qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." ); |
496 | qDebug( "type: %0X", type() ); | 509 | qDebug( "type: %0X", type() ); |
497 | qDebug( "subType: %0X", subType() ); | 510 | qDebug( "subType: %0X", subType() ); |
498 | qDebug( "duration: %d", duration() ); | 511 | qDebug( "duration: %d", duration() ); |
499 | qDebug( "powermanagement: %d", usesPowerManagement() ); | 512 | qDebug( "powermanagement: %d", usesPowerManagement() ); |
500 | qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" ); | 513 | qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" ); |
501 | qDebug( "MAC1: %s", (const char*) macAddress1().toString() ); | 514 | qDebug( "MAC1: %s", (const char*) macAddress1().toString() ); |
502 | qDebug( "MAC2: %s", (const char*) macAddress2().toString() ); | 515 | qDebug( "MAC2: %s", (const char*) macAddress2().toString() ); |
503 | qDebug( "MAC3: %s", (const char*) macAddress3().toString() ); | 516 | qDebug( "MAC3: %s", (const char*) macAddress3().toString() ); |
504 | qDebug( "MAC4: %s", (const char*) macAddress4().toString() ); | 517 | qDebug( "MAC4: %s", (const char*) macAddress4().toString() ); |
505 | 518 | ||
506 | switch ( type() ) | 519 | switch ( type() ) |
507 | { | 520 | { |
508 | case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; | 521 | case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; |
509 | case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; | 522 | case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; |
510 | case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break; | 523 | case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break; |
511 | default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() ); | 524 | default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() ); |
512 | } | 525 | } |
513 | } | 526 | } |
514 | 527 | ||
515 | OWaveLanPacket::~OWaveLanPacket() | 528 | OWaveLanPacket::~OWaveLanPacket() |
516 | { | 529 | { |
517 | } | 530 | } |
518 | 531 | ||
519 | 532 | ||
520 | int OWaveLanPacket::duration() const | 533 | int OWaveLanPacket::duration() const |
521 | { | 534 | { |
522 | return _wlanhdr->duration; | 535 | return _wlanhdr->duration; |
523 | } | 536 | } |
524 | 537 | ||
525 | 538 | ||
526 | OMacAddress OWaveLanPacket::macAddress1() const | 539 | OMacAddress OWaveLanPacket::macAddress1() const |
527 | { | 540 | { |
528 | return OMacAddress( _wlanhdr->mac1 ); | 541 | return OMacAddress( _wlanhdr->mac1 ); |
529 | } | 542 | } |
530 | 543 | ||
531 | 544 | ||
532 | OMacAddress OWaveLanPacket::macAddress2() const | 545 | OMacAddress OWaveLanPacket::macAddress2() const |
533 | { | 546 | { |
534 | return OMacAddress( _wlanhdr->mac2 ); | 547 | return OMacAddress( _wlanhdr->mac2 ); |
535 | } | 548 | } |
536 | 549 | ||
537 | 550 | ||
538 | OMacAddress OWaveLanPacket::macAddress3() const | 551 | OMacAddress OWaveLanPacket::macAddress3() const |
539 | { | 552 | { |
540 | return OMacAddress( _wlanhdr->mac3 ); | 553 | return OMacAddress( _wlanhdr->mac3 ); |
541 | } | 554 | } |
542 | 555 | ||
543 | 556 | ||
544 | OMacAddress OWaveLanPacket::macAddress4() const | 557 | OMacAddress OWaveLanPacket::macAddress4() const |
545 | { | 558 | { |
546 | return OMacAddress( _wlanhdr->mac4 ); | 559 | return OMacAddress( _wlanhdr->mac4 ); |
547 | } | 560 | } |
548 | 561 | ||
549 | 562 | ||
550 | int OWaveLanPacket::subType() const | 563 | int OWaveLanPacket::subType() const |
551 | { | 564 | { |
552 | return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 565 | return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
553 | } | 566 | } |
554 | 567 | ||
555 | 568 | ||
556 | int OWaveLanPacket::type() const | 569 | int OWaveLanPacket::type() const |
557 | { | 570 | { |
558 | return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 571 | return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
559 | } | 572 | } |
560 | 573 | ||
561 | 574 | ||
562 | int OWaveLanPacket::version() const | 575 | int OWaveLanPacket::version() const |
563 | { | 576 | { |
564 | return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 577 | return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
565 | } | 578 | } |
566 | 579 | ||
567 | 580 | ||
568 | bool OWaveLanPacket::fromDS() const | 581 | bool OWaveLanPacket::fromDS() const |
569 | { | 582 | { |
570 | return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 583 | return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
571 | } | 584 | } |
572 | 585 | ||
573 | 586 | ||
574 | bool OWaveLanPacket::toDS() const | 587 | bool OWaveLanPacket::toDS() const |
575 | { | 588 | { |
576 | return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 589 | return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
577 | } | 590 | } |
578 | 591 | ||
579 | 592 | ||
580 | bool OWaveLanPacket::usesPowerManagement() const | 593 | bool OWaveLanPacket::usesPowerManagement() const |
581 | { | 594 | { |
582 | return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 595 | return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
583 | } | 596 | } |
584 | 597 | ||
585 | 598 | ||
586 | bool OWaveLanPacket::usesWep() const | 599 | bool OWaveLanPacket::usesWep() const |
587 | { | 600 | { |
588 | return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | 601 | return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); |
589 | } | 602 | } |
590 | 603 | ||
591 | 604 | ||
592 | /*====================================================================================== | 605 | /*====================================================================================== |
593 | * OWaveLanManagementPacket | 606 | * OWaveLanManagementPacket |
594 | *======================================================================================*/ | 607 | *======================================================================================*/ |
595 | 608 | ||
596 | OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) | 609 | OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) |
597 | :QObject( parent, "802.11 Management" ), _header( data ), | 610 | :QObject( parent, "802.11 Management" ), _header( data ), |
598 | _body( (const struct ieee_802_11_mgmt_body*) (data+1) ) | 611 | _body( (const struct ieee_802_11_mgmt_body*) (data+1) ) |
599 | { | 612 | { |
600 | qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." ); | 613 | qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." ); |
601 | qDebug( "Detected subtype is '%s'", (const char*) managementType() ); | 614 | qDebug( "Detected subtype is '%s'", (const char*) managementType() ); |
602 | 615 | ||
603 | // grab tagged values | 616 | // grab tagged values |
604 | const unsigned char* ptr = (const unsigned char*) (_body+1); | 617 | const unsigned char* ptr = (const unsigned char*) (_body+1); |
605 | while (ptr < end) | 618 | while (ptr < end) |
606 | { | 619 | { |
607 | switch ( *ptr ) | 620 | switch ( *ptr ) |
608 | { | 621 | { |
609 | case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; | 622 | case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; |
610 | case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; | 623 | case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; |
611 | case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; | 624 | case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; |
612 | case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; | 625 | case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; |
613 | case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; | 626 | case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; |
614 | case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; | 627 | case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; |
615 | case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; | 628 | case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; |
616 | case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; | 629 | case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; |
617 | } | 630 | } |
618 | ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value | 631 | ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value |
619 | ptr+= 2; // skip tag ID and length | 632 | ptr+= 2; // skip tag ID and length |
620 | } | 633 | } |
621 | } | 634 | } |
622 | 635 | ||
623 | 636 | ||
624 | OWaveLanManagementPacket::~OWaveLanManagementPacket() | 637 | OWaveLanManagementPacket::~OWaveLanManagementPacket() |
625 | { | 638 | { |
626 | } | 639 | } |
627 | 640 | ||
628 | 641 | ||
629 | QString OWaveLanManagementPacket::managementType() const | 642 | QString OWaveLanManagementPacket::managementType() const |
630 | { | 643 | { |
631 | switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ) | 644 | switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ) |
632 | { | 645 | { |
633 | case ST_ASSOC_REQUEST: return "AssociationRequest"; break; | 646 | case ST_ASSOC_REQUEST: return "AssociationRequest"; break; |
634 | case ST_ASSOC_RESPONSE: return "AssociationResponse"; break; | 647 | case ST_ASSOC_RESPONSE: return "AssociationResponse"; break; |
635 | case ST_REASSOC_REQUEST: return "ReassociationRequest"; break; | 648 | case ST_REASSOC_REQUEST: return "ReassociationRequest"; break; |
636 | case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break; | 649 | case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break; |
637 | case ST_PROBE_REQUEST: return "ProbeRequest"; break; | 650 | case ST_PROBE_REQUEST: return "ProbeRequest"; break; |
638 | case ST_PROBE_RESPONSE: return "ProbeResponse"; break; | 651 | case ST_PROBE_RESPONSE: return "ProbeResponse"; break; |
639 | case ST_BEACON: return "Beacon"; break; | 652 | case ST_BEACON: return "Beacon"; break; |
640 | case ST_ATIM: return "Atim"; break; | 653 | case ST_ATIM: return "Atim"; break; |
641 | case ST_DISASSOC: return "Disassociation"; break; | 654 | case ST_DISASSOC: return "Disassociation"; break; |
642 | case ST_AUTH: return "Authentication"; break; | 655 | case ST_AUTH: return "Authentication"; break; |
643 | case ST_DEAUTH: return "Deathentication"; break; | 656 | case ST_DEAUTH: return "Deathentication"; break; |
644 | default: | 657 | default: |
645 | qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ); | 658 | qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ); |
646 | return "Unknown"; | 659 | return "Unknown"; |
647 | } | 660 | } |
648 | } | 661 | } |
649 | 662 | ||
650 | 663 | ||
651 | int OWaveLanManagementPacket::beaconInterval() const | 664 | int OWaveLanManagementPacket::beaconInterval() const |
652 | { | 665 | { |
653 | return EXTRACT_LE_16BITS( &_body->beacon_interval ); | 666 | return EXTRACT_LE_16BITS( &_body->beacon_interval ); |
654 | } | 667 | } |
655 | 668 | ||
656 | 669 | ||
657 | int OWaveLanManagementPacket::capabilities() const | 670 | int OWaveLanManagementPacket::capabilities() const |
658 | { | 671 | { |
659 | return EXTRACT_LE_16BITS( &_body->capability_info ); | 672 | return EXTRACT_LE_16BITS( &_body->capability_info ); |
660 | } | 673 | } |
661 | 674 | ||
662 | 675 | ||
663 | bool OWaveLanManagementPacket::canESS() const | 676 | bool OWaveLanManagementPacket::canESS() const |
664 | { | 677 | { |
665 | return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); | 678 | return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
666 | } | 679 | } |
667 | 680 | ||
668 | 681 | ||
669 | bool OWaveLanManagementPacket::canIBSS() const | 682 | bool OWaveLanManagementPacket::canIBSS() const |
670 | { | 683 | { |
671 | return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); | 684 | return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
672 | } | 685 | } |
673 | 686 | ||
674 | 687 | ||
675 | bool OWaveLanManagementPacket::canCFP() const | 688 | bool OWaveLanManagementPacket::canCFP() const |
676 | { | 689 | { |
677 | return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); | 690 | return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
678 | } | 691 | } |
679 | 692 | ||
680 | 693 | ||
681 | bool OWaveLanManagementPacket::canCFP_REQ() const | 694 | bool OWaveLanManagementPacket::canCFP_REQ() const |
682 | { | 695 | { |
683 | return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); | 696 | return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
684 | } | 697 | } |
685 | 698 | ||
686 | 699 | ||
687 | bool OWaveLanManagementPacket::canPrivacy() const | 700 | bool OWaveLanManagementPacket::canPrivacy() const |
688 | { | 701 | { |
689 | return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); | 702 | return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
690 | } | 703 | } |
691 | 704 | ||
692 | 705 | ||
693 | /*====================================================================================== | 706 | /*====================================================================================== |
694 | * OWaveLanManagementSSID | 707 | * OWaveLanManagementSSID |
695 | *======================================================================================*/ | 708 | *======================================================================================*/ |
696 | 709 | ||
697 | OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) | 710 | OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) |
698 | :QObject( parent, "802.11 SSID" ), _data( data ) | 711 | :QObject( parent, "802.11 SSID" ), _data( data ) |
699 | { | 712 | { |
700 | qDebug( "OWaveLanManagementSSID()" ); | 713 | qDebug( "OWaveLanManagementSSID()" ); |
701 | } | 714 | } |
702 | 715 | ||
703 | 716 | ||
704 | OWaveLanManagementSSID::~OWaveLanManagementSSID() | 717 | OWaveLanManagementSSID::~OWaveLanManagementSSID() |
705 | { | 718 | { |
706 | } | 719 | } |
707 | 720 | ||
708 | 721 | ||
709 | QString OWaveLanManagementSSID::ID() const | 722 | QString OWaveLanManagementSSID::ID() const |
710 | { | 723 | { |
711 | int length = _data->length; | 724 | int length = _data->length; |
712 | if ( length > 32 ) length = 32; | 725 | if ( length > 32 ) length = 32; |
713 | char essid[length+1]; | 726 | char essid[length+1]; |
714 | memcpy( &essid, &_data->ssid, length ); | 727 | memcpy( &essid, &_data->ssid, length ); |
715 | essid[length] = 0x0; | 728 | essid[length] = 0x0; |
716 | return essid; | 729 | return essid; |
717 | } | 730 | } |
718 | 731 | ||
719 | 732 | ||
720 | /*====================================================================================== | 733 | /*====================================================================================== |
721 | * OWaveLanManagementRates | 734 | * OWaveLanManagementRates |
722 | *======================================================================================*/ | 735 | *======================================================================================*/ |
723 | 736 | ||
724 | OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) | 737 | OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) |
725 | :QObject( parent, "802.11 Rates" ), _data( data ) | 738 | :QObject( parent, "802.11 Rates" ), _data( data ) |
726 | { | 739 | { |
727 | qDebug( "OWaveLanManagementRates()" ); | 740 | qDebug( "OWaveLanManagementRates()" ); |
728 | } | 741 | } |
729 | 742 | ||
730 | 743 | ||
731 | OWaveLanManagementRates::~OWaveLanManagementRates() | 744 | OWaveLanManagementRates::~OWaveLanManagementRates() |
732 | { | 745 | { |
733 | } | 746 | } |
734 | 747 | ||
735 | /*====================================================================================== | 748 | /*====================================================================================== |
736 | * OWaveLanManagementCF | 749 | * OWaveLanManagementCF |
737 | *======================================================================================*/ | 750 | *======================================================================================*/ |
738 | 751 | ||
739 | OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) | 752 | OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) |
740 | :QObject( parent, "802.11 CF" ), _data( data ) | 753 | :QObject( parent, "802.11 CF" ), _data( data ) |
741 | { | 754 | { |
742 | qDebug( "OWaveLanManagementCF()" ); | 755 | qDebug( "OWaveLanManagementCF()" ); |
743 | } | 756 | } |
744 | 757 | ||
745 | 758 | ||
746 | OWaveLanManagementCF::~OWaveLanManagementCF() | 759 | OWaveLanManagementCF::~OWaveLanManagementCF() |
747 | { | 760 | { |
748 | } | 761 | } |
749 | 762 | ||
750 | /*====================================================================================== | 763 | /*====================================================================================== |
751 | * OWaveLanManagementFH | 764 | * OWaveLanManagementFH |
752 | *======================================================================================*/ | 765 | *======================================================================================*/ |
753 | 766 | ||
754 | OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent ) | 767 | OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent ) |
755 | :QObject( parent, "802.11 FH" ), _data( data ) | 768 | :QObject( parent, "802.11 FH" ), _data( data ) |
756 | { | 769 | { |
757 | qDebug( "OWaveLanManagementFH()" ); | 770 | qDebug( "OWaveLanManagementFH()" ); |
758 | } | 771 | } |
759 | 772 | ||
760 | 773 | ||
761 | OWaveLanManagementFH::~OWaveLanManagementFH() | 774 | OWaveLanManagementFH::~OWaveLanManagementFH() |
762 | { | 775 | { |
763 | } | 776 | } |
764 | 777 | ||
765 | /*====================================================================================== | 778 | /*====================================================================================== |
766 | * OWaveLanManagementDS | 779 | * OWaveLanManagementDS |
767 | *======================================================================================*/ | 780 | *======================================================================================*/ |
768 | 781 | ||
769 | OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent ) | 782 | OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent ) |
770 | :QObject( parent, "802.11 DS" ), _data( data ) | 783 | :QObject( parent, "802.11 DS" ), _data( data ) |
771 | { | 784 | { |
772 | qDebug( "OWaveLanManagementDS()" ); | 785 | qDebug( "OWaveLanManagementDS()" ); |
773 | } | 786 | } |
774 | 787 | ||
775 | 788 | ||
776 | OWaveLanManagementDS::~OWaveLanManagementDS() | 789 | OWaveLanManagementDS::~OWaveLanManagementDS() |
777 | { | 790 | { |
778 | } | 791 | } |
779 | 792 | ||
780 | 793 | ||
781 | int OWaveLanManagementDS::channel() const | 794 | int OWaveLanManagementDS::channel() const |
782 | { | 795 | { |
783 | return _data->channel; | 796 | return _data->channel; |
784 | } | 797 | } |
785 | 798 | ||
786 | /*====================================================================================== | 799 | /*====================================================================================== |
787 | * OWaveLanManagementTim | 800 | * OWaveLanManagementTim |
788 | *======================================================================================*/ | 801 | *======================================================================================*/ |
789 | 802 | ||
790 | OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent ) | 803 | OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent ) |
791 | :QObject( parent, "802.11 Tim" ), _data( data ) | 804 | :QObject( parent, "802.11 Tim" ), _data( data ) |
792 | { | 805 | { |
793 | qDebug( "OWaveLanManagementTim()" ); | 806 | qDebug( "OWaveLanManagementTim()" ); |
794 | } | 807 | } |
795 | 808 | ||
796 | 809 | ||
797 | OWaveLanManagementTim::~OWaveLanManagementTim() | 810 | OWaveLanManagementTim::~OWaveLanManagementTim() |
798 | { | 811 | { |
799 | } | 812 | } |
800 | 813 | ||
801 | /*====================================================================================== | 814 | /*====================================================================================== |
802 | * OWaveLanManagementIBSS | 815 | * OWaveLanManagementIBSS |
803 | *======================================================================================*/ | 816 | *======================================================================================*/ |
804 | 817 | ||
805 | OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent ) | 818 | OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent ) |
806 | :QObject( parent, "802.11 IBSS" ), _data( data ) | 819 | :QObject( parent, "802.11 IBSS" ), _data( data ) |
807 | { | 820 | { |
808 | qDebug( "OWaveLanManagementIBSS()" ); | 821 | qDebug( "OWaveLanManagementIBSS()" ); |
809 | } | 822 | } |
810 | 823 | ||
811 | 824 | ||
812 | OWaveLanManagementIBSS::~OWaveLanManagementIBSS() | 825 | OWaveLanManagementIBSS::~OWaveLanManagementIBSS() |
813 | { | 826 | { |
814 | } | 827 | } |
815 | 828 | ||
816 | /*====================================================================================== | 829 | /*====================================================================================== |
817 | * OWaveLanManagementChallenge | 830 | * OWaveLanManagementChallenge |
818 | *======================================================================================*/ | 831 | *======================================================================================*/ |
819 | 832 | ||
820 | OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent ) | 833 | OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent ) |
821 | :QObject( parent, "802.11 Challenge" ), _data( data ) | 834 | :QObject( parent, "802.11 Challenge" ), _data( data ) |
822 | { | 835 | { |
823 | qDebug( "OWaveLanManagementChallenge()" ); | 836 | qDebug( "OWaveLanManagementChallenge()" ); |
824 | } | 837 | } |
825 | 838 | ||
826 | 839 | ||
827 | OWaveLanManagementChallenge::~OWaveLanManagementChallenge() | 840 | OWaveLanManagementChallenge::~OWaveLanManagementChallenge() |
828 | { | 841 | { |
829 | } | 842 | } |
830 | 843 | ||
831 | /*====================================================================================== | 844 | /*====================================================================================== |
832 | * OWaveLanDataPacket | 845 | * OWaveLanDataPacket |
833 | *======================================================================================*/ | 846 | *======================================================================================*/ |
834 | 847 | ||
835 | OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) | 848 | OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) |
836 | :QObject( parent, "802.11 Data" ), _header( data ) | 849 | :QObject( parent, "802.11 Data" ), _header( data ) |
837 | { | 850 | { |
838 | qDebug( "OWaveLanDataPacket::OWaveLanDataPacket(): decoding frame..." ); | 851 | qDebug( "OWaveLanDataPacket::OWaveLanDataPacket(): decoding frame..." ); |
839 | 852 | ||
840 | const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header ); | 853 | const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header ); |
841 | 854 | ||
842 | #warning The next line works for most cases, but can not be correct generally! | 855 | #warning The next line works for most cases, but can not be correct generally! |
843 | if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address | 856 | if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address |
844 | 857 | ||
845 | new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); | 858 | new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); |
846 | } | 859 | } |
847 | 860 | ||
848 | 861 | ||
849 | OWaveLanDataPacket::~OWaveLanDataPacket() | 862 | OWaveLanDataPacket::~OWaveLanDataPacket() |
850 | { | 863 | { |
851 | } | 864 | } |
852 | 865 | ||
853 | 866 | ||
854 | /*====================================================================================== | 867 | /*====================================================================================== |
855 | * OLLCPacket | 868 | * OLLCPacket |
856 | *======================================================================================*/ | 869 | *======================================================================================*/ |
857 | 870 | ||
858 | OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) | 871 | OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) |
859 | :QObject( parent, "802.11 LLC" ), _header( data ) | 872 | :QObject( parent, "802.11 LLC" ), _header( data ) |
860 | { | 873 | { |
861 | qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." ); | 874 | qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." ); |
862 | 875 | ||
863 | if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) ) | 876 | if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) ) |
864 | { | 877 | { |
865 | qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) ); | 878 | qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) ); |
866 | 879 | ||
867 | switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h | 880 | switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h |
868 | { | 881 | { |
869 | case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; | 882 | case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; |
870 | case ETH_P_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break; | 883 | case ETH_P_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break; |
871 | default: qWarning( "OLLCPacket::OLLCPacket(): Unknown Encapsulation (type=%04X)", EXTRACT_16BITS( &_header->type ) ); | 884 | default: qWarning( "OLLCPacket::OLLCPacket(): Unknown Encapsulation (type=%04X)", EXTRACT_16BITS( &_header->type ) ); |
872 | } | 885 | } |
873 | 886 | ||
874 | } | 887 | } |
875 | } | 888 | } |
876 | 889 | ||
877 | 890 | ||
878 | OLLCPacket::~OLLCPacket() | 891 | OLLCPacket::~OLLCPacket() |
879 | { | 892 | { |
880 | } | 893 | } |
881 | 894 | ||
882 | 895 | ||
883 | /*====================================================================================== | 896 | /*====================================================================================== |
884 | * OWaveLanControlPacket | 897 | * OWaveLanControlPacket |
885 | *======================================================================================*/ | 898 | *======================================================================================*/ |
886 | 899 | ||
887 | OWaveLanControlPacket::OWaveLanControlPacket( const unsigned char* end, const struct ieee_802_11_control_header* data, OWaveLanPacket* parent ) | 900 | OWaveLanControlPacket::OWaveLanControlPacket( const unsigned char* end, const struct ieee_802_11_control_header* data, OWaveLanPacket* parent ) |
888 | :QObject( parent, "802.11 Control" ), _header( data ) | 901 | :QObject( parent, "802.11 Control" ), _header( data ) |
889 | { | 902 | { |
890 | qDebug( "OWaveLanControlPacket::OWaveLanDataControl(): decoding frame..." ); | 903 | qDebug( "OWaveLanControlPacket::OWaveLanDataControl(): decoding frame..." ); |
891 | //TODO: Implement this | 904 | //TODO: Implement this |
892 | } | 905 | } |
893 | 906 | ||
894 | 907 | ||
895 | OWaveLanControlPacket::~OWaveLanControlPacket() | 908 | OWaveLanControlPacket::~OWaveLanControlPacket() |
896 | { | 909 | { |
897 | } | 910 | } |
898 | 911 | ||
899 | 912 | ||
900 | /*====================================================================================== | 913 | /*====================================================================================== |
901 | * OPacketCapturer | 914 | * OPacketCapturer |
902 | *======================================================================================*/ | 915 | *======================================================================================*/ |
903 | 916 | ||
904 | OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) | 917 | OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) |
905 | :QObject( parent, name ), _name( QString::null ), _open( false ), | 918 | :QObject( parent, name ), _name( QString::null ), _open( false ), |
906 | _pch( 0 ), _pcd( 0 ), _sn( 0 ) | 919 | _pch( 0 ), _pcd( 0 ), _sn( 0 ) |
907 | { | 920 | { |
908 | } | 921 | } |
909 | 922 | ||
910 | 923 | ||
911 | OPacketCapturer::~OPacketCapturer() | 924 | OPacketCapturer::~OPacketCapturer() |
912 | { | 925 | { |
913 | if ( _open ) | 926 | if ( _open ) |
914 | { | 927 | { |
915 | qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." ); | 928 | qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." ); |
916 | close(); | 929 | close(); |
917 | } | 930 | } |
918 | } | 931 | } |
919 | 932 | ||
920 | 933 | ||
921 | void OPacketCapturer::setBlocking( bool b ) | 934 | void OPacketCapturer::setBlocking( bool b ) |
922 | { | 935 | { |
923 | if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 ) | 936 | if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 ) |
924 | { | 937 | { |
925 | qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." ); | 938 | qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." ); |
926 | } | 939 | } |
927 | else | 940 | else |
928 | { | 941 | { |
929 | qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf ); | 942 | qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf ); |
930 | } | 943 | } |
931 | } | 944 | } |
932 | 945 | ||
933 | 946 | ||
934 | bool OPacketCapturer::blocking() const | 947 | bool OPacketCapturer::blocking() const |
935 | { | 948 | { |
936 | int b = pcap_getnonblock( _pch, _errbuf ); | 949 | int b = pcap_getnonblock( _pch, _errbuf ); |
937 | if ( b == -1 ) | 950 | if ( b == -1 ) |
938 | { | 951 | { |
939 | qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf ); | 952 | qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf ); |
940 | return -1; | 953 | return -1; |
941 | } | 954 | } |
942 | return !b; | 955 | return !b; |
943 | } | 956 | } |
944 | 957 | ||
945 | 958 | ||
946 | void OPacketCapturer::closeDumpFile() | 959 | void OPacketCapturer::closeDumpFile() |
947 | { | 960 | { |
948 | if ( _pcd ) | 961 | if ( _pcd ) |
949 | { | 962 | { |
950 | pcap_dump_close( _pcd ); | 963 | pcap_dump_close( _pcd ); |
951 | _pcd = 0; | 964 | _pcd = 0; |
952 | } | 965 | } |
953 | pcap_close( _pch ); | 966 | pcap_close( _pch ); |
954 | } | 967 | } |
955 | 968 | ||
956 | 969 | ||
957 | void OPacketCapturer::close() | 970 | void OPacketCapturer::close() |
958 | { | 971 | { |
959 | if ( _open ) | 972 | if ( _open ) |
960 | { | 973 | { |
961 | if ( _sn ) | 974 | if ( _sn ) |
962 | { | 975 | { |
963 | _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); | 976 | _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); |
964 | delete _sn; | 977 | delete _sn; |
965 | } | 978 | } |
966 | closeDumpFile(); | 979 | closeDumpFile(); |
967 | _open = false; | 980 | _open = false; |
968 | } | 981 | } |
969 | 982 | ||
970 | qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." ); | 983 | qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." ); |
971 | qDebug( "--------------------------------------------------" ); | 984 | qDebug( "--------------------------------------------------" ); |
972 | for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it ) | 985 | for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it ) |
973 | qDebug( "%s : %d", (const char*) it.key(), it.data() ); | 986 | qDebug( "%s : %d", (const char*) it.key(), it.data() ); |
974 | qDebug( "--------------------------------------------------" ); | 987 | qDebug( "--------------------------------------------------" ); |
975 | 988 | ||
976 | } | 989 | } |
977 | 990 | ||
978 | 991 | ||
979 | int OPacketCapturer::dataLink() const | 992 | int OPacketCapturer::dataLink() const |
980 | { | 993 | { |
981 | return pcap_datalink( _pch ); | 994 | return pcap_datalink( _pch ); |
982 | } | 995 | } |
983 | 996 | ||
984 | 997 | ||
985 | void OPacketCapturer::dump( OPacket* p ) | 998 | void OPacketCapturer::dump( OPacket* p ) |
986 | { | 999 | { |
987 | if ( !_pcd ) | 1000 | if ( !_pcd ) |
988 | { | 1001 | { |
989 | qWarning( "OPacketCapturer::dump() - cannot dump without open capture file!" ); | 1002 | qWarning( "OPacketCapturer::dump() - cannot dump without open capture file!" ); |
990 | return; | 1003 | return; |
991 | } | 1004 | } |
992 | pcap_dump( (u_char*) _pcd, &p->_hdr, p->_data ); | 1005 | pcap_dump( (u_char*) _pcd, &p->_hdr, p->_data ); |
993 | } | 1006 | } |
994 | 1007 | ||
995 | 1008 | ||
996 | int OPacketCapturer::fileno() const | 1009 | int OPacketCapturer::fileno() const |
997 | { | 1010 | { |
998 | if ( _open ) | 1011 | if ( _open ) |
999 | { | 1012 | { |
1000 | return pcap_fileno( _pch ); | 1013 | return pcap_fileno( _pch ); |
1001 | } | 1014 | } |
1002 | else | 1015 | else |
1003 | { | 1016 | { |
1004 | return -1; | 1017 | return -1; |
1005 | } | 1018 | } |
1006 | } | 1019 | } |
1007 | 1020 | ||
1008 | OPacket* OPacketCapturer::next() | 1021 | OPacket* OPacketCapturer::next() |
1009 | { | 1022 | { |
1010 | packetheaderstruct header; | 1023 | packetheaderstruct header; |
1011 | qDebug( "==> OPacketCapturer::next()" ); | 1024 | qDebug( "==> OPacketCapturer::next()" ); |
1012 | const unsigned char* pdata = pcap_next( _pch, &header ); | 1025 | const unsigned char* pdata = pcap_next( _pch, &header ); |
1013 | qDebug( "<== OPacketCapturer::next()" ); | 1026 | qDebug( "<== OPacketCapturer::next()" ); |
1014 | 1027 | ||
1015 | if ( pdata && header.len ) | 1028 | if ( pdata && header.len ) |
1016 | { | 1029 | { |
1017 | OPacket* p = new OPacket( dataLink(), header, pdata, 0 ); | 1030 | OPacket* p = new OPacket( dataLink(), header, pdata, 0 ); |
1018 | // packets shouldn't be inserted in the QObject child-parent hierarchy, | 1031 | // packets shouldn't be inserted in the QObject child-parent hierarchy, |
1019 | // because due to memory constraints they will be deleted as soon | 1032 | // because due to memory constraints they will be deleted as soon |
1020 | // as possible - that is right after they have been processed | 1033 | // as possible - that is right after they have been processed |
1021 | // by emit() [ see below ] | 1034 | // by emit() [ see below ] |
1022 | //TODO: make gathering statistics optional, because it takes time | 1035 | //TODO: make gathering statistics optional, because it takes time |
1023 | p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) ); | 1036 | p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) ); |
1024 | 1037 | ||
1025 | return p; | 1038 | return p; |
1026 | } | 1039 | } |
1027 | else | 1040 | else |
1028 | { | 1041 | { |
1029 | qWarning( "OPacketCapturer::next() - no packet received!" ); | 1042 | qWarning( "OPacketCapturer::next() - no packet received!" ); |
1030 | return 0; | 1043 | return 0; |
1031 | } | 1044 | } |
1032 | } | 1045 | } |
1033 | 1046 | ||
1034 | 1047 | ||
1035 | bool OPacketCapturer::open( const QString& name ) | 1048 | bool OPacketCapturer::open( const QString& name ) |
1036 | { | 1049 | { |
1037 | if ( _open ) | 1050 | if ( _open ) |
1038 | { | 1051 | { |
1039 | if ( name == _name ) // ignore opening an already openend device | 1052 | if ( name == _name ) // ignore opening an already openend device |
1040 | { | 1053 | { |
1041 | return true; | 1054 | return true; |
1042 | } | 1055 | } |
1043 | else // close the last opened device | 1056 | else // close the last opened device |
1044 | { | 1057 | { |
1045 | close(); | 1058 | close(); |
1046 | } | 1059 | } |
1047 | } | 1060 | } |
1048 | 1061 | ||
1049 | _name = name; | 1062 | _name = name; |
1050 | 1063 | ||
1051 | // open libpcap | 1064 | // open libpcap |
1052 | pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] ); | 1065 | pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] ); |
1053 | 1066 | ||
1054 | if ( !handle ) | 1067 | if ( !handle ) |
1055 | { | 1068 | { |
1056 | qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); | 1069 | qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); |
1057 | return false; | 1070 | return false; |
1058 | } | 1071 | } |
1059 | 1072 | ||
1060 | qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name ); | 1073 | qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name ); |
1061 | _pch = handle; | 1074 | _pch = handle; |
1062 | _open = true; | 1075 | _open = true; |
1063 | _stats.clear(); | 1076 | _stats.clear(); |
1064 | 1077 | ||
1065 | // in case we have an application object, create a socket notifier | 1078 | // in case we have an application object, create a socket notifier |
1066 | if ( qApp ) //TODO: I don't like this here... | 1079 | if ( qApp ) //TODO: I don't like this here... |
1067 | { | 1080 | { |
1068 | _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); | 1081 | _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); |
1069 | connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); | 1082 | connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); |
1070 | } | 1083 | } |
1071 | 1084 | ||
1072 | return true; | 1085 | return true; |
1073 | } | 1086 | } |
1074 | 1087 | ||
1075 | 1088 | ||
1076 | bool OPacketCapturer::openDumpFile( const QString& filename ) | 1089 | bool OPacketCapturer::openDumpFile( const QString& filename ) |
1077 | { | 1090 | { |
1078 | pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) ); | 1091 | pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) ); |
1079 | if ( !dump ) | 1092 | if ( !dump ) |
1080 | { | 1093 | { |
1081 | qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf ); | 1094 | qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf ); |
1082 | return false; | 1095 | return false; |
1083 | } | 1096 | } |
1084 | qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename ); | 1097 | qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename ); |
1085 | _pcd = dump; | 1098 | _pcd = dump; |
1086 | 1099 | ||
1087 | return true; | 1100 | return true; |
1088 | } | 1101 | } |
1089 | 1102 | ||
1090 | 1103 | ||
1091 | bool OPacketCapturer::open( const QFile& file ) | 1104 | bool OPacketCapturer::open( const QFile& file ) |
1092 | { | 1105 | { |
1093 | QString name = file.name(); | 1106 | QString name = file.name(); |
1094 | 1107 | ||
1095 | if ( _open ) | 1108 | if ( _open ) |
1096 | { | 1109 | { |
1097 | close(); | 1110 | close(); |
1098 | if ( name == _name ) // ignore opening an already openend device | 1111 | if ( name == _name ) // ignore opening an already openend device |
1099 | { | 1112 | { |
1100 | return true; | 1113 | return true; |
1101 | } | 1114 | } |
1102 | else // close the last opened device | 1115 | else // close the last opened device |
1103 | { | 1116 | { |
1104 | close(); | 1117 | close(); |
1105 | } | 1118 | } |
1106 | } | 1119 | } |
1107 | 1120 | ||
1108 | _name = name; | 1121 | _name = name; |
1109 | 1122 | ||
1110 | pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] ); | 1123 | pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] ); |
1111 | 1124 | ||
1112 | if ( handle ) | 1125 | if ( handle ) |
1113 | { | 1126 | { |
1114 | qDebug( "OPacketCapturer::open(): libpcap opened successfully." ); | 1127 | qDebug( "OPacketCapturer::open(): libpcap opened successfully." ); |
1115 | _pch = handle; | 1128 | _pch = handle; |
1116 | _open = true; | 1129 | _open = true; |
1117 | 1130 | ||
1118 | // in case we have an application object, create a socket notifier | 1131 | // in case we have an application object, create a socket notifier |
1119 | if ( qApp ) | 1132 | if ( qApp ) |
1120 | { | 1133 | { |
1121 | _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); | 1134 | _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); |
1122 | connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); | 1135 | connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); |
1123 | } | 1136 | } |
1124 | 1137 | ||
1125 | return true; | 1138 | return true; |
1126 | } | 1139 | } |
1127 | else | 1140 | else |
1128 | { | 1141 | { |
1129 | qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); | 1142 | qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); |
1130 | return false; | 1143 | return false; |
1131 | } | 1144 | } |
1132 | 1145 | ||
1133 | } | 1146 | } |
1134 | 1147 | ||
1135 | 1148 | ||
1136 | bool OPacketCapturer::isOpen() const | 1149 | bool OPacketCapturer::isOpen() const |
1137 | { | 1150 | { |
1138 | return _open; | 1151 | return _open; |
1139 | } | 1152 | } |
1140 | 1153 | ||
1141 | 1154 | ||
1142 | void OPacketCapturer::readyToReceive() | 1155 | void OPacketCapturer::readyToReceive() |
1143 | { | 1156 | { |
1144 | qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" ); | 1157 | qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" ); |
1145 | OPacket* p = next(); | 1158 | OPacket* p = next(); |
1146 | emit receivedPacket( p ); | 1159 | emit receivedPacket( p ); |
1147 | // emit is synchronous - packet has been dealt with, now it's safe to delete | 1160 | // emit is synchronous - packet has been dealt with, now it's safe to delete |
1148 | delete p; | 1161 | delete p; |
1149 | } | 1162 | } |
1150 | 1163 | ||
1151 | 1164 | ||
1152 | const QMap<QString,int>& OPacketCapturer::statistics() const | 1165 | const QMap<QString,int>& OPacketCapturer::statistics() const |
1153 | { | 1166 | { |
1154 | return _stats; | 1167 | return _stats; |
1155 | } | 1168 | } |
1156 | 1169 | ||
1157 | 1170 | ||
1158 | int OPacketCapturer::snapShot() const | 1171 | int OPacketCapturer::snapShot() const |
1159 | { | 1172 | { |
1160 | return pcap_snapshot( _pch ); | 1173 | return pcap_snapshot( _pch ); |
1161 | } | 1174 | } |
1162 | 1175 | ||
1163 | 1176 | ||
1164 | bool OPacketCapturer::swapped() const | 1177 | bool OPacketCapturer::swapped() const |
1165 | { | 1178 | { |
1166 | return pcap_is_swapped( _pch ); | 1179 | return pcap_is_swapped( _pch ); |
1167 | } | 1180 | } |
1168 | 1181 | ||
1169 | 1182 | ||
1170 | QString OPacketCapturer::version() const | 1183 | QString OPacketCapturer::version() const |
1171 | { | 1184 | { |
1172 | return QString().sprintf( "%s.%s", pcap_major_version( _pch ), pcap_minor_version( _pch ) ); | 1185 | return QString().sprintf( "%s.%s", pcap_major_version( _pch ), pcap_minor_version( _pch ) ); |
1173 | } | 1186 | } |
1174 | 1187 | ||
1175 | 1188 | ||
diff --git a/libopie2/opienet/udp_ports.h b/libopie2/opienet/udp_ports.h new file mode 100644 index 0000000..5e92497 --- a/dev/null +++ b/libopie2/opienet/udp_ports.h | |||
@@ -0,0 +1,89 @@ | |||
1 | /* | ||
2 | * This file has been generated by doing | ||
3 | * find . -name "*"|xargs grep -h '#define UDP_PORT' > udp_ports.h | ||
4 | * in the root directory of Ethereal 0.9.15. Cudos to the Ethereal Team. | ||
5 | * -- Michael 'Mickey' Lauer <mickeyl@handhelds.org> | ||
6 | */ | ||
7 | |||
8 | #define UDP_PORT_AODV654 | ||
9 | #define UDP_PORT_LENGTH 2 | ||
10 | #define UDP_PORT_OFFSET PARAMETER_VALUE_OFFSET | ||
11 | #define UDP_PORT_RAS1 1718 | ||
12 | #define UDP_PORT_RAS2 1719 | ||
13 | #define UDP_PORT_CPHA8116 | ||
14 | #define UDP_PORT_DDTP1052 | ||
15 | #define UDP_PORT_CUPS631 | ||
16 | #define UDP_PORT_DLSW 2067 | ||
17 | #define UDP_PORT_ISAKMP500 | ||
18 | #define UDP_PORT_L2TP 1701 | ||
19 | #define UDP_PORT_IAPP 2313 | ||
20 | #define UDP_PORT_HSRP 1985 | ||
21 | #define UDP_PORT_SSDP 1900 | ||
22 | #define UDP_PORT_TACACS49 | ||
23 | #define UDP_PORT_CLDAP 389 | ||
24 | #define UDP_PORT_VINES573 | ||
25 | #define UDP_PORT_NBNS137 | ||
26 | #define UDP_PORT_NBDGM138 | ||
27 | #define UDP_PORT_XYPLEX 173 | ||
28 | #define UDP_PORT_PIM_RP_DISC 496 | ||
29 | #define UDP_PORT_SLIMP3_V1 1069 | ||
30 | #define UDP_PORT_SLIMP3_V2 3483 | ||
31 | #define UDP_PORT_RMCP 623 | ||
32 | #define UDP_PORT_RMCP_SECURE664 | ||
33 | #define UDP_PORT_SYSLOG 514 | ||
34 | #define UDP_PORT_SNMP 161 | ||
35 | #define UDP_PORT_SNMP_TRAP162 | ||
36 | #define UDP_PORT_TFTP 69 | ||
37 | #define UDP_PORT_TIME 37 | ||
38 | #define UDP_PORT_STUN 3478 | ||
39 | #define UDP_PORT_SRVLOC427 | ||
40 | #define UDP_PORT_TZSP0x9090 | ||
41 | #define UDP_PORT_WCCP2048 | ||
42 | #define UDP_PORT_MSPROXY 1745 | ||
43 | #define UDP_PORT_BOOTPS 67 | ||
44 | #define UDP_PORT_BOOTPC 68 | ||
45 | #define UDP_PORT_XDMCP 177 | ||
46 | #define UDP_PORT_DHCPV6_DOWNSTREAM546 | ||
47 | #define UDP_PORT_DHCPV6_UPSTREAM547 | ||
48 | #define UDP_PORT_DNS 53 | ||
49 | #define UDP_PORT_MDNS 5353 | ||
50 | #define UDP_PORT_ICP 3130 | ||
51 | #define UDP_PORT_ICQ4000 | ||
52 | #define UDP_PORT_IPX 213 /* RFC 1234 */ | ||
53 | #define UDP_PORT_LDP 646 | ||
54 | #define UDP_PORT_LLC1 12000 | ||
55 | #define UDP_PORT_LLC2 12001 | ||
56 | #define UDP_PORT_LLC3 12002 | ||
57 | #define UDP_PORT_LLC4 12003 | ||
58 | #define UDP_PORT_LLC5 12004 | ||
59 | #define UDP_PORT_MIP 434 | ||
60 | #define UDP_PORT_NCP 524 | ||
61 | #define UDP_PORT_NTP123 | ||
62 | #define UDP_PORT_RIP 520 | ||
63 | #define UDP_PORT_SAP9875 | ||
64 | #define UDP_PORT_SIP 5060 | ||
65 | #define UDP_PORT_TIMED525 | ||
66 | #define UDP_PORT_RIPNG 521 | ||
67 | #define UDP_PORT_WSP 9200 /* wap-wsp */ | ||
68 | #define UDP_PORT_WTP_WSP 9201 /* wap-wsp-wtp */ | ||
69 | #define UDP_PORT_WTLS_WSP 9202 /* wap-wsp-s */ | ||
70 | #define UDP_PORT_WTLS_WTP_WSP 9203 /* wap-wsp-wtp-s*/ | ||
71 | #define UDP_PORT_WSP_PUSH 2948 /* wap-wsp */ | ||
72 | #define UDP_PORT_WTLS_WSP_PUSH 2949 /* wap-wsp-s */ | ||
73 | #define UDP_PORT_WHO 513 | ||
74 | #define UDP_PORT_KERBEROS 88 | ||
75 | #define UDP_PORT_SFLOW 6343 | ||
76 | #define UDP_PORT_LAPLINK 1547 | ||
77 | #define UDP_PORT_NETFLOW2055 | ||
78 | #define UDP_PORT_RX_LOW 7000 | ||
79 | #define UDP_PORT_RX_HIGH7009 | ||
80 | #define UDP_PORT_RX_AFS_BACKUPS7021 | ||
81 | #define UDP_PORT_MGCP_GATEWAY 2427 | ||
82 | #define UDP_PORT_MGCP_CALLAGENT 2727 | ||
83 | #define UDP_PORT_PCLI 9000 | ||
84 | #define UDP_PORT_ARTNET 0x1936 | ||
85 | #define UDP_PORT_TERREDO 3544 | ||
86 | #define UDP_PORT_RADIUS 1645 | ||
87 | #define UDP_PORT_RADIUS_NEW1812 | ||
88 | #define UDP_PORT_RADACCT1646 | ||
89 | #define UDP_PORT_RADACCT_NEW1813 | ||