summaryrefslogtreecommitdiff
path: root/libopie2/opienet/opcap.cpp
Unidiff
Diffstat (limited to 'libopie2/opienet/opcap.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/opcap.cpp253
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
112OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* parent ) 115OEthernetPacket::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
163OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent ) 166OIPPacket::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
247OUDPPacket::OUDPPacket( const struct udphdr* data, QObject* parent ) 250OUDPPacket::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
264OTCPPacket::OTCPPacket( const struct tcphdr* data, QObject* parent ) 267OTCPPacket::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
281OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* parent ) 284OWaveLanPacket::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
386OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) 389OWaveLanManagementPacket::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
409QString OWaveLanManagementPacket::SSID() const 429int OWaveLanManagementPacket::beaconInterval() const
430{
431 return EXTRACT_LE_16BITS( &_body->beacon_interval );
432}
433
434
435int OWaveLanManagementPacket::capabilities() const
436{
437 return EXTRACT_LE_16BITS( &_body->capability_info );
438}
439
440
441bool OWaveLanManagementPacket::canESS() const
410{ 442{
411 int length = _body->ssid.length; 443 return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) );
444}
445
446
447bool OWaveLanManagementPacket::canIBSS() const
448{
449 return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) );
450}
451
452
453bool OWaveLanManagementPacket::canCFP() const
454{
455 return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) );
456}
457
458
459bool OWaveLanManagementPacket::canCFP_REQ() const
460{
461 return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) );
462}
463
464
465bool OWaveLanManagementPacket::canPrivacy() const
466{
467 return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) );
468}
469
470
471/*======================================================================================
472 * OWaveLanManagementSSID
473 *======================================================================================*/
474
475OWaveLanManagementSSID::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
482OWaveLanManagementSSID::~OWaveLanManagementSSID()
483{
484}
485
486
487QString 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
502OWaveLanManagementRates::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
509OWaveLanManagementRates::~OWaveLanManagementRates()
510{
511}
512
513/*======================================================================================
514 * OWaveLanManagementCF
515 *======================================================================================*/
516
517OWaveLanManagementCF::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
524OWaveLanManagementCF::~OWaveLanManagementCF()
525{
526}
527
528/*======================================================================================
529 * OWaveLanManagementFH
530 *======================================================================================*/
531
532OWaveLanManagementFH::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
539OWaveLanManagementFH::~OWaveLanManagementFH()
540{
541}
542
543/*======================================================================================
544 * OWaveLanManagementDS
545 *======================================================================================*/
546
547OWaveLanManagementDS::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
554OWaveLanManagementDS::~OWaveLanManagementDS()
555{
556}
557
558
559int OWaveLanManagementDS::channel() const
560{
561 return _data->channel;
562}
563
564/*======================================================================================
565 * OWaveLanManagementTim
566 *======================================================================================*/
567
568OWaveLanManagementTim::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
575OWaveLanManagementTim::~OWaveLanManagementTim()
576{
577}
578
579/*======================================================================================
580 * OWaveLanManagementIBSS
581 *======================================================================================*/
582
583OWaveLanManagementIBSS::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
590OWaveLanManagementIBSS::~OWaveLanManagementIBSS()
591{
592}
593
594/*======================================================================================
595 * OWaveLanManagementChallenge
596 *======================================================================================*/
597
598OWaveLanManagementChallenge::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
605OWaveLanManagementChallenge::~OWaveLanManagementChallenge()
606{
607}
608
609/*======================================================================================
421 * OWaveLanDataPacket 610 * OWaveLanDataPacket
@@ -423,3 +612,3 @@ QString OWaveLanManagementPacket::SSID() const
423 612
424OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) 613OWaveLanDataPacket::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
447OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent ) 636OLLCPacket::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 }