-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 | 98 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 16 |
4 files changed, 103 insertions, 51 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 @@ -7,7 +7,6 @@ DEPENDPATH += $(OPIEDIR)/include LIBS += -lopiecore2 TARGET = odebugdemo -MOC_DIR = moc OBJECTS_DIR = obj !contains( platform, x11 ) { @@ -17,3 +16,5 @@ OBJECTS_DIR = obj contains( platform, x11 ) { LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib } + +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 @@ -2,6 +2,8 @@ #include <opie2/ostation.h> #include <opie2/omanufacturerdb.h> +#include <unistd.h> + int main( int argc, char** argv ) { qDebug( "OPIE Network Demo" ); @@ -13,6 +15,7 @@ int main( int argc, char** argv ) while ( it.current() ) { 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() ); qDebug( "DEMO: MAC Address is '%s'", (const char*) it.current()->macAddress().toString(true) ); qDebug( "DEMO: MAC Manufacturer seems to be '%s'", (const char*) it.current()->macAddress().manufacturer() ); @@ -28,9 +31,11 @@ int main( int argc, char** argv ) //if ( iface->mode() == OWirelessNetworkInterface::adhoc ) //{ - 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 qDebug( "DEMO: Current NickName is '%s'", (const char*) iface->nickName() ); iface->setNickName( "MyNickName" ); @@ -39,6 +44,8 @@ int main( int argc, char** argv ) else qDebug( "DEMO: Nickname change successful." ); + /* + // operation mode qDebug( "DEMO: Current OperationMode is '%s'", (const char*) iface->mode() ); iface->setMode( "adhoc" ); @@ -57,6 +64,10 @@ int main( int argc, char** argv ) iface->setMode( "managed" ); + */ + + /* + // network scan OStationList* stations = iface->scanNetwork(); @@ -97,6 +108,30 @@ 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() );*/ } ++it; 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 @@ -673,40 +673,82 @@ OChannelHopper* OWirelessNetworkInterface::channelHopper() const } -void OWirelessNetworkInterface::setMode( const QString& mode ) +void OWirelessNetworkInterface::commit() const { - _iwr.u.mode = stringToMode( mode ); - wioctl( SIOCSIWMODE ); + wioctl( SIOCSIWCOMMIT ); } -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>"; - } - return modeToString( _iwr.u.mode ); -} + // 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) -void OWirelessNetworkInterface::setMonitorMode( bool b ) + if ( mode() == "monitor" ) { + qDebug( "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not sufficient - trying fallback to iwpriv..." ); if ( _mon ) - _mon->setEnabled( b ); + _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" ); + } + } +} + -bool OWirelessNetworkInterface::monitorMode() const +QString OWirelessNetworkInterface::mode() 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? + 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 ) ); + + // legacy compatible monitor mode check + + if ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ) + { + return "monitor"; + } + else + { + return modeToString( _iwr.u.mode ); + } +} void OWirelessNetworkInterface::setNickName( const QString& nickname ) { @@ -969,12 +1011,6 @@ void OMonitoringInterface::setChannel( int c ) } -bool OMonitoringInterface::enabled() const -{ - return _if->monitorMode(); -} - - void OMonitoringInterface::setEnabled( bool b ) { } @@ -1092,15 +1128,6 @@ OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 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; if ( b ) { @@ -1110,7 +1137,6 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) { _if->setPrivate( "monitor", 1, 0 ); } - #endif } @@ -1149,13 +1175,6 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) // Wireless Extensions < Version 15 need iwpriv commandos for monitoring // However, as of recent orinoco drivers, IW_MODE_MONITOR is still not supported - #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 ) { setChannel( 1 ); @@ -1164,7 +1183,6 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) { _if->setPrivate( "monitor", 2, 0, 0 ); } - #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 @@ -349,9 +349,8 @@ class OWirelessNetworkInterface : public ONetworkInterface /** * @returns the current IEEE 802.11 operation mode. * 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 * listening to IEEE 802.11 data and management frames which normally * are handled by the device firmware. This can be used to detect @@ -362,11 +361,7 @@ class OWirelessNetworkInterface : public ONetworkInterface * the proper @ref OMonitoringInterface to be associated with the interface. * @see OMonitoringInterface */ - 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; /** * Set the channel hopping @a interval. An @a interval of 0 disables channel hopping. * @see OChannelHopper @@ -422,6 +417,10 @@ class OWirelessNetworkInterface : public ONetworkInterface * @note: UNSTABLE API - UNDER CONSTRUCTION - DON'T USE! */ virtual OStationList* scanNetwork(); + /** @internal commit pending changes to the driver + * + */ + void commit() const; protected: void buildInformation(); @@ -456,7 +455,6 @@ class OMonitoringInterface public: virtual void setEnabled( bool ); - virtual bool enabled() const; virtual void setChannel( int ); virtual QString name() const = 0; |