From 30e5401a945ebdfd92eedb9f3def9a6acd0fc6ca Mon Sep 17 00:00:00 2001 From: mickeyl Date: Sat, 05 Apr 2003 19:29:47 +0000 Subject: - setting the monitor mode on wireless cards via private ioctls is now much more reliable because we detect the appropriate ioctl number at runtime - ONetworkInterface supports now the evil but handy feature to change MAC address on the fly (provided the driver supports this) --- diff --git a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp index b010ac5..020fc23 100644 --- a/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp +++ b/libopie2/examples/opienet/onetworkdemo/onetworkdemo.cpp @@ -28,12 +28,30 @@ int main( int argc, char** argv ) // try to set monitor mode + /* + // first some wrong calls to check if this is working iface->setPrivate( "seppel", 10 ); iface->setPrivate( "monitor", 0 ); // now the real deal iface->setPrivate( "monitor", 2, 2, 3 ); + + */ + + // trying to set hw address to 12:34:56:AB:CD:EF + + /* + + OMacAddress addr = OMacAddress::fromString( "12:34:56:AB:CD:EF" ); + iface->setUp( false ); + iface->setMacAddress( addr ); + iface->setUp( true ); + qDebug( "DEMO: MAC Address now is '%s'", (const char*) iface->macAddress().toString() ); + + */ + + } ++it; } diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp index b317810..0fb21ff 100644 --- a/libopie2/opienet/onetutils.cpp +++ b/libopie2/opienet/onetutils.cpp @@ -62,7 +62,7 @@ const OMacAddress& OMacAddress::unknown = OMacAddress( __unknown ); OMacAddress::OMacAddress( unsigned char* p ) { - memcpy( _bytes, p, 6 ); // D'OH! memcpy in my sources... eeek... + memcpy( _bytes, p, 6 ); } @@ -83,6 +83,32 @@ OMacAddress::~OMacAddress() } +#ifdef QT_NO_DEBUG +inline +#endif +const unsigned char* OMacAddress::native() const +{ + return (const unsigned char*) &_bytes; +} + + +OMacAddress OMacAddress::fromString( const QString& str ) +{ + QString addr( str ); + unsigned char buf[6]; + bool ok = true; + int index = 14; + for ( int i = 5; i >= 0; --i ) + { + buf[i] = addr.right( 2 ).toUShort( &ok, 16 ); + if ( !ok ) return OMacAddress::unknown; + addr.truncate( index ); + index -= 3; + } + return (const unsigned char*) &buf; +} + + QString OMacAddress::toString() const { QString s; diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h index 8be042b..73d52cc 100644 --- a/libopie2/opienet/onetutils.h +++ b/libopie2/opienet/onetutils.h @@ -56,6 +56,9 @@ class OMacAddress ~OMacAddress(); QString toString() const; + const unsigned char* native() const; + + static OMacAddress fromString( const QString& ); public: static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index f52279a..e916c44 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -224,6 +224,14 @@ QString ONetworkInterface::ipV4Address() const } +void ONetworkInterface::setMacAddress( const OMacAddress& addr ) +{ + _ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 ); + ioctl( SIOCSIFHWADDR ); +} + + OMacAddress ONetworkInterface::macAddress() const { if ( ioctl( SIOCGIFHWADDR ) ) @@ -647,6 +655,13 @@ void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, .. void OWirelessNetworkInterface::getPrivate( const QString& call ) { + qWarning( "OWirelessNetworkInterface::getPrivate() is not implemented yet." ); +} + + +bool OWirelessNetworkInterface::hasPrivate( const QString& call ) +{ + return child( (const char*) call ); } @@ -834,29 +849,16 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring + //TODO: check wireless extensions version on runtime and use + //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15 + if ( b ) { - #if WIRELESS_EXT > 14 - _if->_iwr.u.mode = IW_MODE_MONITOR; - _if->wioctl( SIOCSIWMODE ); - #else - int* args = (int*) &_if->_iwr.u.name; - args[0] = 2; - args[1] = 0; - _if->wioctl( SIOCDEVPRIVATE ); - #endif + _if->setPrivate( "monitor", 1, 2 ); } else { - #if WIRELESS_EXT > 14 - _if->_iwr.u.mode = IW_MODE_INFRA; - _if->wioctl( SIOCSIWMODE ); - #else - int* args = (int*) &_if->_iwr.u.name; - args[0] = 0; - args[1] = 0; - _if->wioctl( SIOCDEVPRIVATE ); - #endif + _if->setPrivate( "monitor", 1, 0 ); } } @@ -885,11 +887,7 @@ OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() void OOrinocoMonitoringInterface::setChannel( int c ) { - // call iwpriv monitor 2 - int* args = (int*) &_if->_iwr.u.name; - args[0] = 2; - args[1] = c; - _if->wioctl( SIOCIWFIRSTPRIV + 0x8 ); + _if->setPrivate( "monitor", 2, 2, c ); } @@ -901,11 +899,7 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) } else { - // call iwpriv monitor 0 0 - int* args = (int*) &_if->_iwr.u.name; - args[0] = 0; - args[1] = 0; - _if->wioctl( SIOCIWFIRSTPRIV + 0x8 ); + _if->setPrivate( "monitor", 2, 0, 0 ); } } diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index 4cadbeb..e249aee 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -63,10 +63,6 @@ #define _LINUX_IF_H #include -#ifndef SIOCIWFIRSTPRIV -#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE -#endif - class ONetworkInterface; class OWirelessNetworkInterface; class OChannelHopper; @@ -125,6 +121,7 @@ class ONetworkInterface : public QObject bool isLoopback() const; bool isWireless() const; QString ipV4Address() const; + void setMacAddress( const OMacAddress& ); OMacAddress macAddress() const; int dataLinkType() const; @@ -204,6 +201,7 @@ class OWirelessNetworkInterface : public ONetworkInterface virtual QString nickName() const; virtual void setPrivate( const QString&, int, ... ); + virtual bool hasPrivate( const QString& ); virtual void getPrivate( const QString& ); virtual bool isAssociated() const {}; @@ -249,7 +247,7 @@ class OMonitoringInterface virtual QString name() const = 0; protected: - const OWirelessNetworkInterface* _if; + OWirelessNetworkInterface* _if; }; -- cgit v0.9.0.2