author | mickeyl <mickeyl> | 2003-10-11 23:54:03 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-10-11 23:54:03 (UTC) |
commit | a8fe3ba1544ca2a2ad2559e3094acbb284cc7783 (patch) (side-by-side diff) | |
tree | ef60fa83b396d16580f5ce7ab2b5c147fbceeabf /libopie2 | |
parent | e6273e146d3ef3f9387fbc3b6a214f9b3d08221e (diff) | |
download | opie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.zip opie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.tar.gz opie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.tar.bz2 |
add scanning skeleton (wip)
-rw-r--r-- | libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp | 12 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 113 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 29 |
3 files changed, 131 insertions, 23 deletions
diff --git a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp index 607d8f1..fc2026f 100644 --- a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp +++ b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp @@ -57,4 +57,16 @@ int main( int argc, char** argv ) iface->setMode( "managed" ); + // network scan + + int stations = iface->scanNetwork(); + if ( stations != -1 ) + { + qDebug( "DEMO: # of stations around = %d", stations ); + } + else + { + qDebug( "DEMO: Warning! Scan didn't work!" ); + } + /* diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index dc2e388..be45924 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -77,4 +77,5 @@ void ONetwork::synchronize() //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices + //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev _interfaces.clear(); @@ -189,7 +190,7 @@ bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const int result = ::ioctl( _sfd, call, &ifreq ); if ( result == -1 ) - qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) ); + qDebug( "ONetworkInterface::ioctl (%s) call %d (0x%04X) - Status: Failed: %d (%s)", name(), call, call, result, strerror( errno ) ); else - qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Ok.", name(), call ); + qDebug( "ONetworkInterface::ioctl (%s) call %d (0x%04X) - Status: Ok.", name(), call, call ); return ( result != -1 ); } @@ -455,6 +456,14 @@ void OWirelessNetworkInterface::init() qDebug( "OWirelessNetworkInterface::init()" ); memset( &_iwr, 0, sizeof( struct iwreq ) ); - buildChannelList(); + buildInformation(); buildPrivateList(); + dumpInformation(); +} + + +bool OWirelessNetworkInterface::isAssociated() const +{ + //FIXME: handle different modes + return associatedAP() != "44:44:44:44:44:44"; } @@ -483,5 +492,5 @@ QString OWirelessNetworkInterface::associatedAP() const -void OWirelessNetworkInterface::buildChannelList() +void OWirelessNetworkInterface::buildInformation() { //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck @@ -506,5 +515,5 @@ void OWirelessNetworkInterface::buildChannelList() if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) { - qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) ); + qDebug( "OWirelessNetworkInterface::buildInformation(): SIOCGIWRANGE failed (%s) - using default values.", strerror( errno ) ); _channels.insert( 2412, 1 ); // 2.412 GHz _channels.insert( 2417, 2 ); // 2.417 GHz @@ -518,4 +527,6 @@ void OWirelessNetworkInterface::buildChannelList() _channels.insert( 2457, 10 ); // 2.457 GHz _channels.insert( 2462, 11 ); // 2.462 GHz + + memset( &_range, 0, sizeof( struct iw_range ) ); } else @@ -528,6 +539,6 @@ void OWirelessNetworkInterface::buildChannelList() if (max > 0) { - qWarning( "OWirelessNetworkInterface::buildChannelList(): Driver for wireless interface '%s'" - "overwrote buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) ); + qWarning( "OWirelessNetworkInterface::buildInformation(): Driver for wireless interface '%s' sucks!\n" + "It overwrote the buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) ); } // </check if the driver overwrites stuff> @@ -536,5 +547,5 @@ void OWirelessNetworkInterface::buildChannelList() memcpy( &range, buffer, sizeof range ); - qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency ); + qDebug( "OWirelessNetworkInterface::buildInformation(): Interface %s reported to have %d channels.", name(), range.num_frequency ); for ( int i = 0; i < range.num_frequency; ++i ) { @@ -544,5 +555,6 @@ void OWirelessNetworkInterface::buildChannelList() } - qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." ); + memcpy( &_range, buffer, sizeof( struct iw_range ) ); + qDebug( "OWirelessNetworkInterface::buildInformation(): Information block constructed." ); free(buffer); } @@ -573,4 +585,15 @@ void OWirelessNetworkInterface::buildPrivateList() +void OWirelessNetworkInterface::dumpInformation() const +{ + qDebug( "OWirelessNetworkInterface::() -------------- dumping information block ----------------" ); + + qDebug( " - driver's idea of maximum throughput is %d bps = %d byte/s = %d Kb/s = %f.2 Mb/s", _range.throughput, _range.throughput / 8, _range.throughput / 8 / 1024, float( _range.throughput ) / 8.0 / 1024.0 / 1024.0 ); + qDebug( " - driver for '%s' has been compiled against WE V%d (source=V%d)", name(), _range.we_version_compiled, _range.we_version_source ); + + qDebug( "OWirelessNetworkInterface::() ---------------------------------------------------------" ); +} + + int OWirelessNetworkInterface::channel() const { @@ -662,7 +685,5 @@ void OWirelessNetworkInterface::setMode( const QString& mode ) else if ( mode == "repeater" ) _iwr.u.mode = IW_MODE_REPEAT; else if ( mode == "secondary" ) _iwr.u.mode = IW_MODE_SECOND; - #if WIRELESS_EXT > 14 else if ( mode == "monitor" ) _iwr.u.mode = IW_MODE_MONITOR; - #endif else { @@ -688,7 +709,5 @@ QString OWirelessNetworkInterface::mode() const case IW_MODE_REPEAT: return "repeater"; case IW_MODE_SECOND: return "secondary"; - #if WIRELESS_EXT > 14 case IW_MODE_MONITOR: return "monitor"; - #endif default: assert( 0 ); // shouldn't happen } @@ -709,5 +728,6 @@ bool OWirelessNetworkInterface::monitorMode() const qDebug( "dataLinkType = %d", dataLinkType() ); return ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ); - // 802 is the header type for PRISM - Linux support for this is pending... + //FIXME: 802 is the header type for PRISM - Linux support for this is pending... + //FIXME: What is 119, by the way? } @@ -801,11 +821,72 @@ void OWirelessNetworkInterface::setSSID( const QString& ssid ) +int OWirelessNetworkInterface::scanNetwork() +{ + _iwr.u.param.flags = IW_SCAN_DEFAULT; + _iwr.u.param.value = 0; + if ( !wioctl( SIOCSIWSCAN ) ) + { + return -1; + } + + int timeout = 1000000; + + qDebug( "ONetworkInterface::scanNetwork() - scan started." ); + + bool results = false; + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 250000; // initial timeout ~ 250ms + char buffer[IW_SCAN_MAX_DATA]; + + while ( !results && timeout > 0 ) + { + timeout -= tv.tv_usec; + select( 0, 0, 0, 0, &tv ); + + _iwr.u.data.pointer = &buffer[0]; + _iwr.u.data.flags = 0; + _iwr.u.data.length = sizeof buffer; + if ( wioctl( SIOCGIWSCAN ) ) + { + results = true; + continue; + } + else if ( errno == EAGAIN) + { + qDebug( "ONetworkInterface::scanNetwork() - scan in progress..." ); + #if 0 + if ( qApp ) + { + qApp->processEvents( 100 ); + continue; + } + #endif + tv.tv_sec = 0; + tv.tv_usec = 100000; + continue; + } + } + + qDebug( "ONetworkInterface::scanNetwork() - scan finished." ); + + if ( results ) + { + qDebug( " - results are in!" ); + } + else + { + qDebug( " - no results :(" ); + } +} + + bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const { int result = ::ioctl( _sfd, call, &iwreq ); if ( result == -1 ) - qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) ); + qDebug( "ONetworkInterface::wioctl (%s) call %d (0x%04X) - Status: Failed: %d (%s)", name(), call, call, result, strerror( errno ) ); else - qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call ); + qDebug( "ONetworkInterface::wioctl (%s) call %d (0x%04X) - Status: Ok.", name(), call, call ); return ( result != -1 ); } diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index b170ea2..e1545dd 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -362,5 +362,5 @@ class OWirelessNetworkInterface : public ONetworkInterface * @see OMonitoringInterface */ - virtual void setMonitorMode( bool ); //FIXME: ==> setMode( "monitor" ); + 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 @@ -398,10 +398,12 @@ class OWirelessNetworkInterface : public ONetworkInterface virtual bool hasPrivate( const QString& command ); virtual void getPrivate( const QString& command ); //FIXME: Implement and document this - - virtual bool isAssociated() const {}; //FIXME: Implement and document this /** - * @returns the MAC address of the Access Point if the - * device is in infrastructure mode. @returns a (more or less random) CELL - * address if the device is in adhoc mode. + * @returns true if the interface is associated to an access point + * @note: This information is only valid if the interface is in managed mode. + */ + virtual bool isAssociated() const; + /** + * @returns the MAC address of the Access Point if the device is in infrastructure mode. + * @returns a (more or less random) cell ID address if the device is in adhoc mode. */ virtual QString associatedAP() const; @@ -415,8 +417,14 @@ class OWirelessNetworkInterface : public ONetworkInterface */ virtual QString SSID() const; + /** + * Perform scanning the wireless network neighbourhood. + * @note: UNSTABLE API - UNDER CONSTRUCTION - DON'T USE! + */ + virtual int scanNetwork(); protected: - void buildChannelList(); + void buildInformation(); void buildPrivateList(); + void dumpInformation() const; virtual void init(); struct iwreq& iwr() const; @@ -427,4 +435,5 @@ class OWirelessNetworkInterface : public ONetworkInterface mutable struct iwreq _iwr; QMap<int,int> _channels; + struct iw_range _range; private: @@ -476,8 +485,10 @@ class OCiscoMonitoringInterface : public OMonitoringInterface }; + /*====================================================================================== * OWlanNGMonitoringInterface *======================================================================================*/ + class OWlanNGMonitoringInterface : public OMonitoringInterface { @@ -493,8 +504,10 @@ class OWlanNGMonitoringInterface : public OMonitoringInterface }; + /*====================================================================================== * OHostAPMonitoringInterface *======================================================================================*/ + class OHostAPMonitoringInterface : public OMonitoringInterface { @@ -508,8 +521,10 @@ class OHostAPMonitoringInterface : public OMonitoringInterface }; + /*====================================================================================== * OOrinocoMonitoringInterface *======================================================================================*/ + class OOrinocoMonitoringInterface : public OMonitoringInterface { |