summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetutils.cpp59
-rw-r--r--libopie2/opienet/onetutils.h25
-rw-r--r--libopie2/opienet/onetwork.cpp127
-rw-r--r--libopie2/opienet/onetwork.h21
4 files changed, 178 insertions, 54 deletions
diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp
index 8006f41..3e11b53 100644
--- a/libopie2/opienet/onetutils.cpp
+++ b/libopie2/opienet/onetutils.cpp
@@ -38,2 +38,12 @@ using namespace std;
38 38
39#define IW_PRIV_TYPE_MASK 0x7000
40#define IW_PRIV_TYPE_NONE 0x0000
41#define IW_PRIV_TYPE_BYTE 0x1000
42#define IW_PRIV_TYPE_CHAR 0x2000
43#define IW_PRIV_TYPE_INT 0x4000
44#define IW_PRIV_TYPE_FLOAT 0x5000
45#define IW_PRIV_TYPE_ADDR 0x6000
46#define IW_PRIV_SIZE_FIXED 0x0800
47#define IW_PRIV_SIZE_MASK 0x07FF
48
39/*====================================================================================== 49/*======================================================================================
@@ -89,2 +99,51 @@ bool operator==( const OMacAddress &m1, const OMacAddress &m2 )
89 99
100
101/*======================================================================================
102 * OHostAddress
103 *======================================================================================*/
104
105
106/*======================================================================================
107 * OPrivateIOCTL
108 *======================================================================================*/
109
110OPrivateIOCTL::OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs )
111 :QObject( parent, name ), _ioctl( cmd ), _getargs( getargs ), _setargs( setargs )
112{
113}
114
115
116OPrivateIOCTL::~OPrivateIOCTL()
117{
118}
119
120
121inline int OPrivateIOCTL::numberGetArgs() const
122{
123 return _getargs & IW_PRIV_SIZE_MASK;
124}
125
126
127inline int OPrivateIOCTL::typeGetArgs() const
128{
129 return _getargs & IW_PRIV_TYPE_MASK >> 12;
130}
131
132
133inline int OPrivateIOCTL::numberSetArgs() const
134{
135 return _setargs & IW_PRIV_SIZE_MASK;
136}
137
138
139inline int OPrivateIOCTL::typeSetArgs() const
140{
141 return _setargs & IW_PRIV_TYPE_MASK >> 12;
142}
143
144
145/*======================================================================================
146 * assorted functions
147 *======================================================================================*/
148
90void dumpBytes( const unsigned char* data, int num ) 149void dumpBytes( const unsigned char* data, int num )
diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h
index 0dabe8d..6640515 100644
--- a/libopie2/opienet/onetutils.h
+++ b/libopie2/opienet/onetutils.h
@@ -38,4 +38,8 @@
38#include <qhostaddress.h> 38#include <qhostaddress.h>
39#include <qobject.h>
40
41#include <sys/types.h>
39 42
40struct ifreq; 43struct ifreq;
44class OWirelessNetworkInterface;
41 45
@@ -82,2 +86,23 @@ class OHostAddress : public QHostAddress
82/*====================================================================================== 86/*======================================================================================
87 * OPrivateIOCTL
88 *======================================================================================*/
89
90class OPrivateIOCTL : public QObject
91{
92 public:
93 OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs );
94 ~OPrivateIOCTL();
95
96 int numberGetArgs() const;
97 int typeGetArgs() const;
98 int numberSetArgs() const;
99 int typeSetArgs() const;
100
101 private:
102 u_int32_t _ioctl;
103 u_int16_t _getargs;
104 u_int16_t _setargs;
105};
106
107 /*======================================================================================
83 * Miscellaneous 108 * Miscellaneous
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index ac2857a..2548a04 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -94,3 +94,3 @@ void ONetwork::synchronize()
94 { 94 {
95 iface = new OWirelessNetworkInterface( str ); 95 iface = new OWirelessNetworkInterface( this, str );
96 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); 96 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str );
@@ -99,3 +99,3 @@ void ONetwork::synchronize()
99 { 99 {
100 iface = new ONetworkInterface( str ); 100 iface = new ONetworkInterface( this, str );
101 } 101 }
@@ -128,3 +128,3 @@ bool ONetwork::isWirelessInterface( const char* name ) const
128{ 128{
129 int sfd = socket( AF_INET, SOCK_DGRAM, 0 ); 129 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
130 iwreqstruct iwr; 130 iwreqstruct iwr;
@@ -144,4 +144,5 @@ bool ONetwork::isWirelessInterface( const char* name ) const
144 144
145ONetworkInterface::ONetworkInterface( const QString& name ) 145ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
146 :_name( name ), _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 146 :QObject( parent, name ),
147 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
147{ 148{
@@ -166,3 +167,3 @@ void ONetworkInterface::init()
166 { 167 {
167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", (const char*) _name ); 168 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", name() );
168 return; 169 return;
@@ -185,3 +186,3 @@ bool ONetworkInterface::ioctl( int call ) const
185{ 186{
186 strcpy( _ifr.ifr_name, (const char*) _name ); 187 strcpy( _ifr.ifr_name, name() );
187 return ioctl( call, _ifr ); 188 return ioctl( call, _ifr );
@@ -242,3 +243,3 @@ void ONetworkInterface::setMonitoring( OMonitoringInterface* m )
242 _mon = m; 243 _mon = m;
243 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), (const char*) _name ); 244 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), name() );
244} 245}
@@ -252,8 +253,2 @@ OMonitoringInterface* ONetworkInterface::monitoring() const
252 253
253const QString& ONetworkInterface::name() const
254{
255 return _name;
256}
257
258
259ONetworkInterface::~ONetworkInterface() 254ONetworkInterface::~ONetworkInterface()
@@ -370,4 +365,4 @@ int OChannelHopper::interval() const
370 365
371OWirelessNetworkInterface::OWirelessNetworkInterface( const QString& name ) 366OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name )
372 :ONetworkInterface( name ), _hopper( 0 ) 367 :ONetworkInterface( parent, name ), _hopper( 0 )
373{ 368{
@@ -392,31 +387,5 @@ void OWirelessNetworkInterface::init()
392 qDebug( "OWirelessNetworkInterface::init()" ); 387 qDebug( "OWirelessNetworkInterface::init()" );
393
394 memset( &_iwr, 0, sizeof( struct iwreq ) ); 388 memset( &_iwr, 0, sizeof( struct iwreq ) );
395 389 buildChannelList();
396 // IEEE802.11(b) radio frequency channels 390 buildPrivateList();
397
398 iwrangestruct range;
399 //ML: work around an ugly HostAP bug, which needs
400 //ML: extra space or will complain with "invalid argument length"... :-(
401 //ML: But don't allocate too much or prism2_usb will segfault *sigh*
402 char __extraBufferForBuggyDrivers[20];
403
404 qDebug( "sizeof(iwrangestruct)=%d, sizeof range=%d, sizeof range*2=%d", sizeof(iwrangestruct), sizeof range, (sizeof range)*2 );
405
406 _iwr.u.data.pointer = (char*) &range;
407 _iwr.u.data.length = sizeof(iwrangestruct)+20;
408 _iwr.u.data.flags = 0;
409 if ( !wioctl( SIOCGIWRANGE ) )
410 {
411 qDebug( "OWirelessNetworkInterface::init(): SIOCGIWRANGE failed (%s)", strerror( errno ) );
412 return;
413 }
414
415 qDebug( "OWirelessNetworkInterface::init(): Interface %s reported to have %d channels.", (const char*) _name, range.num_frequency );
416
417 for ( int i = 0; i < range.num_frequency; ++i )
418 {
419 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
420 _channels.insert( freq, i+1 );
421 }
422} 391}
@@ -447,2 +416,69 @@ QString OWirelessNetworkInterface::associatedAP() const
447 416
417void OWirelessNetworkInterface::buildChannelList()
418{
419 // IEEE802.11(b) radio frequency channels
420 struct iw_range range;
421
422 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
423 //ML: The HostAP drivers need more than sizeof struct_iw range to complete
424 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
425 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
426 //ML: _too much_ space. This is damn shitty crap *sigh*
427
428 _iwr.u.data.pointer = (char*) &range;
429 _iwr.u.data.length = IW_MAX_FREQUENCIES; //sizeof range;
430 _iwr.u.data.flags = 0;
431
432 if ( !wioctl( SIOCGIWRANGE ) )
433 {
434 qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) );
435 _channels.insert( 2412, 1 ); // 2.412 GHz
436 _channels.insert( 2417, 2 ); // 2.417 GHz
437 _channels.insert( 2422, 3 ); // 2.422 GHz
438 _channels.insert( 2427, 4 ); // 2.427 GHz
439 _channels.insert( 2432, 5 ); // 2.432 GHz
440 _channels.insert( 2437, 6 ); // 2.437 GHz
441 _channels.insert( 2442, 7 ); // 2.442 GHz
442 _channels.insert( 2447, 8 ); // 2.447 GHz
443 _channels.insert( 2452, 9 ); // 2.452 GHz
444 _channels.insert( 2457, 10 ); // 2.457 GHz
445 _channels.insert( 2462, 11 ); // 2.462 GHz
446 }
447 else
448 {
449 qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency );
450 for ( int i = 0; i < range.num_frequency; ++i )
451 {
452 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
453 _channels.insert( freq, i+1 );
454 }
455 }
456 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." );
457}
458
459
460void OWirelessNetworkInterface::buildPrivateList()
461{
462 qDebug( "OWirelessNetworkInterface::buildPrivateList()" );
463
464 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
465
466 _iwr.u.data.pointer = (char*) &priv;
467 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
468 _iwr.u.data.flags = 0;
469
470 if ( !wioctl( SIOCGIWPRIV ) )
471 {
472 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) );
473 return;
474 }
475
476 for ( int i = 0; i < _iwr.u.data.length; ++i )
477 {
478 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
479 }
480 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." );
481}
482
483
448int OWirelessNetworkInterface::channel() const 484int OWirelessNetworkInterface::channel() const
@@ -506,2 +542,3 @@ void OWirelessNetworkInterface::setChannelHopping( int interval )
506 //FIXME: When and by whom will the channel hopper be deleted? 542 //FIXME: When and by whom will the channel hopper be deleted?
543 //TODO: rely on QObject hierarchy
507} 544}
@@ -584,3 +621,3 @@ bool OWirelessNetworkInterface::wioctl( int call ) const
584{ 621{
585 strcpy( _iwr.ifr_name, (const char*) _name ); 622 strcpy( _iwr.ifr_name, name() );
586 return wioctl( call, _iwr ); 623 return wioctl( call, _iwr );
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
index b57ac3f..acf2f69 100644
--- a/libopie2/opienet/onetwork.h
+++ b/libopie2/opienet/onetwork.h
@@ -51,2 +51,5 @@
51#endif 51#endif
52#ifndef IW_MAX_PRIV_DEF
53#define IW_MAX_PRIV_DEF 128
54#endif
52 55
@@ -110,3 +113,3 @@ class ONetwork : public QObject
110 113
111class ONetworkInterface 114class ONetworkInterface : public QObject
112{ 115{
@@ -119,6 +122,5 @@ class ONetworkInterface
119 public: 122 public:
120 ONetworkInterface( const QString& name ); 123 ONetworkInterface( QObject* parent, const char* name );
121 virtual ~ONetworkInterface(); 124 virtual ~ONetworkInterface();
122 125
123 const QString& name() const;
124 void setMonitoring( OMonitoringInterface* ); 126 void setMonitoring( OMonitoringInterface* );
@@ -135,3 +137,2 @@ class ONetworkInterface
135 protected: 137 protected:
136 const QString _name;
137 const int _sfd; 138 const int _sfd;
@@ -187,3 +188,3 @@ class OWirelessNetworkInterface : public ONetworkInterface
187 188
188 OWirelessNetworkInterface( const QString& name ); 189 OWirelessNetworkInterface( QObject* parent, const char* name );
189 virtual ~OWirelessNetworkInterface(); 190 virtual ~OWirelessNetworkInterface();
@@ -215,6 +216,4 @@ class OWirelessNetworkInterface : public ONetworkInterface
215 protected: 216 protected:
216 mutable iwreqstruct _iwr; 217 void buildChannelList();
217 QMap<int,int> _channels; 218 void buildPrivateList();
218
219 protected:
220 virtual void init(); 219 virtual void init();
@@ -224,2 +223,6 @@ class OWirelessNetworkInterface : public ONetworkInterface
224 223
224 protected:
225 mutable iwreqstruct _iwr;
226 QMap<int,int> _channels;
227
225 private: 228 private: