-rw-r--r-- | libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp | 16 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.cpp | 30 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.h | 7 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 91 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 5 | ||||
-rw-r--r-- | libopie2/opienet/ostation.cpp | 15 | ||||
-rw-r--r-- | libopie2/opienet/ostation.h | 17 |
7 files changed, 115 insertions, 66 deletions
diff --git a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp index fc2026f..21026e1 100644 --- a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp +++ b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp @@ -1,5 +1,6 @@ #include <opie2/onetwork.h> +#include <opie2/ostation.h> #include <opie2/omanufacturerdb.h> int main( int argc, char** argv ) { @@ -26,9 +27,9 @@ int main( int argc, char** argv ) qDebug( "DEMO: Antenna is tuned to '%f', that is channel %d", iface->frequency(), iface->channel() ); //if ( iface->mode() == OWirelessNetworkInterface::adhoc ) //{ - qDebug( "DEMO: Associated AP has MAC Address '%s'", (const char*) iface->associatedAP() ); + qDebug( "DEMO: Associated AP has MAC Address '%s'", (const char*) iface->associatedAP().toString() ); //} // nickname qDebug( "DEMO: Current NickName is '%s'", (const char*) iface->nickName() ); @@ -57,13 +58,20 @@ int main( int argc, char** argv ) iface->setMode( "managed" ); // network scan - int stations = iface->scanNetwork(); - if ( stations != -1 ) + OStationList* stations = iface->scanNetwork(); + if ( stations ) { - qDebug( "DEMO: # of stations around = %d", stations ); + qDebug( "DEMO: # of stations around = %d", stations->count() ); + OStation* station; + for ( station = stations->first(); station != 0; station = stations->next() ) + { + qDebug( "DEMO: station dump following..." ); + station->dump(); + } } + else { qDebug( "DEMO: Warning! Scan didn't work!" ); } diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp index ad0e89d..ce147c5 100644 --- a/libopie2/opienet/onetutils.cpp +++ b/libopie2/opienet/onetutils.cpp @@ -33,9 +33,9 @@ #include <opie2/onetwork.h> #include <opie2/omanufacturerdb.h> #include <net/if.h> - +#include <cassert> #include <cstdio> using namespace std; #define IW_PRIV_TYPE_MASK 0x7000 @@ -212,4 +212,32 @@ void dumpBytes( const unsigned char* data, int num ) } printf( "\n\n" ); } + +int stringToMode( const QString& mode ) +{ + if ( mode == "auto" ) return IW_MODE_AUTO; + else if ( mode == "adhoc" ) return IW_MODE_ADHOC; + else if ( mode == "managed" ) return IW_MODE_INFRA; + else if ( mode == "master" ) return IW_MODE_MASTER; + else if ( mode == "repeater" ) return IW_MODE_REPEAT; + else if ( mode == "secondary" ) return IW_MODE_SECOND; + else if ( mode == "monitor" ) return IW_MODE_MONITOR; + else assert( 0 ); +} + + +QString modeToString( int mode ) +{ + switch ( mode ) + { + case IW_MODE_AUTO: return "auto"; + case IW_MODE_ADHOC: return "adhoc"; + case IW_MODE_INFRA: return "managed"; + case IW_MODE_MASTER: return "master"; + case IW_MODE_REPEAT: return "repeater"; + case IW_MODE_SECOND: return "second"; + case IW_MODE_MONITOR: return "monitor"; + default: assert( 0 ); + } +} diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h index 18731ba..541c5ab 100644 --- a/libopie2/opienet/onetutils.h +++ b/libopie2/opienet/onetutils.h @@ -83,11 +83,12 @@ bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); *======================================================================================*/ class OHostAddress : public QHostAddress { - public: + /*public: OHostAddress(); ~OHostAddress(); + */ }; /*====================================================================================== @@ -119,11 +120,11 @@ class OPrivateIOCTL : public QObject /*====================================================================================== * Miscellaneous *======================================================================================*/ -/* dump bytes */ - void dumpBytes( const unsigned char* data, int num ); +QString modeToString( int ); +int stringToMode( const QString& ); /* Network to host order macros */ #ifdef LBL_ALIGN diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index a85a510..50c6679 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -255,8 +255,9 @@ QString ONetworkInterface::ipV4Address() const return QString( inet_ntoa( sa->sin_addr ) ); } else return "<unknown>"; + } void ONetworkInterface::setMacAddress( const OMacAddress& addr ) @@ -473,32 +474,18 @@ void OWirelessNetworkInterface::init() bool OWirelessNetworkInterface::isAssociated() const { //FIXME: handle different modes - return associatedAP() != "44:44:44:44:44:44"; + return !(associatedAP() == OMacAddress::unknown); } -QString OWirelessNetworkInterface::associatedAP() const +OMacAddress OWirelessNetworkInterface::associatedAP() const { - //FIXME: use OMacAddress - QString mac; - if ( ioctl( SIOCGIWAP ) ) - { - mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", - _ifr.ifr_hwaddr.sa_data[0]&0xff, - _ifr.ifr_hwaddr.sa_data[1]&0xff, - _ifr.ifr_hwaddr.sa_data[2]&0xff, - _ifr.ifr_hwaddr.sa_data[3]&0xff, - _ifr.ifr_hwaddr.sa_data[4]&0xff, - _ifr.ifr_hwaddr.sa_data[5]&0xff ); - } + return (const unsigned char*) &_ifr.ifr_hwaddr.sa_data[0]; else - { - mac = "<Unknown>"; - } - return mac; + return OMacAddress::unknown; } void OWirelessNetworkInterface::buildInformation() @@ -687,20 +674,9 @@ OChannelHopper* OWirelessNetworkInterface::channelHopper() const void OWirelessNetworkInterface::setMode( const QString& mode ) { - if ( mode == "auto" ) _iwr.u.mode = IW_MODE_AUTO; - else if ( mode == "adhoc" ) _iwr.u.mode = IW_MODE_ADHOC; - else if ( mode == "managed" ) _iwr.u.mode = IW_MODE_INFRA; - else if ( mode == "master" ) _iwr.u.mode = IW_MODE_MASTER; - else if ( mode == "repeater" ) _iwr.u.mode = IW_MODE_REPEAT; - else if ( mode == "secondary" ) _iwr.u.mode = IW_MODE_SECOND; - else if ( mode == "monitor" ) _iwr.u.mode = IW_MODE_MONITOR; - else - { - qDebug( "ONetwork: Warning! Invalid IEEE 802.11 mode '%s' specified.", (const char*) mode ); - return; - } + _iwr.u.mode = stringToMode( mode ); wioctl( SIOCSIWMODE ); } @@ -709,19 +685,9 @@ QString OWirelessNetworkInterface::mode() const if ( !wioctl( SIOCGIWMODE ) ) { return "<unknown>"; } - switch ( _iwr.u.mode ) - { - case IW_MODE_AUTO: return "auto"; - case IW_MODE_ADHOC: return "adhoc"; - case IW_MODE_INFRA: return "managed"; - case IW_MODE_MASTER: return "master"; - case IW_MODE_REPEAT: return "repeater"; - case IW_MODE_SECOND: return "secondary"; - case IW_MODE_MONITOR: return "monitor"; - default: assert( 0 ); // shouldn't happen - } + return modeToString( _iwr.u.mode ); } void OWirelessNetworkInterface::setMonitorMode( bool b ) @@ -829,17 +795,19 @@ void OWirelessNetworkInterface::setSSID( const QString& ssid ) wioctl( SIOCSIWESSID ); } -int OWirelessNetworkInterface::scanNetwork() +OStationList* OWirelessNetworkInterface::scanNetwork() { _iwr.u.param.flags = IW_SCAN_DEFAULT; _iwr.u.param.value = 0; if ( !wioctl( SIOCSIWSCAN ) ) { - return -1; + return 0; } + OStationList* stations = new OStationList(); + int timeout = 1000000; qDebug( "ONetworkInterface::scanNetwork() - scan started." ); @@ -885,16 +853,14 @@ int OWirelessNetworkInterface::scanNetwork() qDebug( " - result length = %d", _iwr.u.data.length ); if ( !_iwr.u.data.length ) { qDebug( " - no results (empty neighbourhood)" ); - return 0; + return stations; } qDebug( " - results are in!" ); dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length ); - int stations = 0; - // parse results int offset = 0; struct iw_event* we = (struct iw_event*) &buffer[0]; @@ -905,12 +871,33 @@ int OWirelessNetworkInterface::scanNetwork() //if ( !cmd ) cmd = "<unknown>"; qDebug( "reading next event... cmd=%d, len=%d", we->cmd, we->len ); switch (we->cmd) { - case SIOCGIWAP: qDebug( "SIOCGIWAP" ); stations++; break; - case SIOCGIWMODE: qDebug( "SIOCGIWMODE" ); break; - case SIOCGIWFREQ: qDebug( "SIOCGIWFREQ" ); break; - case SIOCGIWESSID: qDebug( "SIOCGIWESSID" ); break; + case SIOCGIWAP: + { + qDebug( "SIOCGIWAP" ); + stations->append( new OStation() ); + stations->last()->macAddress = (const unsigned char*) &we->u.ap_addr.sa_data[0]; + break; + } + case SIOCGIWMODE: + { + qDebug( "SIOCGIWMODE" ); + stations->last()->type = modeToString( we->u.mode ); + break; + } + case SIOCGIWFREQ: + { + qDebug( "SIOCGIWFREQ" ); + stations->last()->channel = _channels[ static_cast<int>(double( we->u.freq.m ) * pow( 10.0, we->u.freq.e ) / 1000000) ]; + break; + } + case SIOCGIWESSID: + { + qDebug( "SIOCGIWESSID" ); + stations->last()->ssid = we->u.essid.pointer; + break; + } case SIOCGIWSENS: qDebug( "SIOCGIWSENS" ); break; case SIOCGIWENCODE: qDebug( "SIOCGIWENCODE" ); break; case IWEVTXDROP: qDebug( "IWEVTXDROP" ); break; /* Packet dropped to excessive retry */ case IWEVQUAL: qDebug( "IWEVQUAL" ); break; /* Quality part of statistics (scan) */ @@ -923,13 +910,15 @@ int OWirelessNetworkInterface::scanNetwork() offset += we->len; we = (struct iw_event*) &buffer[offset]; } + return stations; + } else { qDebug( " - no results (timeout) :(" ); - return 0; + return stations; } } diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index e1545dd..0eb4542 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -38,8 +38,9 @@ /* OPIE */ #include <opie2/onetutils.h> +#include <opie2/ostation.h> /* QT */ #include <qvaluelist.h> @@ -405,9 +406,9 @@ class OWirelessNetworkInterface : public ONetworkInterface /** * @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; + virtual OMacAddress associatedAP() const; /** * Set the @a ssid (Service Set ID) string. This is used to decide * which network to associate with (use "any" to let the driver decide). */ @@ -419,9 +420,9 @@ class OWirelessNetworkInterface : public ONetworkInterface /** * Perform scanning the wireless network neighbourhood. * @note: UNSTABLE API - UNDER CONSTRUCTION - DON'T USE! */ - virtual int scanNetwork(); + virtual OStationList* scanNetwork(); protected: void buildInformation(); void buildPrivateList(); diff --git a/libopie2/opienet/ostation.cpp b/libopie2/opienet/ostation.cpp index 3817b31..ba1e4f6 100644 --- a/libopie2/opienet/ostation.cpp +++ b/libopie2/opienet/ostation.cpp @@ -37,8 +37,15 @@ OStation::OStation() { qDebug( "OStation::OStation()" ); + + type = "<unknown>"; + macAddress = OMacAddress::unknown; + ssid = "<unknown>"; + channel = 0; + apAddress = OMacAddress::unknown; + } OStation::~OStation() @@ -46,4 +53,12 @@ OStation::~OStation() qDebug( "OStation::~OStation()" ); } +void OStation::dump() +{ + qDebug( "------- OStation::dump() ------------" ); + qDebug( "type: %s", (const char*) type ); + qDebug( "mac: %s", (const char*) macAddress.toString() ); + qDebug( "ap: %s", (const char*) apAddress.toString() ); + qDebug( "ip: %s", (const char*) ipAddress.toString() ); +} diff --git a/libopie2/opienet/ostation.h b/libopie2/opienet/ostation.h index f61570b..a6956c9 100644 --- a/libopie2/opienet/ostation.h +++ b/libopie2/opienet/ostation.h @@ -33,19 +33,18 @@ #define OSTATION_H #include <opie2/onetutils.h> -#include <qdict.h> -#include <qmap.h> +#include <qlist.h> #include <qstring.h> #include <qhostaddress.h> #include <qobject.h> #include <sys/types.h> class OStation; -typedef QDict<OStation> OStationDict; +typedef QList<OStation> OStationList; /*====================================================================================== * OStation *======================================================================================*/ @@ -55,13 +54,21 @@ class OStation public: OStation(); ~OStation(); - private: + void dump(); + + /* Ethernet */ + QString type; OMacAddress macAddress; QHostAddress ipAddress; + + /* WaveLan */ QString ssid; - QString type; + OMacAddress apAddress; + int channel; + bool encrypted; }; + #endif // OSTATION_H |