-rw-r--r-- | libopie2/opienet/.cvsignore | 6 | ||||
-rw-r--r-- | libopie2/opienet/802_11_user.h | 419 | ||||
-rw-r--r-- | libopie2/opienet/config.in | 7 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.cpp | 101 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.h | 125 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 774 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 307 | ||||
-rw-r--r-- | libopie2/opienet/opcap.cpp | 609 | ||||
-rw-r--r-- | libopie2/opienet/opcap.h | 294 | ||||
-rw-r--r-- | libopie2/opienet/opienet.pro | 18 |
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 @@ | |||
1 | Makefile* | ||
2 | moc* | ||
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 | |||
4 | enum 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 nonAssociated 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 | |||
34 | struct 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 | |||
47 | struct 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 | |||
58 | struct 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 | |||
69 | struct 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 | |||
79 | struct 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 | } | ||
153 | struct 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 | |||
236 | struct 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 | |||
246 | struct 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 | |||
264 | struct ssid_t { | ||
265 | u_int8_telement_id; | ||
266 | u_int8_tlength; | ||
267 | u_char ssid[33]; /* 32 + 1 for null */ | ||
268 | }; | ||
269 | |||
270 | |||
271 | struct rates_t { | ||
272 | u_int8_telement_id; | ||
273 | u_int8_tlength; | ||
274 | u_int8_trate[8]; | ||
275 | }; | ||
276 | |||
277 | |||
278 | struct challenge_t { | ||
279 | u_int8_telement_id; | ||
280 | u_int8_tlength; | ||
281 | u_int8_ttext[254]; /* 1-253 + 1 for null */ | ||
282 | }; | ||
283 | |||
284 | |||
285 | struct 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 | |||
295 | struct ds_t { | ||
296 | u_int8_telement_id; | ||
297 | u_int8_tlength; | ||
298 | u_int8_tchannel; | ||
299 | }; | ||
300 | |||
301 | |||
302 | struct 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 | |||
312 | struct 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 | |||
332 | struct 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 | |||
353 | struct ieee_802_11_data_body { | ||
354 | //FIXME | ||
355 | }; | ||
356 | |||
357 | struct 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 | |||
367 | struct 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 | |||
376 | struct 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 | |||
385 | struct 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 | |||
395 | struct 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 | |||
405 | struct 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> | ||
37 | using namespace std; | ||
38 | |||
39 | /*====================================================================================== | ||
40 | * OMacAddress | ||
41 | *======================================================================================*/ | ||
42 | |||
43 | // static initializer for broadcast and unknown MAC Adresses | ||
44 | const unsigned char __broadcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | ||
45 | const OMacAddress& OMacAddress::broadcast = OMacAddress( __broadcast ); | ||
46 | const unsigned char __unknown[6] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }; | ||
47 | const OMacAddress& OMacAddress::unknown = OMacAddress( __unknown ); | ||
48 | |||
49 | |||
50 | //TODO: Incorporate Ethernet Manufacturer database here! | ||
51 | |||
52 | OMacAddress::OMacAddress( unsigned char* p ) | ||
53 | { | ||
54 | memcpy( _bytes, p, 6 ); // D'OH! memcpy in my sources... eeek... | ||
55 | } | ||
56 | |||
57 | |||
58 | OMacAddress::OMacAddress( const unsigned char* p ) | ||
59 | { | ||
60 | memcpy( _bytes, p, 6 ); | ||
61 | } | ||
62 | |||
63 | |||
64 | OMacAddress::OMacAddress( struct ifreq& ifr ) | ||
65 | { | ||
66 | memcpy( _bytes, ifr.ifr_hwaddr.sa_data, 6 ); | ||
67 | } | ||
68 | |||
69 | |||
70 | OMacAddress::~OMacAddress() | ||
71 | { | ||
72 | } | ||
73 | |||
74 | |||
75 | QString 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 | |||
85 | bool operator==( const OMacAddress &m1, const OMacAddress &m2 ) | ||
86 | { | ||
87 | return memcmp( &m1._bytes, &m2._bytes, 6 ) == 0; | ||
88 | } | ||
89 | |||
90 | void 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 | |||
40 | struct ifreq; | ||
41 | |||
42 | /*====================================================================================== | ||
43 | * OMacAddress | ||
44 | *======================================================================================*/ | ||
45 | |||
46 | class 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 | |||
67 | bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); | ||
68 | |||
69 | |||
70 | /*====================================================================================== | ||
71 | * OHostAddress | ||
72 | *======================================================================================*/ | ||
73 | |||
74 | class OHostAddress : public QHostAddress | ||
75 | { | ||
76 | public: | ||
77 | OHostAddress(); | ||
78 | ~OHostAddress(); | ||
79 | }; | ||
80 | |||
81 | |||
82 | /*====================================================================================== | ||
83 | * Miscellaneous | ||
84 | *======================================================================================*/ | ||
85 | |||
86 | /* dump bytes */ | ||
87 | |||
88 | void 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 | |||
56 | using namespace std; | ||
57 | |||
58 | /*====================================================================================== | ||
59 | * ONetwork | ||
60 | *======================================================================================*/ | ||
61 | |||
62 | ONetwork* ONetwork::_instance = 0; | ||
63 | |||
64 | ONetwork::ONetwork() | ||
65 | { | ||
66 | qDebug( "ONetwork::ONetwork()" ); | ||
67 | synchronize(); | ||
68 | } | ||
69 | |||
70 | void 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 | |||
108 | ONetworkInterface* ONetwork::interface( QString iface ) const | ||
109 | { | ||
110 | return _interfaces[iface]; | ||
111 | } | ||
112 | |||
113 | |||
114 | ONetwork* ONetwork::instance() | ||
115 | { | ||
116 | if ( !_instance ) _instance = new ONetwork(); | ||
117 | return _instance; | ||
118 | } | ||
119 | |||
120 | |||
121 | ONetwork::InterfaceIterator ONetwork::iterator() const | ||
122 | { | ||
123 | return ONetwork::InterfaceIterator( _interfaces ); | ||
124 | } | ||
125 | |||
126 | |||
127 | bool 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 | |||
145 | ONetworkInterface::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 | |||
153 | ifreqstruct& ONetworkInterface::ifr() const | ||
154 | { | ||
155 | return _ifr; | ||
156 | } | ||
157 | |||
158 | |||
159 | void 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 | |||
173 | bool 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 | |||
184 | bool ONetworkInterface::ioctl( int call ) const | ||
185 | { | ||
186 | strcpy( _ifr.ifr_name, (const char*) _name ); | ||
187 | return ioctl( call, _ifr ); | ||
188 | } | ||
189 | |||
190 | |||
191 | bool ONetworkInterface::isLoopback() const | ||
192 | { | ||
193 | ioctl( SIOCGIFFLAGS ); | ||
194 | return _ifr.ifr_flags & IFF_LOOPBACK; | ||
195 | } | ||
196 | |||
197 | |||
198 | bool 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 | |||
207 | bool ONetworkInterface::isUp() const | ||
208 | { | ||
209 | ioctl( SIOCGIFFLAGS ); | ||
210 | return _ifr.ifr_flags & IFF_UP; | ||
211 | } | ||
212 | |||
213 | |||
214 | QString 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 | |||
227 | OMacAddress 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 | |||
240 | void ONetworkInterface::setMonitoring( OMonitoringInterface* m ) | ||
241 | { | ||
242 | _mon = m; | ||
243 | qDebug( "ONetwork::setMonitoring(): Installed monitoring interface '%s'", (const char*) m->name() ); | ||
244 | } | ||
245 | |||
246 | |||
247 | OMonitoringInterface* ONetworkInterface::monitoring() const | ||
248 | { | ||
249 | return _mon; | ||
250 | } | ||
251 | |||
252 | |||
253 | const QString& ONetworkInterface::name() const | ||
254 | { | ||
255 | return _name; | ||
256 | } | ||
257 | |||
258 | |||
259 | ONetworkInterface::~ONetworkInterface() | ||
260 | { | ||
261 | qDebug( "ONetworkInterface::~ONetworkInterface()" ); | ||
262 | if ( _sfd != -1 ) ::close( _sfd ); | ||
263 | } | ||
264 | |||
265 | |||
266 | bool 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 | |||
275 | bool ONetworkInterface::promiscuousMode() const | ||
276 | { | ||
277 | ioctl( SIOCGIFFLAGS ); | ||
278 | return _ifr.ifr_flags & IFF_PROMISC; | ||
279 | } | ||
280 | |||
281 | |||
282 | bool ONetworkInterface::isWireless() const | ||
283 | { | ||
284 | return ioctl( SIOCGIWNAME ); | ||
285 | } | ||
286 | |||
287 | |||
288 | /*====================================================================================== | ||
289 | * OChannelHopper | ||
290 | *======================================================================================*/ | ||
291 | |||
292 | OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface ) | ||
293 | :QObject( 0, "Mickey's funky hopper" ), | ||
294 | _iface( iface ), _interval( 0 ), _channel( 0 ), _tid( 0 ) | ||
295 | { | ||
296 | } | ||
297 | |||
298 | |||
299 | OChannelHopper::~OChannelHopper() | ||
300 | { | ||
301 | } | ||
302 | |||
303 | |||
304 | void 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 | |||
314 | void 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 | |||
331 | int OChannelHopper::interval() const | ||
332 | { | ||
333 | return _interval; | ||
334 | } | ||
335 | |||
336 | |||
337 | /*====================================================================================== | ||
338 | * OWirelessNetworkInterface | ||
339 | *======================================================================================*/ | ||
340 | |||
341 | OWirelessNetworkInterface::OWirelessNetworkInterface( const QString& name ) | ||
342 | :ONetworkInterface( name ), _hopper( this ) | ||
343 | { | ||
344 | qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" ); | ||
345 | init(); | ||
346 | } | ||
347 | |||
348 | |||
349 | OWirelessNetworkInterface::~OWirelessNetworkInterface() | ||
350 | { | ||
351 | } | ||
352 | |||
353 | |||
354 | iwreqstruct& OWirelessNetworkInterface::iwr() const | ||
355 | { | ||
356 | return _iwr; | ||
357 | } | ||
358 | |||
359 | |||
360 | void 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*) ⦥ | ||
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 | |||
390 | QString 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 | |||
413 | int 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 | |||
427 | void 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 | |||
443 | double 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 | |||
456 | int OWirelessNetworkInterface::channels() const | ||
457 | { | ||
458 | return _channels.count(); | ||
459 | } | ||
460 | |||
461 | |||
462 | void OWirelessNetworkInterface::setChannelHopping( int interval ) | ||
463 | { | ||
464 | _hopper.setInterval( interval ); | ||
465 | } | ||
466 | |||
467 | |||
468 | int OWirelessNetworkInterface::channelHopping() const | ||
469 | { | ||
470 | return _hopper.interval(); | ||
471 | } | ||
472 | |||
473 | |||
474 | void 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 | |||
482 | bool OWirelessNetworkInterface::monitorMode() const | ||
483 | { | ||
484 | return _mon ? _mon->enabled() : false; | ||
485 | } | ||
486 | |||
487 | |||
488 | QString 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 | |||
505 | QString 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 | |||
521 | void 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 | |||
529 | bool 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 | |||
540 | bool 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 | |||
551 | OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface ) | ||
552 | :_enabled( false ), _if( static_cast<OWirelessNetworkInterface*>( iface ) ) | ||
553 | { | ||
554 | } | ||
555 | |||
556 | |||
557 | OMonitoringInterface::~OMonitoringInterface() | ||
558 | { | ||
559 | } | ||
560 | |||
561 | |||
562 | void 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 | |||
572 | bool OMonitoringInterface::enabled() const | ||
573 | { | ||
574 | return _enabled; | ||
575 | } | ||
576 | |||
577 | void 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 | |||
599 | OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface ) | ||
600 | :OMonitoringInterface( iface ) | ||
601 | { | ||
602 | iface->setMonitoring( this ); | ||
603 | } | ||
604 | |||
605 | |||
606 | OCiscoMonitoringInterface::~OCiscoMonitoringInterface() | ||
607 | { | ||
608 | } | ||
609 | |||
610 | |||
611 | void 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 | |||
633 | QString OCiscoMonitoringInterface::name() const | ||
634 | { | ||
635 | return "cisco"; | ||
636 | } | ||
637 | |||
638 | |||
639 | void OCiscoMonitoringInterface::setChannel( int ) | ||
640 | { | ||
641 | // cisco devices automatically switch channels when in monitor mode | ||
642 | } | ||
643 | |||
644 | |||
645 | /*====================================================================================== | ||
646 | * OWlanNGMonitoringInterface | ||
647 | *======================================================================================*/ | ||
648 | |||
649 | |||
650 | OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface ) | ||
651 | :OMonitoringInterface( iface ) | ||
652 | { | ||
653 | iface->setMonitoring( this ); | ||
654 | } | ||
655 | |||
656 | |||
657 | OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface() | ||
658 | { | ||
659 | } | ||
660 | |||
661 | |||
662 | void 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 | |||
675 | QString OWlanNGMonitoringInterface::name() const | ||
676 | { | ||
677 | return "wlan-ng"; | ||
678 | } | ||
679 | |||
680 | |||
681 | void OWlanNGMonitoringInterface::setChannel( int ) | ||
682 | { | ||
683 | // wlan-ng devices automatically switch channels when in monitor mode | ||
684 | } | ||
685 | |||
686 | |||
687 | /*====================================================================================== | ||
688 | * OHostAPMonitoringInterface | ||
689 | *======================================================================================*/ | ||
690 | |||
691 | OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) | ||
692 | :OMonitoringInterface( iface ) | ||
693 | { | ||
694 | iface->setMonitoring( this ); | ||
695 | } | ||
696 | |||
697 | OHostAPMonitoringInterface::~OHostAPMonitoringInterface() | ||
698 | { | ||
699 | } | ||
700 | |||
701 | void 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 | |||
720 | QString OHostAPMonitoringInterface::name() const | ||
721 | { | ||
722 | return "hostap"; | ||
723 | } | ||
724 | |||
725 | |||
726 | /*====================================================================================== | ||
727 | * OOrinocoNetworkInterface | ||
728 | *======================================================================================*/ | ||
729 | |||
730 | OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) | ||
731 | :OMonitoringInterface( iface ) | ||
732 | { | ||
733 | iface->setMonitoring( this ); | ||
734 | } | ||
735 | |||
736 | |||
737 | OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() | ||
738 | { | ||
739 | } | ||
740 | |||
741 | |||
742 | void 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 | |||
752 | void 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 | |||
771 | QString 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 | |||
55 | class ONetworkInterface; | ||
56 | class OWirelessNetworkInterface; | ||
57 | class OChannelHopper; | ||
58 | class OMonitoringInterface; | ||
59 | |||
60 | typedef struct ifreq ifreqstruct; | ||
61 | typedef struct iwreq iwreqstruct; | ||
62 | typedef struct iw_event iweventstruct; | ||
63 | typedef struct iw_freq iwfreqstruct; | ||
64 | typedef struct iw_priv_args iwprivargsstruct; | ||
65 | typedef struct iw_range iwrangestruct; | ||
66 | |||
67 | /*====================================================================================== | ||
68 | * ONetwork | ||
69 | *======================================================================================*/ | ||
70 | |||
71 | class 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 | |||
99 | class 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 | |||
140 | class 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 | |||
161 | class 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 | |||
219 | class 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 | |||
245 | class 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 | |||
261 | class 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 | |||
278 | class 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 | |||
293 | class 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 | |||
47 | OPacket::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 | |||
65 | OPacket::~OPacket() | ||
66 | { | ||
67 | } | ||
68 | |||
69 | |||
70 | OPacketCapturer* OPacket::packetCapturer() const | ||
71 | { | ||
72 | return parent()->inherits( "OPacketCapturer" ) ? static_cast<OPacketCapturer*>( parent() ) : 0; | ||
73 | } | ||
74 | |||
75 | |||
76 | timevalstruct OPacket::timeval() const | ||
77 | { | ||
78 | return _hdr.ts; | ||
79 | } | ||
80 | |||
81 | |||
82 | int OPacket::caplen() const | ||
83 | { | ||
84 | return _hdr.caplen; | ||
85 | } | ||
86 | |||
87 | |||
88 | void 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 | |||
103 | int OPacket::len() const | ||
104 | { | ||
105 | return _hdr.len; | ||
106 | } | ||
107 | |||
108 | /*====================================================================================== | ||
109 | * OEthernetPacket | ||
110 | *======================================================================================*/ | ||
111 | |||
112 | OEthernetPacket::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 | |||
136 | OEthernetPacket::~OEthernetPacket() | ||
137 | { | ||
138 | } | ||
139 | |||
140 | |||
141 | OMacAddress OEthernetPacket::sourceAddress() const | ||
142 | { | ||
143 | return OMacAddress( _ether->ether_shost ); | ||
144 | } | ||
145 | |||
146 | |||
147 | OMacAddress OEthernetPacket::destinationAddress() const | ||
148 | { | ||
149 | return OMacAddress( _ether->ether_dhost ); | ||
150 | } | ||
151 | |||
152 | int OEthernetPacket::type() const | ||
153 | { | ||
154 | return ntohs( _ether->ether_type ); | ||
155 | } | ||
156 | |||
157 | |||
158 | /*====================================================================================== | ||
159 | * OIPPacket | ||
160 | *======================================================================================*/ | ||
161 | |||
162 | |||
163 | OIPPacket::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 | |||
184 | OIPPacket::~OIPPacket() | ||
185 | { | ||
186 | } | ||
187 | |||
188 | |||
189 | QHostAddress OIPPacket::fromIPAddress() const | ||
190 | { | ||
191 | return EXTRACT_32BITS( &_iphdr->saddr ); | ||
192 | } | ||
193 | |||
194 | |||
195 | QHostAddress OIPPacket::toIPAddress() const | ||
196 | { | ||
197 | return EXTRACT_32BITS( &_iphdr->saddr ); | ||
198 | } | ||
199 | |||
200 | |||
201 | int OIPPacket::tos() const | ||
202 | { | ||
203 | return _iphdr->tos; | ||
204 | } | ||
205 | |||
206 | |||
207 | int OIPPacket::len() const | ||
208 | { | ||
209 | return EXTRACT_16BITS( &_iphdr->tot_len ); | ||
210 | } | ||
211 | |||
212 | |||
213 | int OIPPacket::id() const | ||
214 | { | ||
215 | return EXTRACT_16BITS( &_iphdr->id ); | ||
216 | } | ||
217 | |||
218 | |||
219 | int OIPPacket::offset() const | ||
220 | { | ||
221 | return EXTRACT_16BITS( &_iphdr->frag_off ); | ||
222 | } | ||
223 | |||
224 | |||
225 | int OIPPacket::ttl() const | ||
226 | { | ||
227 | return _iphdr->ttl; | ||
228 | } | ||
229 | |||
230 | |||
231 | int OIPPacket::protocol() const | ||
232 | { | ||
233 | return _iphdr->protocol; | ||
234 | } | ||
235 | |||
236 | |||
237 | int OIPPacket::checksum() const | ||
238 | { | ||
239 | return EXTRACT_16BITS( &_iphdr->check ); | ||
240 | } | ||
241 | |||
242 | /*====================================================================================== | ||
243 | * OUDPPacket | ||
244 | *======================================================================================*/ | ||
245 | |||
246 | |||
247 | OUDPPacket::OUDPPacket( const struct udphdr* data, QObject* parent ) | ||
248 | :QObject( parent, "UDP" ), _udphdr( data ) | ||
249 | |||
250 | { | ||
251 | qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); | ||
252 | } | ||
253 | |||
254 | OUDPPacket::~OUDPPacket() | ||
255 | { | ||
256 | } | ||
257 | |||
258 | |||
259 | /*====================================================================================== | ||
260 | * OTCPPacket | ||
261 | *======================================================================================*/ | ||
262 | |||
263 | |||
264 | OTCPPacket::OTCPPacket( const struct tcphdr* data, QObject* parent ) | ||
265 | :QObject( parent, "TCP" ), _tcphdr( data ) | ||
266 | |||
267 | { | ||
268 | qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); | ||
269 | } | ||
270 | |||
271 | OTCPPacket::~OTCPPacket() | ||
272 | { | ||
273 | } | ||
274 | |||
275 | |||
276 | /*====================================================================================== | ||
277 | * OWaveLanPacket | ||
278 | *======================================================================================*/ | ||
279 | |||
280 | |||
281 | OWaveLanPacket::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 | |||
305 | OWaveLanPacket::~OWaveLanPacket() | ||
306 | { | ||
307 | } | ||
308 | |||
309 | |||
310 | int OWaveLanPacket::duration() const | ||
311 | { | ||
312 | return _wlanhdr->duration; | ||
313 | } | ||
314 | |||
315 | |||
316 | OMacAddress OWaveLanPacket::macAddress1() const | ||
317 | { | ||
318 | return OMacAddress( _wlanhdr->mac1 ); | ||
319 | } | ||
320 | |||
321 | |||
322 | OMacAddress OWaveLanPacket::macAddress2() const | ||
323 | { | ||
324 | return OMacAddress( _wlanhdr->mac2 ); | ||
325 | } | ||
326 | |||
327 | |||
328 | OMacAddress OWaveLanPacket::macAddress3() const | ||
329 | { | ||
330 | return OMacAddress( _wlanhdr->mac3 ); | ||
331 | } | ||
332 | |||
333 | |||
334 | OMacAddress OWaveLanPacket::macAddress4() const | ||
335 | { | ||
336 | return OMacAddress( _wlanhdr->mac4 ); | ||
337 | } | ||
338 | |||
339 | |||
340 | int OWaveLanPacket::subType() const | ||
341 | { | ||
342 | return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
343 | } | ||
344 | |||
345 | |||
346 | int OWaveLanPacket::type() const | ||
347 | { | ||
348 | return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
349 | } | ||
350 | |||
351 | |||
352 | int OWaveLanPacket::version() const | ||
353 | { | ||
354 | return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
355 | } | ||
356 | |||
357 | |||
358 | bool OWaveLanPacket::fromDS() const | ||
359 | { | ||
360 | return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
361 | } | ||
362 | |||
363 | |||
364 | bool OWaveLanPacket::toDS() const | ||
365 | { | ||
366 | return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
367 | } | ||
368 | |||
369 | |||
370 | bool OWaveLanPacket::usesPowerManagement() const | ||
371 | { | ||
372 | return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
373 | } | ||
374 | |||
375 | |||
376 | bool OWaveLanPacket::usesWep() const | ||
377 | { | ||
378 | return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); | ||
379 | } | ||
380 | |||
381 | |||
382 | /*====================================================================================== | ||
383 | * OWaveLanManagementPacket | ||
384 | *======================================================================================*/ | ||
385 | |||
386 | OWaveLanManagementPacket::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 | |||
404 | OWaveLanManagementPacket::~OWaveLanManagementPacket() | ||
405 | { | ||
406 | } | ||
407 | |||
408 | |||
409 | QString 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 | |||
424 | OWaveLanDataPacket::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 | |||
438 | OWaveLanDataPacket::~OWaveLanDataPacket() | ||
439 | { | ||
440 | } | ||
441 | |||
442 | |||
443 | /*====================================================================================== | ||
444 | * OLLCPacket | ||
445 | *======================================================================================*/ | ||
446 | |||
447 | OLLCPacket::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 | |||
466 | OLLCPacket::~OLLCPacket() | ||
467 | { | ||
468 | } | ||
469 | |||
470 | /*====================================================================================== | ||
471 | * OPacketCapturer | ||
472 | *======================================================================================*/ | ||
473 | |||
474 | OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) | ||
475 | :QObject( parent, name ), _name( QString::null ), _open( false ), | ||
476 | _pch( 0 ) | ||
477 | { | ||
478 | } | ||
479 | |||
480 | |||
481 | OPacketCapturer::~OPacketCapturer() | ||
482 | { | ||
483 | if ( _open ) | ||
484 | { | ||
485 | qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." ); | ||
486 | close(); | ||
487 | } | ||
488 | } | ||
489 | |||
490 | |||
491 | void 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 | |||
504 | bool 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 | |||
516 | void OPacketCapturer::close() | ||
517 | { | ||
518 | if ( _open ) | ||
519 | { | ||
520 | pcap_close( _pch ); | ||
521 | _open = false; | ||
522 | } | ||
523 | } | ||
524 | |||
525 | |||
526 | int OPacketCapturer::dataLink() const | ||
527 | { | ||
528 | return pcap_datalink( _pch ); | ||
529 | } | ||
530 | |||
531 | |||
532 | int OPacketCapturer::fileno() const | ||
533 | { | ||
534 | if ( _open ) | ||
535 | { | ||
536 | return pcap_fileno( _pch ); | ||
537 | } | ||
538 | else | ||
539 | { | ||
540 | return -1; | ||
541 | } | ||
542 | } | ||
543 | |||
544 | |||
545 | OPacket* 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 | |||
556 | bool 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 | |||
598 | bool OPacketCapturer::isOpen() const | ||
599 | { | ||
600 | return _open; | ||
601 | } | ||
602 | |||
603 | |||
604 | void 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 */ | ||
38 | extern "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 */ | ||
58 | typedef struct timeval timevalstruct; | ||
59 | typedef struct pcap_pkthdr packetheaderstruct; | ||
60 | |||
61 | /* FORWARDS */ | ||
62 | class OPacketCapturer; | ||
63 | |||
64 | /*====================================================================================== | ||
65 | * OPacket - A frame on the wire | ||
66 | *======================================================================================*/ | ||
67 | |||
68 | class 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 | |||
93 | class 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 | |||
114 | class 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 | |||
144 | class 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 | |||
164 | class 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 | |||
180 | class 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 | |||
196 | class 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 | |||
223 | class 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 | |||
242 | class 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 | |||
262 | class 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 @@ | |||
1 | TEMPLATE = lib | ||
2 | CONFIG += qt warn_on debug | ||
3 | DESTDIR = $(OPIEDIR)/lib | ||
4 | HEADERS = onetutils.cpp onetwork.h opcap.h | ||
5 | |||
6 | SOURCES = onetutils.cpp onetwork.cpp opcap.cpp | ||
7 | INTERFACES = | ||
8 | TARGET = opienet2 | ||
9 | VERSION = 1.8.1 | ||
10 | INCLUDEPATH += $(OPIEDIR)/include | ||
11 | DEPENDPATH += $(OPIEDIR)/include | ||
12 | LIBS += -lpcap | ||
13 | |||
14 | MOC_DIR = moc | ||
15 | OBJECTS_DIR = obj | ||
16 | |||
17 | include ( $(OPIEDIR)/include.pro ) | ||
18 | |||