author | mickeyl <mickeyl> | 2003-04-10 15:49:08 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-04-10 15:49:08 (UTC) |
commit | 4e8e3741dca909782e15bb197e5b6a78750536c2 (patch) (side-by-side diff) | |
tree | 37285f8d053b3995aee46487277b57248862848c | |
parent | 3733471135ea180709fcf4695607cce0c5fc7fb5 (diff) | |
download | opie-4e8e3741dca909782e15bb197e5b6a78750536c2.zip opie-4e8e3741dca909782e15bb197e5b6a78750536c2.tar.gz opie-4e8e3741dca909782e15bb197e5b6a78750536c2.tar.bz2 |
Wellenreiter can now open and replay capture files as written by tcpdump, ethereal, etc.
Next task: writing capture files
-rw-r--r-- | noncore/net/wellenreiter/gui/configbase.ui | 6 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/configwindow.cpp | 46 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/configwindow.h | 14 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/mainwindow.cpp | 2 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/mainwindow.h | 4 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/wellenreiter.cpp | 94 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/wellenreiter.h | 3 |
7 files changed, 121 insertions, 48 deletions
diff --git a/noncore/net/wellenreiter/gui/configbase.ui b/noncore/net/wellenreiter/gui/configbase.ui index dda7ba0..3ece270 100644 --- a/noncore/net/wellenreiter/gui/configbase.ui +++ b/noncore/net/wellenreiter/gui/configbase.ui @@ -169,6 +169,12 @@ <string><manual></string> </property> </item> + <item> + <property> + <name>text</name> + <string><file></string> + </property> + </item> <property stdset="1"> <name>name</name> <cstring>deviceType</cstring> diff --git a/noncore/net/wellenreiter/gui/configwindow.cpp b/noncore/net/wellenreiter/gui/configwindow.cpp index ba1119e..4aca526 100644 --- a/noncore/net/wellenreiter/gui/configwindow.cpp +++ b/noncore/net/wellenreiter/gui/configwindow.cpp @@ -15,8 +15,10 @@ /* LOCAL */ #include "configwindow.h" +#include "mainwindow.h" /* QT */ +#include <qapplication.h> #include <qcombobox.h> #include <qfile.h> #include <qlayout.h> @@ -33,11 +35,12 @@ WellenreiterConfigWindow* WellenreiterConfigWindow::_instance = 0; WellenreiterConfigWindow::WellenreiterConfigWindow( QWidget * parent, const char * name, WFlags f ) :WellenreiterConfigBase( parent, name, true, f ) { - _devicetype[ "cisco" ] = 1; - _devicetype[ "wlan-ng" ] = 2; - _devicetype[ "hostap" ] = 3; - _devicetype[ "orinoco" ] = 4; - _devicetype[ "<manual>" ] = 5; + _devicetype[ "cisco" ] = DEVTYPE_CISCO; + _devicetype[ "wlan-ng" ] = DEVTYPE_WLAN_NG; + _devicetype[ "hostap" ] = DEVTYPE_HOSTAP; + _devicetype[ "orinoco" ] = DEVTYPE_ORINOCO; + _devicetype[ "<manual>" ] = DEVTYPE_MANUAL; + _devicetype[ "<file>" ] = DEVTYPE_FILE; // gather possible interface names from ONetwork ONetwork* net = ONetwork::instance(); @@ -59,15 +62,16 @@ WellenreiterConfigWindow::WellenreiterConfigWindow( QWidget * parent, const char while( !modules.atEnd() && !devicetype ) { modules >> line; - if ( line.contains( "cisco" ) ) devicetype = 1; - else if ( line.contains( "hostap" ) ) devicetype = 3; - else if ( line.contains( "prism" ) ) devicetype = 2; - else if ( line.contains( "orinoco" ) ) devicetype = 4; + if ( line.contains( "cisco" ) ) devicetype = DEVTYPE_CISCO; + else if ( line.contains( "hostap" ) ) devicetype = DEVTYPE_HOSTAP; + else if ( line.contains( "prism" ) ) devicetype = DEVTYPE_WLAN_NG; + else if ( line.contains( "orinoco" ) ) devicetype = DEVTYPE_ORINOCO; } if ( devicetype ) { deviceType->setCurrentItem( devicetype ); - qDebug( "Wellenreiter: guessed device type to be %d", devicetype ); + _guess = devicetype; + qDebug( "Wellenreiter: guessed device type to be #%d", devicetype ); } } @@ -79,8 +83,11 @@ WellenreiterConfigWindow::WellenreiterConfigWindow( QWidget * parent, const char #endif WellenreiterConfigWindow::_instance = this; + + connect( deviceType, SIGNAL( activated(int) ), this, SLOT( changedDeviceType(int) ) ); }; + int WellenreiterConfigWindow::daemonDeviceType() { QString name = deviceType->currentText(); @@ -94,7 +101,26 @@ int WellenreiterConfigWindow::daemonDeviceType() } }; + int WellenreiterConfigWindow::daemonHopInterval() { return hopInterval->cleanText().toInt(); } + + +void WellenreiterConfigWindow::changedDeviceType(int t) +{ + if ( t != DEVTYPE_FILE ) return; + QString name = ( (WellenreiterMainWindow*) qApp->mainWidget() )->getFileName(false); + if ( !name.isNull() && QFile::exists( name ) ) + { + interfaceName->insertItem( name ); + interfaceName->setCurrentItem( interfaceName->count()-1 ); + } + else + { + deviceType->setCurrentItem( _guess ); + } + +} + diff --git a/noncore/net/wellenreiter/gui/configwindow.h b/noncore/net/wellenreiter/gui/configwindow.h index 5fd0327..7df1a80 100644 --- a/noncore/net/wellenreiter/gui/configwindow.h +++ b/noncore/net/wellenreiter/gui/configwindow.h @@ -21,10 +21,19 @@ #include <qcombobox.h> #include <qstring.h> +const int DEVTYPE_SELECT = 0; +const int DEVTYPE_CISCO = 1; +const int DEVTYPE_WLAN_NG = 2; +const int DEVTYPE_HOSTAP = 3; +const int DEVTYPE_ORINOCO = 4; +const int DEVTYPE_MANUAL = 5; +const int DEVTYPE_FILE = 6; + class WellenreiterConfigWindow; class WellenreiterConfigWindow : public WellenreiterConfigBase { + Q_OBJECT public: WellenreiterConfigWindow( QWidget * parent = 0, const char * name = "WellenreiterConfigWindow", WFlags f = 0 ); @@ -34,11 +43,14 @@ class WellenreiterConfigWindow : public WellenreiterConfigBase const QString soundOnBeacon() const { return beaconSound->currentText(); }; static WellenreiterConfigWindow* instance() { return _instance; }; + public slots: + void changedDeviceType(int); + protected: QMap<QString, int> _devicetype; static WellenreiterConfigWindow* _instance; + int _guess; }; #endif - diff --git a/noncore/net/wellenreiter/gui/mainwindow.cpp b/noncore/net/wellenreiter/gui/mainwindow.cpp index 94e3f28..6cd364c 100644 --- a/noncore/net/wellenreiter/gui/mainwindow.cpp +++ b/noncore/net/wellenreiter/gui/mainwindow.cpp @@ -223,6 +223,7 @@ void WellenreiterMainWindow::demoAddStations() mw->netView()->addNewItem( "adhoc", "ELAN", "00:B0:8E:E7:56:E2", false, 3, 20 ); } + QString WellenreiterMainWindow::getFileName( bool save ) { QMap<QString, QStringList> map; @@ -257,6 +258,7 @@ QString WellenreiterMainWindow::getFileName( bool save ) return str; } + void WellenreiterMainWindow::fileSaveLog() { QString fname = getFileName( true ); diff --git a/noncore/net/wellenreiter/gui/mainwindow.h b/noncore/net/wellenreiter/gui/mainwindow.h index 1e191e5..926bb0a 100644 --- a/noncore/net/wellenreiter/gui/mainwindow.h +++ b/noncore/net/wellenreiter/gui/mainwindow.h @@ -30,6 +30,7 @@ class WellenreiterMainWindow: public QMainWindow public: WellenreiterMainWindow( QWidget * parent = 0, const char * name = "mainwindow", WFlags f = 0 ); ~WellenreiterMainWindow(); + QString getFileName( bool save ); protected: Wellenreiter* mw; @@ -49,9 +50,6 @@ class WellenreiterMainWindow: public QMainWindow virtual void closeEvent( QCloseEvent* ); void updateToolButtonState(); - private: - QString getFileName( bool save ); - public slots: void showConfigure(); void demoAddStations(); diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp index 3372883..5c10c3b 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.cpp +++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp @@ -221,28 +221,28 @@ void Wellenreiter::receivePacket(OPacket* p) void Wellenreiter::stopClicked() { - disconnect( SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) ); - disconnect( SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) ); - iface->setChannelHopping(); // stop hopping channels + if ( iface ) + { + disconnect( SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) ); + disconnect( SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) ); + iface->setChannelHopping(); // stop hopping channels + } + else + killTimers(); + pcap->close(); sniffing = false; - #ifdef QWS - oApp->setTitle(); - #else - qApp->mainWidget()->setCaption( "Wellenreiter II" ); - #endif - // get interface name from config window - const QString& interface = configwindow->interfaceName->currentText(); - ONetwork* net = ONetwork::instance(); - iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface )); + if ( iface ) + { + // switch off monitor mode + iface->setMonitorMode( false ); + // switch off promisc flag + iface->setPromiscuousMode( false ); - // switch off monitor mode - iface->setMonitorMode( false ); - // switch off promisc flag - iface->setPromiscuousMode( false ); + system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess + } - system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess logwindow->log( "(i) Stopped Scanning." ); assert( parent() ); ( (QMainWindow*) parent() )->setCaption( "Wellenreiter II" ); @@ -297,25 +297,32 @@ void Wellenreiter::startClicked() switch ( cardtype ) { - case 1: iface->setMonitoring( new OCiscoMonitoringInterface( iface ) ); break; - case 2: iface->setMonitoring( new OWlanNGMonitoringInterface( iface ) ); break; - case 3: iface->setMonitoring( new OHostAPMonitoringInterface( iface ) ); break; - case 4: iface->setMonitoring( new OOrinocoMonitoringInterface( iface ) ); break; - default: - QMessageBox::information( this, "Wellenreiter II", "Bring your device into\nmonitor mode now." ); + case DEVTYPE_CISCO: iface->setMonitoring( new OCiscoMonitoringInterface( iface ) ); break; + case DEVTYPE_WLAN_NG: iface->setMonitoring( new OWlanNGMonitoringInterface( iface ) ); break; + case DEVTYPE_HOSTAP: iface->setMonitoring( new OHostAPMonitoringInterface( iface ) ); break; + case DEVTYPE_ORINOCO: iface->setMonitoring( new OOrinocoMonitoringInterface( iface ) ); break; + case DEVTYPE_MANUAL: QMessageBox::information( this, "Wellenreiter II", "Bring your device into\nmonitor mode now." ); break; + case DEVTYPE_FILE: qDebug( "Wellenreiter: Capturing from file '%s'", (const char*) interface ); break; + default: assert( 0 ); // shouldn't reach this } - if ( cardtype > 0 && cardtype < 5 ) - iface->setMonitorMode( true ); - - if ( !iface->monitorMode() ) + // switch device into monitor mode + if ( cardtype < DEVTYPE_FILE ) { - QMessageBox::warning( this, "Wellenreiter II", "Can't set device into monitor mode." ); - return; + if ( cardtype != DEVTYPE_MANUAL ) + iface->setMonitorMode( true ); + if ( !iface->monitorMode() ) + { + QMessageBox::warning( this, "Wellenreiter II", "Can't set device into monitor mode." ); + return; + } } // open pcap and start sniffing - pcap->open( interface ); + if ( cardtype != DEVTYPE_FILE ) + pcap->open( interface ); + else + pcap->open( QFile( interface ) ); if ( !pcap->isOpen() ) { @@ -327,13 +334,32 @@ void Wellenreiter::startClicked() pcap->setBlocking( false ); // start channel hopper - iface->setChannelHopping( 1000 ); //use interval from config window + if ( cardtype != DEVTYPE_FILE ) + iface->setChannelHopping( 1000 ); //use interval from config window - // connect - connect( pcap, SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) ); - connect( iface->channelHopper(), SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) ); + if ( cardtype != DEVTYPE_FILE ) + { + // connect socket notifier and start channel hopper + connect( pcap, SIGNAL( receivedPacket(OPacket*) ), this, SLOT( receivePacket(OPacket*) ) ); + connect( iface->channelHopper(), SIGNAL( hopped(int) ), this, SLOT( channelHopped(int) ) ); + } + else + { + // start timer for reading packets + startTimer( 100 ); + } logwindow->log( "(i) Started Scanning." ); sniffing = true; emit( startedSniffing() ); } + + +void Wellenreiter::timerEvent( QTimerEvent* ) +{ + qDebug( "Wellenreiter::timerEvent()" ); + OPacket* p = pcap->next(); + receivePacket( p ); + delete p; +} + diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h index 839c77e..c37a9f2 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.h +++ b/noncore/net/wellenreiter/gui/wellenreiter.h @@ -49,6 +49,9 @@ class Wellenreiter : public WellenreiterBase { bool sniffing; + protected: + virtual void timerEvent( QTimerEvent* ); + public slots: void channelHopped(int); void receivePacket(OPacket*); |