author | mickeyl <mickeyl> | 2003-10-09 00:03:06 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-10-09 00:03:06 (UTC) |
commit | f8d08db59ac05f5bf2f56e6ebf69c28dfbe8b13e (patch) (side-by-side diff) | |
tree | 36059d71abfcdb73748c1941fb9458dc75e0d4a8 | |
parent | 5517443d9ebe96ff9c30d91b2254418964d5c410 (diff) | |
download | opie-f8d08db59ac05f5bf2f56e6ebf69c28dfbe8b13e.zip opie-f8d08db59ac05f5bf2f56e6ebf69c28dfbe8b13e.tar.gz opie-f8d08db59ac05f5bf2f56e6ebf69c28dfbe8b13e.tar.bz2 |
- catch up with changed sniffing behaviour in newer wlan-ng *puke* drivers
- new API: OPacketCapturer::next( int time )
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 12 | ||||
-rw-r--r-- | libopie2/opienet/opcap.cpp | 27 | ||||
-rw-r--r-- | libopie2/opienet/opcap.h | 5 |
3 files changed, 38 insertions, 6 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 1f529d2..45ee4c0 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -926,20 +926,26 @@ void OWlanNGMonitoringInterface::setEnabled( bool b ) QString OWlanNGMonitoringInterface::name() const { return "wlan-ng"; } -void OWlanNGMonitoringInterface::setChannel( int ) +void OWlanNGMonitoringInterface::setChannel( int c ) { - // wlan-ng devices automatically switch channels when in monitor mode - // NOTE: The above note no longer seems to be true for recent driver versions! + //NOTE: Older wlan-ng drivers automatically hopped channels while lnxreq_wlansniff=true. Newer ones don't. + + QString enable = "true"; //_if->monitorMode() ? "true" : "false"; + QString prism = _prismHeader ? "true" : "false"; + QString cmd; + cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s", + (const char*) _if->name(), c+1, (const char*) enable, (const char*) prism ); + system( cmd ); } /*====================================================================================== * OHostAPMonitoringInterface *======================================================================================*/ OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp index 9ed2b83..38ca1a1 100644 --- a/libopie2/opienet/opcap.cpp +++ b/libopie2/opienet/opcap.cpp @@ -27,25 +27,29 @@ -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* OPIE */ - #include <opie2/opcap.h> /* QT */ - #include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) #include <qsocketnotifier.h> #include <qobjectlist.h> +/* SYSTEM */ +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> + +/* LOCAL */ #include "udp_ports.h" /*====================================================================================== * OPacket *======================================================================================*/ OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) :QObject( parent, "Generic" ), _hdr( header ), _data( data ) @@ -191,17 +195,17 @@ OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_h if ( sourceAddress() == OMacAddress::broadcast ) qDebug( "Source is broadcast address" ); if ( destinationAddress() == OMacAddress::broadcast ) qDebug( "Destination is broadcast address" ); switch ( type() ) { case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; - case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } + case ETHERTYPE_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break; case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); } } OEthernetPacket::~OEthernetPacket() @@ -1125,16 +1129,33 @@ int OPacketCapturer::fileno() const return pcap_fileno( _pch ); } else { return -1; } } + +OPacket* OPacketCapturer::next( int time ) +{ + fd_set fds; + struct timeval tv; + FD_ZERO( &fds ); + FD_SET( pcap_fileno( _pch ), &fds ); + tv.tv_sec = time / 1000; + tv.tv_usec = time % 1000; + int retval = select( 1, &fds, NULL, NULL, &tv); + if ( retval > 0 ) // clear to read! + return next(); + else + return 0; +} + + OPacket* OPacketCapturer::next() { packetheaderstruct header; qDebug( "==> OPacketCapturer::next()" ); const unsigned char* pdata = pcap_next( _pch, &header ); qDebug( "<== OPacketCapturer::next()" ); if ( pdata && header.len ) diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h index 51f067a..54b256b 100644 --- a/libopie2/opienet/opcap.h +++ b/libopie2/opienet/opcap.h @@ -600,16 +600,21 @@ class OPacketCapturer : public QObject */ int fileno() const; /** * @returns the next @ref OPacket from the packet capturer. * @note If blocking mode is true then this call might block. */ OPacket* next(); /** + * @returns the next @ref OPacket from the packet capturer, if + * one arrives within @a time milliseconds. + */ + OPacket* next( int time ); + /** * Open the packet capturer to capture packets in live-mode from @a interface. */ bool open( const QString& interface ); /** * Open the packet capturer to capture packets in offline-mode from @a file. */ bool open( const QFile& file ); /** |