summaryrefslogtreecommitdiff
path: root/libopie2/opienet
authormickeyl <mickeyl>2003-04-22 22:11:28 (UTC)
committer mickeyl <mickeyl>2003-04-22 22:11:28 (UTC)
commita0ffe9079338a8b870de5267a22ddbb01cb1cc27 (patch) (unidiff)
treefe240ab38bd11cd32d51674e4f79a465092476e5 /libopie2/opienet
parentbb8965d31b06ec122a0916d8c5bc4c4b68873a14 (diff)
downloadopie-a0ffe9079338a8b870de5267a22ddbb01cb1cc27.zip
opie-a0ffe9079338a8b870de5267a22ddbb01cb1cc27.tar.gz
opie-a0ffe9079338a8b870de5267a22ddbb01cb1cc27.tar.bz2
add prism header parsing capability!
Diffstat (limited to 'libopie2/opienet') (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
@@ -244,200 +244,214 @@ struct ieee_802_11_mgmt_header {
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
@@ -526,257 +526,258 @@ void OWirelessNetworkInterface::buildChannelList()
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{
@@ -808,149 +809,149 @@ OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
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,446 +1,477 @@
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;
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
@@ -30,256 +30,275 @@
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