summaryrefslogtreecommitdiff
path: root/libopie2/opienet
authormickeyl <mickeyl>2003-03-28 15:11:52 (UTC)
committer mickeyl <mickeyl>2003-03-28 15:11:52 (UTC)
commit11304d02942e9fa493e4e80943a828f9c65f6772 (patch) (unidiff)
treea0223c10c067e1afc70d15c2b82be3f3c15e41ae /libopie2/opienet
parentb271d575fa05cf570a1a829136517761bd47e69b (diff)
downloadopie-11304d02942e9fa493e4e80943a828f9c65f6772.zip
opie-11304d02942e9fa493e4e80943a828f9c65f6772.tar.gz
opie-11304d02942e9fa493e4e80943a828f9c65f6772.tar.bz2
skeleton and the start of libopie2, please read README, ROADMAP and STATUS and comment...
Diffstat (limited to 'libopie2/opienet') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/.cvsignore6
-rw-r--r--libopie2/opienet/802_11_user.h419
-rw-r--r--libopie2/opienet/config.in7
-rw-r--r--libopie2/opienet/onetutils.cpp101
-rw-r--r--libopie2/opienet/onetutils.h125
-rw-r--r--libopie2/opienet/onetwork.cpp774
-rw-r--r--libopie2/opienet/onetwork.h307
-rw-r--r--libopie2/opienet/opcap.cpp609
-rw-r--r--libopie2/opienet/opcap.h294
-rw-r--r--libopie2/opienet/opienet.pro18
10 files changed, 2660 insertions, 0 deletions
diff --git a/libopie2/opienet/.cvsignore b/libopie2/opienet/.cvsignore
new file mode 100644
index 0000000..8f7300c
--- a/dev/null
+++ b/libopie2/opienet/.cvsignore
@@ -0,0 +1,6 @@
1Makefile*
2moc*
3*moc
4*.o
5~*
6
diff --git a/libopie2/opienet/802_11_user.h b/libopie2/opienet/802_11_user.h
new file mode 100644
index 0000000..0b3f198
--- a/dev/null
+++ b/libopie2/opienet/802_11_user.h
@@ -0,0 +1,419 @@
1#ifndef IEEE_802_11
2#define IEEE_802_11
3
4enum ieee_802_11_link_status_failure_reason {
5 reserved0, Unspecified=1, Previous_not_valid,
6 Sender_Quits_ESS_or_IBSS,
7 Due_Inactivity, AP_Overload,
8 Class_2_from_NonAuth,
9 Class_3_from_NonAuth,
10 Sender_Quits_BSS,
11 Association_requester_not_authenticated,
12 Reserved10
13};
14
15
16#define IEEE_802_11_LINK_STATUS_FAILURE_REASON_STRINGS \
17 {\
18 {reserved0, 0xff," Reserved reason "},\
19 {Unspecified, 0xff," Unspecified Reason "},\
20 {Previous_not_valid,0xff," Previous Authentication no longer valid "},\
21 {Sender_Quits_ESS_or_IBSS,0xff," Deauthenticated because sending station is leaving (has left) IBSS or ESS "},\
22 {Due_Inactivity,0xff," Disassociated due to inactivity "},\
23 {AP_Overload, 0xff," Disassociated because AP is unable to handle all currently associated stations "},\
24 {Class_2_from_NonAuth,0xff," Class 2 frame received from non-Authenticated station"},\
25 {Class_3_from_NonAuth,0xff," Class 3 frame received from non­Associated station"},\
26 {Sender_Quits_BSS,0xff," Disassociated because sending station is leaving (has left) BSS"},\
27 {Association_requester_not_authenticated,0xff," Station requesting (Re)Association is not Authenticated with responding station"},\
28 {Reserved10, 0xff," Reserved"},\
29 {0,0,NULL}\
30};
31
32
33
34struct ieee_802_11_header {
35 u_int16_tframe_control;// needs to be subtyped
36 u_int16_tduration;
37 u_int8_tmac1[6];
38 u_int8_tmac2[6];
39 u_int8_tmac3[6];
40 u_int16_tSeqCtl;
41 u_int8_tmac4[6];
42 // u_int16_tgapLen;
43 // u_int8_tgap[8];
44};
45
46
47struct ieee_802_3_header {
48
49 u_int16_tstatus;
50 u_int16_tpayload_length;
51 u_int8_tdst_mac[6];
52 u_int8_tsrc_mac[6];
53
54};
55
56#define P80211_OUI_LEN 3
57
58struct ieee_802_11_snap_header {
59
60 u_int8_t dsap; /* always 0xAA */
61 u_int8_t ssap; /* always 0xAA */
62 u_int8_t ctrl; /* always 0x03 */
63 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
64
65} __attribute__ ((packed));
66
67#define P80211_LLC_OUI_LEN 3
68
69struct ieee_802_11_802_1H_header {
70
71 u_int8_t dsap;
72 u_int8_t ssap; /* always 0xAA */
73 u_int8_t ctrl; /* always 0x03 */
74 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
75 u_int16_t unknown1; /* packet type ID fields */
76 u_int16_t unknown2; /* here is something like length in some cases */
77} __attribute__ ((packed));
78
79struct ieee_802_11_802_2_header {
80
81 u_int8_t dsap;
82 u_int8_t ssap; /* always 0xAA */
83 u_int8_t ctrl; /* always 0x03 */
84 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
85 u_int16_t type; /* packet type ID field */
86
87} __attribute__ ((packed));
88
89
90
91// following is incoplete and may be incorrect and need reorganization
92
93 #define ieee_802_11_frame_type_Management0x00
94 #define ieee_802_11_frame_type_Control 0x01
95 #define ieee_802_11_frame_type_Data 0x10
96 #define ieee_802_11_frame_type_Reserved 0x11
97
98 #define ieee_802_11_frame_subtype_Association_Req0x0 // Association Request
99 #define ieee_802_11_frame_subtype_Association_Resp0x1 // Association Response
100 #define ieee_802_11_frame_subtype_Reassociation_Req0x2 // Reassociation Request
101 #define ieee_802_11_frame_subtype_Reassociation_Resp0x3 // Reassociation Response
102 #define ieee_802_11_frame_subtype_Probe_Req 0x4 // Probe Request
103 #define ieee_802_11_frame_subtype_Probe_Resp 0x5 // Probe Response
104 #define ieee_802_11_frame_subtype_Beacon 0x8 // Beacon
105 #define ieee_802_11_frame_subtype_ATIM 0x9 // ATIM
106 #define ieee_802_11_frame_subtype_Disassociation 0xA // Disassociation
107 #define ieee_802_11_frame_subtype_Authentication 0xB // Authentication
108 #define ieee_802_11_frame_subtype_Deauthentication 0xC // Deauthentication
109 #define ieee_802_11_frame_subtype_PS_Poll 0xA // PS-Poll
110 #define ieee_802_11_frame_subtype_RTS 0xB // RTS
111 #define ieee_802_11_frame_subtype_CTS 0xC // CTS
112 #define ieee_802_11_frame_subtype_ACK 0xD // ACK
113 #define ieee_802_11_frame_subtype_CFEnd 0xE // CF-End
114 #define ieee_802_11_frame_subtype_CFEnd_CFAck 0xF // CF-End + CF-Ack
115 #define ieee_802_11_frame_subtype_Data 0x0 // Data
116 #define ieee_802_11_frame_subtype_Data_CFAck 0x1 // Data + CF-Ack
117 #define ieee_802_11_frame_subtype_Data_CF_Poll 0x2 // Data + CF-Poll
118 #define ieee_802_11_frame_subtype_Data_CF_AckCF_Poll 0x3 // Data + CF-Ack + CF-Poll
119 #define ieee_802_11_frame_subtype_NullFunction 0x4 // Null Function (no data)
120 #define ieee_802_11_frame_subtype_CF_Ack 0x5 // CF-Ack (no data)
121 #define ieee_802_11_frame_subtype_CF_Poll 0x6 // CF-Poll (no data)
122 #define ieee_802_11_frame_subtype_CF_AckCF_Poll 0x7 // CF-Ack + CF-Poll (no data)
123
124
125#define ieee_802_11_frame_subtype_strings {\
126 { ieee_802_11_frame_subtype_Association_Req,0xF,"f Association Request"},\
127 { ieee_802_11_frame_subtype_Association_Resp,0xF,"1 Association Response"},\
128 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,"2 Reassociation Request"},\
129 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,"3 Reassociation Response"},\
130 { ieee_802_11_frame_subtype_Probe_Req ,0xF,"4 Probe Request"},\
131 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,"5 Probe Response"},\
132 { ieee_802_11_frame_subtype_Beacon ,0xF,"8 Beacon"},\
133 { ieee_802_11_frame_subtype_ATIM ,0xF,"9 ATIM"},\
134 { ieee_802_11_frame_subtype_Disassociation,0xF,"A Disassociation"},\
135 { ieee_802_11_frame_subtype_Authentication,0xF,"B Authentication"},\
136 { ieee_802_11_frame_subtype_Deauthentication,0xF,"C Deauthentication"},\
137 { ieee_802_11_frame_subtype_PS_Poll ,0xF,"A PS-Poll"},\
138 { ieee_802_11_frame_subtype_RTS ,0xF,"B RTS"},\
139 { ieee_802_11_frame_subtype_CTS ,0xF,"C CTS"},\
140 { ieee_802_11_frame_subtype_ACK ,0xF,"D ACK"},\
141 { ieee_802_11_frame_subtype_CFEnd ,0xF,"E CF-End"},\
142 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,"F CF-End + CF-Ack"},\
143 { ieee_802_11_frame_subtype_Data ,0xF,"0 Data"},\
144 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,"1 Data + CF-Ack"},\
145 { ieee_802_11_frame_subtype_Data_CFPoll ,0xF,"2 Data + CF-Poll"},\
146 { ieee_802_11_frame_subtype_Data_CFAck_CFPoll,0xF,"3 Data + CF-Ack + CF-Poll"},\
147 { ieee_802_11_frame_subtype_Null_Function ,0xF,"4 Null Function (no data)"},\
148 { ieee_802_11_frame_subtype_CFAck , 0xF,"5 CF-Ack (no data)"},\
149 { ieee_802_11_frame_subtype_CFPoll , 0xF,"6 CF-Poll (no data)"},\
150 { ieee_802_11_frame_subtype_CFAck_CFPoll,0xF,"y7 CF-Ack + CF-Poll (no data)"},\
151 { 0,0,NULL}\
152}
153struct ieee_802_11_frame_subtype_class {
154 u_int8_tsubtype;
155 u_int8_tmask;
156 u_int8_tklass;
157 u_int8_ttype;
158};
159#define ieee_802_11_frame_subtype_classes {\
160 { ieee_802_11_frame_subtype_Association_Req,0xF,2,ieee_802_11_frame_type_Management},\
161 { ieee_802_11_frame_subtype_Association_Resp,0xF,2,ieee_802_11_frame_type_Management},\
162 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,2,ieee_802_11_frame_type_Management},\
163 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,2,ieee_802_11_frame_type_Management},\
164 { ieee_802_11_frame_subtype_Probe_Req ,0xF,1,ieee_802_11_frame_type_Management},\
165 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,1,ieee_802_11_frame_type_Management},\
166 { ieee_802_11_frame_subtype_Beacon ,0xF,1,ieee_802_11_frame_type_Management},\
167 { ieee_802_11_frame_subtype_ATIM ,0xF,1,ieee_802_11_frame_type_Management},\
168 { ieee_802_11_frame_subtype_Disassociation,0xF,2,ieee_802_11_frame_type_Management},\
169 { ieee_802_11_frame_subtype_Authentication,0xF,1,ieee_802_11_frame_type_Management},\
170 { ieee_802_11_frame_subtype_Deauthentication,0xF,3,ieee_802_11_frame_type_Management},\
171 { ieee_802_11_frame_subtype_PS-Poll ,0xF,3,ieee_802_11_frame_type_Control},\
172 { ieee_802_11_frame_subtype_RTS ,0xF,1,ieee_802_11_frame_type_Control},\
173 { ieee_802_11_frame_subtype_CTS ,0xF,1,ieee_802_11_frame_type_Control},\
174 { ieee_802_11_frame_subtype_ACK ,0xF,1,ieee_802_11_frame_type_Control},\
175 { ieee_802_11_frame_subtype_CFEnd ,0xF,1,ieee_802_11_frame_type_Control},\
176 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,1,ieee_802_11_frame_type_Control},\
177 { ieee_802_11_frame_subtype_Data ,0xF,3,ieee_802_11_frame_type_Data},\
178 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,3,ieee_802_11_frame_type_Data},\
179 { ieee_802_11_frame_subtype_Data_CF_Poll 0xF,3,ieee_802_11_frame_type_Data},\
180 { ieee_802_11_frame_subtype_Data_CF_AckCF_Poll,0xF,3,ieee_802_11_frame_type_Data},\
181 { ieee_802_11_frame_subtype_NullFunction 0xF,1,ieee_802_11_frame_type_Data},\
182 { ieee_802_11_frame_subtype_CF_Ack , 0xF,1,ieee_802_11_frame_type_Data},\
183 { ieee_802_11_frame_subtype_CF_Poll , 0xF,1,ieee_802_11_frame_type_Data},\
184 { ieee_802_11_frame_subtype_CF_AckCF_Poll,0xF,1,ieee_802_11_frame_type_Data},\
185 { 0,0,NULL}\
186}
187
188 #define IEEE802_11_FC_LEN2
189
190#define T_MGMT 0x0 /* management */
191#define T_CTRL 0x1 /* control */
192#define T_DATA 0x2 /* data */
193#define T_RESV 0x3 /* reserved */
194
195 #define ST_ASSOC_REQUEST 0x0
196 #define ST_ASSOC_RESPONSE 0x1
197 #define ST_REASSOC_REQUEST 0x2
198 #define ST_REASSOC_RESPONSE 0x3
199 #define ST_PROBE_REQUEST 0x4
200 #define ST_PROBE_RESPONSE 0x5
201 /* RESERVED 0x6 */
202 /* RESERVED 0x7 */
203 #define ST_BEACON 0x8
204 #define ST_ATIM 0x9
205 #define ST_DISASSOC 0xA
206 #define ST_AUTH 0xB
207 #define ST_DEAUTH 0xC
208 /* RESERVED 0xD */
209 /* RESERVED 0xE */
210 /* RESERVED 0xF */
211
212
213 #define CTRL_PS_POLL0xA
214 #define CTRL_RTS0xB
215 #define CTRL_CTS0xC
216 #define CTRL_ACK0xD
217 #define CTRL_CF_END0xE
218 #define CTRL_END_ACK0xF
219
220/*
221 * Bits in the frame control field.
222 */
223 #define FC_VERSION(fc) ((fc) & 0x3)
224 #define FC_TYPE(fc) (((fc) >> 2) & 0x3)
225 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
226 #define FC_TO_DS(fc) ((fc) & 0x0100)
227 #define FC_FROM_DS(fc) ((fc) & 0x0200)
228 #define FC_MORE_FLAG(fc)((fc) & 0x0400)
229 #define FC_RETRY(fc) ((fc) & 0x0800)
230 #define FC_POWER_MGMT(fc)((fc) & 0x1000)
231 #define FC_MORE_DATA(fc)((fc) & 0x2000)
232 #define FC_WEP(fc) ((fc) & 0x4000)
233 #define FC_ORDER(fc) ((fc) & 0x8000)
234
235
236struct ieee_802_11_mgmt_header {
237 u_int16_t fc;
238 u_int16_t duration;
239 u_int8_t da[6];
240 u_int8_t sa[6];
241 u_int8_t bssid[6];
242 u_int16_t seq_ctrl;
243};
244
245
246struct ieee_802_11_data_header {
247 u_int16_tframe_control;
248 u_int16_tduration;
249 u_int8_tmac1[6];
250 u_int8_tmac2[6];
251 u_int8_tmac3[6];
252 u_int16_tSeqCtl;
253 u_int8_tmac4[6];
254 // u_int16_tgapLen;
255 // u_int8_tgap[8];
256};
257
258 #define CAPABILITY_ESS(cap)((cap) & 0x0001)
259 #define CAPABILITY_IBSS(cap)((cap) & 0x0002)
260 #define CAPABILITY_CFP(cap)((cap) & 0x0004)
261 #define CAPABILITY_CFP_REQ(cap)((cap) & 0x0008)
262 #define CAPABILITY_PRIVACY(cap)((cap) & 0x0010)
263
264struct ssid_t {
265 u_int8_telement_id;
266 u_int8_tlength;
267 u_char ssid[33]; /* 32 + 1 for null */
268};
269
270
271struct rates_t {
272 u_int8_telement_id;
273 u_int8_tlength;
274 u_int8_trate[8];
275};
276
277
278struct challenge_t {
279 u_int8_telement_id;
280 u_int8_tlength;
281 u_int8_ttext[254]; /* 1-253 + 1 for null */
282};
283
284
285struct fh_t {
286 u_int8_telement_id;
287 u_int8_tlength;
288 u_int16_tdwell_time;
289 u_int8_thop_set;
290 u_int8_t hop_pattern;
291 u_int8_thop_index;
292};
293
294
295struct ds_t {
296 u_int8_telement_id;
297 u_int8_tlength;
298 u_int8_tchannel;
299};
300
301
302struct cf_t {
303 u_int8_telement_id;
304 u_int8_tlength;
305 u_int8_tcount;
306 u_int8_tperiod;
307 u_int16_tmax_duration;
308 u_int16_tdur_remaing;
309};
310
311
312struct tim_t {
313 u_int8_telement_id;
314 u_int8_tlength;
315 u_int8_tcount;
316 u_int8_tperiod;
317 u_int8_tbitmap_control;
318 u_int8_tbitmap[251];
319};
320
321 #define E_SSID 0
322 #define E_RATES 1
323 #define E_FH 2
324 #define E_DS 3
325 #define E_CF 4
326 #define E_TIM 5
327 #define E_IBSS 6
328 #define E_CHALLENGE 16
329 #define E_CISCO 133
330
331
332struct ieee_802_11_mgmt_body {
333 u_int8_t timestamp[8];
334 u_int16_t beacon_interval;
335 // u_int16_t listen_interval;
336 // u_int16_t status_code;
337 // u_int16_t aid;
338 // u_char ap[6];
339 // u_int16_treason_code;
340 // u_int16_tauth_alg;
341 // u_int16_tauth_trans_seq_num;
342// struct challenge_t challenge;
343 u_int16_tcapability_info;
344 struct ssid_tssid;
345 struct rates_t rates;
346 struct ds_tds;
347 struct cf_tcf;
348 struct fh_tfh;
349 struct tim_ttim;
350};
351
352
353struct ieee_802_11_data_body {
354//FIXME
355};
356
357struct ctrl_rts_t {
358 u_int16_tfc;
359 u_int16_tduration;
360 u_int8_tra[6];
361 u_int8_tta[6];
362 u_int8_tfcs[4];
363};
364
365 #define CTRL_RTS_LEN(2+2+6+6+4)
366
367struct ctrl_cts_t {
368 u_int16_tfc;
369 u_int16_tduration;
370 u_int8_tra[6];
371 u_int8_tfcs[4];
372};
373
374 #define CTRL_CTS_LEN(2+2+6+4)
375
376struct ctrl_ack_t {
377 u_int16_tfc;
378 u_int16_tduration;
379 u_int8_tra[6];
380 u_int8_tfcs[4];
381};
382
383 #define CTRL_ACK_LEN(2+2+6+4)
384
385struct ctrl_ps_poll_t {
386 u_int16_tfc;
387 u_int16_taid;
388 u_int8_tbssid[6];
389 u_int8_tta[6];
390 u_int8_tfcs[4];
391};
392
393 #define CTRL_PS_POLL_LEN(2+2+6+6+4)
394
395struct ctrl_end_t {
396 u_int16_tfc;
397 u_int16_tduration;
398 u_int8_tra[6];
399 u_int8_tbssid[6];
400 u_int8_tfcs[4];
401};
402
403 #define CTRL_END_LEN(2+2+6+6+4)
404
405struct ctrl_end_ack_t {
406 u_int16_tfc;
407 u_int16_tduration;
408 u_int8_tra[6];
409 u_int8_tbssid[6];
410 u_int8_tfcs[4];
411};
412
413 #define CTRL_END_ACK_LEN(2+2+6+6+4)
414
415 #define IV_IV(iv)((iv) & 0xFFFFFF)
416 #define IV_PAD(iv)(((iv) >> 24) & 0x3F)
417 #define IV_KEYID(iv)(((iv) >> 30) & 0x03)
418
419#endif
diff --git a/libopie2/opienet/config.in b/libopie2/opienet/config.in
new file mode 100644
index 0000000..5b235da
--- a/dev/null
+++ b/libopie2/opienet/config.in
@@ -0,0 +1,7 @@
1 config LIBOPIE2NET
2 boolean "libopie2net (network and packet capturing related classes)"
3 default "n"
4 depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE
5 comment "libopie2net needs a libqpe and libopie2core"
6 depends !(( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE)
7
diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp
new file mode 100644
index 0000000..8006f41
--- a/dev/null
+++ b/libopie2/opienet/onetutils.cpp
@@ -0,0 +1,101 @@
1/*
2                 This file is part of the Opie Project
3
4              (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
5 =.
6 .=l.
7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_.
15    .i_,=:_.      -<s. This program is distributed in the hope that
16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
17    : ..    .:,     . . . without even the implied warranty of
18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.=       =       ; Library General Public License for more
21++=   -.     .`     .: details.
22 :     =  ...= . :.=-
23 -.   .:....=;==+<; You should have received a copy of the GNU
24  -_. . .   )=.  = Library General Public License along with
25    --        :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA.
29
30*/
31
32#include <opie2/onetutils.h>
33
34#include <net/if.h>
35
36#include <cstdio>
37using namespace std;
38
39/*======================================================================================
40 * OMacAddress
41 *======================================================================================*/
42
43// static initializer for broadcast and unknown MAC Adresses
44const unsigned char __broadcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
45const OMacAddress& OMacAddress::broadcast = OMacAddress( __broadcast );
46const unsigned char __unknown[6] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };
47const OMacAddress& OMacAddress::unknown = OMacAddress( __unknown );
48
49
50//TODO: Incorporate Ethernet Manufacturer database here!
51
52OMacAddress::OMacAddress( unsigned char* p )
53{
54 memcpy( _bytes, p, 6 ); // D'OH! memcpy in my sources... eeek...
55}
56
57
58OMacAddress::OMacAddress( const unsigned char* p )
59{
60 memcpy( _bytes, p, 6 );
61}
62
63
64OMacAddress::OMacAddress( struct ifreq& ifr )
65{
66 memcpy( _bytes, ifr.ifr_hwaddr.sa_data, 6 );
67}
68
69
70OMacAddress::~OMacAddress()
71{
72}
73
74
75QString OMacAddress::toString() const
76{
77 QString s;
78 s.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
79 _bytes[0]&0xff, _bytes[1]&0xff, _bytes[2]&0xff,
80 _bytes[3]&0xff, _bytes[4]&0xff, _bytes[5]&0xff );
81 return s;
82}
83
84
85bool operator==( const OMacAddress &m1, const OMacAddress &m2 )
86{
87 return memcmp( &m1._bytes, &m2._bytes, 6 ) == 0;
88}
89
90void dumpBytes( const unsigned char* data, int num )
91{
92 printf( "Dumping %d bytes @ %0x", num, data );
93 printf( "-------------------------------------------\n" );
94
95 for ( int i = 0; i < num; ++i )
96 {
97 printf( "%02x ", data[i] );
98 if ( !((i+1) % 32) ) printf( "\n" );
99 }
100 printf( "\n\n" );
101}
diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h
new file mode 100644
index 0000000..0dabe8d
--- a/dev/null
+++ b/libopie2/opienet/onetutils.h
@@ -0,0 +1,125 @@
1/*
2                 This file is part of the Opie Project
3
4              (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
5 =.
6 .=l.
7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_.
15    .i_,=:_.      -<s. This program is distributed in the hope that
16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
17    : ..    .:,     . . . without even the implied warranty of
18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.=       =       ; Library General Public License for more
21++=   -.     .`     .: details.
22 :     =  ...= . :.=-
23 -.   .:....=;==+<; You should have received a copy of the GNU
24  -_. . .   )=.  = Library General Public License along with
25    --        :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA.
29
30*/
31
32#ifndef ONETUTILS_H
33#define ONETUTILS_H
34
35#include <qdict.h>
36#include <qmap.h>
37#include <qstring.h>
38#include <qhostaddress.h>
39
40struct ifreq;
41
42/*======================================================================================
43 * OMacAddress
44 *======================================================================================*/
45
46class OMacAddress
47{
48 public:
49 OMacAddress( unsigned char* );
50 OMacAddress( const unsigned char* );
51 OMacAddress( struct ifreq& );
52 ~OMacAddress();
53
54 QString toString() const;
55
56 public:
57 static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff
58 static const OMacAddress& unknown; // 44:44:44:44:44:44
59
60 private:
61 unsigned char _bytes[6];
62
63 friend bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
64
65};
66
67bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
68
69
70/*======================================================================================
71 * OHostAddress
72 *======================================================================================*/
73
74class OHostAddress : public QHostAddress
75{
76 public:
77 OHostAddress();
78 ~OHostAddress();
79};
80
81
82/*======================================================================================
83 * Miscellaneous
84 *======================================================================================*/
85
86/* dump bytes */
87
88void dumpBytes( const unsigned char* data, int num );
89
90/* Network to host order macros */
91
92#ifdef LBL_ALIGN
93#define EXTRACT_16BITS(p) \
94 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \
95 (u_int16_t)*((const u_int8_t *)(p) + 1)))
96#define EXTRACT_32BITS(p) \
97 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \
98 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \
99 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \
100 (u_int32_t)*((const u_int8_t *)(p) + 3)))
101#else
102#define EXTRACT_16BITS(p) \
103 ((u_int16_t)ntohs(*(const u_int16_t *)(p)))
104#define EXTRACT_32BITS(p) \
105 ((u_int32_t)ntohl(*(const u_int32_t *)(p)))
106#endif
107
108#define EXTRACT_24BITS(p) \
109 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \
110 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
111 (u_int32_t)*((const u_int8_t *)(p) + 2)))
112
113/* Little endian protocol host order macros */
114#define EXTRACT_LE_8BITS(p) (*(p))
115#define EXTRACT_LE_16BITS(p) \
116 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \
117 (u_int16_t)*((const u_int8_t *)(p) + 0)))
118#define EXTRACT_LE_32BITS(p) \
119 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \
120 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \
121 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
122 (u_int32_t)*((const u_int8_t *)(p) + 0)))
123
124#endif // ONETUTILS_H
125
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
new file mode 100644
index 0000000..1d3b9fe
--- a/dev/null
+++ b/libopie2/opienet/onetwork.cpp
@@ -0,0 +1,774 @@
1/*
2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =.
8 .=l.
9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details.
24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA.
31
32*/
33
34/* OPIE */
35
36#include <opie2/onetwork.h>
37
38/* QT */
39
40#include <qfile.h>
41#include <qtextstream.h>
42
43/* UNIX */
44
45#include <arpa/inet.h>
46#include <cerrno>
47#include <cstring>
48#include <cstdlib>
49#include <math.h>
50#include <sys/ioctl.h>
51#include <sys/socket.h>
52#include <sys/types.h>
53#include <unistd.h>
54#include <linux/wireless.h>
55
56using namespace std;
57
58/*======================================================================================
59 * ONetwork
60 *======================================================================================*/
61
62ONetwork* ONetwork::_instance = 0;
63
64ONetwork::ONetwork()
65{
66 qDebug( "ONetwork::ONetwork()" );
67 synchronize();
68}
69
70void ONetwork::synchronize()
71{
72 // gather available interfaces by inspecting /proc/net/dev
73 // we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
74
75 _interfaces.clear();
76 QString str;
77 QFile f( "/proc/net/dev" );
78 bool hasFile = f.open( IO_ReadOnly );
79 if ( !hasFile )
80 {
81 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" );
82 return;
83 }
84 QTextStream s( &f );
85 s.readLine();
86 s.readLine();
87 while ( !s.atEnd() )
88 {
89 s >> str;
90 str.truncate( str.find( ':' ) );
91 qDebug( "ONetwork: found interface '%s'", (const char*) str );
92 ONetworkInterface* iface;
93 if ( isWirelessInterface( str ) )
94 {
95 iface = new OWirelessNetworkInterface( str );
96 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str );
97 }
98 else
99 {
100 iface = new ONetworkInterface( str );
101 }
102 _interfaces.insert( str, iface );
103 s.readLine();
104 }
105}
106
107
108ONetworkInterface* ONetwork::interface( QString iface ) const
109{
110 return _interfaces[iface];
111}
112
113
114ONetwork* ONetwork::instance()
115{
116 if ( !_instance ) _instance = new ONetwork();
117 return _instance;
118}
119
120
121ONetwork::InterfaceIterator ONetwork::iterator() const
122{
123 return ONetwork::InterfaceIterator( _interfaces );
124}
125
126
127bool ONetwork::isWirelessInterface( const char* name ) const
128{
129 int sfd = socket( AF_INET, SOCK_DGRAM, 0 );
130 iwreqstruct iwr;
131 memset( &iwr, 0, sizeof( iwreqstruct ) );
132 strcpy( (char*) &iwr.ifr_name, name );
133 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
134 if ( result == -1 )
135 qDebug( "ONetwork::ioctl(): SIOCGIWNAME failed: %d (%s)", result, strerror( errno ) );
136 else
137 qDebug( "ONetwork::ioctl(): SIOCGIWNAME ok." );
138 return ( result != -1 );
139}
140
141/*======================================================================================
142 * ONetworkInterface
143 *======================================================================================*/
144
145ONetworkInterface::ONetworkInterface( const QString& name )
146 :_name( name ), _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
147{
148 qDebug( "ONetworkInterface::ONetworkInterface()" );
149 init();
150}
151
152
153ifreqstruct& ONetworkInterface::ifr() const
154{
155 return _ifr;
156}
157
158
159void ONetworkInterface::init()
160{
161 qDebug( "ONetworkInterface::init()" );
162
163 memset( &_ifr, 0, sizeof( struct ifreq ) );
164
165 if ( _sfd == -1 )
166 {
167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", (const char*) _name );
168 return;
169 }
170}
171
172
173bool ONetworkInterface::ioctl( int call, ifreqstruct& ifreq ) const
174{
175 int result = ::ioctl( _sfd, call, &ifreq );
176 if ( result == -1 )
177 qDebug( "ONetworkInterface::ioctl(): Call %d - Status: Failed: %d (%s)", call, result, strerror( errno ) );
178 else
179 qDebug( "ONetworkInterface::ioctl(): Call %d - Status: Ok.", call );
180 return ( result != -1 );
181}
182
183
184bool ONetworkInterface::ioctl( int call ) const
185{
186 strcpy( _ifr.ifr_name, (const char*) _name );
187 return ioctl( call, _ifr );
188}
189
190
191bool ONetworkInterface::isLoopback() const
192{
193 ioctl( SIOCGIFFLAGS );
194 return _ifr.ifr_flags & IFF_LOOPBACK;
195}
196
197
198bool ONetworkInterface::setUp( bool b )
199{
200 ioctl( SIOCGIFFLAGS );
201 if ( b ) _ifr.ifr_flags |= IFF_UP;
202 else _ifr.ifr_flags &= (~IFF_UP);
203 return ioctl( SIOCSIFFLAGS );
204}
205
206
207bool ONetworkInterface::isUp() const
208{
209 ioctl( SIOCGIFFLAGS );
210 return _ifr.ifr_flags & IFF_UP;
211}
212
213
214QString ONetworkInterface::ipV4Address() const
215{
216 if ( ioctl( SIOCGIFADDR ) )
217 {
218 struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr;
219 //FIXME: Use QHostAddress here
220 return QString( inet_ntoa( sa->sin_addr ) );
221 }
222 else
223 return "<unknown>";
224}
225
226
227OMacAddress ONetworkInterface::macAddress() const
228{
229 if ( ioctl( SIOCGIFHWADDR ) )
230 {
231 return OMacAddress( _ifr );
232 }
233 else
234 {
235 return OMacAddress::unknown;
236 }
237}
238
239
240void ONetworkInterface::setMonitoring( OMonitoringInterface* m )
241{
242 _mon = m;
243 qDebug( "ONetwork::setMonitoring(): Installed monitoring interface '%s'", (const char*) m->name() );
244}
245
246
247OMonitoringInterface* ONetworkInterface::monitoring() const
248{
249 return _mon;
250}
251
252
253const QString& ONetworkInterface::name() const
254{
255 return _name;
256}
257
258
259ONetworkInterface::~ONetworkInterface()
260{
261 qDebug( "ONetworkInterface::~ONetworkInterface()" );
262 if ( _sfd != -1 ) ::close( _sfd );
263}
264
265
266bool ONetworkInterface::setPromiscuousMode( bool b )
267{
268 ioctl( SIOCGIFFLAGS );
269 if ( b ) _ifr.ifr_flags |= IFF_PROMISC;
270 else _ifr.ifr_flags &= (~IFF_PROMISC);
271 return ioctl( SIOCSIFFLAGS );
272}
273
274
275bool ONetworkInterface::promiscuousMode() const
276{
277 ioctl( SIOCGIFFLAGS );
278 return _ifr.ifr_flags & IFF_PROMISC;
279}
280
281
282bool ONetworkInterface::isWireless() const
283{
284 return ioctl( SIOCGIWNAME );
285}
286
287
288/*======================================================================================
289 * OChannelHopper
290 *======================================================================================*/
291
292OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface )
293 :QObject( 0, "Mickey's funky hopper" ),
294 _iface( iface ), _interval( 0 ), _channel( 0 ), _tid( 0 )
295{
296}
297
298
299OChannelHopper::~OChannelHopper()
300{
301}
302
303
304void OChannelHopper::timerEvent( QTimerEvent* )
305{
306 //FIXME: Get available channels from OWirelessNetworkInterface
307 if ( --_channel < 0 ) _channel = 13;
308 _iface->setChannel( _channel );
309 qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'",
310 _channel, (const char*) _iface->name() );
311}
312
313
314void OChannelHopper::setInterval( int interval )
315{
316 if ( interval == _interval )
317 return;
318
319 if ( _interval )
320 killTimer( _tid );
321
322 _interval = interval;
323
324 if ( _interval )
325 {
326 _tid = startTimer( interval );
327 }
328}
329
330
331int OChannelHopper::interval() const
332{
333 return _interval;
334}
335
336
337/*======================================================================================
338 * OWirelessNetworkInterface
339 *======================================================================================*/
340
341OWirelessNetworkInterface::OWirelessNetworkInterface( const QString& name )
342 :ONetworkInterface( name ), _hopper( this )
343{
344 qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" );
345 init();
346}
347
348
349OWirelessNetworkInterface::~OWirelessNetworkInterface()
350{
351}
352
353
354iwreqstruct& OWirelessNetworkInterface::iwr() const
355{
356 return _iwr;
357}
358
359
360void OWirelessNetworkInterface::init()
361{
362 qDebug( "OWirelessNetworkInterface::init()" );
363
364 memset( &_iwr, 0, sizeof( struct iwreq ) );
365
366 // IEEE802.11(b) radio frequency channels
367 //FIXME: get these directly from the interface
368 //FIXME: check if these channels are off-by-one
369
370 iwrangestruct range;
371 _iwr.u.data.pointer = (char*) &range;
372 _iwr.u.data.length = sizeof( iwrangestruct );
373 if ( !wioctl( SIOCGIWRANGE ) )
374 {
375 qDebug( "OWirelessNetworkInterface::init(): SIOCGIWRANGE failed (%s)", strerror( errno ) );
376 return;
377 }
378
379 //TODO: Find out what the difference between num_channel and
380 // num_frequency is about.
381
382 for ( int i = 0; i < range.num_frequency; ++i )
383 {
384 int freq = (int) ( double( range.freq[i].m ) * pow( 10, range.freq[i].e ) / 1000000.0 );
385 _channels.insert( freq, i );
386 }
387}
388
389
390QString OWirelessNetworkInterface::associatedAP() const
391{
392 //FIXME: use OMacAddress
393 QString mac;
394
395 if ( ioctl( SIOCGIWAP ) )
396 {
397 mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
398 _ifr.ifr_hwaddr.sa_data[0]&0xff,
399 _ifr.ifr_hwaddr.sa_data[1]&0xff,
400 _ifr.ifr_hwaddr.sa_data[2]&0xff,
401 _ifr.ifr_hwaddr.sa_data[3]&0xff,
402 _ifr.ifr_hwaddr.sa_data[4]&0xff,
403 _ifr.ifr_hwaddr.sa_data[5]&0xff );
404 }
405 else
406 {
407 mac = "<Unknown>";
408 }
409 return mac;
410}
411
412
413int OWirelessNetworkInterface::channel() const
414{
415 if ( !wioctl( SIOCGIWFREQ ) )
416 {
417 return -1;
418 }
419 else
420 {
421 //FIXME: This is off-by-one !? Why?
422 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10, _iwr.u.freq.e ) / 1000000) ];
423 }
424}
425
426
427void OWirelessNetworkInterface::setChannel( int c ) const
428{
429 if ( !_mon )
430 {
431 memset( &_iwr, 0, sizeof( iwreqstruct ) );
432 _iwr.u.freq.m = c;
433 _iwr.u.freq.e = 0;
434 wioctl( SIOCSIWFREQ );
435 }
436 else
437 {
438 _mon->setChannel( c );
439 }
440}
441
442
443double OWirelessNetworkInterface::frequency() const
444{
445 if ( !wioctl( SIOCGIWFREQ ) )
446 {
447 return -1.0;
448 }
449 else
450 {
451 return double( _iwr.u.freq.m ) * pow( 10, _iwr.u.freq.e ) / 1000000000.0;
452 }
453}
454
455
456int OWirelessNetworkInterface::channels() const
457{
458 return _channels.count();
459}
460
461
462void OWirelessNetworkInterface::setChannelHopping( int interval )
463{
464 _hopper.setInterval( interval );
465}
466
467
468int OWirelessNetworkInterface::channelHopping() const
469{
470 return _hopper.interval();
471}
472
473
474void OWirelessNetworkInterface::setMonitorMode( bool b )
475{
476 if ( _mon )
477 _mon->setEnabled( b );
478 else
479 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" );
480}
481
482bool OWirelessNetworkInterface::monitorMode() const
483{
484 return _mon ? _mon->enabled() : false;
485}
486
487
488QString OWirelessNetworkInterface::nickName() const
489{
490 char str[IW_ESSID_MAX_SIZE];
491 _iwr.u.data.pointer = &str[0];
492 _iwr.u.data.length = IW_ESSID_MAX_SIZE;
493 if ( !wioctl( SIOCGIWNICKN ) )
494 {
495 return "<unknown>";
496 }
497 else
498 {
499 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string
500 return str;
501 }
502}
503
504
505QString OWirelessNetworkInterface::SSID() const
506{
507 char str[IW_ESSID_MAX_SIZE];
508 _iwr.u.essid.pointer = &str[0];
509 _iwr.u.essid.length = IW_ESSID_MAX_SIZE;
510 if ( !wioctl( SIOCGIWESSID ) )
511 {
512 return "<unknown>";
513 }
514 else
515 {
516 return str;
517 }
518}
519
520
521void OWirelessNetworkInterface::setSSID( const QString& ssid )
522{
523 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
524 _iwr.u.essid.length = ssid.length();
525 wioctl( SIOCSIWESSID );
526}
527
528
529bool OWirelessNetworkInterface::wioctl( int call, iwreqstruct& iwreq ) const
530{
531 int result = ::ioctl( _sfd, call, &iwreq );
532 if ( result == -1 )
533 qDebug( "ONetworkInterface::wioctl(): Call %d - Status: Failed: %d (%s)", call, result, strerror( errno ) );
534 else
535 qDebug( "ONetworkInterface::wioctl(): Call %d - Status: Ok.", call );
536 return ( result != -1 );
537}
538
539
540bool OWirelessNetworkInterface::wioctl( int call ) const
541{
542 strcpy( _iwr.ifr_name, (const char*) _name );
543 return wioctl( call, _iwr );
544}
545
546
547/*======================================================================================
548 * OMonitoringInterface
549 *======================================================================================*/
550
551OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface )
552 :_enabled( false ), _if( static_cast<OWirelessNetworkInterface*>( iface ) )
553{
554}
555
556
557OMonitoringInterface::~OMonitoringInterface()
558{
559}
560
561
562void OMonitoringInterface::setChannel( int c )
563{
564 // use standard WE channel switching protocol
565 memset( &_if->_iwr, 0, sizeof( iwreqstruct ) );
566 _if->_iwr.u.freq.m = c;
567 _if->_iwr.u.freq.e = 0;
568 _if->wioctl( SIOCSIWFREQ );
569}
570
571
572bool OMonitoringInterface::enabled() const
573{
574 return _enabled;
575}
576
577void OMonitoringInterface::setEnabled( bool b )
578{
579 // open a packet capturer here or leave this to
580 // the client code?
581
582 /*
583
584 if ( b )
585 {
586 OPacketCapturer* opcap = new OPacketCapturer();
587 opcap->open( _if->name() );
588 }
589 */
590
591 _enabled = b;
592
593}
594
595/*======================================================================================
596 * OCiscoMonitoringInterface
597 *======================================================================================*/
598
599OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface )
600 :OMonitoringInterface( iface )
601{
602 iface->setMonitoring( this );
603}
604
605
606OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
607{
608}
609
610
611void OCiscoMonitoringInterface::setEnabled( bool b )
612{
613 QString fname;
614 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() );
615 QFile f( fname );
616 if ( !f.exists() ) return;
617
618 if ( f.open( IO_WriteOnly ) )
619 {
620 QTextStream s( &f );
621 s << "Mode: r";
622 s << "Mode: y";
623 s << "XmitPower: 1";
624
625 OMonitoringInterface::setEnabled( b );
626
627 }
628
629 // flushing and closing will be done automatically when f goes out of scope
630}
631
632
633QString OCiscoMonitoringInterface::name() const
634{
635 return "cisco";
636}
637
638
639void OCiscoMonitoringInterface::setChannel( int )
640{
641 // cisco devices automatically switch channels when in monitor mode
642}
643
644
645/*======================================================================================
646 * OWlanNGMonitoringInterface
647 *======================================================================================*/
648
649
650OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface )
651 :OMonitoringInterface( iface )
652{
653 iface->setMonitoring( this );
654}
655
656
657OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
658{
659}
660
661
662void OWlanNGMonitoringInterface::setEnabled( bool b )
663{
664 //FIXME: do nothing if its already in the same mode
665
666 QString enable = b ? "true" : "false";
667 QString cmd;
668 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable );
669 system( cmd );
670
671 OMonitoringInterface::setEnabled( b );
672}
673
674
675QString OWlanNGMonitoringInterface::name() const
676{
677 return "wlan-ng";
678}
679
680
681void OWlanNGMonitoringInterface::setChannel( int )
682{
683 // wlan-ng devices automatically switch channels when in monitor mode
684}
685
686
687/*======================================================================================
688 * OHostAPMonitoringInterface
689 *======================================================================================*/
690
691OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface )
692 :OMonitoringInterface( iface )
693{
694 iface->setMonitoring( this );
695}
696
697OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
698{
699}
700
701void OHostAPMonitoringInterface::setEnabled( bool b )
702{
703 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
704 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
705
706 #if WIRELESS_EXT > 14
707 _if->_iwr.u.mode = IW_MODE_MONITOR;
708 _if->wioctl( SIOCSIWMODE );
709 #else
710 int* args = (int*) &_if._iwr.u.name;
711 args[0] = 2;
712 args[1] = 0;
713 _if->wioctl( SIOCDEVPRIVATE );
714 #endif
715
716 OMonitoringInterface::setEnabled( b );
717}
718
719
720QString OHostAPMonitoringInterface::name() const
721{
722 return "hostap";
723}
724
725
726/*======================================================================================
727 * OOrinocoNetworkInterface
728 *======================================================================================*/
729
730OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface )
731 :OMonitoringInterface( iface )
732{
733 iface->setMonitoring( this );
734}
735
736
737OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface()
738{
739}
740
741
742void OOrinocoMonitoringInterface::setChannel( int c )
743{
744 // call iwpriv <device> monitor 2 <channel>
745 int* args = (int*) &_if->_iwr.u.name;
746 args[0] = 2;
747 args[1] = c;
748 _if->wioctl( SIOCIWFIRSTPRIV + 0x8 );
749}
750
751
752void OOrinocoMonitoringInterface::setEnabled( bool b )
753{
754 if ( b )
755 {
756 setChannel( 1 );
757 }
758 else
759 {
760 // call iwpriv <device> monitor 0 0
761 int* args = (int*) &_if->_iwr.u.name;
762 args[0] = 0;
763 args[1] = 0;
764 _if->wioctl( SIOCIWFIRSTPRIV + 0x8 );
765 }
766
767 OMonitoringInterface::setEnabled( b );
768}
769
770
771QString OOrinocoMonitoringInterface::name() const
772{
773 return "orinoco";
774}
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
new file mode 100644
index 0000000..9a68a74
--- a/dev/null
+++ b/libopie2/opienet/onetwork.h
@@ -0,0 +1,307 @@
1/*
2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =.
8 .=l.
9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details.
24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA.
31
32*/
33
34#ifndef ONETWORK_H
35#define ONETWORK_H
36
37/* QT */
38
39#include <qdict.h>
40#include <qmap.h>
41#include <qobject.h>
42#include <qhostaddress.h>
43
44/* OPIE */
45
46#include <opie2/onetutils.h>
47
48// ML: Yeah, I hate to include kernel headers, but it's necessary here
49// ML: Recent RedHat and MandrakePatches to the Kernel and WE broke something
50// ML: #include <net/if.h> e.g. conflicts with #include <linux/wireless.h>
51#define IFNAMSIZ 16
52#include <linux/wireless.h>
53#include <net/if.h>
54
55class ONetworkInterface;
56class OWirelessNetworkInterface;
57class OChannelHopper;
58class OMonitoringInterface;
59
60typedef struct ifreq ifreqstruct;
61typedef struct iwreq iwreqstruct;
62typedef struct iw_event iweventstruct;
63typedef struct iw_freq iwfreqstruct;
64typedef struct iw_priv_args iwprivargsstruct;
65typedef struct iw_range iwrangestruct;
66
67/*======================================================================================
68 * ONetwork
69 *======================================================================================*/
70
71class ONetwork : public QObject
72{
73 Q_OBJECT
74
75 public:
76 typedef QDict<ONetworkInterface> InterfaceMap;
77 typedef QDictIterator<ONetworkInterface> InterfaceIterator;
78
79 public:
80 static ONetwork* instance();
81 InterfaceIterator iterator() const;
82 bool isWirelessInterface( const char* ) const;
83 ONetworkInterface* interface( QString ) const;
84
85 protected:
86 ONetwork();
87 void synchronize();
88
89 private:
90 static ONetwork* _instance;
91 InterfaceMap _interfaces;
92};
93
94
95/*======================================================================================
96 * ONetworkInterface
97 *======================================================================================*/
98
99class ONetworkInterface
100{
101 friend class OMonitoringInterface;
102 friend class OCiscoMonitoringInterface;
103 friend class OWlanNGMonitoringInterface;
104 friend class OHostAPMonitoringInterface;
105 friend class OOrinocoMonitoringInterface;
106
107 public:
108 ONetworkInterface( const QString& name );
109 virtual ~ONetworkInterface();
110
111 const QString& name() const;
112 void setMonitoring( OMonitoringInterface* );
113 OMonitoringInterface* monitoring() const;
114 bool setPromiscuousMode( bool );
115 bool promiscuousMode() const;
116 bool setUp( bool );
117 bool isUp() const;
118 bool isLoopback() const;
119 bool isWireless() const;
120 QString ipV4Address() const;
121 OMacAddress macAddress() const;
122
123 protected:
124 const QString _name;
125 const int _sfd;
126 mutable ifreqstruct _ifr;
127 OMonitoringInterface* _mon;
128
129 protected:
130 ifreqstruct& ifr() const;
131 virtual void init();
132 bool ioctl( int call ) const;
133 bool ioctl( int call, ifreqstruct& ) const;
134};
135
136/*======================================================================================
137 * OChannelHopper
138 *======================================================================================*/
139
140class OChannelHopper : public QObject
141{
142 public:
143 OChannelHopper( OWirelessNetworkInterface* );
144 virtual ~OChannelHopper();
145 virtual void timerEvent( QTimerEvent* );
146 void setInterval( int );
147 int interval() const;
148
149 private:
150 OWirelessNetworkInterface* _iface;
151 int _interval;
152 int _channel;
153 int _tid;
154};
155
156
157/*======================================================================================
158 * OWirelessNetworkInterface
159 *======================================================================================*/
160
161class OWirelessNetworkInterface : public ONetworkInterface
162{
163 friend class OMonitoringInterface;
164 friend class OCiscoMonitoringInterface;
165 friend class OWlanNGMonitoringInterface;
166 friend class OHostAPMonitoringInterface;
167 friend class OOrinocoMonitoringInterface;
168
169 public:
170 enum Mode { AdHoc, Managed, Monitor };
171
172 OWirelessNetworkInterface( const QString& name );
173 virtual ~OWirelessNetworkInterface();
174
175 virtual void setChannel( int ) const;
176 virtual int channel() const;
177 virtual double frequency() const;
178 virtual int channels() const;
179 //virtual double frequency(int) const;
180
181 virtual void setMode( Mode ) {};
182 virtual bool mode() const {};
183
184 virtual void setMonitorMode( bool );
185 virtual bool monitorMode() const;
186
187 virtual void setChannelHopping( int interval );
188 virtual int channelHopping() const;
189
190 virtual void setNickName( const QString& ) {};
191 virtual QString nickName() const;
192
193 virtual bool isAssociated() const {};
194 virtual QString associatedAP() const;
195
196 virtual void setSSID( const QString& );
197 virtual QString SSID() const;
198
199 protected:
200 mutable iwreqstruct _iwr;
201 QMap<int,int> _channels;
202
203 protected:
204 virtual void init();
205 iwreqstruct& iwr() const;
206 bool wioctl( int call ) const;
207 bool wioctl( int call, iwreqstruct& ) const;
208
209 private:
210 OChannelHopper _hopper;
211};
212
213
214/*======================================================================================
215 * OMonitoringInterface
216 *======================================================================================*/
217
218
219class OMonitoringInterface
220{
221 public:
222 OMonitoringInterface();
223 OMonitoringInterface( ONetworkInterface* );
224 virtual ~OMonitoringInterface();
225
226 public:
227 virtual void setEnabled( bool );
228 virtual bool enabled() const;
229 virtual void setChannel( int );
230
231 virtual QString name() const = 0;
232
233 protected:
234 bool _enabled;
235 const OWirelessNetworkInterface* _if;
236
237};
238
239
240/*======================================================================================
241 * OCiscoMonitoring
242 *======================================================================================*/
243
244
245class OCiscoMonitoringInterface : public OMonitoringInterface
246{
247 public:
248 OCiscoMonitoringInterface( ONetworkInterface* );
249 virtual ~OCiscoMonitoringInterface();
250
251 virtual void setEnabled( bool );
252 virtual QString name() const;
253 virtual void setChannel( int );
254
255};
256
257/*======================================================================================
258 * OWlanNGMonitoringInterface
259 *======================================================================================*/
260
261class OWlanNGMonitoringInterface : public OMonitoringInterface
262{
263 public:
264 OWlanNGMonitoringInterface( ONetworkInterface* );
265 virtual ~OWlanNGMonitoringInterface();
266
267 public:
268 virtual void setEnabled( bool );
269 virtual QString name() const;
270 virtual void setChannel( int );
271
272};
273
274/*======================================================================================
275 * OHostAPMonitoringInterface
276 *======================================================================================*/
277
278class OHostAPMonitoringInterface : public OMonitoringInterface
279{
280 public:
281 OHostAPMonitoringInterface( ONetworkInterface* );
282 virtual ~OHostAPMonitoringInterface();
283
284 public:
285 virtual void setEnabled( bool );
286 virtual QString name() const;
287 };
288
289/*======================================================================================
290 * OOrinocoMonitoringInterface
291 *======================================================================================*/
292
293class OOrinocoMonitoringInterface : public OMonitoringInterface
294{
295 public:
296 OOrinocoMonitoringInterface( ONetworkInterface* );
297 virtual ~OOrinocoMonitoringInterface();
298
299 public:
300 virtual void setChannel( int );
301 virtual void setEnabled( bool );
302 virtual QString name() const;
303
304};
305
306#endif // ONETWORK_H
307
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
new file mode 100644
index 0000000..48f874f
--- a/dev/null
+++ b/libopie2/opienet/opcap.cpp
@@ -0,0 +1,609 @@
1/*
2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =.
8 .=l.
9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details.
24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA.
31
32*/
33
34/* OPIE */
35
36#include <opie2/opcap.h>
37
38/* QT */
39
40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects)
41#include <qsocketnotifier.h>
42
43/*======================================================================================
44 * OPacket
45 *======================================================================================*/
46
47OPacket::OPacket( packetheaderstruct header, const unsigned char* data, QObject* parent )
48 :QObject( parent, "Generic" ), _hdr( header ), _data( data )
49{
50 qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen );
51
52 if ( packetCapturer()->dataLink() == DLT_EN10MB )
53 {
54 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" );
55 new OEthernetPacket( (const struct ether_header*) data, this );
56 }
57 else
58 {
59 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" );
60 new OWaveLanPacket( (const struct ieee_802_11_header*) data, this );
61 }
62}
63
64
65OPacket::~OPacket()
66{
67}
68
69
70OPacketCapturer* OPacket::packetCapturer() const
71{
72 return parent()->inherits( "OPacketCapturer" ) ? static_cast<OPacketCapturer*>( parent() ) : 0;
73}
74
75
76timevalstruct OPacket::timeval() const
77{
78 return _hdr.ts;
79}
80
81
82int OPacket::caplen() const
83{
84 return _hdr.caplen;
85}
86
87
88void OPacket::dump() const
89{
90 printf( "OPacket::dump()\n" );
91 printf( "----------------\n" );
92
93 for ( int i = 0; i < _hdr.caplen; ++i )
94 {
95 printf( "%02x ", _data[i] );
96 if ( !((i+1) % 32) ) printf( "\n" );
97 }
98 printf( "\n\n" );
99}
100
101
102
103int OPacket::len() const
104{
105 return _hdr.len;
106}
107
108/*======================================================================================
109 * OEthernetPacket
110 *======================================================================================*/
111
112OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* parent )
113 :QObject( parent, "Ethernet" ), _ether( data )
114
115{
116
117 qDebug( "Source = %s", (const char*) sourceAddress().toString() );
118 qDebug( "Destination = %s", (const char*) destinationAddress().toString() );
119
120 if ( sourceAddress() == OMacAddress::broadcast )
121 qDebug( "Source is broadcast address" );
122 if ( destinationAddress() == OMacAddress::broadcast )
123 qDebug( "Destination is broadcast address" );
124
125 switch ( type() )
126 {
127 case ETHERTYPE_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break;
128 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; }
129 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; }
130 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" );
131 }
132
133}
134
135
136OEthernetPacket::~OEthernetPacket()
137{
138}
139
140
141OMacAddress OEthernetPacket::sourceAddress() const
142{
143 return OMacAddress( _ether->ether_shost );
144}
145
146
147OMacAddress OEthernetPacket::destinationAddress() const
148{
149 return OMacAddress( _ether->ether_dhost );
150}
151
152int OEthernetPacket::type() const
153{
154 return ntohs( _ether->ether_type );
155}
156
157
158/*======================================================================================
159 * OIPPacket
160 *======================================================================================*/
161
162
163OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent )
164 :QObject( parent, "IP" ), _iphdr( data )
165
166{
167 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." );
168
169 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) );
170 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) );
171
172 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() );
173 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() );
174
175 switch ( protocol() )
176 {
177 case IPPROTO_UDP: new OUDPPacket( (const struct udphdr*) (data+1), this ); break;
178 case IPPROTO_TCP: new OTCPPacket( (const struct tcphdr*) (data+1), this ); break;
179 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() );
180 }
181
182}
183
184OIPPacket::~OIPPacket()
185{
186}
187
188
189QHostAddress OIPPacket::fromIPAddress() const
190{
191 return EXTRACT_32BITS( &_iphdr->saddr );
192}
193
194
195QHostAddress OIPPacket::toIPAddress() const
196{
197 return EXTRACT_32BITS( &_iphdr->saddr );
198}
199
200
201int OIPPacket::tos() const
202{
203 return _iphdr->tos;
204}
205
206
207int OIPPacket::len() const
208{
209 return EXTRACT_16BITS( &_iphdr->tot_len );
210}
211
212
213int OIPPacket::id() const
214{
215 return EXTRACT_16BITS( &_iphdr->id );
216}
217
218
219int OIPPacket::offset() const
220{
221 return EXTRACT_16BITS( &_iphdr->frag_off );
222}
223
224
225int OIPPacket::ttl() const
226{
227 return _iphdr->ttl;
228}
229
230
231int OIPPacket::protocol() const
232{
233 return _iphdr->protocol;
234}
235
236
237int OIPPacket::checksum() const
238{
239 return EXTRACT_16BITS( &_iphdr->check );
240}
241
242/*======================================================================================
243 * OUDPPacket
244 *======================================================================================*/
245
246
247OUDPPacket::OUDPPacket( const struct udphdr* data, QObject* parent )
248 :QObject( parent, "UDP" ), _udphdr( data )
249
250{
251 qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." );
252}
253
254OUDPPacket::~OUDPPacket()
255{
256}
257
258
259/*======================================================================================
260 * OTCPPacket
261 *======================================================================================*/
262
263
264OTCPPacket::OTCPPacket( const struct tcphdr* data, QObject* parent )
265 :QObject( parent, "TCP" ), _tcphdr( data )
266
267{
268 qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." );
269}
270
271OTCPPacket::~OTCPPacket()
272{
273}
274
275
276/*======================================================================================
277 * OWaveLanPacket
278 *======================================================================================*/
279
280
281OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* parent )
282 :QObject( parent, "802.11" ), _wlanhdr( data )
283
284{
285 qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." );
286 qDebug( "type: %0X", type() );
287 qDebug( "subType: %0X", subType() );
288 qDebug( "duration: %d", duration() );
289 qDebug( "powermanagement: %d", usesPowerManagement() );
290 qDebug( "wep: %d", usesWep() );
291 qDebug( "MAC1: %s", (const char*) macAddress1().toString() );
292 qDebug( "MAC2: %s", (const char*) macAddress2().toString() );
293 qDebug( "MAC3: %s", (const char*) macAddress3().toString() );
294 qDebug( "MAC4: %s", (const char*) macAddress4().toString() );
295
296 switch ( type() )
297 {
298 case T_MGMT: new OWaveLanManagementPacket( (const struct ieee_802_11_mgmt_header*) data, this ); break;
299 case T_DATA: new OWaveLanDataPacket( (const struct ieee_802_11_data_header*) data, this ); break;
300 //case T_CTRL: new OWaveLanControlPacket( (const struct ieee_802_11_ctrl_header*) data, this ); break;
301 default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown type!" );
302 }
303}
304
305OWaveLanPacket::~OWaveLanPacket()
306{
307}
308
309
310int OWaveLanPacket::duration() const
311{
312 return _wlanhdr->duration;
313}
314
315
316OMacAddress OWaveLanPacket::macAddress1() const
317{
318 return OMacAddress( _wlanhdr->mac1 );
319}
320
321
322OMacAddress OWaveLanPacket::macAddress2() const
323{
324 return OMacAddress( _wlanhdr->mac2 );
325}
326
327
328OMacAddress OWaveLanPacket::macAddress3() const
329{
330 return OMacAddress( _wlanhdr->mac3 );
331}
332
333
334OMacAddress OWaveLanPacket::macAddress4() const
335{
336 return OMacAddress( _wlanhdr->mac4 );
337}
338
339
340int OWaveLanPacket::subType() const
341{
342 return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
343}
344
345
346int OWaveLanPacket::type() const
347{
348 return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
349}
350
351
352int OWaveLanPacket::version() const
353{
354 return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
355}
356
357
358bool OWaveLanPacket::fromDS() const
359{
360 return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
361}
362
363
364bool OWaveLanPacket::toDS() const
365{
366 return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
367}
368
369
370bool OWaveLanPacket::usesPowerManagement() const
371{
372 return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
373}
374
375
376bool OWaveLanPacket::usesWep() const
377{
378 return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
379}
380
381
382/*======================================================================================
383 * OWaveLanManagementPacket
384 *======================================================================================*/
385
386OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent )
387 :QObject( parent, "802.11 Management" ), _header( data ),
388 _body( (const struct ieee_802_11_mgmt_body*) (data+1) )
389{
390 qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." );
391
392 switch ( ((OWaveLanPacket*) this->parent() )->subType() )
393 {
394 case ST_BEACON:
395 {
396 qDebug( "TYPE: BEACON FRAME" );
397 qDebug( "ESSID: %s", (const char*) SSID() );
398 break;
399 }
400 }
401}
402
403
404OWaveLanManagementPacket::~OWaveLanManagementPacket()
405{
406}
407
408
409QString OWaveLanManagementPacket::SSID() const
410{
411 int length = _body->ssid.length;
412 if ( length > 32 ) length = 32;
413 char essid[length+1];
414 memcpy( &essid, _body->ssid.ssid, length );
415 essid[length] = 0x0;
416 return essid;
417}
418
419
420/*======================================================================================
421 * OWaveLanDataPacket
422 *======================================================================================*/
423
424OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* data, OWaveLanPacket* parent )
425 :QObject( parent, "802.11 Data" ), _header( data )
426{
427 //qDebug( "size of header = %d", sizeof( struct ieee_802_11_data_header ) );
428 //qDebug( "header: %0x", data );
429 const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header );
430 //qDebug( "payload: %0x", payload );
431
432 if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address
433
434 new OLLCPacket( (const struct ieee_802_11_802_2_header*) payload, this );
435}
436
437
438OWaveLanDataPacket::~OWaveLanDataPacket()
439{
440}
441
442
443/*======================================================================================
444 * OLLCPacket
445 *======================================================================================*/
446
447OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent )
448 :QObject( parent, "802.11 802_2" ), _header( data )
449{
450 qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." );
451
452 if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) )
453 {
454 qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) );
455
456 switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h
457 {
458 case ETH_P_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break;
459 default: qDebug( "OLLCPacket::OLLCPacket(): Unknown Encapsulation Type" );
460 }
461
462 }
463}
464
465
466OLLCPacket::~OLLCPacket()
467{
468}
469
470/*======================================================================================
471 * OPacketCapturer
472 *======================================================================================*/
473
474OPacketCapturer::OPacketCapturer( QObject* parent, const char* name )
475 :QObject( parent, name ), _name( QString::null ), _open( false ),
476 _pch( 0 )
477{
478}
479
480
481OPacketCapturer::~OPacketCapturer()
482{
483 if ( _open )
484 {
485 qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." );
486 close();
487 }
488}
489
490
491void OPacketCapturer::setBlocking( bool b )
492{
493 if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 )
494 {
495 qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." );
496 }
497 else
498 {
499 qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf );
500 }
501}
502
503
504bool OPacketCapturer::blocking() const
505{
506 int b = pcap_getnonblock( _pch, _errbuf );
507 if ( b == -1 )
508 {
509 qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf );
510 return -1;
511 }
512 return !b;
513}
514
515
516void OPacketCapturer::close()
517{
518 if ( _open )
519 {
520 pcap_close( _pch );
521 _open = false;
522 }
523}
524
525
526int OPacketCapturer::dataLink() const
527{
528 return pcap_datalink( _pch );
529}
530
531
532int OPacketCapturer::fileno() const
533{
534 if ( _open )
535 {
536 return pcap_fileno( _pch );
537 }
538 else
539 {
540 return -1;
541 }
542}
543
544
545OPacket* OPacketCapturer::next()
546{
547 packetheaderstruct header;
548 const unsigned char* pdata = pcap_next( _pch, &header );
549 if ( header.len )
550 return new OPacket( header, pdata, this );
551 else
552 return 0;
553}
554
555
556bool OPacketCapturer::open( const QString& name )
557{
558 if ( _open )
559 {
560 if ( name == _name ) // ignore opening an already openend device
561 {
562 return true;
563 }
564 else // close the last opened device
565 {
566 close();
567 }
568 }
569
570 _name = name;
571
572 pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] );
573
574 if ( handle )
575 {
576 qDebug( "OPacketCapturer::open(): libpcap opened successfully." );
577 _pch = handle;
578 _open = true;
579
580 // in case we have a qapp, create a socket notifier
581 if ( qApp )
582 {
583 QSocketNotifier* sn = new QSocketNotifier( fileno(), QSocketNotifier::Read, this );
584 connect( sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
585 }
586
587 return true;
588 }
589 else
590 {
591 qDebug( "OPacketCapturer::open(): can't open libpcap: %s", _errbuf );
592 return false;
593 }
594
595}
596
597
598bool OPacketCapturer::isOpen() const
599{
600 return _open;
601}
602
603
604void OPacketCapturer::readyToReceive()
605{
606 qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(...)'" );
607 emit receivedPacket( next() );
608}
609
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
new file mode 100644
index 0000000..65c550c
--- a/dev/null
+++ b/libopie2/opienet/opcap.h
@@ -0,0 +1,294 @@
1/*
2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =.
8 .=l.
9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details.
24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA.
31
32*/
33
34#ifndef OPCAP_H
35#define OPCAP_H
36
37/* LINUX */
38extern "C" // work around a bpf/pcap conflict in recent headers
39{
40 #include <pcap.h>
41}
42#include <netinet/ether.h>
43#include <netinet/ip.h>
44#include <netinet/udp.h>
45#include <netinet/tcp.h>
46#include <time.h>
47
48/* QT */
49#include <qhostaddress.h>
50#include <qobject.h>
51#include <qstring.h>
52
53/* OPIE */
54#include <opie2/onetutils.h>
55#include "802_11_user.h"
56
57/* TYPEDEFS */
58typedef struct timeval timevalstruct;
59typedef struct pcap_pkthdr packetheaderstruct;
60
61/* FORWARDS */
62class OPacketCapturer;
63
64/*======================================================================================
65 * OPacket - A frame on the wire
66 *======================================================================================*/
67
68class OPacket : public QObject
69{
70 Q_OBJECT
71
72 public:
73 OPacket( packetheaderstruct, const unsigned char*, QObject* parent );
74 virtual ~OPacket();
75
76 timevalstruct timeval() const;
77
78 OPacketCapturer* packetCapturer() const;
79
80 int caplen() const;
81 int len() const;
82 void dump() const;
83
84 private:
85 const packetheaderstruct _hdr; // pcap packet header
86 const unsigned char* _data; // pcap packet data
87};
88
89/*======================================================================================
90 * OEthernetPacket - DLT_EN10MB frame
91 *======================================================================================*/
92
93class OEthernetPacket : public QObject
94{
95 Q_OBJECT
96
97 public:
98 OEthernetPacket( const struct ether_header*, QObject* parent = 0 );
99 virtual ~OEthernetPacket();
100
101 OMacAddress sourceAddress() const;
102 OMacAddress destinationAddress() const;
103 int type() const;
104
105 private:
106 const struct ether_header* _ether;
107};
108
109
110/*======================================================================================
111 * OWaveLanPacket - DLT_IEEE802_11 frame
112 *======================================================================================*/
113
114class OWaveLanPacket : public QObject
115{
116 Q_OBJECT
117
118 public:
119 OWaveLanPacket( const struct ieee_802_11_header*, QObject* parent = 0 );
120 virtual ~OWaveLanPacket();
121
122 int duration() const;
123 bool fromDS() const;
124 bool toDS() const;
125 virtual OMacAddress macAddress1() const;
126 virtual OMacAddress macAddress2() const;
127 virtual OMacAddress macAddress3() const;
128 virtual OMacAddress macAddress4() const;
129 bool usesPowerManagement() const;
130 int type() const;
131 int subType() const;
132 int version() const;
133 bool usesWep() const;
134
135 private:
136 const struct ieee_802_11_header* _wlanhdr;
137};
138
139
140/*======================================================================================
141 * OWaveLanManagementPacket - type: management (T_MGMT)
142 *======================================================================================*/
143
144class OWaveLanManagementPacket : public QObject
145{
146 Q_OBJECT
147
148 public:
149 OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 );
150 virtual ~OWaveLanManagementPacket();
151
152 QString SSID() const;
153
154 private:
155 const struct ieee_802_11_mgmt_header* _header;
156 const struct ieee_802_11_mgmt_body* _body;
157};
158
159
160/*======================================================================================
161 * OWaveLanDataPacket - type: data (T_DATA)
162 *======================================================================================*/
163
164class OWaveLanDataPacket : public QObject
165{
166 Q_OBJECT
167
168 public:
169 OWaveLanDataPacket( const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 );
170 virtual ~OWaveLanDataPacket();
171
172 private:
173 const struct ieee_802_11_data_header* _header;
174};
175
176/*======================================================================================
177 * OLLCPacket - IEEE 802.2 Link Level Control
178 *======================================================================================*/
179
180class OLLCPacket : public QObject
181{
182 Q_OBJECT
183
184 public:
185 OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent = 0 );
186 virtual ~OLLCPacket();
187
188 private:
189 const struct ieee_802_11_802_2_header* _header;
190};
191
192/*======================================================================================
193 * OIPPacket
194 *======================================================================================*/
195
196class OIPPacket : public QObject
197{
198 Q_OBJECT
199
200 public:
201 OIPPacket( const struct iphdr*, QObject* parent = 0 );
202 virtual ~OIPPacket();
203
204 QHostAddress fromIPAddress() const;
205 QHostAddress toIPAddress() const;
206
207 int tos() const;
208 int len() const;
209 int id() const;
210 int offset() const;
211 int ttl() const;
212 int protocol() const;
213 int checksum() const;
214
215 private:
216 const struct iphdr* _iphdr;
217};
218
219/*======================================================================================
220 * OUDPPacket
221 *======================================================================================*/
222
223class OUDPPacket : public QObject
224{
225 Q_OBJECT
226
227 public:
228 OUDPPacket( const struct udphdr*, QObject* parent = 0 );
229 virtual ~OUDPPacket();
230
231 int fromPort() const;
232 int toPort() const;
233
234 private:
235 const struct udphdr* _udphdr;
236};
237
238/*======================================================================================
239 * OTCPPacket
240 *======================================================================================*/
241
242class OTCPPacket : public QObject
243{
244 Q_OBJECT
245
246 public:
247 OTCPPacket( const struct tcphdr*, QObject* parent = 0 );
248 virtual ~OTCPPacket();
249
250 int fromPort() const;
251 int toPort() const;
252
253 private:
254 const struct tcphdr* _tcphdr;
255};
256
257
258/*======================================================================================
259 * OPacketCapturer
260 *======================================================================================*/
261
262class OPacketCapturer : public QObject
263{
264 Q_OBJECT
265
266 public:
267 OPacketCapturer( QObject* parent = 0, const char* name = 0 );
268 ~OPacketCapturer();
269
270 void setBlocking( bool );
271 bool blocking() const;
272
273 void close();
274 int dataLink() const;
275 int fileno() const;
276 OPacket* next();
277 bool open( const QString& name );
278 bool isOpen() const;
279
280 signals:
281 void receivedPacket( OPacket* );
282
283 protected slots:
284 void readyToReceive();
285
286 protected:
287 QString _name; // devicename
288 bool _open; // check this before doing pcap calls
289 pcap_t* _pch; // pcap library handle
290 mutable char _errbuf[PCAP_ERRBUF_SIZE];
291};
292
293#endif // OPCAP_H
294
diff --git a/libopie2/opienet/opienet.pro b/libopie2/opienet/opienet.pro
new file mode 100644
index 0000000..e73afbf
--- a/dev/null
+++ b/libopie2/opienet/opienet.pro
@@ -0,0 +1,18 @@
1TEMPLATE = lib
2CONFIG += qt warn_on debug
3DESTDIR = $(OPIEDIR)/lib
4HEADERS = onetutils.cpp onetwork.h opcap.h
5
6SOURCES = onetutils.cpp onetwork.cpp opcap.cpp
7INTERFACES =
8TARGET = opienet2
9VERSION = 1.8.1
10INCLUDEPATH += $(OPIEDIR)/include
11DEPENDPATH += $(OPIEDIR)/include
12LIBS += -lpcap
13
14MOC_DIR = moc
15OBJECTS_DIR = obj
16
17include ( $(OPIEDIR)/include.pro )
18