Diffstat (limited to 'libopie2/examples/opienet/miniwellenreiter') (more/less context) (ignore whitespace changes)
3 files changed, 218 insertions, 0 deletions
diff --git a/libopie2/examples/opienet/miniwellenreiter/.cvsignore b/libopie2/examples/opienet/miniwellenreiter/.cvsignore new file mode 100644 index 0000000..8f7300c --- a/dev/null +++ b/libopie2/examples/opienet/miniwellenreiter/.cvsignore @@ -0,0 +1,6 @@ +Makefile* +moc* +*moc +*.o +~* + diff --git a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp new file mode 100644 index 0000000..aec9cc7 --- a/dev/null +++ b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.cpp @@ -0,0 +1,199 @@ +#include <qdict.h> +#include <qsocketnotifier.h> +#include <qstring.h> +#include <opie2/onetwork.h> +#include <qapplication.h> +#include <opie2/opcap.h> +#include <cerrno> +#include <cstdio> +#include <cstdlib> +#include <cstring> + +//======================== Station help class =============================== + +class Station +{ + public: + Station( QString t, int c, bool w ) : type(t), channel(c), wep(w), beacons(1) {}; + ~Station() {}; + + QString type; + int channel; + bool wep; + int beacons; +}; + +QDict<Station> stations; + +//======================== Application class =============================== + +class Wellenreiter : public QApplication +{ +Q_OBJECT +public: + Wellenreiter( int argc, char** argv ) : QApplication( argc, argv ) + { + + ONetwork* net = ONetwork::instance(); + + if ( argc < 3 ) + { + printf( "Usage: ./%s <interface> <driver> <interval>\n", argv[0] ); + printf( "\n" ); + printf( "Valid wireless interfaces (detected) are:\n" ); + + ONetwork::InterfaceIterator it = net->iterator(); + while ( it.current() ) + { + if ( it.current()->isWireless() ) + { + printf( " - '%s' (MAC=%s) (IPv4=%s)\n", (const char*) it.current()->name(), + (const char*) it.current()->macAddress().toString(), + (const char*) it.current()->ipV4Address() ); + } + ++it; + } + exit( -1 ); + } + + printf( "****************************************************\n" ); + printf( "* Wellenreiter mini edition 1.0 (C) 2003 M-M-M *\n" ); + printf( "****************************************************\n" ); + printf( "\n\n" ); + + QString interface( argv[1] ); + QString driver( argv[2] ); + + printf( "Trying to use '%s' as %s-controlled device...\n", (const char*) interface, (const char*) driver ); + + // sanity checks before downcasting + ONetworkInterface* iface = net->interface( interface ); + if ( !iface ) + { + printf( "Interface '%s' doesn't exist. Exiting.\n", (const char*) interface ); + exit( -1 ); + } + if ( !iface->isWireless() ) + { + 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 ) ); + exit( -1 ); + } + else + { + printf( "ok.\n" ); + } + } + else + printf( "Interface status is already promisc - good.\n" ); + + // connect a monitoring strategy to the interface + if ( driver == "orinoco" ) + new OOrinocoMonitoringInterface( wiface ); + else + { + printf( "Unknown driver. Exiting\n" ); + exit( -1 ); + } + + // enable monitoring mode + printf( "Enabling monitor mode...\n" ); + wiface->setMonitorMode( true ); + + // open a packet capturer + cap = new OPacketCapturer(); + cap->open( interface ); + if ( !cap->isOpen() ) + { + printf( "Unable to open libpcap (%s). Exiting.\n", strerror( errno ) ); + exit( -1 ); + } + + // set capturer to non-blocking mode + cap->setBlocking( false ); + + // start channel hopper + wiface->setChannelHopping( 1000 ); + + // connect + connect( cap, SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) ); + + } + + ~Wellenreiter() {}; + +public slots: + void receivePacket(OPacket* p) + { + if (!p) + { + printf( "(empty packet received)\n" ); + return; + } + + OWaveLanManagementPacket* beacon = (OWaveLanManagementPacket*) p->child( "802.11 Management" ); + + if ( beacon ) + { + if ( stations.find( beacon->SSID() ) ) + stations[beacon->SSID()]->beacons++; + else + { + printf( "found new network @ channel %d, SSID = '%s'\n", wiface->channel(), (const char*) beacon->SSID() ); + stations.insert( beacon->SSID(), new Station( "unknown", wiface->channel(), + ((OWaveLanPacket*) beacon->parent())->usesWep() ) ); + } + } + } +private: + OPacketCapturer* cap; + OWirelessNetworkInterface* wiface; +}; + + +int main( int argc, char** argv ) +{ + Wellenreiter w( argc, argv ); + w.exec(); + return 0; +} + +#include "miniwellenreiter.moc" + diff --git a/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.pro b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.pro new file mode 100644 index 0000000..7ce535c --- a/dev/null +++ b/libopie2/examples/opienet/miniwellenreiter/miniwellenreiter.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +CONFIG = qt warn_on debug +HEADERS = +SOURCES = miniwellenreiter.cpp +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include +LIBS += -lopiecore2 -lopienet2 +TARGET = miniwellenreiter +MOC_DIR = moc +OBJECTS_DIR = obj + +include ( $(OPIEDIR)/include.pro ) + |