summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/802_11_user.h14
-rw-r--r--libopie2/opienet/onetwork.cpp5
-rw-r--r--libopie2/opienet/opcap.cpp31
-rw-r--r--libopie2/opienet/opcap.h19
4 files changed, 67 insertions, 2 deletions
diff --git a/libopie2/opienet/802_11_user.h b/libopie2/opienet/802_11_user.h
index f596bd8..cd98503 100644
--- a/libopie2/opienet/802_11_user.h
+++ b/libopie2/opienet/802_11_user.h
@@ -116,328 +116,342 @@ struct ieee_802_11_802_2_header {
116 #define ieee_802_11_frame_subtype_Data_CFAck 0x1 // Data + CF-Ack 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 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 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) 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) 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) 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) 122 #define ieee_802_11_frame_subtype_CF_AckCF_Poll 0x7 // CF-Ack + CF-Poll (no data)
123 123
124 124
125#define ieee_802_11_frame_subtype_strings {\ 125#define ieee_802_11_frame_subtype_strings {\
126 { ieee_802_11_frame_subtype_Association_Req,0xF,"f Association Request"},\ 126 { ieee_802_11_frame_subtype_Association_Req,0xF,"f Association Request"},\
127 { ieee_802_11_frame_subtype_Association_Resp,0xF,"1 Association Response"},\ 127 { ieee_802_11_frame_subtype_Association_Resp,0xF,"1 Association Response"},\
128 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,"2 Reassociation Request"},\ 128 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,"2 Reassociation Request"},\
129 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,"3 Reassociation Response"},\ 129 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,"3 Reassociation Response"},\
130 { ieee_802_11_frame_subtype_Probe_Req ,0xF,"4 Probe Request"},\ 130 { ieee_802_11_frame_subtype_Probe_Req ,0xF,"4 Probe Request"},\
131 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,"5 Probe Response"},\ 131 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,"5 Probe Response"},\
132 { ieee_802_11_frame_subtype_Beacon ,0xF,"8 Beacon"},\ 132 { ieee_802_11_frame_subtype_Beacon ,0xF,"8 Beacon"},\
133 { ieee_802_11_frame_subtype_ATIM ,0xF,"9 ATIM"},\ 133 { ieee_802_11_frame_subtype_ATIM ,0xF,"9 ATIM"},\
134 { ieee_802_11_frame_subtype_Disassociation,0xF,"A Disassociation"},\ 134 { ieee_802_11_frame_subtype_Disassociation,0xF,"A Disassociation"},\
135 { ieee_802_11_frame_subtype_Authentication,0xF,"B Authentication"},\ 135 { ieee_802_11_frame_subtype_Authentication,0xF,"B Authentication"},\
136 { ieee_802_11_frame_subtype_Deauthentication,0xF,"C Deauthentication"},\ 136 { ieee_802_11_frame_subtype_Deauthentication,0xF,"C Deauthentication"},\
137 { ieee_802_11_frame_subtype_PS_Poll ,0xF,"A PS-Poll"},\ 137 { ieee_802_11_frame_subtype_PS_Poll ,0xF,"A PS-Poll"},\
138 { ieee_802_11_frame_subtype_RTS ,0xF,"B RTS"},\ 138 { ieee_802_11_frame_subtype_RTS ,0xF,"B RTS"},\
139 { ieee_802_11_frame_subtype_CTS ,0xF,"C CTS"},\ 139 { ieee_802_11_frame_subtype_CTS ,0xF,"C CTS"},\
140 { ieee_802_11_frame_subtype_ACK ,0xF,"D ACK"},\ 140 { ieee_802_11_frame_subtype_ACK ,0xF,"D ACK"},\
141 { ieee_802_11_frame_subtype_CFEnd ,0xF,"E CF-End"},\ 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"},\ 142 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,"F CF-End + CF-Ack"},\
143 { ieee_802_11_frame_subtype_Data ,0xF,"0 Data"},\ 143 { ieee_802_11_frame_subtype_Data ,0xF,"0 Data"},\
144 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,"1 Data + CF-Ack"},\ 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"},\ 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"},\ 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)"},\ 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)"},\ 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)"},\ 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)"},\ 150 { ieee_802_11_frame_subtype_CFAck_CFPoll,0xF,"y7 CF-Ack + CF-Poll (no data)"},\
151 { 0,0,NULL}\ 151 { 0,0,NULL}\
152} 152}
153struct ieee_802_11_frame_subtype_class { 153struct ieee_802_11_frame_subtype_class {
154 u_int8_tsubtype; 154 u_int8_tsubtype;
155 u_int8_tmask; 155 u_int8_tmask;
156 u_int8_tklass; 156 u_int8_tklass;
157 u_int8_ttype; 157 u_int8_ttype;
158}; 158};
159#define ieee_802_11_frame_subtype_classes {\ 159#define ieee_802_11_frame_subtype_classes {\
160 { ieee_802_11_frame_subtype_Association_Req,0xF,2,ieee_802_11_frame_type_Management},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 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},\ 184 { ieee_802_11_frame_subtype_CF_AckCF_Poll,0xF,1,ieee_802_11_frame_type_Data},\
185 { 0,0,NULL}\ 185 { 0,0,NULL}\
186} 186}
187 187
188 #define IEEE802_11_FC_LEN2 188 #define IEEE802_11_FC_LEN2
189 189
190#define T_MGMT 0x0 /* management */ 190#define T_MGMT 0x0 /* management */
191#define T_CTRL 0x1 /* control */ 191#define T_CTRL 0x1 /* control */
192#define T_DATA 0x2 /* data */ 192#define T_DATA 0x2 /* data */
193#define T_RESV 0x3 /* reserved */ 193#define T_RESV 0x3 /* reserved */
194 194
195 #define ST_ASSOC_REQUEST 0x0 195 #define ST_ASSOC_REQUEST 0x0
196 #define ST_ASSOC_RESPONSE 0x1 196 #define ST_ASSOC_RESPONSE 0x1
197 #define ST_REASSOC_REQUEST 0x2 197 #define ST_REASSOC_REQUEST 0x2
198 #define ST_REASSOC_RESPONSE 0x3 198 #define ST_REASSOC_RESPONSE 0x3
199 #define ST_PROBE_REQUEST 0x4 199 #define ST_PROBE_REQUEST 0x4
200 #define ST_PROBE_RESPONSE 0x5 200 #define ST_PROBE_RESPONSE 0x5
201 /* RESERVED 0x6 */ 201 /* RESERVED 0x6 */
202 /* RESERVED 0x7 */ 202 /* RESERVED 0x7 */
203 #define ST_BEACON 0x8 203 #define ST_BEACON 0x8
204 #define ST_ATIM 0x9 204 #define ST_ATIM 0x9
205 #define ST_DISASSOC 0xA 205 #define ST_DISASSOC 0xA
206 #define ST_AUTH 0xB 206 #define ST_AUTH 0xB
207 #define ST_DEAUTH 0xC 207 #define ST_DEAUTH 0xC
208 /* RESERVED 0xD */ 208 /* RESERVED 0xD */
209 /* RESERVED 0xE */ 209 /* RESERVED 0xE */
210 /* RESERVED 0xF */ 210 /* RESERVED 0xF */
211 211
212 212
213 #define CTRL_PS_POLL0xA 213 #define CTRL_PS_POLL0xA
214 #define CTRL_RTS0xB 214 #define CTRL_RTS0xB
215 #define CTRL_CTS0xC 215 #define CTRL_CTS0xC
216 #define CTRL_ACK0xD 216 #define CTRL_ACK0xD
217 #define CTRL_CF_END0xE 217 #define CTRL_CF_END0xE
218 #define CTRL_END_ACK0xF 218 #define CTRL_END_ACK0xF
219 219
220/* 220/*
221 * Bits in the frame control field. 221 * Bits in the frame control field.
222 */ 222 */
223 #define FC_VERSION(fc) ((fc) & 0x3) 223 #define FC_VERSION(fc) ((fc) & 0x3)
224 #define FC_TYPE(fc) (((fc) >> 2) & 0x3) 224 #define FC_TYPE(fc) (((fc) >> 2) & 0x3)
225 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 225 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
226 #define FC_TO_DS(fc) ((fc) & 0x0100) 226 #define FC_TO_DS(fc) ((fc) & 0x0100)
227 #define FC_FROM_DS(fc) ((fc) & 0x0200) 227 #define FC_FROM_DS(fc) ((fc) & 0x0200)
228 #define FC_MORE_FLAG(fc)((fc) & 0x0400) 228 #define FC_MORE_FLAG(fc)((fc) & 0x0400)
229 #define FC_RETRY(fc) ((fc) & 0x0800) 229 #define FC_RETRY(fc) ((fc) & 0x0800)
230 #define FC_POWER_MGMT(fc)((fc) & 0x1000) 230 #define FC_POWER_MGMT(fc)((fc) & 0x1000)
231 #define FC_MORE_DATA(fc)((fc) & 0x2000) 231 #define FC_MORE_DATA(fc)((fc) & 0x2000)
232 #define FC_WEP(fc) ((fc) & 0x4000) 232 #define FC_WEP(fc) ((fc) & 0x4000)
233 #define FC_ORDER(fc) ((fc) & 0x8000) 233 #define FC_ORDER(fc) ((fc) & 0x8000)
234 234
235 235
236struct ieee_802_11_mgmt_header { 236struct ieee_802_11_mgmt_header {
237 u_int16_t fc; 237 u_int16_t fc;
238 u_int16_t duration; 238 u_int16_t duration;
239 u_int8_t da[6]; 239 u_int8_t da[6];
240 u_int8_t sa[6]; 240 u_int8_t sa[6];
241 u_int8_t bssid[6]; 241 u_int8_t bssid[6];
242 u_int16_t seq_ctrl; 242 u_int16_t seq_ctrl;
243}; 243};
244 244
245 245
246struct ieee_802_11_data_header { 246struct ieee_802_11_data_header {
247 u_int16_tframe_control; 247 u_int16_tframe_control;
248 u_int16_tduration; 248 u_int16_tduration;
249 u_int8_tmac1[6]; 249 u_int8_tmac1[6];
250 u_int8_tmac2[6]; 250 u_int8_tmac2[6];
251 u_int8_tmac3[6]; 251 u_int8_tmac3[6];
252 u_int16_tSeqCtl; 252 u_int16_tSeqCtl;
253 u_int8_tmac4[6]; 253 u_int8_tmac4[6];
254 // u_int16_tgapLen; 254 // u_int16_tgapLen;
255 // u_int8_tgap[8]; 255 // u_int8_tgap[8];
256}; 256};
257 257
258struct ieee_802_11_control_header { 258struct ieee_802_11_control_header {
259 u_int16_tframe_control; 259 u_int16_tframe_control;
260 u_int16_tduration; 260 u_int16_tduration;
261 u_int8_tmac1[6]; 261 u_int8_tmac1[6];
262 u_int8_tmac2[6]; 262 u_int8_tmac2[6];
263 u_int8_tmac3[6]; 263 u_int8_tmac3[6];
264 u_int16_tSeqCtl; 264 u_int16_tSeqCtl;
265 u_int8_tmac4[6]; 265 u_int8_tmac4[6];
266 // u_int16_tgapLen; 266 // u_int16_tgapLen;
267 // u_int8_tgap[8]; 267 // u_int8_tgap[8];
268}; 268};
269 269
270#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 270#define CAPABILITY_ESS(cap) ((cap) & 0x0001)
271#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 271#define CAPABILITY_IBSS(cap) ((cap) & 0x0002)
272#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 272#define CAPABILITY_CFP(cap) ((cap) & 0x0004)
273#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 273#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008)
274#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 274#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010)
275 275
276struct ssid_t { 276struct ssid_t {
277 u_int8_telement_id; 277 u_int8_telement_id;
278 u_int8_tlength; 278 u_int8_tlength;
279 u_char ssid[33]; /* 32 + 1 for null */ 279 u_char ssid[33]; /* 32 + 1 for null */
280}; 280};
281 281
282 282
283struct rates_t { 283struct rates_t {
284 u_int8_telement_id; 284 u_int8_telement_id;
285 u_int8_tlength; 285 u_int8_tlength;
286 u_int8_trate[8]; 286 u_int8_trate[8];
287}; 287};
288 288
289 289
290struct challenge_t { 290struct challenge_t {
291 u_int8_telement_id; 291 u_int8_telement_id;
292 u_int8_tlength; 292 u_int8_tlength;
293 u_int8_ttext[254]; /* 1-253 + 1 for null */ 293 u_int8_ttext[254]; /* 1-253 + 1 for null */
294}; 294};
295 295
296 296
297struct fh_t { 297struct fh_t {
298 u_int8_telement_id; 298 u_int8_telement_id;
299 u_int8_tlength; 299 u_int8_tlength;
300 u_int16_tdwell_time; 300 u_int16_tdwell_time;
301 u_int8_thop_set; 301 u_int8_thop_set;
302 u_int8_t hop_pattern; 302 u_int8_t hop_pattern;
303 u_int8_thop_index; 303 u_int8_thop_index;
304}; 304};
305 305
306 306
307struct ds_t { 307struct ds_t {
308 u_int8_telement_id; 308 u_int8_telement_id;
309 u_int8_tlength; 309 u_int8_tlength;
310 u_int8_tchannel; 310 u_int8_tchannel;
311}; 311};
312 312
313 313
314struct cf_t { 314struct cf_t {
315 u_int8_telement_id; 315 u_int8_telement_id;
316 u_int8_tlength; 316 u_int8_tlength;
317 u_int8_tcount; 317 u_int8_tcount;
318 u_int8_tperiod; 318 u_int8_tperiod;
319 u_int16_tmax_duration; 319 u_int16_tmax_duration;
320 u_int16_tdur_remaing; 320 u_int16_tdur_remaing;
321}; 321};
322 322
323 323
324struct tim_t { 324struct tim_t {
325 u_int8_telement_id; 325 u_int8_telement_id;
326 u_int8_tlength; 326 u_int8_tlength;
327 u_int8_tcount; 327 u_int8_tcount;
328 u_int8_tperiod; 328 u_int8_tperiod;
329 u_int8_tbitmap_control; 329 u_int8_tbitmap_control;
330 u_int8_tbitmap[251]; 330 u_int8_tbitmap[251];
331}; 331};
332 332
333 333
334struct ibss_t { 334struct ibss_t {
335 u_int8_telement_id; 335 u_int8_telement_id;
336 u_int8_tlength; 336 u_int8_tlength;
337 u_int16_tatim_window; 337 u_int16_tatim_window;
338}; 338};
339 339
340 340
341#define E_SSID 0 341#define E_SSID 0
342#define E_RATES 1 342#define E_RATES 1
343#define E_FH 2 343#define E_FH 2
344#define E_DS 3 344#define E_DS 3
345#define E_CF 4 345#define E_CF 4
346#define E_TIM 5 346#define E_TIM 5
347#define E_IBSS 6 347#define E_IBSS 6
348#define E_CHALLENGE 16 348#define E_CHALLENGE 16
349#define E_CISCO 133 349#define E_CISCO 133
350 350
351 351
352struct ieee_802_11_mgmt_body { 352struct ieee_802_11_mgmt_body {
353 u_int8_t timestamp[8]; 353 u_int8_t timestamp[8];
354 u_int16_t beacon_interval; 354 u_int16_t beacon_interval;
355 // u_int16_t listen_interval; 355 // u_int16_t listen_interval;
356 // u_int16_t status_code; 356 // u_int16_t status_code;
357 // u_int16_t aid; 357 // u_int16_t aid;
358 // u_char ap[6]; 358 // u_char ap[6];
359 // u_int16_treason_code; 359 // u_int16_treason_code;
360 // u_int16_tauth_alg; 360 // u_int16_tauth_alg;
361 // u_int16_tauth_trans_seq_num; 361 // u_int16_tauth_trans_seq_num;
362// struct challenge_t challenge; 362// struct challenge_t challenge;
363 u_int16_t capability_info; 363 u_int16_t capability_info;
364 // struct ssid_tssid; 364 // struct ssid_tssid;
365 // struct rates_t rates; 365 // struct rates_t rates;
366 // struct ds_tds; 366 // struct ds_tds;
367 // struct cf_tcf; 367 // struct cf_tcf;
368 // struct fh_tfh; 368 // struct fh_tfh;
369 // struct tim_ttim; 369 // struct tim_ttim;
370}; 370};
371 371
372/* a 802.11 value */
373struct val_80211 {
374 unsigned int did;
375 unsigned short status, len;
376 unsigned int data;
377};
378
379/* header attached during prism monitor mode */
380struct prism_hdr {
381 unsigned int msgcode, msglen;
382 char devname[16];
383 struct val_80211 hosttime, mactime, channel, rssi, sq, signal,
384 noise, rate, istx, frmlen;
385};
372 386
373struct ieee_802_11_data_body { 387struct ieee_802_11_data_body {
374//FIXME 388//FIXME
375}; 389};
376 390
377struct ieee_802_11_control_body { 391struct ieee_802_11_control_body {
378//FIXME 392//FIXME
379}; 393};
380 394
381struct ctrl_rts_t { 395struct ctrl_rts_t {
382 u_int16_tfc; 396 u_int16_tfc;
383 u_int16_tduration; 397 u_int16_tduration;
384 u_int8_tra[6]; 398 u_int8_tra[6];
385 u_int8_tta[6]; 399 u_int8_tta[6];
386 u_int8_tfcs[4]; 400 u_int8_tfcs[4];
387}; 401};
388 402
389 #define CTRL_RTS_LEN(2+2+6+6+4) 403 #define CTRL_RTS_LEN(2+2+6+6+4)
390 404
391struct ctrl_cts_t { 405struct ctrl_cts_t {
392 u_int16_tfc; 406 u_int16_tfc;
393 u_int16_tduration; 407 u_int16_tduration;
394 u_int8_tra[6]; 408 u_int8_tra[6];
395 u_int8_tfcs[4]; 409 u_int8_tfcs[4];
396}; 410};
397 411
398 #define CTRL_CTS_LEN(2+2+6+4) 412 #define CTRL_CTS_LEN(2+2+6+4)
399 413
400struct ctrl_ack_t { 414struct ctrl_ack_t {
401 u_int16_tfc; 415 u_int16_tfc;
402 u_int16_tduration; 416 u_int16_tduration;
403 u_int8_tra[6]; 417 u_int8_tra[6];
404 u_int8_tfcs[4]; 418 u_int8_tfcs[4];
405}; 419};
406 420
407 #define CTRL_ACK_LEN(2+2+6+4) 421 #define CTRL_ACK_LEN(2+2+6+4)
408 422
409struct ctrl_ps_poll_t { 423struct ctrl_ps_poll_t {
410 u_int16_tfc; 424 u_int16_tfc;
411 u_int16_taid; 425 u_int16_taid;
412 u_int8_tbssid[6]; 426 u_int8_tbssid[6];
413 u_int8_tta[6]; 427 u_int8_tta[6];
414 u_int8_tfcs[4]; 428 u_int8_tfcs[4];
415}; 429};
416 430
417 #define CTRL_PS_POLL_LEN(2+2+6+6+4) 431 #define CTRL_PS_POLL_LEN(2+2+6+6+4)
418 432
419struct ctrl_end_t { 433struct ctrl_end_t {
420 u_int16_tfc; 434 u_int16_tfc;
421 u_int16_tduration; 435 u_int16_tduration;
422 u_int8_tra[6]; 436 u_int8_tra[6];
423 u_int8_tbssid[6]; 437 u_int8_tbssid[6];
424 u_int8_tfcs[4]; 438 u_int8_tfcs[4];
425}; 439};
426 440
427 #define CTRL_END_LEN(2+2+6+6+4) 441 #define CTRL_END_LEN(2+2+6+6+4)
428 442
429struct ctrl_end_ack_t { 443struct ctrl_end_ack_t {
430 u_int16_tfc; 444 u_int16_tfc;
431 u_int16_tduration; 445 u_int16_tduration;
432 u_int8_tra[6]; 446 u_int8_tra[6];
433 u_int8_tbssid[6]; 447 u_int8_tbssid[6];
434 u_int8_tfcs[4]; 448 u_int8_tfcs[4];
435}; 449};
436 450
437 #define CTRL_END_ACK_LEN(2+2+6+6+4) 451 #define CTRL_END_ACK_LEN(2+2+6+6+4)
438 452
439 #define IV_IV(iv)((iv) & 0xFFFFFF) 453 #define IV_IV(iv)((iv) & 0xFFFFFF)
440 #define IV_PAD(iv)(((iv) >> 24) & 0x3F) 454 #define IV_PAD(iv)(((iv) >> 24) & 0x3F)
441 #define IV_KEYID(iv)(((iv) >> 30) & 0x03) 455 #define IV_KEYID(iv)(((iv) >> 30) & 0x03)
442 456
443#endif 457#endif
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index be2736a..95e7043 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -398,559 +398,560 @@ void OChannelHopper::timerEvent( QTimerEvent* )
398void OChannelHopper::setInterval( int interval ) 398void OChannelHopper::setInterval( int interval )
399{ 399{
400 if ( interval == _interval ) 400 if ( interval == _interval )
401 return; 401 return;
402 402
403 if ( _interval ) 403 if ( _interval )
404 killTimer( _tid ); 404 killTimer( _tid );
405 405
406 _tid = 0; 406 _tid = 0;
407 _interval = interval; 407 _interval = interval;
408 408
409 if ( _interval ) 409 if ( _interval )
410 { 410 {
411 _tid = startTimer( interval ); 411 _tid = startTimer( interval );
412 } 412 }
413} 413}
414 414
415 415
416int OChannelHopper::interval() const 416int OChannelHopper::interval() const
417{ 417{
418 return _interval; 418 return _interval;
419} 419}
420 420
421 421
422/*====================================================================================== 422/*======================================================================================
423 * OWirelessNetworkInterface 423 * OWirelessNetworkInterface
424 *======================================================================================*/ 424 *======================================================================================*/
425 425
426OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name ) 426OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name )
427 :ONetworkInterface( parent, name ), _hopper( 0 ) 427 :ONetworkInterface( parent, name ), _hopper( 0 )
428{ 428{
429 qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" ); 429 qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" );
430 init(); 430 init();
431} 431}
432 432
433 433
434OWirelessNetworkInterface::~OWirelessNetworkInterface() 434OWirelessNetworkInterface::~OWirelessNetworkInterface()
435{ 435{
436} 436}
437 437
438 438
439struct iwreq& OWirelessNetworkInterface::iwr() const 439struct iwreq& OWirelessNetworkInterface::iwr() const
440{ 440{
441 return _iwr; 441 return _iwr;
442} 442}
443 443
444 444
445void OWirelessNetworkInterface::init() 445void OWirelessNetworkInterface::init()
446{ 446{
447 qDebug( "OWirelessNetworkInterface::init()" ); 447 qDebug( "OWirelessNetworkInterface::init()" );
448 memset( &_iwr, 0, sizeof( struct iwreq ) ); 448 memset( &_iwr, 0, sizeof( struct iwreq ) );
449 buildChannelList(); 449 buildChannelList();
450 buildPrivateList(); 450 buildPrivateList();
451} 451}
452 452
453 453
454QString OWirelessNetworkInterface::associatedAP() const 454QString OWirelessNetworkInterface::associatedAP() const
455{ 455{
456 //FIXME: use OMacAddress 456 //FIXME: use OMacAddress
457 QString mac; 457 QString mac;
458 458
459 if ( ioctl( SIOCGIWAP ) ) 459 if ( ioctl( SIOCGIWAP ) )
460 { 460 {
461 mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", 461 mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
462 _ifr.ifr_hwaddr.sa_data[0]&0xff, 462 _ifr.ifr_hwaddr.sa_data[0]&0xff,
463 _ifr.ifr_hwaddr.sa_data[1]&0xff, 463 _ifr.ifr_hwaddr.sa_data[1]&0xff,
464 _ifr.ifr_hwaddr.sa_data[2]&0xff, 464 _ifr.ifr_hwaddr.sa_data[2]&0xff,
465 _ifr.ifr_hwaddr.sa_data[3]&0xff, 465 _ifr.ifr_hwaddr.sa_data[3]&0xff,
466 _ifr.ifr_hwaddr.sa_data[4]&0xff, 466 _ifr.ifr_hwaddr.sa_data[4]&0xff,
467 _ifr.ifr_hwaddr.sa_data[5]&0xff ); 467 _ifr.ifr_hwaddr.sa_data[5]&0xff );
468 } 468 }
469 else 469 else
470 { 470 {
471 mac = "<Unknown>"; 471 mac = "<Unknown>";
472 } 472 }
473 return mac; 473 return mac;
474} 474}
475 475
476 476
477void OWirelessNetworkInterface::buildChannelList() 477void OWirelessNetworkInterface::buildChannelList()
478{ 478{
479 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck 479 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
480 //ML: The HostAP drivers need more than sizeof struct_iw range to complete 480 //ML: The HostAP drivers need more than sizeof struct_iw range to complete
481 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length". 481 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
482 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate 482 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
483 //ML: _too much_ space. This is damn shitty crap *sigh* 483 //ML: _too much_ space. This is damn shitty crap *sigh*
484 //ML: We allocate a large memory region in RAM and check whether the 484 //ML: We allocate a large memory region in RAM and check whether the
485 //ML: driver pollutes this extra space. The complaint will be made on stdout, 485 //ML: driver pollutes this extra space. The complaint will be made on stdout,
486 //ML: so please forward this... 486 //ML: so please forward this...
487 487
488 struct iwreq wrq; 488 struct iwreq wrq;
489 int len = sizeof( struct iw_range )*2; 489 int len = sizeof( struct iw_range )*2;
490 char *buffer = (char*) malloc( len ); 490 char *buffer = (char*) malloc( len );
491 //FIXME: Validate if we actually got the memory block 491 //FIXME: Validate if we actually got the memory block
492 memset( buffer, 0, len ); 492 memset( buffer, 0, len );
493 memcpy( wrq.ifr_name, name(), IFNAMSIZ); 493 memcpy( wrq.ifr_name, name(), IFNAMSIZ);
494 wrq.u.data.pointer = (caddr_t) buffer; 494 wrq.u.data.pointer = (caddr_t) buffer;
495 wrq.u.data.length = sizeof( struct iw_range ); 495 wrq.u.data.length = sizeof( struct iw_range );
496 wrq.u.data.flags = 0; 496 wrq.u.data.flags = 0;
497 497
498 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) 498 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 )
499 { 499 {
500 qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) ); 500 qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) );
501 _channels.insert( 2412, 1 ); // 2.412 GHz 501 _channels.insert( 2412, 1 ); // 2.412 GHz
502 _channels.insert( 2417, 2 ); // 2.417 GHz 502 _channels.insert( 2417, 2 ); // 2.417 GHz
503 _channels.insert( 2422, 3 ); // 2.422 GHz 503 _channels.insert( 2422, 3 ); // 2.422 GHz
504 _channels.insert( 2427, 4 ); // 2.427 GHz 504 _channels.insert( 2427, 4 ); // 2.427 GHz
505 _channels.insert( 2432, 5 ); // 2.432 GHz 505 _channels.insert( 2432, 5 ); // 2.432 GHz
506 _channels.insert( 2437, 6 ); // 2.437 GHz 506 _channels.insert( 2437, 6 ); // 2.437 GHz
507 _channels.insert( 2442, 7 ); // 2.442 GHz 507 _channels.insert( 2442, 7 ); // 2.442 GHz
508 _channels.insert( 2447, 8 ); // 2.447 GHz 508 _channels.insert( 2447, 8 ); // 2.447 GHz
509 _channels.insert( 2452, 9 ); // 2.452 GHz 509 _channels.insert( 2452, 9 ); // 2.452 GHz
510 _channels.insert( 2457, 10 ); // 2.457 GHz 510 _channels.insert( 2457, 10 ); // 2.457 GHz
511 _channels.insert( 2462, 11 ); // 2.462 GHz 511 _channels.insert( 2462, 11 ); // 2.462 GHz
512 } 512 }
513 else 513 else
514 { 514 {
515 // <check if the driver overwrites stuff> 515 // <check if the driver overwrites stuff>
516 int max = 0; 516 int max = 0;
517 for ( int r = sizeof( struct iw_range ); r < len; r++ ) 517 for ( int r = sizeof( struct iw_range ); r < len; r++ )
518 if (buffer[r] != 0) 518 if (buffer[r] != 0)
519 max = r; 519 max = r;
520 if (max > 0) 520 if (max > 0)
521 { 521 {
522 qWarning( "OWirelessNetworkInterface::buildChannelList(): Driver for wireless interface '%s'" 522 qWarning( "OWirelessNetworkInterface::buildChannelList(): Driver for wireless interface '%s'"
523 "overwrote buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) ); 523 "overwrote buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) );
524 } 524 }
525 // </check if the driver overwrites stuff> 525 // </check if the driver overwrites stuff>
526 526
527 struct iw_range range; 527 struct iw_range range;
528 memcpy( &range, buffer, sizeof range ); 528 memcpy( &range, buffer, sizeof range );
529 529
530 qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency ); 530 qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency );
531 for ( int i = 0; i < range.num_frequency; ++i ) 531 for ( int i = 0; i < range.num_frequency; ++i )
532 { 532 {
533 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 ); 533 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
534 _channels.insert( freq, i+1 ); 534 _channels.insert( freq, i+1 );
535 } 535 }
536 } 536 }
537 537
538 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." ); 538 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." );
539 free(buffer); 539 free(buffer);
540} 540}
541 541
542 542
543void OWirelessNetworkInterface::buildPrivateList() 543void OWirelessNetworkInterface::buildPrivateList()
544{ 544{
545 qDebug( "OWirelessNetworkInterface::buildPrivateList()" ); 545 qDebug( "OWirelessNetworkInterface::buildPrivateList()" );
546 546
547 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 547 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
548 548
549 _iwr.u.data.pointer = (char*) &priv; 549 _iwr.u.data.pointer = (char*) &priv;
550 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 550 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
551 _iwr.u.data.flags = 0; 551 _iwr.u.data.flags = 0;
552 552
553 if ( !wioctl( SIOCGIWPRIV ) ) 553 if ( !wioctl( SIOCGIWPRIV ) )
554 { 554 {
555 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) ); 555 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) );
556 return; 556 return;
557 } 557 }
558 558
559 for ( int i = 0; i < _iwr.u.data.length; ++i ) 559 for ( int i = 0; i < _iwr.u.data.length; ++i )
560 { 560 {
561 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 561 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
562 } 562 }
563 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." ); 563 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." );
564} 564}
565 565
566 566
567int OWirelessNetworkInterface::channel() const 567int OWirelessNetworkInterface::channel() const
568{ 568{
569 //FIXME: When monitoring enabled, then use it 569 //FIXME: When monitoring enabled, then use it
570 //FIXME: to gather the current RF channel 570 //FIXME: to gather the current RF channel
571 //FIXME: Until then, get active channel from hopper. 571 //FIXME: Until then, get active channel from hopper.
572 if ( _hopper && _hopper->isActive() ) 572 if ( _hopper && _hopper->isActive() )
573 return _hopper->channel(); 573 return _hopper->channel();
574 574
575 if ( !wioctl( SIOCGIWFREQ ) ) 575 if ( !wioctl( SIOCGIWFREQ ) )
576 { 576 {
577 return -1; 577 return -1;
578 } 578 }
579 else 579 else
580 { 580 {
581 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ]; 581 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ];
582 } 582 }
583} 583}
584 584
585 585
586void OWirelessNetworkInterface::setChannel( int c ) const 586void OWirelessNetworkInterface::setChannel( int c ) const
587{ 587{
588 if ( !_mon ) 588 if ( !_mon )
589 { 589 {
590 memset( &_iwr, 0, sizeof( struct iwreq ) ); 590 memset( &_iwr, 0, sizeof( struct iwreq ) );
591 _iwr.u.freq.m = c; 591 _iwr.u.freq.m = c;
592 _iwr.u.freq.e = 0; 592 _iwr.u.freq.e = 0;
593 wioctl( SIOCSIWFREQ ); 593 wioctl( SIOCSIWFREQ );
594 } 594 }
595 else 595 else
596 { 596 {
597 _mon->setChannel( c ); 597 _mon->setChannel( c );
598 } 598 }
599} 599}
600 600
601 601
602double OWirelessNetworkInterface::frequency() const 602double OWirelessNetworkInterface::frequency() const
603{ 603{
604 if ( !wioctl( SIOCGIWFREQ ) ) 604 if ( !wioctl( SIOCGIWFREQ ) )
605 { 605 {
606 return -1.0; 606 return -1.0;
607 } 607 }
608 else 608 else
609 { 609 {
610 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0; 610 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0;
611 } 611 }
612} 612}
613 613
614 614
615int OWirelessNetworkInterface::channels() const 615int OWirelessNetworkInterface::channels() const
616{ 616{
617 return _channels.count(); 617 return _channels.count();
618} 618}
619 619
620 620
621void OWirelessNetworkInterface::setChannelHopping( int interval ) 621void OWirelessNetworkInterface::setChannelHopping( int interval )
622{ 622{
623 if ( !_hopper ) _hopper = new OChannelHopper( this ); 623 if ( !_hopper ) _hopper = new OChannelHopper( this );
624 _hopper->setInterval( interval ); 624 _hopper->setInterval( interval );
625 //FIXME: When and by whom will the channel hopper be deleted? 625 //FIXME: When and by whom will the channel hopper be deleted?
626 //TODO: rely on QObject hierarchy 626 //TODO: rely on QObject hierarchy
627} 627}
628 628
629 629
630int OWirelessNetworkInterface::channelHopping() const 630int OWirelessNetworkInterface::channelHopping() const
631{ 631{
632 return _hopper->interval(); 632 return _hopper->interval();
633} 633}
634 634
635 635
636OChannelHopper* OWirelessNetworkInterface::channelHopper() const 636OChannelHopper* OWirelessNetworkInterface::channelHopper() const
637{ 637{
638 return _hopper; 638 return _hopper;
639} 639}
640 640
641 641
642void OWirelessNetworkInterface::setMonitorMode( bool b ) 642void OWirelessNetworkInterface::setMonitorMode( bool b )
643{ 643{
644 if ( _mon ) 644 if ( _mon )
645 _mon->setEnabled( b ); 645 _mon->setEnabled( b );
646 else 646 else
647 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); 647 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" );
648} 648}
649 649
650 650
651bool OWirelessNetworkInterface::monitorMode() const 651bool OWirelessNetworkInterface::monitorMode() const
652{ 652{
653 qDebug( "dataLinkType = %d", dataLinkType() ); 653 qDebug( "dataLinkType = %d", dataLinkType() );
654 return dataLinkType() == ARPHRD_IEEE80211; 654 return ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 );
655 // 802 is the header type for PRISM - Linux support for this is pending...
655} 656}
656 657
657 658
658QString OWirelessNetworkInterface::nickName() const 659QString OWirelessNetworkInterface::nickName() const
659{ 660{
660 char str[IW_ESSID_MAX_SIZE]; 661 char str[IW_ESSID_MAX_SIZE];
661 _iwr.u.data.pointer = &str[0]; 662 _iwr.u.data.pointer = &str[0];
662 _iwr.u.data.length = IW_ESSID_MAX_SIZE; 663 _iwr.u.data.length = IW_ESSID_MAX_SIZE;
663 if ( !wioctl( SIOCGIWNICKN ) ) 664 if ( !wioctl( SIOCGIWNICKN ) )
664 { 665 {
665 return "<unknown>"; 666 return "<unknown>";
666 } 667 }
667 else 668 else
668 { 669 {
669 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string 670 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string
670 return str; 671 return str;
671 } 672 }
672} 673}
673 674
674 675
675void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... ) 676void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... )
676{ 677{
677 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) ); 678 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) );
678 if ( !priv ) 679 if ( !priv )
679 { 680 {
680 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call ); 681 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call );
681 return; 682 return;
682 } 683 }
683 if ( priv->numberSetArgs() != numargs ) 684 if ( priv->numberSetArgs() != numargs )
684 { 685 {
685 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs ); 686 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs );
686 return; 687 return;
687 } 688 }
688 689
689 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() ); 690 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() );
690 memset( &_iwr, 0, sizeof _iwr ); 691 memset( &_iwr, 0, sizeof _iwr );
691 va_list argp; 692 va_list argp;
692 va_start( argp, numargs ); 693 va_start( argp, numargs );
693 for ( int i = 0; i < numargs; ++i ) 694 for ( int i = 0; i < numargs; ++i )
694 { 695 {
695 priv->setParameter( i, va_arg( argp, int ) ); 696 priv->setParameter( i, va_arg( argp, int ) );
696 } 697 }
697 va_end( argp ); 698 va_end( argp );
698 priv->invoke(); 699 priv->invoke();
699} 700}
700 701
701 702
702void OWirelessNetworkInterface::getPrivate( const QString& call ) 703void OWirelessNetworkInterface::getPrivate( const QString& call )
703{ 704{
704 qWarning( "OWirelessNetworkInterface::getPrivate() is not implemented yet." ); 705 qWarning( "OWirelessNetworkInterface::getPrivate() is not implemented yet." );
705} 706}
706 707
707 708
708bool OWirelessNetworkInterface::hasPrivate( const QString& call ) 709bool OWirelessNetworkInterface::hasPrivate( const QString& call )
709{ 710{
710 return child( (const char*) call ); 711 return child( (const char*) call );
711} 712}
712 713
713 714
714QString OWirelessNetworkInterface::SSID() const 715QString OWirelessNetworkInterface::SSID() const
715{ 716{
716 char str[IW_ESSID_MAX_SIZE]; 717 char str[IW_ESSID_MAX_SIZE];
717 _iwr.u.essid.pointer = &str[0]; 718 _iwr.u.essid.pointer = &str[0];
718 _iwr.u.essid.length = IW_ESSID_MAX_SIZE; 719 _iwr.u.essid.length = IW_ESSID_MAX_SIZE;
719 if ( !wioctl( SIOCGIWESSID ) ) 720 if ( !wioctl( SIOCGIWESSID ) )
720 { 721 {
721 return "<unknown>"; 722 return "<unknown>";
722 } 723 }
723 else 724 else
724 { 725 {
725 return str; 726 return str;
726 } 727 }
727} 728}
728 729
729 730
730void OWirelessNetworkInterface::setSSID( const QString& ssid ) 731void OWirelessNetworkInterface::setSSID( const QString& ssid )
731{ 732{
732 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid ); 733 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
733 _iwr.u.essid.length = ssid.length(); 734 _iwr.u.essid.length = ssid.length();
734 wioctl( SIOCSIWESSID ); 735 wioctl( SIOCSIWESSID );
735} 736}
736 737
737 738
738bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 739bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
739{ 740{
740 int result = ::ioctl( _sfd, call, &iwreq ); 741 int result = ::ioctl( _sfd, call, &iwreq );
741 if ( result == -1 ) 742 if ( result == -1 )
742 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) ); 743 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) );
743 else 744 else
744 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call ); 745 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call );
745 return ( result != -1 ); 746 return ( result != -1 );
746} 747}
747 748
748 749
749bool OWirelessNetworkInterface::wioctl( int call ) const 750bool OWirelessNetworkInterface::wioctl( int call ) const
750{ 751{
751 strcpy( _iwr.ifr_name, name() ); 752 strcpy( _iwr.ifr_name, name() );
752 return wioctl( call, _iwr ); 753 return wioctl( call, _iwr );
753} 754}
754 755
755 756
756/*====================================================================================== 757/*======================================================================================
757 * OMonitoringInterface 758 * OMonitoringInterface
758 *======================================================================================*/ 759 *======================================================================================*/
759 760
760OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface ) 761OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface )
761 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ) 762 :_if( static_cast<OWirelessNetworkInterface*>( iface ) )
762{ 763{
763} 764}
764 765
765 766
766OMonitoringInterface::~OMonitoringInterface() 767OMonitoringInterface::~OMonitoringInterface()
767{ 768{
768} 769}
769 770
770 771
771void OMonitoringInterface::setChannel( int c ) 772void OMonitoringInterface::setChannel( int c )
772{ 773{
773 // use standard WE channel switching protocol 774 // use standard WE channel switching protocol
774 memset( &_if->_iwr, 0, sizeof( struct iwreq ) ); 775 memset( &_if->_iwr, 0, sizeof( struct iwreq ) );
775 _if->_iwr.u.freq.m = c; 776 _if->_iwr.u.freq.m = c;
776 _if->_iwr.u.freq.e = 0; 777 _if->_iwr.u.freq.e = 0;
777 _if->wioctl( SIOCSIWFREQ ); 778 _if->wioctl( SIOCSIWFREQ );
778} 779}
779 780
780 781
781bool OMonitoringInterface::enabled() const 782bool OMonitoringInterface::enabled() const
782{ 783{
783 return _if->monitorMode(); 784 return _if->monitorMode();
784} 785}
785 786
786 787
787void OMonitoringInterface::setEnabled( bool b ) 788void OMonitoringInterface::setEnabled( bool b )
788{ 789{
789} 790}
790 791
791 792
792/*====================================================================================== 793/*======================================================================================
793 * OCiscoMonitoringInterface 794 * OCiscoMonitoringInterface
794 *======================================================================================*/ 795 *======================================================================================*/
795 796
796OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface ) 797OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface )
797 :OMonitoringInterface( iface ) 798 :OMonitoringInterface( iface )
798{ 799{
799 iface->setMonitoring( this ); 800 iface->setMonitoring( this );
800} 801}
801 802
802 803
803OCiscoMonitoringInterface::~OCiscoMonitoringInterface() 804OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
804{ 805{
805} 806}
806 807
807 808
808void OCiscoMonitoringInterface::setEnabled( bool b ) 809void OCiscoMonitoringInterface::setEnabled( bool b )
809{ 810{
810 QString fname; 811 QString fname;
811 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() ); 812 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() );
812 QFile f( fname ); 813 QFile f( fname );
813 if ( !f.exists() ) return; 814 if ( !f.exists() ) return;
814 815
815 if ( f.open( IO_WriteOnly ) ) 816 if ( f.open( IO_WriteOnly ) )
816 { 817 {
817 QTextStream s( &f ); 818 QTextStream s( &f );
818 s << "Mode: r"; 819 s << "Mode: r";
819 s << "Mode: y"; 820 s << "Mode: y";
820 s << "XmitPower: 1"; 821 s << "XmitPower: 1";
821 } 822 }
822 823
823 // flushing and closing will be done automatically when f goes out of scope 824 // flushing and closing will be done automatically when f goes out of scope
824} 825}
825 826
826 827
827QString OCiscoMonitoringInterface::name() const 828QString OCiscoMonitoringInterface::name() const
828{ 829{
829 return "cisco"; 830 return "cisco";
830} 831}
831 832
832 833
833void OCiscoMonitoringInterface::setChannel( int ) 834void OCiscoMonitoringInterface::setChannel( int )
834{ 835{
835 // cisco devices automatically switch channels when in monitor mode 836 // cisco devices automatically switch channels when in monitor mode
836} 837}
837 838
838 839
839/*====================================================================================== 840/*======================================================================================
840 * OWlanNGMonitoringInterface 841 * OWlanNGMonitoringInterface
841 *======================================================================================*/ 842 *======================================================================================*/
842 843
843 844
844OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface ) 845OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface )
845 :OMonitoringInterface( iface ) 846 :OMonitoringInterface( iface )
846{ 847{
847 iface->setMonitoring( this ); 848 iface->setMonitoring( this );
848} 849}
849 850
850 851
851OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface() 852OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
852{ 853{
853} 854}
854 855
855 856
856void OWlanNGMonitoringInterface::setEnabled( bool b ) 857void OWlanNGMonitoringInterface::setEnabled( bool b )
857{ 858{
858 //FIXME: do nothing if its already in the same mode 859 //FIXME: do nothing if its already in the same mode
859 860
860 QString enable = b ? "true" : "false"; 861 QString enable = b ? "true" : "false";
861 QString cmd; 862 QString cmd;
862 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable ); 863 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable );
863 system( cmd ); 864 system( cmd );
864} 865}
865 866
866 867
867QString OWlanNGMonitoringInterface::name() const 868QString OWlanNGMonitoringInterface::name() const
868{ 869{
869 return "wlan-ng"; 870 return "wlan-ng";
870} 871}
871 872
872 873
873void OWlanNGMonitoringInterface::setChannel( int ) 874void OWlanNGMonitoringInterface::setChannel( int )
874{ 875{
875 // wlan-ng devices automatically switch channels when in monitor mode 876 // wlan-ng devices automatically switch channels when in monitor mode
876} 877}
877 878
878 879
879/*====================================================================================== 880/*======================================================================================
880 * OHostAPMonitoringInterface 881 * OHostAPMonitoringInterface
881 *======================================================================================*/ 882 *======================================================================================*/
882 883
883OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) 884OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface )
884 :OMonitoringInterface( iface ) 885 :OMonitoringInterface( iface )
885{ 886{
886 iface->setMonitoring( this ); 887 iface->setMonitoring( this );
887} 888}
888 889
889OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 890OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
890{ 891{
891} 892}
892 893
893void OHostAPMonitoringInterface::setEnabled( bool b ) 894void OHostAPMonitoringInterface::setEnabled( bool b )
894{ 895{
895 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 896 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
896 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring 897 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
897 898
898 //TODO: check wireless extensions version on runtime and use 899 //TODO: check wireless extensions version on runtime and use
899 //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15 900 //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15
900 901
901 if ( b ) 902 if ( b )
902 { 903 {
903 _if->setPrivate( "monitor", 1, 2 ); 904 _if->setPrivate( "monitor", 1, 2 );
904 } 905 }
905 else 906 else
906 { 907 {
907 _if->setPrivate( "monitor", 1, 0 ); 908 _if->setPrivate( "monitor", 1, 0 );
908 } 909 }
909} 910}
910 911
911 912
912QString OHostAPMonitoringInterface::name() const 913QString OHostAPMonitoringInterface::name() const
913{ 914{
914 return "hostap"; 915 return "hostap";
915} 916}
916 917
917 918
918/*====================================================================================== 919/*======================================================================================
919 * OOrinocoNetworkInterface 920 * OOrinocoNetworkInterface
920 *======================================================================================*/ 921 *======================================================================================*/
921 922
922OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) 923OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface )
923 :OMonitoringInterface( iface ) 924 :OMonitoringInterface( iface )
924{ 925{
925 iface->setMonitoring( this ); 926 iface->setMonitoring( this );
926} 927}
927 928
928 929
929OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() 930OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface()
930{ 931{
931} 932}
932 933
933 934
934void OOrinocoMonitoringInterface::setChannel( int c ) 935void OOrinocoMonitoringInterface::setChannel( int c )
935{ 936{
936 _if->setPrivate( "monitor", 2, 2, c ); 937 _if->setPrivate( "monitor", 2, 1, c );
937} 938}
938 939
939 940
940void OOrinocoMonitoringInterface::setEnabled( bool b ) 941void OOrinocoMonitoringInterface::setEnabled( bool b )
941{ 942{
942 if ( b ) 943 if ( b )
943 { 944 {
944 setChannel( 1 ); 945 setChannel( 1 );
945 } 946 }
946 else 947 else
947 { 948 {
948 _if->setPrivate( "monitor", 2, 0, 0 ); 949 _if->setPrivate( "monitor", 2, 0, 0 );
949 } 950 }
950} 951}
951 952
952 953
953QString OOrinocoMonitoringInterface::name() const 954QString OOrinocoMonitoringInterface::name() const
954{ 955{
955 return "orinoco"; 956 return "orinoco";
956} 957}
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index e362883..675818e 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -1,574 +1,605 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34/* OPIE */ 34/* OPIE */
35 35
36#include <opie2/opcap.h> 36#include <opie2/opcap.h>
37 37
38/* QT */ 38/* QT */
39 39
40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) 40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects)
41#include <qsocketnotifier.h> 41#include <qsocketnotifier.h>
42#include <qobjectlist.h> 42#include <qobjectlist.h>
43 43
44/*====================================================================================== 44/*======================================================================================
45 * OPacket 45 * OPacket
46 *======================================================================================*/ 46 *======================================================================================*/
47 47
48OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) 48OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent )
49 :QObject( parent, "Generic" ), _hdr( header ), _data( data ) 49 :QObject( parent, "Generic" ), _hdr( header ), _data( data )
50{ 50{
51 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); 51 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen );
52 52
53 _end = (unsigned char*) data + header.len; 53 _end = (unsigned char*) data + header.len;
54 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); 54 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end );
55 55
56 switch ( datalink ) 56 switch ( datalink )
57 { 57 {
58 case DLT_EN10MB: 58 case DLT_EN10MB:
59 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); 59 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" );
60 new OEthernetPacket( _end, (const struct ether_header*) data, this ); 60 new OEthernetPacket( _end, (const struct ether_header*) data, this );
61 break; 61 break;
62 62
63 case DLT_IEEE802_11: 63 case DLT_IEEE802_11:
64 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); 64 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" );
65 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); 65 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this );
66 break; 66 break;
67 67
68 case DLT_PRISM_HEADER:
69 qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" );
70 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this );
71 break;
72
68 default: 73 default:
69 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink '%s'!", datalink ); 74 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink '%s'!", datalink );
70 } 75 }
71} 76}
72 77
73 78
74OPacket::~OPacket() 79OPacket::~OPacket()
75{ 80{
76} 81}
77 82
78 83
79timevalstruct OPacket::timeval() const 84timevalstruct OPacket::timeval() const
80{ 85{
81 return _hdr.ts; 86 return _hdr.ts;
82} 87}
83 88
84 89
85int OPacket::caplen() const 90int OPacket::caplen() const
86{ 91{
87 return _hdr.caplen; 92 return _hdr.caplen;
88} 93}
89 94
90 95
91void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) 96void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l )
92{ 97{
93 if (!l) return; 98 if (!l) return;
94 QObject* o = l->first(); 99 QObject* o = l->first();
95 while ( o ) 100 while ( o )
96 { 101 {
97 stats[o->name()]++; 102 stats[o->name()]++;
98 updateStats( stats, const_cast<QObjectList*>( o->children() ) ); 103 updateStats( stats, const_cast<QObjectList*>( o->children() ) );
99 o = l->next(); 104 o = l->next();
100 } 105 }
101} 106}
102 107
103 108
104QString OPacket::dump( int bpl ) const 109QString OPacket::dump( int bpl ) const
105{ 110{
106 static int index = 0; 111 static int index = 0;
107 index++; 112 index++;
108 int len = _hdr.caplen; 113 int len = _hdr.caplen;
109 QString str; 114 QString str;
110 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); 115 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len );
111 str.append( "0000: " ); 116 str.append( "0000: " );
112 QString tmp; 117 QString tmp;
113 QString bytes; 118 QString bytes;
114 QString chars; 119 QString chars;
115 120
116 for ( int i = 0; i < len; ++i ) 121 for ( int i = 0; i < len; ++i )
117 { 122 {
118 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); 123 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp );
119 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); 124 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] );
120 else chars.append( '.' ); 125 else chars.append( '.' );
121 126
122 if ( !((i+1) % bpl) ) 127 if ( !((i+1) % bpl) )
123 { 128 {
124 str.append( bytes ); 129 str.append( bytes );
125 str.append( ' ' ); 130 str.append( ' ' );
126 str.append( chars ); 131 str.append( chars );
127 str.append( '\n' ); 132 str.append( '\n' );
128 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); 133 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp );
129 bytes = ""; 134 bytes = "";
130 chars = ""; 135 chars = "";
131 } 136 }
132 137
133 } 138 }
134 if ( (len % bpl) ) 139 if ( (len % bpl) )
135 { 140 {
136 str.append( bytes.leftJustify( 1 + 3*bpl ) ); 141 str.append( bytes.leftJustify( 1 + 3*bpl ) );
137 str.append( chars ); 142 str.append( chars );
138 } 143 }
139 str.append( '\n' ); 144 str.append( '\n' );
140 return str; 145 return str;
141} 146}
142 147
143 148
144int OPacket::len() const 149int OPacket::len() const
145{ 150{
146 return _hdr.len; 151 return _hdr.len;
147} 152}
148 153
149 154
150/*====================================================================================== 155/*======================================================================================
151 * OEthernetPacket 156 * OEthernetPacket
152 *======================================================================================*/ 157 *======================================================================================*/
153 158
154OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) 159OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent )
155 :QObject( parent, "Ethernet" ), _ether( data ) 160 :QObject( parent, "Ethernet" ), _ether( data )
156 161
157{ 162{
158 163
159 qDebug( "Source = %s", (const char*) sourceAddress().toString() ); 164 qDebug( "Source = %s", (const char*) sourceAddress().toString() );
160 qDebug( "Destination = %s", (const char*) destinationAddress().toString() ); 165 qDebug( "Destination = %s", (const char*) destinationAddress().toString() );
161 166
162 if ( sourceAddress() == OMacAddress::broadcast ) 167 if ( sourceAddress() == OMacAddress::broadcast )
163 qDebug( "Source is broadcast address" ); 168 qDebug( "Source is broadcast address" );
164 if ( destinationAddress() == OMacAddress::broadcast ) 169 if ( destinationAddress() == OMacAddress::broadcast )
165 qDebug( "Destination is broadcast address" ); 170 qDebug( "Destination is broadcast address" );
166 171
167 switch ( type() ) 172 switch ( type() )
168 { 173 {
169 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; 174 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break;
170 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } 175 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; }
171 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } 176 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; }
172 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); 177 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" );
173 } 178 }
174 179
175} 180}
176 181
177 182
178OEthernetPacket::~OEthernetPacket() 183OEthernetPacket::~OEthernetPacket()
179{ 184{
180} 185}
181 186
182 187
183OMacAddress OEthernetPacket::sourceAddress() const 188OMacAddress OEthernetPacket::sourceAddress() const
184{ 189{
185 return OMacAddress( _ether->ether_shost ); 190 return OMacAddress( _ether->ether_shost );
186} 191}
187 192
188 193
189OMacAddress OEthernetPacket::destinationAddress() const 194OMacAddress OEthernetPacket::destinationAddress() const
190{ 195{
191 return OMacAddress( _ether->ether_dhost ); 196 return OMacAddress( _ether->ether_dhost );
192} 197}
193 198
194int OEthernetPacket::type() const 199int OEthernetPacket::type() const
195{ 200{
196 return ntohs( _ether->ether_type ); 201 return ntohs( _ether->ether_type );
197} 202}
198 203
199 204
200/*====================================================================================== 205/*======================================================================================
201 * OIPPacket 206 * OIPPacket
202 *======================================================================================*/ 207 *======================================================================================*/
203 208
204 209
205OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) 210OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent )
206 :QObject( parent, "IP" ), _iphdr( data ) 211 :QObject( parent, "IP" ), _iphdr( data )
207 212
208{ 213{
209 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); 214 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." );
210 215
211 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) ); 216 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) );
212 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) ); 217 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) );
213 218
214 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() ); 219 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() );
215 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); 220 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() );
216 221
217 switch ( protocol() ) 222 switch ( protocol() )
218 { 223 {
219 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; 224 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break;
220 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; 225 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break;
221 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); 226 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() );
222 } 227 }
223 228
224} 229}
225 230
226OIPPacket::~OIPPacket() 231OIPPacket::~OIPPacket()
227{ 232{
228} 233}
229 234
230 235
231QHostAddress OIPPacket::fromIPAddress() const 236QHostAddress OIPPacket::fromIPAddress() const
232{ 237{
233 return EXTRACT_32BITS( &_iphdr->saddr ); 238 return EXTRACT_32BITS( &_iphdr->saddr );
234} 239}
235 240
236 241
237QHostAddress OIPPacket::toIPAddress() const 242QHostAddress OIPPacket::toIPAddress() const
238{ 243{
239 return EXTRACT_32BITS( &_iphdr->saddr ); 244 return EXTRACT_32BITS( &_iphdr->saddr );
240} 245}
241 246
242 247
243int OIPPacket::tos() const 248int OIPPacket::tos() const
244{ 249{
245 return _iphdr->tos; 250 return _iphdr->tos;
246} 251}
247 252
248 253
249int OIPPacket::len() const 254int OIPPacket::len() const
250{ 255{
251 return EXTRACT_16BITS( &_iphdr->tot_len ); 256 return EXTRACT_16BITS( &_iphdr->tot_len );
252} 257}
253 258
254 259
255int OIPPacket::id() const 260int OIPPacket::id() const
256{ 261{
257 return EXTRACT_16BITS( &_iphdr->id ); 262 return EXTRACT_16BITS( &_iphdr->id );
258} 263}
259 264
260 265
261int OIPPacket::offset() const 266int OIPPacket::offset() const
262{ 267{
263 return EXTRACT_16BITS( &_iphdr->frag_off ); 268 return EXTRACT_16BITS( &_iphdr->frag_off );
264} 269}
265 270
266 271
267int OIPPacket::ttl() const 272int OIPPacket::ttl() const
268{ 273{
269 return _iphdr->ttl; 274 return _iphdr->ttl;
270} 275}
271 276
272 277
273int OIPPacket::protocol() const 278int OIPPacket::protocol() const
274{ 279{
275 return _iphdr->protocol; 280 return _iphdr->protocol;
276} 281}
277 282
278 283
279int OIPPacket::checksum() const 284int OIPPacket::checksum() const
280{ 285{
281 return EXTRACT_16BITS( &_iphdr->check ); 286 return EXTRACT_16BITS( &_iphdr->check );
282} 287}
283 288
284/*====================================================================================== 289/*======================================================================================
285 * OUDPPacket 290 * OUDPPacket
286 *======================================================================================*/ 291 *======================================================================================*/
287 292
288 293
289OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) 294OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent )
290 :QObject( parent, "UDP" ), _udphdr( data ) 295 :QObject( parent, "UDP" ), _udphdr( data )
291 296
292{ 297{
293 qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); 298 qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." );
294} 299}
295 300
296OUDPPacket::~OUDPPacket() 301OUDPPacket::~OUDPPacket()
297{ 302{
298} 303}
299 304
300 305
301/*====================================================================================== 306/*======================================================================================
302 * OTCPPacket 307 * OTCPPacket
303 *======================================================================================*/ 308 *======================================================================================*/
304 309
305 310
306OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) 311OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent )
307 :QObject( parent, "TCP" ), _tcphdr( data ) 312 :QObject( parent, "TCP" ), _tcphdr( data )
308 313
309{ 314{
310 qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); 315 qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." );
311} 316}
312 317
313OTCPPacket::~OTCPPacket() 318OTCPPacket::~OTCPPacket()
314{ 319{
315} 320}
316 321
317 322
318/*====================================================================================== 323/*======================================================================================
324 * OPrismHeaderPacket
325 *======================================================================================*/
326
327
328OPrismHeaderPacket::OPrismHeaderPacket( const unsigned char* end, const struct prism_hdr* data, QObject* parent )
329 :QObject( parent, "Prism" ), _header( data )
330
331{
332 qDebug( "OPrismHeaderPacket::OPrismHeaderPacket(): decoding PRISM header..." );
333
334 qDebug( "Signal Strength = %d", data->signal.data );
335
336 new OWaveLanPacket( end, (const struct ieee_802_11_header*) (data+1), this );
337}
338
339OPrismHeaderPacket::~OPrismHeaderPacket()
340{
341}
342
343
344unsigned int OPrismHeaderPacket::signalStrength() const
345{
346 return _header->signal.data;
347}
348
349/*======================================================================================
319 * OWaveLanPacket 350 * OWaveLanPacket
320 *======================================================================================*/ 351 *======================================================================================*/
321 352
322 353
323OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) 354OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent )
324 :QObject( parent, "802.11" ), _wlanhdr( data ) 355 :QObject( parent, "802.11" ), _wlanhdr( data )
325 356
326{ 357{
327 qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." ); 358 qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." );
328 qDebug( "type: %0X", type() ); 359 qDebug( "type: %0X", type() );
329 qDebug( "subType: %0X", subType() ); 360 qDebug( "subType: %0X", subType() );
330 qDebug( "duration: %d", duration() ); 361 qDebug( "duration: %d", duration() );
331 qDebug( "powermanagement: %d", usesPowerManagement() ); 362 qDebug( "powermanagement: %d", usesPowerManagement() );
332 qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" ); 363 qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" );
333 qDebug( "MAC1: %s", (const char*) macAddress1().toString() ); 364 qDebug( "MAC1: %s", (const char*) macAddress1().toString() );
334 qDebug( "MAC2: %s", (const char*) macAddress2().toString() ); 365 qDebug( "MAC2: %s", (const char*) macAddress2().toString() );
335 qDebug( "MAC3: %s", (const char*) macAddress3().toString() ); 366 qDebug( "MAC3: %s", (const char*) macAddress3().toString() );
336 qDebug( "MAC4: %s", (const char*) macAddress4().toString() ); 367 qDebug( "MAC4: %s", (const char*) macAddress4().toString() );
337 368
338 switch ( type() ) 369 switch ( type() )
339 { 370 {
340 case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; 371 case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break;
341 case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; 372 case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break;
342 case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break; 373 case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break;
343 default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() ); 374 default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() );
344 } 375 }
345} 376}
346 377
347OWaveLanPacket::~OWaveLanPacket() 378OWaveLanPacket::~OWaveLanPacket()
348{ 379{
349} 380}
350 381
351 382
352int OWaveLanPacket::duration() const 383int OWaveLanPacket::duration() const
353{ 384{
354 return _wlanhdr->duration; 385 return _wlanhdr->duration;
355} 386}
356 387
357 388
358OMacAddress OWaveLanPacket::macAddress1() const 389OMacAddress OWaveLanPacket::macAddress1() const
359{ 390{
360 return OMacAddress( _wlanhdr->mac1 ); 391 return OMacAddress( _wlanhdr->mac1 );
361} 392}
362 393
363 394
364OMacAddress OWaveLanPacket::macAddress2() const 395OMacAddress OWaveLanPacket::macAddress2() const
365{ 396{
366 return OMacAddress( _wlanhdr->mac2 ); 397 return OMacAddress( _wlanhdr->mac2 );
367} 398}
368 399
369 400
370OMacAddress OWaveLanPacket::macAddress3() const 401OMacAddress OWaveLanPacket::macAddress3() const
371{ 402{
372 return OMacAddress( _wlanhdr->mac3 ); 403 return OMacAddress( _wlanhdr->mac3 );
373} 404}
374 405
375 406
376OMacAddress OWaveLanPacket::macAddress4() const 407OMacAddress OWaveLanPacket::macAddress4() const
377{ 408{
378 return OMacAddress( _wlanhdr->mac4 ); 409 return OMacAddress( _wlanhdr->mac4 );
379} 410}
380 411
381 412
382int OWaveLanPacket::subType() const 413int OWaveLanPacket::subType() const
383{ 414{
384 return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 415 return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
385} 416}
386 417
387 418
388int OWaveLanPacket::type() const 419int OWaveLanPacket::type() const
389{ 420{
390 return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 421 return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
391} 422}
392 423
393 424
394int OWaveLanPacket::version() const 425int OWaveLanPacket::version() const
395{ 426{
396 return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 427 return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
397} 428}
398 429
399 430
400bool OWaveLanPacket::fromDS() const 431bool OWaveLanPacket::fromDS() const
401{ 432{
402 return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 433 return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
403} 434}
404 435
405 436
406bool OWaveLanPacket::toDS() const 437bool OWaveLanPacket::toDS() const
407{ 438{
408 return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 439 return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
409} 440}
410 441
411 442
412bool OWaveLanPacket::usesPowerManagement() const 443bool OWaveLanPacket::usesPowerManagement() const
413{ 444{
414 return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 445 return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
415} 446}
416 447
417 448
418bool OWaveLanPacket::usesWep() const 449bool OWaveLanPacket::usesWep() const
419{ 450{
420 return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 451 return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
421} 452}
422 453
423 454
424/*====================================================================================== 455/*======================================================================================
425 * OWaveLanManagementPacket 456 * OWaveLanManagementPacket
426 *======================================================================================*/ 457 *======================================================================================*/
427 458
428OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) 459OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent )
429 :QObject( parent, "802.11 Management" ), _header( data ), 460 :QObject( parent, "802.11 Management" ), _header( data ),
430 _body( (const struct ieee_802_11_mgmt_body*) (data+1) ) 461 _body( (const struct ieee_802_11_mgmt_body*) (data+1) )
431{ 462{
432 qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." ); 463 qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." );
433 qDebug( "Detected subtype is '%s'", (const char*) managementType() ); 464 qDebug( "Detected subtype is '%s'", (const char*) managementType() );
434 465
435 // grab tagged values 466 // grab tagged values
436 const unsigned char* ptr = (const unsigned char*) (_body+1); 467 const unsigned char* ptr = (const unsigned char*) (_body+1);
437 while (ptr < end) 468 while (ptr < end)
438 { 469 {
439 switch ( *ptr ) 470 switch ( *ptr )
440 { 471 {
441 case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; 472 case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break;
442 case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; 473 case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break;
443 case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; 474 case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break;
444 case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; 475 case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break;
445 case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; 476 case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break;
446 case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; 477 case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break;
447 case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; 478 case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break;
448 case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; 479 case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break;
449 } 480 }
450 ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value 481 ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value
451 ptr+= 2; // skip tag ID and length 482 ptr+= 2; // skip tag ID and length
452 } 483 }
453} 484}
454 485
455 486
456OWaveLanManagementPacket::~OWaveLanManagementPacket() 487OWaveLanManagementPacket::~OWaveLanManagementPacket()
457{ 488{
458} 489}
459 490
460 491
461QString OWaveLanManagementPacket::managementType() const 492QString OWaveLanManagementPacket::managementType() const
462{ 493{
463 switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ) 494 switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) )
464 { 495 {
465 case ST_ASSOC_REQUEST: return "AssociationRequest"; break; 496 case ST_ASSOC_REQUEST: return "AssociationRequest"; break;
466 case ST_ASSOC_RESPONSE: return "AssociationResponse"; break; 497 case ST_ASSOC_RESPONSE: return "AssociationResponse"; break;
467 case ST_REASSOC_REQUEST: return "ReassociationRequest"; break; 498 case ST_REASSOC_REQUEST: return "ReassociationRequest"; break;
468 case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break; 499 case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break;
469 case ST_PROBE_REQUEST: return "ProbeRequest"; break; 500 case ST_PROBE_REQUEST: return "ProbeRequest"; break;
470 case ST_PROBE_RESPONSE: return "ProbeResponse"; break; 501 case ST_PROBE_RESPONSE: return "ProbeResponse"; break;
471 case ST_BEACON: return "Beacon"; break; 502 case ST_BEACON: return "Beacon"; break;
472 case ST_ATIM: return "Atim"; break; 503 case ST_ATIM: return "Atim"; break;
473 case ST_DISASSOC: return "Disassociation"; break; 504 case ST_DISASSOC: return "Disassociation"; break;
474 case ST_AUTH: return "Authentication"; break; 505 case ST_AUTH: return "Authentication"; break;
475 case ST_DEAUTH: return "Deathentication"; break; 506 case ST_DEAUTH: return "Deathentication"; break;
476 default: 507 default:
477 qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ); 508 qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) );
478 return "Unknown"; 509 return "Unknown";
479 } 510 }
480} 511}
481 512
482 513
483int OWaveLanManagementPacket::beaconInterval() const 514int OWaveLanManagementPacket::beaconInterval() const
484{ 515{
485 return EXTRACT_LE_16BITS( &_body->beacon_interval ); 516 return EXTRACT_LE_16BITS( &_body->beacon_interval );
486} 517}
487 518
488 519
489int OWaveLanManagementPacket::capabilities() const 520int OWaveLanManagementPacket::capabilities() const
490{ 521{
491 return EXTRACT_LE_16BITS( &_body->capability_info ); 522 return EXTRACT_LE_16BITS( &_body->capability_info );
492} 523}
493 524
494 525
495bool OWaveLanManagementPacket::canESS() const 526bool OWaveLanManagementPacket::canESS() const
496{ 527{
497 return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); 528 return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) );
498} 529}
499 530
500 531
501bool OWaveLanManagementPacket::canIBSS() const 532bool OWaveLanManagementPacket::canIBSS() const
502{ 533{
503 return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); 534 return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) );
504} 535}
505 536
506 537
507bool OWaveLanManagementPacket::canCFP() const 538bool OWaveLanManagementPacket::canCFP() const
508{ 539{
509 return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); 540 return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) );
510} 541}
511 542
512 543
513bool OWaveLanManagementPacket::canCFP_REQ() const 544bool OWaveLanManagementPacket::canCFP_REQ() const
514{ 545{
515 return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); 546 return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) );
516} 547}
517 548
518 549
519bool OWaveLanManagementPacket::canPrivacy() const 550bool OWaveLanManagementPacket::canPrivacy() const
520{ 551{
521 return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); 552 return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) );
522} 553}
523 554
524 555
525/*====================================================================================== 556/*======================================================================================
526 * OWaveLanManagementSSID 557 * OWaveLanManagementSSID
527 *======================================================================================*/ 558 *======================================================================================*/
528 559
529OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) 560OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent )
530 :QObject( parent, "802.11 SSID" ), _data( data ) 561 :QObject( parent, "802.11 SSID" ), _data( data )
531{ 562{
532 qDebug( "OWaveLanManagementSSID()" ); 563 qDebug( "OWaveLanManagementSSID()" );
533} 564}
534 565
535 566
536OWaveLanManagementSSID::~OWaveLanManagementSSID() 567OWaveLanManagementSSID::~OWaveLanManagementSSID()
537{ 568{
538} 569}
539 570
540 571
541QString OWaveLanManagementSSID::ID() const 572QString OWaveLanManagementSSID::ID() const
542{ 573{
543 int length = _data->length; 574 int length = _data->length;
544 if ( length > 32 ) length = 32; 575 if ( length > 32 ) length = 32;
545 char essid[length+1]; 576 char essid[length+1];
546 memcpy( &essid, &_data->ssid, length ); 577 memcpy( &essid, &_data->ssid, length );
547 essid[length] = 0x0; 578 essid[length] = 0x0;
548 return essid; 579 return essid;
549} 580}
550 581
551 582
552/*====================================================================================== 583/*======================================================================================
553 * OWaveLanManagementRates 584 * OWaveLanManagementRates
554 *======================================================================================*/ 585 *======================================================================================*/
555 586
556OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) 587OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent )
557 :QObject( parent, "802.11 Rates" ), _data( data ) 588 :QObject( parent, "802.11 Rates" ), _data( data )
558{ 589{
559 qDebug( "OWaveLanManagementRates()" ); 590 qDebug( "OWaveLanManagementRates()" );
560} 591}
561 592
562 593
563OWaveLanManagementRates::~OWaveLanManagementRates() 594OWaveLanManagementRates::~OWaveLanManagementRates()
564{ 595{
565} 596}
566 597
567/*====================================================================================== 598/*======================================================================================
568 * OWaveLanManagementCF 599 * OWaveLanManagementCF
569 *======================================================================================*/ 600 *======================================================================================*/
570 601
571OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) 602OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent )
572 :QObject( parent, "802.11 CF" ), _data( data ) 603 :QObject( parent, "802.11 CF" ), _data( data )
573{ 604{
574 qDebug( "OWaveLanManagementCF()" ); 605 qDebug( "OWaveLanManagementCF()" );
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index fe88e68..83f7115 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -1,413 +1,432 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34#ifndef OPCAP_H 34#ifndef OPCAP_H
35#define OPCAP_H 35#define OPCAP_H
36 36
37/* LINUX */ 37/* LINUX */
38extern "C" // work around a bpf/pcap conflict in recent headers 38extern "C" // work around a bpf/pcap conflict in recent headers
39{ 39{
40 #include <pcap.h> 40 #include <pcap.h>
41} 41}
42#include <netinet/ether.h> 42#include <netinet/ether.h>
43#include <netinet/ip.h> 43#include <netinet/ip.h>
44#include <netinet/udp.h> 44#include <netinet/udp.h>
45#include <netinet/tcp.h> 45#include <netinet/tcp.h>
46#include <time.h> 46#include <time.h>
47 47
48/* QT */ 48/* QT */
49#include <qevent.h> 49#include <qevent.h>
50#include <qfile.h> 50#include <qfile.h>
51#include <qhostaddress.h> 51#include <qhostaddress.h>
52#include <qobject.h> 52#include <qobject.h>
53#include <qstring.h> 53#include <qstring.h>
54#include <qmap.h> 54#include <qmap.h>
55 55
56/* OPIE */ 56/* OPIE */
57#include <opie2/onetutils.h> 57#include <opie2/onetutils.h>
58#include "802_11_user.h" 58#include "802_11_user.h"
59 59
60/* TYPEDEFS */ 60/* TYPEDEFS */
61typedef struct timeval timevalstruct; 61typedef struct timeval timevalstruct;
62typedef struct pcap_pkthdr packetheaderstruct; 62typedef struct pcap_pkthdr packetheaderstruct;
63 63
64/* FORWARDS */ 64/* FORWARDS */
65class OPacketCapturer; 65class OPacketCapturer;
66class QSocketNotifier; 66class QSocketNotifier;
67 67
68/*====================================================================================== 68/*======================================================================================
69 * OPacket - A frame on the wire 69 * OPacket - A frame on the wire
70 *======================================================================================*/ 70 *======================================================================================*/
71 71
72/** @brief A class representing a data frame on the wire. 72/** @brief A class representing a data frame on the wire.
73 * 73 *
74 * The whole family of the packet classes are used when capturing frames from a network. 74 * The whole family of the packet classes are used when capturing frames from a network.
75 * Most standard network protocols in use share a common architecture, which mostly is 75 * Most standard network protocols in use share a common architecture, which mostly is
76 * a packet header and then the packet payload. In layered architectures, each lower layer 76 * a packet header and then the packet payload. In layered architectures, each lower layer
77 * encapsulates data from its upper layer - that is it 77 * encapsulates data from its upper layer - that is it
78 * treats the data from its upper layer as payload and prepends an own header to the packet, 78 * treats the data from its upper layer as payload and prepends an own header to the packet,
79 * which - again - is treated as the payload for the layer below. The figure below is an 79 * which - again - is treated as the payload for the layer below. The figure below is an
80 * example for how such a data frame is composed out of packets, e.g. when sending a mail. 80 * example for how such a data frame is composed out of packets, e.g. when sending a mail.
81 * 81 *
82 * <pre> 82 * <pre>
83 * | User Data | == Mail Data 83 * | User Data | == Mail Data
84 * | SMTP Header | User Data | == SMTP 84 * | SMTP Header | User Data | == SMTP
85 * | TCP Header | SMTP Header | User Data | == TCP 85 * | TCP Header | SMTP Header | User Data | == TCP
86 * | IP Header | TCP Header | SMTP Header | User Data | == IP 86 * | IP Header | TCP Header | SMTP Header | User Data | == IP
87 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC 87 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC
88 * 88 *
89 * </pre> 89 * </pre>
90 * 90 *
91 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer 91 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer
92 * also contains a few more levels of encapsulation. 92 * also contains a few more levels of encapsulation.
93 * Since the type of the payload is more or less independent from the encapsulating protocol, 93 * Since the type of the payload is more or less independent from the encapsulating protocol,
94 * the header must be inspected before attempting to decode the payload. Hence, the 94 * the header must be inspected before attempting to decode the payload. Hence, the
95 * encapsulation level varies and can't be deduced without actually looking into the packets. 95 * encapsulation level varies and can't be deduced without actually looking into the packets.
96 * 96 *
97 * For actually working with captured frames, it's useful to identify the packets via names and 97 * For actually working with captured frames, it's useful to identify the packets via names and
98 * insert them into a parent/child - relationship based on the encapsulation. This is why 98 * insert them into a parent/child - relationship based on the encapsulation. This is why
99 * all packet classes derive from QObject. The amount of overhead caused by the QObject is 99 * all packet classes derive from QObject. The amount of overhead caused by the QObject is
100 * not a problem in this case, because we're talking about a theoratical maximum of about 100 * not a problem in this case, because we're talking about a theoratical maximum of about
101 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the 101 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the
102 * QObject also cares about destroying the sub-, (child-) packets. 102 * QObject also cares about destroying the sub-, (child-) packets.
103 * 103 *
104 * This enables us to perform a simple look for packets of a certain type: 104 * This enables us to perform a simple look for packets of a certain type:
105 * @code 105 * @code
106 * OPacketCapturer* pcap = new OPacketCapturer(); 106 * OPacketCapturer* pcap = new OPacketCapturer();
107 * pcap->open( "eth0" ); 107 * pcap->open( "eth0" );
108 * OPacket* p = pcap->next(); 108 * OPacket* p = pcap->next();
109 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists 109 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists
110 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl; 110 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl;
111 * 111 *
112 */ 112 */
113 113
114class OPacket : public QObject 114class OPacket : public QObject
115{ 115{
116 Q_OBJECT 116 Q_OBJECT
117 117
118 public: 118 public:
119 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent ); 119 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent );
120 virtual ~OPacket(); 120 virtual ~OPacket();
121 121
122 timevalstruct timeval() const; 122 timevalstruct timeval() const;
123 123
124 int caplen() const; 124 int caplen() const;
125 int len() const; 125 int len() const;
126 QString dump( int = 32 ) const; 126 QString dump( int = 32 ) const;
127 127
128 void updateStats( QMap<QString,int>&, QObjectList* ); 128 void updateStats( QMap<QString,int>&, QObjectList* );
129 129
130 private: 130 private:
131 const packetheaderstruct _hdr; // pcap packet header 131 const packetheaderstruct _hdr; // pcap packet header
132 const unsigned char* _data; // pcap packet data 132 const unsigned char* _data; // pcap packet data
133 const unsigned char* _end; // end of pcap packet data 133 const unsigned char* _end; // end of pcap packet data
134}; 134};
135 135
136/*====================================================================================== 136/*======================================================================================
137 * OEthernetPacket - DLT_EN10MB frame 137 * OEthernetPacket - DLT_EN10MB frame
138 *======================================================================================*/ 138 *======================================================================================*/
139 139
140class OEthernetPacket : public QObject 140class OEthernetPacket : public QObject
141{ 141{
142 Q_OBJECT 142 Q_OBJECT
143 143
144 public: 144 public:
145 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 ); 145 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 );
146 virtual ~OEthernetPacket(); 146 virtual ~OEthernetPacket();
147 147
148 OMacAddress sourceAddress() const; 148 OMacAddress sourceAddress() const;
149 OMacAddress destinationAddress() const; 149 OMacAddress destinationAddress() const;
150 int type() const; 150 int type() const;
151 151
152 private: 152 private:
153 const struct ether_header* _ether; 153 const struct ether_header* _ether;
154}; 154};
155 155
156 156
157/*====================================================================================== 157/*======================================================================================
158 * OPrismHeaderPacket - DLT_PRISM_HEADER frame
159 *======================================================================================*/
160
161class OPrismHeaderPacket : public QObject
162{
163 Q_OBJECT
164
165 public:
166 OPrismHeaderPacket( const unsigned char*, const struct prism_hdr*, QObject* parent = 0 );
167 virtual ~OPrismHeaderPacket();
168
169 unsigned int signalStrength() const;
170
171 private:
172 const struct prism_hdr* _header;
173};
174
175
176/*======================================================================================
158 * OWaveLanPacket - DLT_IEEE802_11 frame 177 * OWaveLanPacket - DLT_IEEE802_11 frame
159 *======================================================================================*/ 178 *======================================================================================*/
160 179
161class OWaveLanPacket : public QObject 180class OWaveLanPacket : public QObject
162{ 181{
163 Q_OBJECT 182 Q_OBJECT
164 183
165 public: 184 public:
166 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 ); 185 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 );
167 virtual ~OWaveLanPacket(); 186 virtual ~OWaveLanPacket();
168 187
169 int duration() const; 188 int duration() const;
170 bool fromDS() const; 189 bool fromDS() const;
171 bool toDS() const; 190 bool toDS() const;
172 virtual OMacAddress macAddress1() const; 191 virtual OMacAddress macAddress1() const;
173 virtual OMacAddress macAddress2() const; 192 virtual OMacAddress macAddress2() const;
174 virtual OMacAddress macAddress3() const; 193 virtual OMacAddress macAddress3() const;
175 virtual OMacAddress macAddress4() const; 194 virtual OMacAddress macAddress4() const;
176 bool usesPowerManagement() const; 195 bool usesPowerManagement() const;
177 int type() const; 196 int type() const;
178 int subType() const; 197 int subType() const;
179 int version() const; 198 int version() const;
180 bool usesWep() const; 199 bool usesWep() const;
181 200
182 private: 201 private:
183 const struct ieee_802_11_header* _wlanhdr; 202 const struct ieee_802_11_header* _wlanhdr;
184}; 203};
185 204
186 205
187/*====================================================================================== 206/*======================================================================================
188 * OWaveLanManagementPacket - type: management (T_MGMT) 207 * OWaveLanManagementPacket - type: management (T_MGMT)
189 *======================================================================================*/ 208 *======================================================================================*/
190 209
191class OWaveLanManagementPacket : public QObject 210class OWaveLanManagementPacket : public QObject
192{ 211{
193 Q_OBJECT 212 Q_OBJECT
194 213
195 public: 214 public:
196 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); 215 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 );
197 virtual ~OWaveLanManagementPacket(); 216 virtual ~OWaveLanManagementPacket();
198 217
199 QString managementType() const; 218 QString managementType() const;
200 219
201 int beaconInterval() const; 220 int beaconInterval() const;
202 int capabilities() const; // generic 221 int capabilities() const; // generic
203 222
204 bool canESS() const; 223 bool canESS() const;
205 bool canIBSS() const; 224 bool canIBSS() const;
206 bool canCFP() const; 225 bool canCFP() const;
207 bool canCFP_REQ() const; 226 bool canCFP_REQ() const;
208 bool canPrivacy() const; 227 bool canPrivacy() const;
209 228
210 private: 229 private:
211 const struct ieee_802_11_mgmt_header* _header; 230 const struct ieee_802_11_mgmt_header* _header;
212 const struct ieee_802_11_mgmt_body* _body; 231 const struct ieee_802_11_mgmt_body* _body;
213}; 232};
214 233
215 234
216/*====================================================================================== 235/*======================================================================================
217 * OWaveLanManagementSSID 236 * OWaveLanManagementSSID
218 *======================================================================================*/ 237 *======================================================================================*/
219 238
220class OWaveLanManagementSSID : public QObject 239class OWaveLanManagementSSID : public QObject
221{ 240{
222 Q_OBJECT 241 Q_OBJECT
223 242
224 public: 243 public:
225 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 ); 244 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 );
226 virtual ~OWaveLanManagementSSID(); 245 virtual ~OWaveLanManagementSSID();
227 246
228 QString ID() const; 247 QString ID() const;
229 248
230 private: 249 private:
231 const struct ssid_t* _data; 250 const struct ssid_t* _data;
232}; 251};
233 252
234/*====================================================================================== 253/*======================================================================================
235 * OWaveLanManagementRates 254 * OWaveLanManagementRates
236 *======================================================================================*/ 255 *======================================================================================*/
237 256
238class OWaveLanManagementRates : public QObject 257class OWaveLanManagementRates : public QObject
239{ 258{
240 Q_OBJECT 259 Q_OBJECT
241 260
242 public: 261 public:
243 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 ); 262 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 );
244 virtual ~OWaveLanManagementRates(); 263 virtual ~OWaveLanManagementRates();
245 264
246 private: 265 private:
247 const struct rates_t* _data; 266 const struct rates_t* _data;
248}; 267};
249 268
250/*====================================================================================== 269/*======================================================================================
251 * OWaveLanManagementCF 270 * OWaveLanManagementCF
252 *======================================================================================*/ 271 *======================================================================================*/
253 272
254class OWaveLanManagementCF : public QObject 273class OWaveLanManagementCF : public QObject
255{ 274{
256 Q_OBJECT 275 Q_OBJECT
257 276
258 public: 277 public:
259 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 ); 278 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 );
260 virtual ~OWaveLanManagementCF(); 279 virtual ~OWaveLanManagementCF();
261 280
262 private: 281 private:
263 const struct cf_t* _data; 282 const struct cf_t* _data;
264}; 283};
265 284
266/*====================================================================================== 285/*======================================================================================
267 * OWaveLanManagementFH 286 * OWaveLanManagementFH
268 *======================================================================================*/ 287 *======================================================================================*/
269 288
270class OWaveLanManagementFH : public QObject 289class OWaveLanManagementFH : public QObject
271{ 290{
272 Q_OBJECT 291 Q_OBJECT
273 292
274 public: 293 public:
275 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 ); 294 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 );
276 virtual ~OWaveLanManagementFH(); 295 virtual ~OWaveLanManagementFH();
277 296
278 private: 297 private:
279 const struct fh_t* _data; 298 const struct fh_t* _data;
280}; 299};
281 300
282/*====================================================================================== 301/*======================================================================================
283 * OWaveLanManagementDS 302 * OWaveLanManagementDS
284 *======================================================================================*/ 303 *======================================================================================*/
285 304
286class OWaveLanManagementDS : public QObject 305class OWaveLanManagementDS : public QObject
287{ 306{
288 Q_OBJECT 307 Q_OBJECT
289 308
290 public: 309 public:
291 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 ); 310 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 );
292 virtual ~OWaveLanManagementDS(); 311 virtual ~OWaveLanManagementDS();
293 312
294 int channel() const; 313 int channel() const;
295 314
296 private: 315 private:
297 const struct ds_t* _data; 316 const struct ds_t* _data;
298}; 317};
299 318
300/*====================================================================================== 319/*======================================================================================
301 * OWaveLanManagementTim 320 * OWaveLanManagementTim
302 *======================================================================================*/ 321 *======================================================================================*/
303 322
304class OWaveLanManagementTim : public QObject 323class OWaveLanManagementTim : public QObject
305{ 324{
306 Q_OBJECT 325 Q_OBJECT
307 326
308 public: 327 public:
309 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 ); 328 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 );
310 virtual ~OWaveLanManagementTim(); 329 virtual ~OWaveLanManagementTim();
311 330
312 private: 331 private:
313 const struct tim_t* _data; 332 const struct tim_t* _data;
314}; 333};
315 334
316/*====================================================================================== 335/*======================================================================================
317 * OWaveLanManagementIBSS 336 * OWaveLanManagementIBSS
318 *======================================================================================*/ 337 *======================================================================================*/
319 338
320class OWaveLanManagementIBSS : public QObject 339class OWaveLanManagementIBSS : public QObject
321{ 340{
322 Q_OBJECT 341 Q_OBJECT
323 342
324 public: 343 public:
325 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 ); 344 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 );
326 virtual ~OWaveLanManagementIBSS(); 345 virtual ~OWaveLanManagementIBSS();
327 346
328 private: 347 private:
329 const struct ibss_t* _data; 348 const struct ibss_t* _data;
330}; 349};
331 350
332/*====================================================================================== 351/*======================================================================================
333 * OWaveLanManagementChallenge 352 * OWaveLanManagementChallenge
334 *======================================================================================*/ 353 *======================================================================================*/
335 354
336// Qobject do we need that?? 355// Qobject do we need that??
337class OWaveLanManagementChallenge : public QObject 356class OWaveLanManagementChallenge : public QObject
338{ 357{
339 Q_OBJECT 358 Q_OBJECT
340 359
341 public: 360 public:
342 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 ); 361 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 );
343 virtual ~OWaveLanManagementChallenge(); 362 virtual ~OWaveLanManagementChallenge();
344 363
345 private: 364 private:
346 const struct challenge_t* _data; 365 const struct challenge_t* _data;
347}; 366};
348 367
349/*====================================================================================== 368/*======================================================================================
350 * OWaveLanDataPacket - type: data (T_DATA) 369 * OWaveLanDataPacket - type: data (T_DATA)
351 *======================================================================================*/ 370 *======================================================================================*/
352// Qobject? 371// Qobject?
353class OWaveLanDataPacket : public QObject 372class OWaveLanDataPacket : public QObject
354{ 373{
355 Q_OBJECT 374 Q_OBJECT
356 375
357 public: 376 public:
358 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 ); 377 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 );
359 virtual ~OWaveLanDataPacket(); 378 virtual ~OWaveLanDataPacket();
360 379
361 private: 380 private:
362 const struct ieee_802_11_data_header* _header; 381 const struct ieee_802_11_data_header* _header;
363}; 382};
364 383
365/*====================================================================================== 384/*======================================================================================
366 * OWaveLanControlPacket - type: control (T_CTRL) 385 * OWaveLanControlPacket - type: control (T_CTRL)
367 *======================================================================================*/ 386 *======================================================================================*/
368 387
369class OWaveLanControlPacket : public QObject 388class OWaveLanControlPacket : public QObject
370{ 389{
371 Q_OBJECT 390 Q_OBJECT
372 391
373 public: 392 public:
374 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 ); 393 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 );
375 virtual ~OWaveLanControlPacket(); 394 virtual ~OWaveLanControlPacket();
376 395
377 private: 396 private:
378 const struct ieee_802_11_control_header* _header; 397 const struct ieee_802_11_control_header* _header;
379}; 398};
380 399
381/*====================================================================================== 400/*======================================================================================
382 * OLLCPacket - IEEE 802.2 Link Level Control 401 * OLLCPacket - IEEE 802.2 Link Level Control
383 *======================================================================================*/ 402 *======================================================================================*/
384 403
385class OLLCPacket : public QObject 404class OLLCPacket : public QObject
386{ 405{
387 Q_OBJECT 406 Q_OBJECT
388 407
389 public: 408 public:
390 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 ); 409 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 );
391 virtual ~OLLCPacket(); 410 virtual ~OLLCPacket();
392 411
393 private: 412 private:
394 const struct ieee_802_11_802_2_header* _header; 413 const struct ieee_802_11_802_2_header* _header;
395}; 414};
396 415
397/*====================================================================================== 416/*======================================================================================
398 * OIPPacket 417 * OIPPacket
399 *======================================================================================*/ 418 *======================================================================================*/
400 419
401class OIPPacket : public QObject 420class OIPPacket : public QObject
402{ 421{
403 Q_OBJECT 422 Q_OBJECT
404 423
405 public: 424 public:
406 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 ); 425 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 );
407 virtual ~OIPPacket(); 426 virtual ~OIPPacket();
408 427
409 QHostAddress fromIPAddress() const; 428 QHostAddress fromIPAddress() const;
410 QHostAddress toIPAddress() const; 429 QHostAddress toIPAddress() const;
411 430
412 int tos() const; 431 int tos() const;
413 int len() const; 432 int len() const;