-rw-r--r-- | libopie2/opienet/opcap.cpp | 253 |
1 files changed, 225 insertions, 28 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp index 48f874f..913d42e 100644 --- a/libopie2/opienet/opcap.cpp +++ b/libopie2/opienet/opcap.cpp | |||
@@ -51,2 +51,5 @@ OPacket::OPacket( packetheaderstruct header, const unsigned char* data, QObject* | |||
51 | 51 | ||
52 | _end = (unsigned char*) data + header.len; | ||
53 | qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); | ||
54 | |||
52 | if ( packetCapturer()->dataLink() == DLT_EN10MB ) | 55 | if ( packetCapturer()->dataLink() == DLT_EN10MB ) |
@@ -54,3 +57,3 @@ OPacket::OPacket( packetheaderstruct header, const unsigned char* data, QObject* | |||
54 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); | 57 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); |
55 | new OEthernetPacket( (const struct ether_header*) data, this ); | 58 | new OEthernetPacket( _end, (const struct ether_header*) data, this ); |
56 | } | 59 | } |
@@ -59,3 +62,3 @@ OPacket::OPacket( packetheaderstruct header, const unsigned char* data, QObject* | |||
59 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); | 62 | qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); |
60 | new OWaveLanPacket( (const struct ieee_802_11_header*) data, this ); | 63 | new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); |
61 | } | 64 | } |
@@ -111,3 +114,3 @@ int OPacket::len() const | |||
111 | 114 | ||
112 | OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* parent ) | 115 | OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) |
113 | :QObject( parent, "Ethernet" ), _ether( data ) | 116 | :QObject( parent, "Ethernet" ), _ether( data ) |
@@ -126,3 +129,3 @@ OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* pare | |||
126 | { | 129 | { |
127 | case ETHERTYPE_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break; | 130 | case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; |
128 | case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } | 131 | case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } |
@@ -162,3 +165,3 @@ int OEthernetPacket::type() const | |||
162 | 165 | ||
163 | OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent ) | 166 | OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) |
164 | :QObject( parent, "IP" ), _iphdr( data ) | 167 | :QObject( parent, "IP" ), _iphdr( data ) |
@@ -176,4 +179,4 @@ OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent ) | |||
176 | { | 179 | { |
177 | case IPPROTO_UDP: new OUDPPacket( (const struct udphdr*) (data+1), this ); break; | 180 | case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; |
178 | case IPPROTO_TCP: new OTCPPacket( (const struct tcphdr*) (data+1), this ); break; | 181 | case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; |
179 | default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); | 182 | default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); |
@@ -246,3 +249,3 @@ int OIPPacket::checksum() const | |||
246 | 249 | ||
247 | OUDPPacket::OUDPPacket( const struct udphdr* data, QObject* parent ) | 250 | OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) |
248 | :QObject( parent, "UDP" ), _udphdr( data ) | 251 | :QObject( parent, "UDP" ), _udphdr( data ) |
@@ -263,3 +266,3 @@ OUDPPacket::~OUDPPacket() | |||
263 | 266 | ||
264 | OTCPPacket::OTCPPacket( const struct tcphdr* data, QObject* parent ) | 267 | OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) |
265 | :QObject( parent, "TCP" ), _tcphdr( data ) | 268 | :QObject( parent, "TCP" ), _tcphdr( data ) |
@@ -280,3 +283,3 @@ OTCPPacket::~OTCPPacket() | |||
280 | 283 | ||
281 | OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* parent ) | 284 | OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) |
282 | :QObject( parent, "802.11" ), _wlanhdr( data ) | 285 | :QObject( parent, "802.11" ), _wlanhdr( data ) |
@@ -297,5 +300,5 @@ OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* | |||
297 | { | 300 | { |
298 | case T_MGMT: new OWaveLanManagementPacket( (const struct ieee_802_11_mgmt_header*) data, this ); break; | 301 | case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; |
299 | case T_DATA: new OWaveLanDataPacket( (const struct ieee_802_11_data_header*) data, this ); break; | 302 | case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; |
300 | //case T_CTRL: new OWaveLanControlPacket( (const struct ieee_802_11_ctrl_header*) data, this ); break; | 303 | //case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_ctrl_header*) data, this ); break; |
301 | default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown type!" ); | 304 | default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown type!" ); |
@@ -385,3 +388,3 @@ bool OWaveLanPacket::usesWep() const | |||
385 | 388 | ||
386 | OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) | 389 | OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) |
387 | :QObject( parent, "802.11 Management" ), _header( data ), | 390 | :QObject( parent, "802.11 Management" ), _header( data ), |
@@ -395,6 +398,23 @@ OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgm | |||
395 | { | 398 | { |
396 | qDebug( "TYPE: BEACON FRAME" ); | 399 | // nice, received a beacon... |
397 | qDebug( "ESSID: %s", (const char*) SSID() ); | 400 | } |
398 | break; | 401 | } |
402 | |||
403 | // grab tagged values | ||
404 | const unsigned char* ptr = (const unsigned char*) (_body+1); | ||
405 | while (ptr < end) | ||
406 | { | ||
407 | switch ( *ptr ) | ||
408 | { | ||
409 | case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; | ||
410 | case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; | ||
411 | case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; | ||
412 | case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; | ||
413 | case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; | ||
414 | case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; | ||
415 | case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; | ||
416 | case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; | ||
399 | } | 417 | } |
418 | ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value | ||
419 | ptr+= 2; // skip tag ID and length | ||
400 | } | 420 | } |
@@ -408,8 +428,66 @@ OWaveLanManagementPacket::~OWaveLanManagementPacket() | |||
408 | 428 | ||
409 | QString OWaveLanManagementPacket::SSID() const | 429 | int OWaveLanManagementPacket::beaconInterval() const |
430 | { | ||
431 | return EXTRACT_LE_16BITS( &_body->beacon_interval ); | ||
432 | } | ||
433 | |||
434 | |||
435 | int OWaveLanManagementPacket::capabilities() const | ||
436 | { | ||
437 | return EXTRACT_LE_16BITS( &_body->capability_info ); | ||
438 | } | ||
439 | |||
440 | |||
441 | bool OWaveLanManagementPacket::canESS() const | ||
410 | { | 442 | { |
411 | int length = _body->ssid.length; | 443 | return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); |
444 | } | ||
445 | |||
446 | |||
447 | bool OWaveLanManagementPacket::canIBSS() const | ||
448 | { | ||
449 | return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); | ||
450 | } | ||
451 | |||
452 | |||
453 | bool OWaveLanManagementPacket::canCFP() const | ||
454 | { | ||
455 | return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); | ||
456 | } | ||
457 | |||
458 | |||
459 | bool OWaveLanManagementPacket::canCFP_REQ() const | ||
460 | { | ||
461 | return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); | ||
462 | } | ||
463 | |||
464 | |||
465 | bool OWaveLanManagementPacket::canPrivacy() const | ||
466 | { | ||
467 | return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); | ||
468 | } | ||
469 | |||
470 | |||
471 | /*====================================================================================== | ||
472 | * OWaveLanManagementSSID | ||
473 | *======================================================================================*/ | ||
474 | |||
475 | OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) | ||
476 | :QObject( parent, "802.11 SSID" ), _data( data ) | ||
477 | { | ||
478 | qDebug( "OWaveLanManagementSSID()" ); | ||
479 | } | ||
480 | |||
481 | |||
482 | OWaveLanManagementSSID::~OWaveLanManagementSSID() | ||
483 | { | ||
484 | } | ||
485 | |||
486 | |||
487 | QString OWaveLanManagementSSID::ID() const | ||
488 | { | ||
489 | int length = _data->length; | ||
412 | if ( length > 32 ) length = 32; | 490 | if ( length > 32 ) length = 32; |
413 | char essid[length+1]; | 491 | char essid[length+1]; |
414 | memcpy( &essid, _body->ssid.ssid, length ); | 492 | memcpy( &essid, &_data->ssid, length ); |
415 | essid[length] = 0x0; | 493 | essid[length] = 0x0; |
@@ -420,2 +498,113 @@ QString OWaveLanManagementPacket::SSID() const | |||
420 | /*====================================================================================== | 498 | /*====================================================================================== |
499 | * OWaveLanManagementRates | ||
500 | *======================================================================================*/ | ||
501 | |||
502 | OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) | ||
503 | :QObject( parent, "802.11 Rates" ), _data( data ) | ||
504 | { | ||
505 | qDebug( "OWaveLanManagementRates()" ); | ||
506 | } | ||
507 | |||
508 | |||
509 | OWaveLanManagementRates::~OWaveLanManagementRates() | ||
510 | { | ||
511 | } | ||
512 | |||
513 | /*====================================================================================== | ||
514 | * OWaveLanManagementCF | ||
515 | *======================================================================================*/ | ||
516 | |||
517 | OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) | ||
518 | :QObject( parent, "802.11 CF" ), _data( data ) | ||
519 | { | ||
520 | qDebug( "OWaveLanManagementCF()" ); | ||
521 | } | ||
522 | |||
523 | |||
524 | OWaveLanManagementCF::~OWaveLanManagementCF() | ||
525 | { | ||
526 | } | ||
527 | |||
528 | /*====================================================================================== | ||
529 | * OWaveLanManagementFH | ||
530 | *======================================================================================*/ | ||
531 | |||
532 | OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent ) | ||
533 | :QObject( parent, "802.11 FH" ), _data( data ) | ||
534 | { | ||
535 | qDebug( "OWaveLanManagementFH()" ); | ||
536 | } | ||
537 | |||
538 | |||
539 | OWaveLanManagementFH::~OWaveLanManagementFH() | ||
540 | { | ||
541 | } | ||
542 | |||
543 | /*====================================================================================== | ||
544 | * OWaveLanManagementDS | ||
545 | *======================================================================================*/ | ||
546 | |||
547 | OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent ) | ||
548 | :QObject( parent, "802.11 DS" ), _data( data ) | ||
549 | { | ||
550 | qDebug( "OWaveLanManagementDS()" ); | ||
551 | } | ||
552 | |||
553 | |||
554 | OWaveLanManagementDS::~OWaveLanManagementDS() | ||
555 | { | ||
556 | } | ||
557 | |||
558 | |||
559 | int OWaveLanManagementDS::channel() const | ||
560 | { | ||
561 | return _data->channel; | ||
562 | } | ||
563 | |||
564 | /*====================================================================================== | ||
565 | * OWaveLanManagementTim | ||
566 | *======================================================================================*/ | ||
567 | |||
568 | OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent ) | ||
569 | :QObject( parent, "802.11 Tim" ), _data( data ) | ||
570 | { | ||
571 | qDebug( "OWaveLanManagementTim()" ); | ||
572 | } | ||
573 | |||
574 | |||
575 | OWaveLanManagementTim::~OWaveLanManagementTim() | ||
576 | { | ||
577 | } | ||
578 | |||
579 | /*====================================================================================== | ||
580 | * OWaveLanManagementIBSS | ||
581 | *======================================================================================*/ | ||
582 | |||
583 | OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent ) | ||
584 | :QObject( parent, "802.11 IBSS" ), _data( data ) | ||
585 | { | ||
586 | qDebug( "OWaveLanManagementIBSS()" ); | ||
587 | } | ||
588 | |||
589 | |||
590 | OWaveLanManagementIBSS::~OWaveLanManagementIBSS() | ||
591 | { | ||
592 | } | ||
593 | |||
594 | /*====================================================================================== | ||
595 | * OWaveLanManagementChallenge | ||
596 | *======================================================================================*/ | ||
597 | |||
598 | OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent ) | ||
599 | :QObject( parent, "802.11 Challenge" ), _data( data ) | ||
600 | { | ||
601 | qDebug( "OWaveLanManagementChallenge()" ); | ||
602 | } | ||
603 | |||
604 | |||
605 | OWaveLanManagementChallenge::~OWaveLanManagementChallenge() | ||
606 | { | ||
607 | } | ||
608 | |||
609 | /*====================================================================================== | ||
421 | * OWaveLanDataPacket | 610 | * OWaveLanDataPacket |
@@ -423,3 +612,3 @@ QString OWaveLanManagementPacket::SSID() const | |||
423 | 612 | ||
424 | OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) | 613 | OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) |
425 | :QObject( parent, "802.11 Data" ), _header( data ) | 614 | :QObject( parent, "802.11 Data" ), _header( data ) |
@@ -433,3 +622,3 @@ OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* da | |||
433 | 622 | ||
434 | new OLLCPacket( (const struct ieee_802_11_802_2_header*) payload, this ); | 623 | new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); |
435 | } | 624 | } |
@@ -446,3 +635,3 @@ OWaveLanDataPacket::~OWaveLanDataPacket() | |||
446 | 635 | ||
447 | OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent ) | 636 | OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) |
448 | :QObject( parent, "802.11 802_2" ), _header( data ) | 637 | :QObject( parent, "802.11 802_2" ), _header( data ) |
@@ -457,3 +646,3 @@ OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* pa | |||
457 | { | 646 | { |
458 | case ETH_P_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break; | 647 | case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; |
459 | default: qDebug( "OLLCPacket::OLLCPacket(): Unknown Encapsulation Type" ); | 648 | default: qDebug( "OLLCPacket::OLLCPacket(): Unknown Encapsulation Type" ); |
@@ -475,3 +664,3 @@ OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) | |||
475 | :QObject( parent, name ), _name( QString::null ), _open( false ), | 664 | :QObject( parent, name ), _name( QString::null ), _open( false ), |
476 | _pch( 0 ) | 665 | _pch( 0 ), _sn( 0 ) |
477 | { | 666 | { |
@@ -519,2 +708,7 @@ void OPacketCapturer::close() | |||
519 | { | 708 | { |
709 | if ( _sn ) | ||
710 | { | ||
711 | _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); | ||
712 | delete _sn; | ||
713 | } | ||
520 | pcap_close( _pch ); | 714 | pcap_close( _pch ); |
@@ -547,3 +741,6 @@ OPacket* OPacketCapturer::next() | |||
547 | packetheaderstruct header; | 741 | packetheaderstruct header; |
742 | qDebug( "==> OPacketCapturer::next()" ); | ||
548 | const unsigned char* pdata = pcap_next( _pch, &header ); | 743 | const unsigned char* pdata = pcap_next( _pch, &header ); |
744 | qDebug( "<== OPacketCapturer::next()" ); | ||
745 | |||
549 | if ( header.len ) | 746 | if ( header.len ) |
@@ -579,7 +776,7 @@ bool OPacketCapturer::open( const QString& name ) | |||
579 | 776 | ||
580 | // in case we have a qapp, create a socket notifier | 777 | // in case we have an application object, create a socket notifier |
581 | if ( qApp ) | 778 | if ( qApp ) |
582 | { | 779 | { |
583 | QSocketNotifier* sn = new QSocketNotifier( fileno(), QSocketNotifier::Read, this ); | 780 | _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); |
584 | connect( sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); | 781 | connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); |
585 | } | 782 | } |