-rw-r--r-- | libopie2/examples/opiecore/odebugdemo/odebugdemo.pro | 3 | ||||
-rw-r--r-- | libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp | 37 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 106 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 16 |
4 files changed, 107 insertions, 55 deletions
diff --git a/libopie2/examples/opiecore/odebugdemo/odebugdemo.pro b/libopie2/examples/opiecore/odebugdemo/odebugdemo.pro index c52cd02..aa37394 100644 --- a/libopie2/examples/opiecore/odebugdemo/odebugdemo.pro +++ b/libopie2/examples/opiecore/odebugdemo/odebugdemo.pro @@ -9,3 +9,2 @@ TARGET = odebugdemo -MOC_DIR = moc OBJECTS_DIR = obj @@ -19 +18,3 @@ contains( platform, x11 ) { } + +MOC_DIR = moc diff --git a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp index 21026e1..06b8b19 100644 --- a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp +++ b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp @@ -4,2 +4,4 @@ +#include <unistd.h> + int main( int argc, char** argv ) @@ -15,2 +17,3 @@ int main( int argc, char** argv ) qDebug( "DEMO: ONetwork contains Interface '%s'", (const char*) it.current()->name() ); + qDebug( "DEMO: Datalink code is '%d'", it.current()->dataLinkType() ); qDebug( "DEMO: MAC Address is '%s'", (const char*) it.current()->macAddress().toString() ); @@ -30,5 +33,7 @@ int main( int argc, char** argv ) //{ - qDebug( "DEMO: Associated AP has MAC Address '%s'", (const char*) iface->associatedAP().toString() ); + //qDebug( "DEMO: Associated AP has MAC Address '%s'", (const char*) iface->associatedAP().toString() ); //} + /* + // nickname @@ -41,2 +46,4 @@ int main( int argc, char** argv ) + /* + // operation mode @@ -59,2 +66,6 @@ int main( int argc, char** argv ) + */ + + /* + // network scan @@ -99,2 +110,26 @@ int main( int argc, char** argv ) + // monitor test + + /* + + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() ); + iface->setMode( "monitor" ); + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() ); + + sleep( 1 ); */ + + iface->setMode( "master" ); + + //sleep( 1 ); + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() ); + + /*iface->setMode( "adhoc" ); + sleep( 1 ); + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() ); + iface->setMode( "managed" ); + sleep( 1 ); + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() ); + iface->setMode( "master" ); + sleep( 1 ); + qDebug( "DEMO: current interface mode is '%s'", (const char*) iface->mode() );*/ diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 50c6679..c329e9a 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -675,6 +675,5 @@ OChannelHopper* OWirelessNetworkInterface::channelHopper() const -void OWirelessNetworkInterface::setMode( const QString& mode ) +void OWirelessNetworkInterface::commit() const { - _iwr.u.mode = stringToMode( mode ); - wioctl( SIOCSIWMODE ); + wioctl( SIOCSIWCOMMIT ); } @@ -682,9 +681,47 @@ void OWirelessNetworkInterface::setMode( const QString& mode ) -QString OWirelessNetworkInterface::mode() const +void OWirelessNetworkInterface::setMode( const QString& newMode ) { - if ( !wioctl( SIOCGIWMODE ) ) + #ifdef FINALIZE + QString currentMode = mode(); + if ( currentMode == newMode ) return; + #endif + + qDebug( "OWirelessNetworkInterface::setMode(): trying to set mode '%s' (%d)", (const char*) newMode, stringToMode( newMode ) ); + + _iwr.u.mode = stringToMode( newMode ); + + if ( _iwr.u.mode != IW_MODE_MONITOR ) { - return "<unknown>"; + // IWR.U.MODE WIRD DURCH ABFRAGE DES MODE HIER PLATTGEMACHT!!!!!!!!!!!!!!!!!!!!! DEPP! + _iwr.u.mode = stringToMode( newMode ); + wioctl( SIOCSIWMODE ); + + // special iwpriv fallback for monitor mode (check if we're really out of monitor mode now) + + if ( mode() == "monitor" ) + { + qDebug( "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not sufficient - trying fallback to iwpriv..." ); + if ( _mon ) + _mon->setEnabled( false ); + else + qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); + } + + } + else // special iwpriv fallback for monitor mode + { + if ( wioctl( SIOCSIWMODE ) ) + { + qDebug( "OWirelessNetworkInterface::setMode(): IW_MODE_MONITOR ok" ); + } + else + { + qDebug( "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not working - trying fallback to iwpriv..." ); + + if ( _mon ) + _mon->setEnabled( true ); + else + qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); + } } - return modeToString( _iwr.u.mode ); } @@ -692,19 +729,24 @@ QString OWirelessNetworkInterface::mode() const -void OWirelessNetworkInterface::setMonitorMode( bool b ) +QString OWirelessNetworkInterface::mode() const { - if ( _mon ) - _mon->setEnabled( b ); - else - qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); -} + memset( &_iwr, 0, sizeof( struct iwreq ) ); + + if ( !wioctl( SIOCGIWMODE ) ) + { + return "<unknown>"; + } + qDebug( "DEBUG: WE's idea of current mode seems to be '%s'", (const char*) modeToString( _iwr.u.mode ) ); -bool OWirelessNetworkInterface::monitorMode() const -{ - qDebug( "dataLinkType = %d", dataLinkType() ); - return ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ); - //FIXME: 802 is the header type for PRISM - Linux support for this is pending... - //FIXME: What is 119, by the way? -} + // legacy compatible monitor mode check + if ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ) + { + return "monitor"; + } + else + { + return modeToString( _iwr.u.mode ); + } +} @@ -971,8 +1013,2 @@ void OMonitoringInterface::setChannel( int c ) -bool OMonitoringInterface::enabled() const -{ - return _if->monitorMode(); -} - - void OMonitoringInterface::setEnabled( bool b ) @@ -1094,11 +1130,2 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) { - // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 - // Wireless Extensions < Version 15 need iwpriv commandos for monitoring - - #if WIRELESS_EXT > 14 - if ( b ) - _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header - else - _if->setMode( "managed" ); - #else int monitorCode = _prismHeader ? 1 : 2; @@ -1112,3 +1139,2 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) } - #endif } @@ -1151,9 +1177,2 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) - #if 0 - //#if WIRELESS_EXT > 14 - if ( b ) - _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header - else - _if->setMode( "managed" ); - #else if ( b ) @@ -1166,3 +1185,2 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) } - #endif } diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index 0eb4542..eb6c86e 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -351,5 +351,4 @@ class OWirelessNetworkInterface : public ONetworkInterface * Possible values are <ul><li>adhoc<li>managed<li>monitor<li>master or <li>unknown - */ - virtual QString mode() const; - /** + * + * @note: Important note concerning the 'monitor' mode: * Setting the monitor mode on a wireless network interface enables @@ -364,7 +363,3 @@ class OWirelessNetworkInterface : public ONetworkInterface */ - virtual void setMonitorMode( bool ); //FIXME: ==> setMode( "monitor" ); Use IW_MONITOR first, if this doesn't work, then use iwpriv! - /** - * @returns true if the device is listening in IEEE 802.11 monitor mode - */ - virtual bool monitorMode() const; //FIXME: ==> mode() + virtual QString mode() const; /** @@ -424,2 +419,6 @@ class OWirelessNetworkInterface : public ONetworkInterface virtual OStationList* scanNetwork(); + /** @internal commit pending changes to the driver + * + */ + void commit() const; @@ -458,3 +457,2 @@ class OMonitoringInterface virtual void setEnabled( bool ); - virtual bool enabled() const; virtual void setChannel( int ); |