summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2003-04-10 15:49:08 (UTC)
committer mickeyl <mickeyl>2003-04-10 15:49:08 (UTC)
commit4e8e3741dca909782e15bb197e5b6a78750536c2 (patch) (side-by-side diff)
tree37285f8d053b3995aee46487277b57248862848c
parent3733471135ea180709fcf4695607cce0c5fc7fb5 (diff)
downloadopie-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
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/wellenreiter/gui/configbase.ui6
-rw-r--r--noncore/net/wellenreiter/gui/configwindow.cpp46
-rw-r--r--noncore/net/wellenreiter/gui/configwindow.h14
-rw-r--r--noncore/net/wellenreiter/gui/mainwindow.cpp2
-rw-r--r--noncore/net/wellenreiter/gui/mainwindow.h4
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp64
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.h3
7 files changed, 106 insertions, 33 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
@@ -166,12 +166,18 @@
<item>
<property>
<name>text</name>
<string>&lt;manual&gt;</string>
</property>
</item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>&lt;file&gt;</string>
+ </property>
+ </item>
<property stdset="1">
<name>name</name>
<cstring>deviceType</cstring>
</property>
<property stdset="1">
<name>enabled</name>
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
@@ -12,14 +12,16 @@
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
/* LOCAL */
#include "configwindow.h"
+#include "mainwindow.h"
/* QT */
+#include <qapplication.h>
#include <qcombobox.h>
#include <qfile.h>
#include <qlayout.h>
#include <qmap.h>
#include <qpushbutton.h>
#include <qspinbox.h>
@@ -30,17 +32,18 @@
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();
ONetwork::InterfaceIterator it = net->iterator();
while ( it.current() )
{
@@ -56,34 +59,38 @@ WellenreiterConfigWindow::WellenreiterConfigWindow( QWidget * parent, const char
int devicetype(0);
QString line;
QTextStream modules( &m );
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 );
}
}
#ifdef Q_WS_X11 // We're on X11: adding an Ok-Button for the Dialog here
QPushButton* okButton = new QPushButton( "ok", this );
okButton->show();
Layout5_2->addWidget( okButton, 0, 3 ); //FIXME: rename this in configbase.ui
connect( okButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
#endif
WellenreiterConfigWindow::_instance = this;
+
+ connect( deviceType, SIGNAL( activated(int) ), this, SLOT( changedDeviceType(int) ) );
};
+
int WellenreiterConfigWindow::daemonDeviceType()
{
QString name = deviceType->currentText();
if ( _devicetype.contains( name ) )
{
return _devicetype[name];
@@ -91,10 +98,29 @@ int WellenreiterConfigWindow::daemonDeviceType()
else
{
return 0;
}
};
+
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
@@ -18,27 +18,39 @@
#include "configbase.h"
#include <qmap.h>
#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 );
int daemonDeviceType();
int daemonHopInterval();
const QString soundOnNetwork() const { return netSound->currentText(); };
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
@@ -220,12 +220,13 @@ void WellenreiterMainWindow::demoAddStations()
mw->netView()->addNewItem( "managed", "Vanille", "00:30:6D:EF:A6:23", true, 11, 10 );
mw->netView()->addNewItem( "adhoc", "ELAN", "00:A0:F8:E7:16:22", false, 3, 10 );
mw->netView()->addNewItem( "adhoc", "ELAN", "00:AA:01:E7:56:62", false, 3, 15 );
mw->netView()->addNewItem( "adhoc", "ELAN", "00:B0:8E:E7:56:E2", false, 3, 20 );
}
+
QString WellenreiterMainWindow::getFileName( bool save )
{
QMap<QString, QStringList> map;
map.insert( tr("All"), QStringList() );
QStringList text;
text << "text/*";
@@ -254,12 +255,13 @@ QString WellenreiterMainWindow::getFileName( bool save )
if ( str.isEmpty() || !QFile(str).exists() || QFileInfo(str).isDir() )
return "";
}
return str;
}
+
void WellenreiterMainWindow::fileSaveLog()
{
QString fname = getFileName( true );
if ( !fname.isEmpty() )
{
QFile f( fname );
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
@@ -27,12 +27,13 @@ class WellenreiterMainWindow: public QMainWindow
{
Q_OBJECT
public:
WellenreiterMainWindow( QWidget * parent = 0, const char * name = "mainwindow", WFlags f = 0 );
~WellenreiterMainWindow();
+ QString getFileName( bool save );
protected:
Wellenreiter* mw;
WellenreiterConfigWindow* cw;
const QIconSet* startIconSet;
@@ -46,15 +47,12 @@ class WellenreiterMainWindow: public QMainWindow
int stopID;
protected:
virtual void closeEvent( QCloseEvent* );
void updateToolButtonState();
- private:
- QString getFileName( bool save );
-
public slots:
void showConfigure();
void demoAddStations();
void fileSaveLog();
void fileSaveHex();
void fileSaveSession();
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
@@ -218,34 +218,34 @@ void Wellenreiter::receivePacket(OPacket* p)
}
}
void Wellenreiter::stopClicked()
{
+ 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 );
system( "cardctl reset; sleep 1" ); //FIXME: Use OProcess
+ }
+
logwindow->log( "(i) Stopped Scanning." );
assert( parent() );
( (QMainWindow*) parent() )->setCaption( "Wellenreiter II" );
// message the user
QMessageBox::information( this, "Wellenreiter II", "Your wireless card\nshould now be usable again." );
@@ -294,46 +294,72 @@ void Wellenreiter::startClicked()
iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface ));
// set monitor mode
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 )
+ // switch device into monitor mode
+ if ( cardtype < DEVTYPE_FILE )
+ {
+ 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
+ if ( cardtype != DEVTYPE_FILE )
pcap->open( interface );
+ else
+ pcap->open( QFile( interface ) );
if ( !pcap->isOpen() )
{
QMessageBox::warning( this, "Wellenreiter II", "Can't open packet capturer:\n" + QString(strerror( errno ) ));
return;
}
// set capturer to non-blocking mode
pcap->setBlocking( false );
// start channel hopper
+ if ( cardtype != DEVTYPE_FILE )
iface->setChannelHopping( 1000 ); //use interval from config window
- // connect
+ 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
@@ -46,12 +46,15 @@ class Wellenreiter : public WellenreiterBase {
MLogWindow* logWindow() const { return logwindow; };
MHexWindow* hexWindow() const { return hexwindow; };
bool isDaemonRunning() const { return sniffing; };
bool sniffing;
+ protected:
+ virtual void timerEvent( QTimerEvent* );
+
public slots:
void channelHopped(int);
void receivePacket(OPacket*);
void startClicked();
void stopClicked();