author | mickeyl <mickeyl> | 2003-04-07 18:07:38 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-04-07 18:07:38 (UTC) |
commit | cac6a08e456a057a19cc1fc56824fc98ff4f0bc1 (patch) (side-by-side diff) | |
tree | b17fa559629bcb9f49d685d3ec8b8dddc6a20f46 /libopie2 | |
parent | 75f029f87d4c84b37ccfe1c81ef205a6cd5fca79 (diff) | |
download | opie-cac6a08e456a057a19cc1fc56824fc98ff4f0bc1.zip opie-cac6a08e456a057a19cc1fc56824fc98ff4f0bc1.tar.gz opie-cac6a08e456a057a19cc1fc56824fc98ff4f0bc1.tar.bz2 |
- add OManufacturerDB
- API extensions for OMacAddress
- add data packet recognition for miniwellenreiter
-rw-r--r-- | libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp | 63 | ||||
-rw-r--r-- | libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp | 1 | ||||
-rw-r--r-- | libopie2/libopie2.control | 6 | ||||
-rw-r--r-- | libopie2/opienet/omanufacturerdb.cpp | 96 | ||||
-rw-r--r-- | libopie2/opienet/omanufacturerdb.h | 37 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.cpp | 21 | ||||
-rw-r--r-- | libopie2/opienet/onetutils.h | 3 | ||||
-rw-r--r-- | libopie2/opienet/opcap.cpp | 8 | ||||
-rw-r--r-- | libopie2/opienet/opienet.pro | 12 |
9 files changed, 205 insertions, 42 deletions
diff --git a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp index 7581888..f800336 100644 --- a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp +++ b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp @@ -78,39 +78,16 @@ public: printf( "Interface '%s' doesn't support wireless extensions. Exiting.\n", (const char*) interface ); exit( -1 ); } // downcast should be safe now wiface = (OWirelessNetworkInterface*) iface; printf( "Using wireless interface '%s' for scanning (current SSID is '%s')...\n", (const char*) interface, (const char*) wiface->SSID() ); - /* - - // ifconfig down the interface - this enable more crash-proof - // scanning with drivers like spectrum_cs... - if ( wiface->isUp() ) - { - printf( "Interface status is up... switching to down... " ); - wiface->setUp( false ); - if ( wiface->isUp() ) - { - printf( "failed (%s). Exiting.\n", strerror( errno ) ); - exit( -1 ); - } - else - { - printf( "ok.\n" ); - } - } - else - printf( "Interface status is already down - good.\n" ); - - */ - // ifconfig +promisc the interface to receive all packets if ( !wiface->promiscuousMode() ) { printf( "Interface status is not promisc... switching to promisc... " ); wiface->setPromiscuousMode( true ); if ( !wiface->promiscuousMode() ) { printf( "failed (%s). Exiting.\n", strerror( errno ) ); @@ -164,30 +141,68 @@ public slots: { if (!p) { printf( "(empty packet received)\n" ); return; } OWaveLanManagementPacket* beacon = (OWaveLanManagementPacket*) p->child( "802.11 Management" ); - if ( beacon ) { OWaveLanManagementSSID* ssid = static_cast<OWaveLanManagementSSID*>( p->child( "802.11 SSID" ) ); QString essid = ssid ? ssid->ID() : "<unknown>"; if ( stations.find( essid ) ) stations[essid]->beacons++; else { printf( "found new network @ channel %d, SSID = '%s'\n", wiface->channel(), (const char*) essid ); stations.insert( essid, new Station( "unknown", wiface->channel(), ((OWaveLanPacket*) beacon->parent())->usesWep() ) ); } + return; + } + + OWaveLanDataPacket* data = (OWaveLanDataPacket*) p->child( "802.11 Data" ); + if ( data ) + { + OWaveLanPacket* wlan = (OWaveLanPacket*) p->child( "802.11" ); + if ( wlan->fromDS() && !wlan->toDS() ) + { + printf( "FromDS: '%s' -> '%s' via '%s'\n", + (const char*) wlan->macAddress3().toString(true), + (const char*) wlan->macAddress1().toString(true), + (const char*) wlan->macAddress2().toString(true) ); + } + else + if ( !wlan->fromDS() && wlan->toDS() ) + { + printf( "ToDS: '%s' -> '%s' via '%s'\n", + (const char*) wlan->macAddress2().toString(true), + (const char*) wlan->macAddress3().toString(true), + (const char*) wlan->macAddress1().toString(true) ); + } + else + if ( wlan->fromDS() && wlan->toDS() ) + { + printf( "WSD(bridge): '%s' -> '%s' via '%s' and '%s'\n", + (const char*) wlan->macAddress4().toString(true), + (const char*) wlan->macAddress3().toString(true), + (const char*) wlan->macAddress1().toString(true), + (const char*) wlan->macAddress2().toString(true) ); + } + else + { + printf( "IBSS(AdHoc): '%s' -> '%s' (Cell: '%s')'\n", + (const char*) wlan->macAddress2().toString(true), + (const char*) wlan->macAddress1().toString(true), + (const char*) wlan->macAddress3().toString(true) ); + } + return; } } private: OPacketCapturer* cap; OWirelessNetworkInterface* wiface; }; diff --git a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp index 020fc23..f801b15 100644 --- a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp +++ b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp @@ -7,16 +7,17 @@ int main( int argc, char** argv ) ONetwork* net = ONetwork::instance(); ONetwork::InterfaceIterator it = net->iterator(); while ( it.current() ) { qDebug( "DEMO: ONetwork contains Interface '%s'", (const char*) it.current()->name() ); 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: IPv4 Address is '%s'", (const char*) it.current()->ipV4Address() ); if ( it.current()->isWireless() ) { OWirelessNetworkInterface* iface = static_cast<OWirelessNetworkInterface*>( it.current() ); qDebug( "DEMO: '%s' seems to feature the wireless extensions.", (const char*) iface->name() ); qDebug( "DEMO: Current SSID is '%s'", (const char*) iface->SSID() ); qDebug( "DEMO: Current NickName is '%s'", (const char*) iface->nickName() ); qDebug( "DEMO: Antenna is tuned to '%f', that is channel %d", iface->frequency(), iface->channel() ); diff --git a/libopie2/libopie2.control b/libopie2/libopie2.control index 24a7c37..866d106 100644 --- a/libopie2/libopie2.control +++ b/libopie2/libopie2.control @@ -1,10 +1,10 @@ -Files: $OPIEDIR/lib/libopiecore2.so.1.8.1 $OPIEDIR/lib/libopiecore2.so.1.8 $OPIEDIR/lib/libopiecore2.so.1 $OPIEDIR/lib/libopienet2.so.1.8.1 $OPIEDIR/lib/libopienet2.so.1.8 $OPIEDIR/lib/libopienet2.so.1 $OPIEDIR/lib/libopieui2.so.1.8.1 $OPIEDIR/lib/libopieui2.so.1.8 $OPIEDIR/lib/libopieui2.so.1 +Files: $OPIEDIR/lib/libopiecore2.so.1.8.1 $OPIEDIR/lib/libopiecore2.so.1.8 $OPIEDIR/lib/libopiecore2.so.1 $OPIEDIR/lib/libopienet2.so.1.8.1 $OPIEDIR/lib/libopienet2.so.1.8 $OPIEDIR/lib/libopienet2.so.1 $OPIEDIR/lib/libopieui2.so.1.8.1 $OPIEDIR/lib/libopieui2.so.1.8 $OPIEDIR/lib/libopieui2.so.1 $OPIEDIR/etc/manufacturers Priority: optional Section: opie/system Maintainer: Opie Team <opie@handhelds.org> Architecture: arm -Version: 1.8.1-$SUB_VERSION.1 +Version: 1.8.1-$SUB_VERSION.2 Depends: libqpe1 Provides: libopie2 -Replaces: libopie2 Description: Opie library 2.0 + diff --git a/libopie2/opienet/omanufacturerdb.cpp b/libopie2/opienet/omanufacturerdb.cpp new file mode 100644 index 0000000..ea15125 --- a/dev/null +++ b/libopie2/opienet/omanufacturerdb.cpp @@ -0,0 +1,96 @@ +/********************************************************************** +** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. +** +** This file is part of Opie Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#include "omanufacturerdb.h" + +// Qt +#include <qstring.h> +#include <qfile.h> +#include <qtextstream.h> + +OManufacturerDB* OManufacturerDB::_instance = 0; + +OManufacturerDB* OManufacturerDB::instance() +{ + if ( !OManufacturerDB::_instance ) + { + qDebug( "OManufacturerDB::instance(): creating OManufacturerDB..." ); + _instance = new OManufacturerDB(); + } + return _instance; +} + + +OManufacturerDB::OManufacturerDB() +{ + QString filename( "/etc/manufacturers" ); + qDebug( "OManufacturerDB: trying to read '%s'...", (const char*) filename ); + if ( !QFile::exists( filename ) ) + { + filename = "/opt/QtPalmtop/etc/manufacturers"; + qDebug( "OManufacturerDB: trying to read '%s'...", (const char*) filename ); + if ( !QFile::exists( filename ) ) + { + filename = "/usr/share/wellenreiter/manufacturers"; + qDebug( "OManufacturerDB: trying to read '%s'...", (const char*) filename ); + } + } + + QFile file( filename ); + bool hasFile = file.open( IO_ReadOnly ); + if (!hasFile) + { + qWarning( "OManufacturerDB: no valid manufacturer list found.", (const char*) filename ); + } + else + { + qDebug( "OManufacturerDB: found manufacturer list in '%s'...", (const char*) filename ); + QTextStream s( &file ); + QString addr; + QString manu; + while (!s.atEnd()) + { + s >> addr; + if ( !addr ) // read nothing!? + { + continue; + } + else + if ( addr[0] == '#' ) + { + s.readLine(); + continue; + } + s.skipWhiteSpace(); + s >> manu; + s.readLine(); + //qDebug( "ManufacturerDB: read pair %s, %s", (const char*) addr, (const char*) manu ); + manufacturers.insert( addr, manu ); + + } + } + +} + + +OManufacturerDB::~OManufacturerDB() +{ +} + + +const QString& OManufacturerDB::lookup( const QString& macaddr ) const +{ + return manufacturers[macaddr.upper().left(8)]; +} diff --git a/libopie2/opienet/omanufacturerdb.h b/libopie2/opienet/omanufacturerdb.h new file mode 100644 index 0000000..5e66c37 --- a/dev/null +++ b/libopie2/opienet/omanufacturerdb.h @@ -0,0 +1,37 @@ +/********************************************************************** +** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. +** +** This file is part of Opie Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +**********************************************************************/ + +#ifndef OMANUFACTURERDB_H +#define OMANUFACTURERDB_H + +#include <qmap.h> + +class OManufacturerDB +{ + public: + static OManufacturerDB* instance(); + const QString& lookup( const QString& macaddr ) const; + + protected: + OManufacturerDB(); + virtual ~OManufacturerDB(); + + private: + QMap<QString, QString> manufacturers; + static OManufacturerDB* _instance; +}; + +#endif + diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp index 2485f30..236f108 100644 --- a/libopie2/opienet/onetutils.cpp +++ b/libopie2/opienet/onetutils.cpp @@ -26,16 +26,17 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <opie2/onetutils.h> #include <opie2/onetwork.h> +#include <opie2/omanufacturerdb.h> #include <net/if.h> #include <cstdio> using namespace std; #define IW_PRIV_TYPE_MASK 0x7000 #define IW_PRIV_TYPE_NONE 0x0000 @@ -104,26 +105,34 @@ OMacAddress OMacAddress::fromString( const QString& str ) if ( !ok ) return OMacAddress::unknown; addr.truncate( index ); index -= 3; } return (const unsigned char*) &buf; } -QString OMacAddress::toString() const +QString OMacAddress::toString( bool substitute ) const { - QString s; - s.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", - _bytes[0]&0xff, _bytes[1]&0xff, _bytes[2]&0xff, - _bytes[3]&0xff, _bytes[4]&0xff, _bytes[5]&0xff ); - return s; + QString manu; + manu.sprintf( "%.2X:%.2X:%.2X", _bytes[0]&0xff, _bytes[1]&0xff, _bytes[2]&0xff ); + QString serial; + serial.sprintf( ":%.2X:%.2X:%.2X", _bytes[3]&0xff, _bytes[4]&0xff, _bytes[5]&0xff ); + if ( !substitute ) return manu+serial; + // fallback - if no vendor is found, just use the number + QString textmanu = OManufacturerDB::instance()->lookup( manu ); + return textmanu.isNull() ? manu+serial : textmanu + serial; } +QString OMacAddress::manufacturer() const +{ + return OManufacturerDB::instance()->lookup( toString() ); +} + bool operator==( const OMacAddress &m1, const OMacAddress &m2 ) { return memcmp( &m1._bytes, &m2._bytes, 6 ) == 0; } /*====================================================================================== * OHostAddress diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h index 73d52cc..bedea63 100644 --- a/libopie2/opienet/onetutils.h +++ b/libopie2/opienet/onetutils.h @@ -50,17 +50,18 @@ class OWirelessNetworkInterface; class OMacAddress { public: OMacAddress( unsigned char* ); OMacAddress( const unsigned char* ); OMacAddress( struct ifreq& ); ~OMacAddress(); - QString toString() const; + QString manufacturer() const; + QString toString( bool substitute = false ) const; const unsigned char* native() const; static OMacAddress fromString( const QString& ); public: static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff static const OMacAddress& unknown; // 44:44:44:44:44:44 diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp index 6ddd457..40aac2c 100644 --- a/libopie2/opienet/opcap.cpp +++ b/libopie2/opienet/opcap.cpp @@ -634,38 +634,38 @@ OWaveLanManagementChallenge::~OWaveLanManagementChallenge() /*====================================================================================== * OWaveLanDataPacket *======================================================================================*/ OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) :QObject( parent, "802.11 Data" ), _header( data ) { - //qDebug( "size of header = %d", sizeof( struct ieee_802_11_data_header ) ); - //qDebug( "header: %0x", data ); + qDebug( "OWaveLanDataPacket::OWaveLanDataPacket(): decoding frame..." ); + const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header ); - //qDebug( "payload: %0x", payload ); + #warning The next line works for most cases, but can not be correct generally! if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); } OWaveLanDataPacket::~OWaveLanDataPacket() { } /*====================================================================================== * OLLCPacket *======================================================================================*/ OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) - :QObject( parent, "802.11 802_2" ), _header( data ) + :QObject( parent, "802.11 LLC" ), _header( data ) { qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." ); if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) ) { qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) ); switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h diff --git a/libopie2/opienet/opienet.pro b/libopie2/opienet/opienet.pro index e73afbf..3f9166a 100644 --- a/libopie2/opienet/opienet.pro +++ b/libopie2/opienet/opienet.pro @@ -1,18 +1,22 @@ TEMPLATE = lib CONFIG += qt warn_on debug DESTDIR = $(OPIEDIR)/lib -HEADERS = onetutils.cpp onetwork.h opcap.h - -SOURCES = onetutils.cpp onetwork.cpp opcap.cpp +HEADERS = omanufacturerdb.cpp \ + onetutils.cpp \ + onetwork.h \ + opcap.h +SOURCES = omanufacturerdb.cpp \ + onetutils.cpp \ + onetwork.cpp \ + opcap.cpp INTERFACES = TARGET = opienet2 VERSION = 1.8.1 INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lpcap - MOC_DIR = moc OBJECTS_DIR = obj include ( $(OPIEDIR)/include.pro ) |