summaryrefslogtreecommitdiff
path: root/libopie2
authormickeyl <mickeyl>2003-10-11 23:54:03 (UTC)
committer mickeyl <mickeyl>2003-10-11 23:54:03 (UTC)
commita8fe3ba1544ca2a2ad2559e3094acbb284cc7783 (patch) (side-by-side diff)
treeef60fa83b396d16580f5ce7ab2b5c147fbceeabf /libopie2
parente6273e146d3ef3f9387fbc3b6a214f9b3d08221e (diff)
downloadopie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.zip
opie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.tar.gz
opie-a8fe3ba1544ca2a2ad2559e3094acbb284cc7783.tar.bz2
add scanning skeleton (wip)
Diffstat (limited to 'libopie2') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp12
-rw-r--r--libopie2/opienet/onetwork.cpp113
-rw-r--r--libopie2/opienet/onetwork.h29
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
{