summaryrefslogtreecommitdiff
path: root/noncore
authormickeyl <mickeyl>2004-05-01 16:15:05 (UTC)
committer mickeyl <mickeyl>2004-05-01 16:15:05 (UTC)
commitfd2bbf9a09aa7a13bd8a43db351b9153e5a4b7ab (patch) (side-by-side diff)
tree17e24a7acb78e995e53ec7127e2d20a834984706 /noncore
parentd5abd7878f553f5ac0a41966b27f4c09389d3cfd (diff)
downloadopie-fd2bbf9a09aa7a13bd8a43db351b9153e5a4b7ab.zip
opie-fd2bbf9a09aa7a13bd8a43db351b9153e5a4b7ab.tar.gz
opie-fd2bbf9a09aa7a13bd8a43db351b9153e5a4b7ab.tar.bz2
- be really paranoid about wireless extension versions for compile time vs. run time
- register handlers for SIGSEGV and SIGBUG to emergency-close the capture file
Diffstat (limited to 'noncore') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/ChangeLog3
-rw-r--r--noncore/net/wellenreiter/TODO6
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp48
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.h5
4 files changed, 56 insertions, 6 deletions
diff --git a/noncore/net/wellenreiter/ChangeLog b/noncore/net/wellenreiter/ChangeLog
index fdc8aa7..b59f9f9 100644
--- a/noncore/net/wellenreiter/ChangeLog
+++ b/noncore/net/wellenreiter/ChangeLog
@@ -1,14 +1,17 @@
2004-??-?? Michael Lauer <mickey@Vanille.de>
+ * Registered a signal handler. We're now trying to gracefully exit and emergency close capture files.
+ This should allow reproducing failures.
+ * Added sanity check for compile time vs. run time Wireless Extension versions.
* Added sanity check isPresent(interface) before starting the engine.
* Added a View submenu. Added actions to expand and collapse all items.
* Switched to a (hopefully) more reliable method reading from gpsd.
* Added parsing of named ProbeRequests. Display only-probed-yet SSIDs in a different network color.
* Rewrote the simple actions on new {Network, Client, Station}. Besides playing a sound or
blinking a LED, a user customizable script can now be executed, if something has been
detected. This opens up many possibilities, i.e. a qcop to qpegps or exec'ing flite (speech).
* Added decloaking of cloaked ESSIDs (length != 0, but essid[0] == \0).
* Hided the 'Parse' Tab in the configuration window. Not functional now and may come later
* Added parsing of control frames. Display stations sending them SSID "<unknown>" for now.
* Added command line option "-nocheck" to skip non-root and dhcp tests.
* Improved the speed of and user feedback during reading the manufacturer list.
diff --git a/noncore/net/wellenreiter/TODO b/noncore/net/wellenreiter/TODO
index 0640d23..f0a193d 100644
--- a/noncore/net/wellenreiter/TODO
+++ b/noncore/net/wellenreiter/TODO
@@ -13,39 +13,39 @@
BUILD
--------
- fix building against X11 again
--------
ENGINE
--------
- enable multiple packet sources
- infrared
- bluetooth
- - usb?
+ - usb
- define packet structure in a metalanguage and generate
the actual parsing code (hmmm)
- pester the ethereal folks to settle for an application independant
packet dissection framework... (unlikely)
- adaptive hopping scheme !
- gather interface capabilities
- enable sniffing in wired networks
-- fix autodetection (interface name)
+- fix autodetection (the interface name is not selected correctly)
- use ethtool IOCTLs (if present)
---------
UI
---------
- display interface capabilities (or rewrite networksettings?)
- distinguish wireless bridges (WDS traffic)
- add configuration for scrollback buffer in hex window and log window
@@ -64,14 +64,12 @@
- write kismet-like .network format and format to be importable into AutoRoute
- implement beacon stripping (the first beacon is enough to detect a
new network - further beacons just blow up the capture file)
- write wi-scan format like that:
# $Creator: Wellenreiter II Version 1.0.2
# $Format: wi-scan
# Latitude Longitude ( SSID ) Type ( BSSID ) Time (GMT) [ SNR Sig Noise ]
# $DateGMT: 2004-02-07
N 41.1008009 W 8.3893034 ( Porceven ) BBS ( 00:a0:f8:41:91:63 ) 22:32:39 (GMT) [ 21 177 156 ]
-- add SIGSEGV handler for emergency closing the capture file etc.
-
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp
index 40cd105..12b3978 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp
@@ -49,24 +49,27 @@ using namespace Opie::Ui;
#include <qspinbox.h>
#include <qtimer.h>
#include <qtoolbutton.h>
#include <qmainwindow.h>
/* STD */
#include <assert.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
+#include <signal.h>
+
+Wellenreiter* Wellenreiter::instance = 0;
Wellenreiter::Wellenreiter( QWidget* parent )
: WellenreiterBase( parent, 0, 0 ),
sniffing( false ), iface( 0 ), configwindow( 0 )
{
logwindow->log( "(i) Wellenreiter has been started." );
//
// detect operating system
//
@@ -78,40 +81,71 @@ Wellenreiter::Wellenreiter( QWidget* parent )
#endif
netview->setColumnWidthMode( 1, QListView::Manual );
connect( netview, SIGNAL( joinNetwork(const QString&,const QString&,int,const QString&) ),
this, SLOT( joinNetwork(const QString&,const QString&,int,const QString&) ) );
pcap = new OPacketCapturer();
pcap->setAutoDelete( false );
gps = new GPS( this );
QTimer::singleShot( 1000, this, SLOT( initialTimer() ) );
+ registerSignalHandler();
}
Wellenreiter::~Wellenreiter()
{
delete pcap;
+ //unregisterSignalHandler();
}
void Wellenreiter::initialTimer()
{
- odebug << "Wellenreiter::preloading manufacturer database..." << oendl;
+ odebug << "preloading manufacturer database..." << oendl;
OManufacturerDB::instance();
}
+void Wellenreiter::signalHandler( int sig )
+{
+ oerr << "Aye! Received SIGSEGV or SIGBUS! Trying to exit gracefully..." << oendl;
+ if ( Wellenreiter::instance->sniffing )
+ {
+ Wellenreiter::instance->pcap->close();
+ Wellenreiter::instance->stopClicked();
+ }
+ oerr << "Phew. Seemed to work." << oendl;
+ ::exit( -1 );
+}
+
+
+void Wellenreiter::registerSignalHandler()
+{
+ Wellenreiter::instance = this;
+ struct sigaction action;
+
+ action.sa_handler = Wellenreiter::signalHandler;
+ if (sigemptyset(&action.sa_mask))
+ oerr << "sigemptyset() failure:" << strerror( errno ) << oendl;
+ if (sigaction(SIGSEGV, &action, NULL))
+ oerr << "can't set up a signal handler for SIGSEGV:" << strerror( errno ) << oendl;
+ if (sigaction(SIGBUS, &action, NULL))
+ oerr << "can't set up a signal handler for SIGBUS:" << strerror( errno ) << oendl;
+ odebug << "signal handlers setup." << oendl;
+}
+
+
void Wellenreiter::setConfigWindow( WellenreiterConfigWindow* cw )
{
configwindow = cw;
}
void Wellenreiter::channelHopped(int c)
{
QString title = "Wellenreiter II -scan- [";
QString left;
if ( c > 1 ) left.fill( '.', c-1 );
title.append( left );
@@ -493,25 +527,25 @@ void Wellenreiter::stopClicked()
void Wellenreiter::startClicked()
{
// get configuration from config window
const QString& interface = configwindow->interfaceName->currentText();
const int cardtype = configwindow->driverType();
const int interval = configwindow->hoppingInterval();
if ( ( interface == "" ) || ( cardtype == 0 ) )
{
QMessageBox::information( this, "Wellenreiter II",
- tr( "Your device is not\nproperly configured. Please reconfigure!" ) );
+ tr( "No device configured.\nPlease reconfigure!" ) );
return;
}
// configure device
ONetwork* net = ONetwork::instance();
// TODO: check if interface is wireless and support sniffing for non-wireless interfaces
if ( cardtype != DEVTYPE_FILE )
{
if ( !net->isPresent( interface ) )
@@ -523,24 +557,34 @@ void Wellenreiter::startClicked()
iface = static_cast<OWirelessNetworkInterface*>(net->interface( interface )); // fails if network is not wireless!
assert( iface );
// bring device UP
iface->setUp( true );
if ( !iface->isUp() )
{
QMessageBox::warning( this, "Wellenreiter II",
tr( "Can't bring interface '%1' up:\n" ).arg( iface->name() ) + strerror( errno ) );
return;
}
+
+ // check if wireless extension version matches
+ if ( ONetwork::wirelessExtensionCompileVersion() != iface->wirelessExtensionDriverVersion() )
+ {
+ QMessageBox::critical( this, "Wellenreiter II", tr( "<p>The Wireless Extension Versions<br>are not matching!<p>"
+ " Wellenreiter II : WE V%1<br>Interface driver: WE V%2" )
+ .arg( QString::number( ONetwork::wirelessExtensionCompileVersion() ) )
+ .arg( QString::number( iface->wirelessExtensionDriverVersion() ) ) );
+ return;
+ }
}
// set monitor mode
bool usePrism = configwindow->usePrismHeader();
switch ( cardtype )
{
case DEVTYPE_CISCO: iface->setMonitoring( new OCiscoMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_WLAN_NG: iface->setMonitoring( new OWlanNGMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_HOSTAP: iface->setMonitoring( new OHostAPMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_ORINOCO: iface->setMonitoring( new OOrinocoMonitoringInterface( iface, usePrism ) ); break;
case DEVTYPE_MANUAL: QMessageBox::information( this, "Wellenreiter II", tr( "Bring your device into\nmonitor mode now." ) ); break;
case DEVTYPE_FILE: odebug << "Wellenreiter: Capturing from file '" << interface << "'" << oendl; break;
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h
index f609ef4..32e5690 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.h
+++ b/noncore/net/wellenreiter/gui/wellenreiter.h
@@ -11,24 +11,26 @@
**
**********************************************************************/
#ifndef WELLENREITER_H
#define WELLENREITER_H
#include "wellenreiterbase.h"
#ifdef QWS
#include <opie2/odevice.h>
#endif
+#include <signal.h>
+
class QTimerEvent;
class QPixmap;
namespace Opie {namespace Net {class OPacket;}}
namespace Opie {namespace Net {class OWaveLanManagementPacket;}}
namespace Opie {namespace Net {class OWaveLanControlPacket;}}
namespace Opie {namespace Net {class OWaveLanDataPacket;}}
namespace Opie {namespace Net {class OEthernetPacket;}}
namespace Opie {namespace Net {class OARPPacket;}}
namespace Opie {namespace Net {class OMacAddress;}}
namespace Opie {namespace Net {class OIPPacket;}}
namespace Opie {namespace Net {class OPacket;}}
namespace Opie {namespace Net {class OWirelessNetworkInterface;}}
@@ -45,24 +47,26 @@ class Wellenreiter : public WellenreiterBase {
Wellenreiter( QWidget* parent = 0 );
~Wellenreiter();
void setConfigWindow( WellenreiterConfigWindow* cw );
MScanListView* netView() const { return netview; };
MLogWindow* logWindow() const { return logwindow; };
PacketView* hexWindow() const { return hexwindow; };
bool isDaemonRunning() const { return sniffing; };
QString captureFileName() const { return dumpname; };
public:
bool sniffing;
+ static Wellenreiter* instance;
+ static void signalHandler( int sig );
protected:
virtual void timerEvent( QTimerEvent* );
public slots:
void initialTimer();
void channelHopped(int);
void receivePacket(Opie::Net::OPacket*);
void startClicked();
void stopClicked();
@@ -77,24 +81,25 @@ class Wellenreiter : public WellenreiterBase {
void handleManagementFrameBeacon( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleManagementFrameProbeRequest( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleManagementFrameProbeResponse( Opie::Net::OPacket* p, Opie::Net::OWaveLanManagementPacket* );
void handleControlFrame( Opie::Net::OPacket* p, Opie::Net::OWaveLanControlPacket* control );
void handleWlanData( Opie::Net::OPacket* p, Opie::Net::OWaveLanDataPacket* data, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleEthernetData( Opie::Net::OPacket* p, Opie::Net::OEthernetPacket* data, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleARPData( Opie::Net::OPacket* p, Opie::Net::OARPPacket* arp, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleIPData( Opie::Net::OPacket* p, Opie::Net::OIPPacket* ip, Opie::Net::OMacAddress& from, Opie::Net::OMacAddress& to );
void handleNotification( Opie::Net::OPacket* p );
void doAction( const QString& action, const QString& protocol, Opie::Net::OPacket* p );
QObject* childIfToParse( Opie::Net::OPacket* p, const QString& protocol );
bool checkDumpPacket( Opie::Net::OPacket* p );
+ void registerSignalHandler();
private:
#ifdef QWS
Opie::Core::OSystem _system; // Opie Operating System identifier
#endif
QString dumpname;
Opie::Net::OWirelessNetworkInterface* iface;
Opie::Net::OPacketCapturer* pcap;
WellenreiterConfigWindow* configwindow;
GPS* gps;