-rw-r--r-- | libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp | 11 | ||||
-rw-r--r-- | libopie2/opiecore/oapplication.cpp | 14 | ||||
-rw-r--r-- | libopie2/opiecore/oapplication.h | 16 | ||||
-rw-r--r-- | libopie2/opienet/802_11_user.h | 54 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 40 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 7 | ||||
-rw-r--r-- | libopie2/opienet/opcap.cpp | 253 | ||||
-rw-r--r-- | libopie2/opienet/opcap.h | 166 |
8 files changed, 481 insertions, 80 deletions
diff --git a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp index aec9cc7..7581888 100644 --- a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp +++ b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp @@ -171,14 +171,17 @@ public slots: OWaveLanManagementPacket* beacon = (OWaveLanManagementPacket*) p->child( "802.11 Management" ); if ( beacon ) { - if ( stations.find( beacon->SSID() ) ) - stations[beacon->SSID()]->beacons++; + OWaveLanManagementSSID* ssid = static_cast<OWaveLanManagementSSID*>( p->child( "802.11 SSID" ) ); + QString essid = ssid ? ssid->ID() : "<unknown>"; + + if ( stations.find( essid ) ) + stations[essid]->beacons++; else { - printf( "found new network @ channel %d, SSID = '%s'\n", wiface->channel(), (const char*) beacon->SSID() ); - stations.insert( beacon->SSID(), new Station( "unknown", wiface->channel(), + printf( "found new network @ channel %d, SSID = '%s'\n", wiface->channel(), (const char*) essid ); + stations.insert( essid, new Station( "unknown", wiface->channel(), ((OWaveLanPacket*) beacon->parent())->usesWep() ) ); } } } diff --git a/libopie2/opiecore/oapplication.cpp b/libopie2/opiecore/oapplication.cpp index a0abcc2..12418d5 100644 --- a/libopie2/opiecore/oapplication.cpp +++ b/libopie2/opiecore/oapplication.cpp @@ -91,13 +91,15 @@ void OApplication::init() qFatal( "OApplication: Can't create more than one OApplication object. Aborting." ); } } + void OApplication::setMainWidget( QWidget* widget ) { showMainWidget( widget ); } + void OApplication::showMainWidget( QWidget* widget, bool nomax ) { #ifdef Q_WS_QWS QPEApplication::showMainWidget( widget, nomax ); @@ -105,6 +107,18 @@ void OApplication::showMainWidget( QWidget* widget, bool nomax ) QApplication::setMainWidget( widget ); widget->show(); #endif widget->setCaption( _appname ); +} + +void OApplication::setTitle( QString title ) const +{ + if ( mainWidget() ) + { + if ( !title.isNull() ) + mainWidget()->setCaption( QString(_appname) + QString( " - " ) + title ); + else + mainWidget()->setCaption( _appname ); + } } + diff --git a/libopie2/opiecore/oapplication.h b/libopie2/opiecore/oapplication.h index 736e786..4d25202 100644 --- a/libopie2/opiecore/oapplication.h +++ b/libopie2/opiecore/oapplication.h @@ -68,8 +68,9 @@ class OApplication: public OApplicationBaseClass * allows access to the single global OApplication object, since * more than one cannot be created in the same application. It * saves you the trouble of having to pass the pointer explicitly * to every function that may require it. + * * @return the current application object */ static const OApplication* oApplication() { return _instance; }; @@ -91,17 +92,32 @@ class OApplication: public OApplicationBaseClass /** * Sets the main widget - reimplemented to call showMainWidget() * on Qt/Embedded. + * + * @param mainWidget the widget to become the main widget + * @see QWidget object */ virtual void setMainWidget( QWidget *mainWidget ); /** * Shows the main widget - reimplemented to call setMainWidget() * on platforms other than Qt/Embedded. + * + * @param mainWidget the widget to become the main widget + * @see QWidget object */ virtual void showMainWidget( QWidget* widget, bool nomax = false ); + /** + * Set the application title. The application title will be concatenated + * to the application name given in the constructor. + * + * @param title the title. If not given, resets caption to appname + */ + virtual void setTitle( QString title = QString::null ) const; + //virtual void setTitle() const; + protected: void init(); private: diff --git a/libopie2/opienet/802_11_user.h b/libopie2/opienet/802_11_user.h index 0b3f198..ffdcb93 100644 --- a/libopie2/opienet/802_11_user.h +++ b/libopie2/opienet/802_11_user.h @@ -254,13 +254,13 @@ struct ieee_802_11_data_header { // u_int16_t gapLen; // u_int8_t gap[8]; }; -#define CAPABILITY_ESS(cap) ((cap) & 0x0001) -#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) -#define CAPABILITY_CFP(cap) ((cap) & 0x0004) -#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) -#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) +#define CAPABILITY_ESS(cap) ((cap) & 0x0001) +#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) +#define CAPABILITY_CFP(cap) ((cap) & 0x0004) +#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) +#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) struct ssid_t { u_int8_t element_id; u_int8_t length; @@ -317,37 +317,45 @@ struct tim_t { u_int8_t bitmap_control; u_int8_t bitmap[251]; }; -#define E_SSID 0 -#define E_RATES 1 -#define E_FH 2 -#define E_DS 3 -#define E_CF 4 -#define E_TIM 5 -#define E_IBSS 6 -#define E_CHALLENGE 16 -#define E_CISCO 133 + +struct ibss_t { + u_int8_t element_id; + u_int8_t length; + u_int16_t atim_window; +}; + + +#define E_SSID 0 +#define E_RATES 1 +#define E_FH 2 +#define E_DS 3 +#define E_CF 4 +#define E_TIM 5 +#define E_IBSS 6 +#define E_CHALLENGE 16 +#define E_CISCO 133 struct ieee_802_11_mgmt_body { - u_int8_t timestamp[8]; - u_int16_t beacon_interval; + u_int8_t timestamp[8]; + u_int16_t beacon_interval; // u_int16_t listen_interval; // u_int16_t status_code; // u_int16_t aid; // u_char ap[6]; // u_int16_t reason_code; // u_int16_t auth_alg; // u_int16_t auth_trans_seq_num; // struct challenge_t challenge; - u_int16_t capability_info; - struct ssid_t ssid; - struct rates_t rates; - struct ds_t ds; - struct cf_t cf; - struct fh_t fh; - struct tim_t tim; + u_int16_t capability_info; +// struct ssid_t ssid; +// struct rates_t rates; +// struct ds_t ds; +// struct cf_t cf; +// struct fh_t fh; +// struct tim_t tim; }; struct ieee_802_11_data_body { diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 1d3b9fe..25c70e0 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -290,9 +290,10 @@ bool ONetworkInterface::isWireless() const *======================================================================================*/ OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface ) :QObject( 0, "Mickey's funky hopper" ), - _iface( iface ), _interval( 0 ), _channel( 0 ), _tid( 0 ) + _iface( iface ), _interval( 0 ), _channel( 1 ), _tid( 0 ), + _maxChannel( iface->channels()+1 ) { } @@ -300,12 +301,23 @@ OChannelHopper::~OChannelHopper() { } +bool OChannelHopper::isActive() const +{ + return _tid; +} + + +int OChannelHopper::channel() const +{ + return _channel; +} + + void OChannelHopper::timerEvent( QTimerEvent* ) { - //FIXME: Get available channels from OWirelessNetworkInterface - if ( --_channel < 0 ) _channel = 13; + if ( !--_channel ) _channel = _maxChannel; _iface->setChannel( _channel ); qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'", _channel, (const char*) _iface->name() ); } @@ -318,8 +330,9 @@ void OChannelHopper::setInterval( int interval ) if ( _interval ) killTimer( _tid ); + _tid = 0; _interval = interval; if ( _interval ) { @@ -338,9 +351,9 @@ int OChannelHopper::interval() const * OWirelessNetworkInterface *======================================================================================*/ OWirelessNetworkInterface::OWirelessNetworkInterface( const QString& name ) - :ONetworkInterface( name ), _hopper( this ) + :ONetworkInterface( name ), _hopper( 0 ) { qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" ); init(); } @@ -375,15 +388,12 @@ void OWirelessNetworkInterface::init() qDebug( "OWirelessNetworkInterface::init(): SIOCGIWRANGE failed (%s)", strerror( errno ) ); return; } - //TODO: Find out what the difference between num_channel and - // num_frequency is about. - for ( int i = 0; i < range.num_frequency; ++i ) { int freq = (int) ( double( range.freq[i].m ) * pow( 10, range.freq[i].e ) / 1000000.0 ); - _channels.insert( freq, i ); + _channels.insert( freq, i+1 ); } } @@ -411,15 +421,20 @@ QString OWirelessNetworkInterface::associatedAP() const int OWirelessNetworkInterface::channel() const { + //FIXME: When monitoring enabled, then use it + //FIXME: to gather the current RF channel + //FIXME: Until then, get active channel from hopper. + if ( _hopper && _hopper->isActive() ) + return _hopper->channel(); + if ( !wioctl( SIOCGIWFREQ ) ) { return -1; } else { - //FIXME: This is off-by-one !? Why? return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10, _iwr.u.freq.e ) / 1000000) ]; } } @@ -460,15 +475,17 @@ int OWirelessNetworkInterface::channels() const void OWirelessNetworkInterface::setChannelHopping( int interval ) { - _hopper.setInterval( interval ); + if ( !_hopper ) _hopper = new OChannelHopper( this ); + _hopper->setInterval( interval ); + //FIXME: When and by whom will the channel hopper be deleted? } int OWirelessNetworkInterface::channelHopping() const { - return _hopper.interval(); + return _hopper->interval(); } void OWirelessNetworkInterface::setMonitorMode( bool b ) @@ -478,8 +495,9 @@ void OWirelessNetworkInterface::setMonitorMode( bool b ) else qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); } + bool OWirelessNetworkInterface::monitorMode() const { return _mon ? _mon->enabled() : false; } diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index 9a68a74..936ac85 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -141,8 +141,10 @@ class OChannelHopper : public QObject { public: OChannelHopper( OWirelessNetworkInterface* ); virtual ~OChannelHopper(); + bool isActive() const; + int channel() const; virtual void timerEvent( QTimerEvent* ); void setInterval( int ); int interval() const; @@ -150,8 +152,9 @@ class OChannelHopper : public QObject OWirelessNetworkInterface* _iface; int _interval; int _channel; int _tid; + int _maxChannel; }; /*====================================================================================== @@ -183,9 +186,9 @@ class OWirelessNetworkInterface : public ONetworkInterface virtual void setMonitorMode( bool ); virtual bool monitorMode() const; - virtual void setChannelHopping( int interval ); + virtual void setChannelHopping( int interval = 0 ); virtual int channelHopping() const; virtual void setNickName( const QString& ) {}; virtual QString nickName() const; @@ -206,9 +209,9 @@ class OWirelessNetworkInterface : public ONetworkInterface bool wioctl( int call ) const; bool wioctl( int call, iwreqstruct& ) const; private: - OChannelHopper _hopper; + OChannelHopper* _hopper; }; /*====================================================================================== 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 @@ -48,17 +48,20 @@ OPacket::OPacket( packetheaderstruct header, const unsigned char* data, QObject* :QObject( parent, "Generic" ), _hdr( header ), _data( data ) { qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); + _end = (unsigned char*) data + header.len; + qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); + if ( packetCapturer()->dataLink() == DLT_EN10MB ) { qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); - new OEthernetPacket( (const struct ether_header*) data, this ); + new OEthernetPacket( _end, (const struct ether_header*) data, this ); } else { qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); - new OWaveLanPacket( (const struct ieee_802_11_header*) data, this ); + new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); } } @@ -108,9 +111,9 @@ int OPacket::len() const /*====================================================================================== * OEthernetPacket *======================================================================================*/ -OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* parent ) +OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) :QObject( parent, "Ethernet" ), _ether( data ) { @@ -123,9 +126,9 @@ OEthernetPacket::OEthernetPacket( const struct ether_header* data, QObject* pare qDebug( "Destination is broadcast address" ); switch ( type() ) { - case ETHERTYPE_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break; + case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); } @@ -159,9 +162,9 @@ int OEthernetPacket::type() const * OIPPacket *======================================================================================*/ -OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent ) +OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) :QObject( parent, "IP" ), _iphdr( data ) { qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); @@ -173,10 +176,10 @@ OIPPacket::OIPPacket( const struct iphdr* data, QObject* parent ) qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); switch ( protocol() ) { - case IPPROTO_UDP: new OUDPPacket( (const struct udphdr*) (data+1), this ); break; - case IPPROTO_TCP: new OTCPPacket( (const struct tcphdr*) (data+1), this ); break; + case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; + case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); } } @@ -243,9 +246,9 @@ int OIPPacket::checksum() const * OUDPPacket *======================================================================================*/ -OUDPPacket::OUDPPacket( const struct udphdr* data, QObject* parent ) +OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) :QObject( parent, "UDP" ), _udphdr( data ) { qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); @@ -260,9 +263,9 @@ OUDPPacket::~OUDPPacket() * OTCPPacket *======================================================================================*/ -OTCPPacket::OTCPPacket( const struct tcphdr* data, QObject* parent ) +OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) :QObject( parent, "TCP" ), _tcphdr( data ) { qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); @@ -277,9 +280,9 @@ OTCPPacket::~OTCPPacket() * OWaveLanPacket *======================================================================================*/ -OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* parent ) +OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) :QObject( parent, "802.11" ), _wlanhdr( data ) { qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." ); @@ -294,11 +297,11 @@ OWaveLanPacket::OWaveLanPacket( const struct ieee_802_11_header* data, QObject* qDebug( "MAC4: %s", (const char*) macAddress4().toString() ); switch ( type() ) { - case T_MGMT: new OWaveLanManagementPacket( (const struct ieee_802_11_mgmt_header*) data, this ); break; - case T_DATA: new OWaveLanDataPacket( (const struct ieee_802_11_data_header*) data, this ); break; - //case T_CTRL: new OWaveLanControlPacket( (const struct ieee_802_11_ctrl_header*) data, this ); break; + case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; + case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; + //case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_ctrl_header*) data, this ); break; default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown type!" ); } } @@ -382,9 +385,9 @@ bool OWaveLanPacket::usesWep() const /*====================================================================================== * OWaveLanManagementPacket *======================================================================================*/ -OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) +OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) :QObject( parent, "802.11 Management" ), _header( data ), _body( (const struct ieee_802_11_mgmt_body*) (data+1) ) { qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." ); @@ -392,12 +395,29 @@ OWaveLanManagementPacket::OWaveLanManagementPacket( const struct ieee_802_11_mgm switch ( ((OWaveLanPacket*) this->parent() )->subType() ) { case ST_BEACON: { - qDebug( "TYPE: BEACON FRAME" ); - qDebug( "ESSID: %s", (const char*) SSID() ); - break; + // nice, received a beacon... + } + } + + // grab tagged values + const unsigned char* ptr = (const unsigned char*) (_body+1); + while (ptr < end) + { + switch ( *ptr ) + { + case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; + case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; + case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; + case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; + case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; + case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; + case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; + case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; } + ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value + ptr+= 2; // skip tag ID and length } } @@ -405,24 +425,193 @@ OWaveLanManagementPacket::~OWaveLanManagementPacket() { } -QString OWaveLanManagementPacket::SSID() const +int OWaveLanManagementPacket::beaconInterval() const +{ + return EXTRACT_LE_16BITS( &_body->beacon_interval ); +} + + +int OWaveLanManagementPacket::capabilities() const +{ + return EXTRACT_LE_16BITS( &_body->capability_info ); +} + + +bool OWaveLanManagementPacket::canESS() const { - int length = _body->ssid.length; + return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); +} + + +bool OWaveLanManagementPacket::canIBSS() const +{ + return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); +} + + +bool OWaveLanManagementPacket::canCFP() const +{ + return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); +} + + +bool OWaveLanManagementPacket::canCFP_REQ() const +{ + return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); +} + + +bool OWaveLanManagementPacket::canPrivacy() const +{ + return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); +} + + +/*====================================================================================== + * OWaveLanManagementSSID + *======================================================================================*/ + +OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) + :QObject( parent, "802.11 SSID" ), _data( data ) +{ + qDebug( "OWaveLanManagementSSID()" ); +} + + +OWaveLanManagementSSID::~OWaveLanManagementSSID() +{ +} + + +QString OWaveLanManagementSSID::ID() const +{ + int length = _data->length; if ( length > 32 ) length = 32; char essid[length+1]; - memcpy( &essid, _body->ssid.ssid, length ); + memcpy( &essid, &_data->ssid, length ); essid[length] = 0x0; return essid; } /*====================================================================================== + * OWaveLanManagementRates + *======================================================================================*/ + +OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) + :QObject( parent, "802.11 Rates" ), _data( data ) +{ + qDebug( "OWaveLanManagementRates()" ); +} + + +OWaveLanManagementRates::~OWaveLanManagementRates() +{ +} + +/*====================================================================================== + * OWaveLanManagementCF + *======================================================================================*/ + +OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) + :QObject( parent, "802.11 CF" ), _data( data ) +{ + qDebug( "OWaveLanManagementCF()" ); +} + + +OWaveLanManagementCF::~OWaveLanManagementCF() +{ +} + +/*====================================================================================== + * OWaveLanManagementFH + *======================================================================================*/ + +OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent ) + :QObject( parent, "802.11 FH" ), _data( data ) +{ + qDebug( "OWaveLanManagementFH()" ); +} + + +OWaveLanManagementFH::~OWaveLanManagementFH() +{ +} + +/*====================================================================================== + * OWaveLanManagementDS + *======================================================================================*/ + +OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent ) + :QObject( parent, "802.11 DS" ), _data( data ) +{ + qDebug( "OWaveLanManagementDS()" ); +} + + +OWaveLanManagementDS::~OWaveLanManagementDS() +{ +} + + +int OWaveLanManagementDS::channel() const +{ + return _data->channel; +} + +/*====================================================================================== + * OWaveLanManagementTim + *======================================================================================*/ + +OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent ) + :QObject( parent, "802.11 Tim" ), _data( data ) +{ + qDebug( "OWaveLanManagementTim()" ); +} + + +OWaveLanManagementTim::~OWaveLanManagementTim() +{ +} + +/*====================================================================================== + * OWaveLanManagementIBSS + *======================================================================================*/ + +OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent ) + :QObject( parent, "802.11 IBSS" ), _data( data ) +{ + qDebug( "OWaveLanManagementIBSS()" ); +} + + +OWaveLanManagementIBSS::~OWaveLanManagementIBSS() +{ +} + +/*====================================================================================== + * OWaveLanManagementChallenge + *======================================================================================*/ + +OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent ) + :QObject( parent, "802.11 Challenge" ), _data( data ) +{ + qDebug( "OWaveLanManagementChallenge()" ); +} + + +OWaveLanManagementChallenge::~OWaveLanManagementChallenge() +{ +} + +/*====================================================================================== * OWaveLanDataPacket *======================================================================================*/ -OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) +OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) :QObject( parent, "802.11 Data" ), _header( data ) { //qDebug( "size of header = %d", sizeof( struct ieee_802_11_data_header ) ); //qDebug( "header: %0x", data ); @@ -430,9 +619,9 @@ OWaveLanDataPacket::OWaveLanDataPacket( const struct ieee_802_11_data_header* da //qDebug( "payload: %0x", payload ); if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address - new OLLCPacket( (const struct ieee_802_11_802_2_header*) payload, this ); + new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); } OWaveLanDataPacket::~OWaveLanDataPacket() @@ -443,9 +632,9 @@ OWaveLanDataPacket::~OWaveLanDataPacket() /*====================================================================================== * OLLCPacket *======================================================================================*/ -OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent ) +OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) :QObject( parent, "802.11 802_2" ), _header( data ) { qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." ); @@ -454,9 +643,9 @@ OLLCPacket::OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* pa qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) ); switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h { - case ETH_P_IP: new OIPPacket( (const struct iphdr*) (data+1), this ); break; + case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; default: qDebug( "OLLCPacket::OLLCPacket(): Unknown Encapsulation Type" ); } } @@ -472,9 +661,9 @@ OLLCPacket::~OLLCPacket() *======================================================================================*/ OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) :QObject( parent, name ), _name( QString::null ), _open( false ), - _pch( 0 ) + _pch( 0 ), _sn( 0 ) { } @@ -516,8 +705,13 @@ bool OPacketCapturer::blocking() const void OPacketCapturer::close() { if ( _open ) { + if ( _sn ) + { + _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); + delete _sn; + } pcap_close( _pch ); _open = false; } } @@ -544,9 +738,12 @@ int OPacketCapturer::fileno() const OPacket* OPacketCapturer::next() { packetheaderstruct header; + qDebug( "==> OPacketCapturer::next()" ); const unsigned char* pdata = pcap_next( _pch, &header ); + qDebug( "<== OPacketCapturer::next()" ); + if ( header.len ) return new OPacket( header, pdata, this ); else return 0; @@ -576,13 +773,13 @@ bool OPacketCapturer::open( const QString& name ) qDebug( "OPacketCapturer::open(): libpcap opened successfully." ); _pch = handle; _open = true; - // in case we have a qapp, create a socket notifier + // in case we have an application object, create a socket notifier if ( qApp ) { - QSocketNotifier* sn = new QSocketNotifier( fileno(), QSocketNotifier::Read, this ); - connect( sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); + _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); + connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); } return true; } diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h index 65c550c..0b06572 100644 --- a/libopie2/opienet/opcap.h +++ b/libopie2/opienet/opcap.h @@ -59,8 +59,9 @@ typedef struct timeval timevalstruct; typedef struct pcap_pkthdr packetheaderstruct; /* FORWARDS */ class OPacketCapturer; +class QSocketNotifier; /*====================================================================================== * OPacket - A frame on the wire *======================================================================================*/ @@ -83,8 +84,9 @@ class OPacket : public QObject private: const packetheaderstruct _hdr; // pcap packet header const unsigned char* _data; // pcap packet data + const unsigned char* _end; // end of pcap packet data }; /*====================================================================================== * OEthernetPacket - DLT_EN10MB frame @@ -94,9 +96,9 @@ class OEthernetPacket : public QObject { Q_OBJECT public: - OEthernetPacket( const struct ether_header*, QObject* parent = 0 ); + OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 ); virtual ~OEthernetPacket(); OMacAddress sourceAddress() const; OMacAddress destinationAddress() const; @@ -115,9 +117,9 @@ class OWaveLanPacket : public QObject { Q_OBJECT public: - OWaveLanPacket( const struct ieee_802_11_header*, QObject* parent = 0 ); + OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 ); virtual ~OWaveLanPacket(); int duration() const; bool fromDS() const; @@ -145,29 +147,168 @@ class OWaveLanManagementPacket : public QObject { Q_OBJECT public: - OWaveLanManagementPacket( const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); + OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); virtual ~OWaveLanManagementPacket(); - QString SSID() const; + int beaconInterval() const; + int capabilities() const; // generic + + bool canESS() const; + bool canIBSS() const; + bool canCFP() const; + bool canCFP_REQ() const; + bool canPrivacy() const; private: const struct ieee_802_11_mgmt_header* _header; const struct ieee_802_11_mgmt_body* _body; }; /*====================================================================================== + * OWaveLanManagementSSID + *======================================================================================*/ + +class OWaveLanManagementSSID : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementSSID(); + + QString ID() const; + + private: + const struct ssid_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementRates + *======================================================================================*/ + +class OWaveLanManagementRates : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementRates(); + + private: + const struct rates_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementCF + *======================================================================================*/ + +class OWaveLanManagementCF : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementCF(); + + private: + const struct cf_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementFH + *======================================================================================*/ + +class OWaveLanManagementFH : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementFH(); + + private: + const struct fh_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementDS + *======================================================================================*/ + +class OWaveLanManagementDS : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementDS(); + + int channel() const; + + private: + const struct ds_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementTim + *======================================================================================*/ + +class OWaveLanManagementTim : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementTim(); + + private: + const struct tim_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementIBSS + *======================================================================================*/ + +class OWaveLanManagementIBSS : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementIBSS(); + + private: + const struct ibss_t* _data; +}; + +/*====================================================================================== + * OWaveLanManagementChallenge + *======================================================================================*/ + +class OWaveLanManagementChallenge : public QObject +{ + Q_OBJECT + + public: + OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 ); + virtual ~OWaveLanManagementChallenge(); + + private: + const struct challenge_t* _data; +}; + +/*====================================================================================== * OWaveLanDataPacket - type: data (T_DATA) *======================================================================================*/ class OWaveLanDataPacket : public QObject { Q_OBJECT public: - OWaveLanDataPacket( const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 ); + OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 ); virtual ~OWaveLanDataPacket(); private: const struct ieee_802_11_data_header* _header; @@ -181,9 +322,9 @@ class OLLCPacket : public QObject { Q_OBJECT public: - OLLCPacket( const struct ieee_802_11_802_2_header* data, QObject* parent = 0 ); + OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 ); virtual ~OLLCPacket(); private: const struct ieee_802_11_802_2_header* _header; @@ -197,9 +338,9 @@ class OIPPacket : public QObject { Q_OBJECT public: - OIPPacket( const struct iphdr*, QObject* parent = 0 ); + OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 ); virtual ~OIPPacket(); QHostAddress fromIPAddress() const; QHostAddress toIPAddress() const; @@ -224,9 +365,9 @@ class OUDPPacket : public QObject { Q_OBJECT public: - OUDPPacket( const struct udphdr*, QObject* parent = 0 ); + OUDPPacket( const unsigned char*, const struct udphdr*, QObject* parent = 0 ); virtual ~OUDPPacket(); int fromPort() const; int toPort() const; @@ -243,9 +384,9 @@ class OTCPPacket : public QObject { Q_OBJECT public: - OTCPPacket( const struct tcphdr*, QObject* parent = 0 ); + OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 ); virtual ~OTCPPacket(); int fromPort() const; int toPort() const; @@ -283,11 +424,12 @@ class OPacketCapturer : public QObject protected slots: void readyToReceive(); protected: - QString _name; // devicename - bool _open; // check this before doing pcap calls - pcap_t* _pch; // pcap library handle + QString _name; // devicename + bool _open; // check this before doing pcap calls + pcap_t* _pch; // pcap library handle + QSocketNotifier* _sn; // socket notifier for main loop mutable char _errbuf[PCAP_ERRBUF_SIZE]; }; #endif // OPCAP_H |