-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,3 +1,4 @@ #include <opie2/onetwork.h> +#include <opie2/ostation.h> #include <opie2/omanufacturerdb.h> @@ -28,5 +29,5 @@ int main( int argc, char** argv ) //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() ); //} @@ -59,9 +60,16 @@ int main( int argc, char** argv ) // 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 { 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 @@ -35,5 +35,5 @@ #include <net/if.h> - +#include <cassert> #include <cstdio> using namespace std; @@ -214,2 +214,30 @@ void dumpBytes( const unsigned char* data, int num ) } + +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 @@ -85,7 +85,8 @@ bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); class OHostAddress : public QHostAddress { - public: + /*public: OHostAddress(); ~OHostAddress(); + */ }; @@ -121,7 +122,7 @@ class OPrivateIOCTL : public QObject *======================================================================================*/ -/* dump bytes */ - void dumpBytes( const unsigned char* data, int num ); +QString modeToString( int ); +int stringToMode( const QString& ); /* Network to host order macros */ 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 @@ -257,4 +257,5 @@ QString ONetworkInterface::ipV4Address() const else return "<unknown>"; + } @@ -475,28 +476,14 @@ 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; } @@ -689,16 +676,5 @@ 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 ); } @@ -711,15 +687,5 @@ QString OWirelessNetworkInterface::mode() const 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 ); } @@ -831,5 +797,5 @@ void OWirelessNetworkInterface::setSSID( const QString& ssid ) -int OWirelessNetworkInterface::scanNetwork() +OStationList* OWirelessNetworkInterface::scanNetwork() { _iwr.u.param.flags = IW_SCAN_DEFAULT; @@ -837,7 +803,9 @@ int OWirelessNetworkInterface::scanNetwork() if ( !wioctl( SIOCSIWSCAN ) ) { - return -1; + return 0; } + OStationList* stations = new OStationList(); + int timeout = 1000000; @@ -887,5 +855,5 @@ int OWirelessNetworkInterface::scanNetwork() { qDebug( " - no results (empty neighbourhood)" ); - return 0; + return stations; } @@ -893,6 +861,4 @@ int OWirelessNetworkInterface::scanNetwork() dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length ); - int stations = 0; - // parse results @@ -907,8 +873,29 @@ int OWirelessNetworkInterface::scanNetwork() 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; @@ -925,9 +912,11 @@ int OWirelessNetworkInterface::scanNetwork() } + 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 @@ -40,4 +40,5 @@ #include <opie2/onetutils.h> +#include <opie2/ostation.h> /* QT */ @@ -407,5 +408,5 @@ class OWirelessNetworkInterface : public ONetworkInterface * @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 @@ -421,5 +422,5 @@ class OWirelessNetworkInterface : public ONetworkInterface * @note: UNSTABLE API - UNDER CONSTRUCTION - DON'T USE! */ - virtual int scanNetwork(); + virtual OStationList* scanNetwork(); protected: 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 @@ -39,4 +39,11 @@ OStation::OStation() { qDebug( "OStation::OStation()" ); + + type = "<unknown>"; + macAddress = OMacAddress::unknown; + ssid = "<unknown>"; + channel = 0; + apAddress = OMacAddress::unknown; + } @@ -48,2 +55,10 @@ 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 @@ -35,6 +35,5 @@ #include <opie2/onetutils.h> -#include <qdict.h> -#include <qmap.h> +#include <qlist.h> #include <qstring.h> #include <qhostaddress.h> @@ -45,5 +44,5 @@ class OStation; -typedef QDict<OStation> OStationDict; +typedef QList<OStation> OStationList; /*====================================================================================== @@ -57,11 +56,19 @@ class 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 |