summaryrefslogtreecommitdiff
path: root/libopie2
Unidiff
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp37
-rw-r--r--libopie2/opienet/onetwork.h12
-rw-r--r--libopie2/opienet/opienet.pro6
-rw-r--r--libopie2/opienet/wireless.15.h (copied from libopie2/opienet/wireless.h)0
-rw-r--r--libopie2/opienet/wireless.16.h (renamed from libopie2/opienet/wireless.h)91
5 files changed, 107 insertions, 39 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index 16fa8ae..36f409b 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -1,196 +1,196 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by Michael 'Mickey' Lauer <mickey@Vanille.de> 3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer
4 =. 4 =. <mickey@Vanille.de>
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28 28
29*/ 29*/
30 30
31/* OPIE */ 31/* OPIE */
32 32
33#include <opie2/onetwork.h> 33#include <opie2/onetwork.h>
34#include <opie2/ostation.h> 34#include <opie2/ostation.h>
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36 36
37/* QT */ 37/* QT */
38 38
39#include <qfile.h> 39#include <qfile.h>
40#include <qtextstream.h> 40#include <qtextstream.h>
41 41
42/* UNIX */ 42/* UNIX */
43 43
44#include <assert.h> 44#include <assert.h>
45#include <arpa/inet.h> 45#include <arpa/inet.h>
46#include <errno.h> 46#include <errno.h>
47#include <string.h> 47#include <string.h>
48#include <stdlib.h> 48#include <stdlib.h>
49#include <math.h> 49#include <math.h>
50#include <sys/ioctl.h> 50#include <sys/ioctl.h>
51#include <sys/socket.h> 51#include <sys/socket.h>
52#include <sys/types.h> 52#include <sys/types.h>
53#include <unistd.h> 53#include <unistd.h>
54#include <linux/sockios.h> 54#include <linux/sockios.h>
55#include <net/if_arp.h> 55#include <net/if_arp.h>
56#include <stdarg.h> 56#include <stdarg.h>
57 57
58#ifndef NODEBUG 58#ifndef NODEBUG
59#include <opie2/odebugmapper.h> 59#include <opie2/odebugmapper.h>
60DebugMapper* debugmapper = new DebugMapper(); 60DebugMapper* debugmapper = new DebugMapper();
61#endif 61#endif
62 62
63/*====================================================================================== 63/*======================================================================================
64 * ONetwork 64 * ONetwork
65 *======================================================================================*/ 65 *======================================================================================*/
66 66
67ONetwork* ONetwork::_instance = 0; 67ONetwork* ONetwork::_instance = 0;
68 68
69ONetwork::ONetwork() 69ONetwork::ONetwork()
70{ 70{
71 odebug << "ONetwork::ONetwork()" << oendl; 71 odebug << "ONetwork::ONetwork()" << oendl;
72 odebug << "ONetwork: This code has been compiled against Wireless Extensions V" << WIRELESS_EXT << oendl; 72 odebug << "ONetwork: This code has been compiled against Wireless Extensions V" << WIRELESS_EXT << oendl;
73 synchronize(); 73 synchronize();
74} 74}
75 75
76void ONetwork::synchronize() 76void ONetwork::synchronize()
77{ 77{
78 // gather available interfaces by inspecting /proc/net/dev 78 // gather available interfaces by inspecting /proc/net/dev
79 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices 79 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
80 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices 80 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices
81 //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev 81 //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev
82 82
83 _interfaces.clear(); 83 _interfaces.clear();
84 QString str; 84 QString str;
85 QFile f( "/proc/net/dev" ); 85 QFile f( "/proc/net/dev" );
86 bool hasFile = f.open( IO_ReadOnly ); 86 bool hasFile = f.open( IO_ReadOnly );
87 if ( !hasFile ) 87 if ( !hasFile )
88 { 88 {
89 odebug << "ONetwork: /proc/net/dev not existing. No network devices available" << oendl; 89 odebug << "ONetwork: /proc/net/dev not existing. No network devices available" << oendl;
90 return; 90 return;
91 } 91 }
92 QTextStream s( &f ); 92 QTextStream s( &f );
93 s.readLine(); 93 s.readLine();
94 s.readLine(); 94 s.readLine();
95 while ( !s.atEnd() ) 95 while ( !s.atEnd() )
96 { 96 {
97 s >> str; 97 s >> str;
98 str.truncate( str.find( ':' ) ); 98 str.truncate( str.find( ':' ) );
99 odebug << "ONetwork: found interface '" << str << "'" << oendl; 99 odebug << "ONetwork: found interface '" << str << "'" << oendl;
100 ONetworkInterface* iface; 100 ONetworkInterface* iface;
101 if ( isWirelessInterface( str ) ) 101 if ( isWirelessInterface( str ) )
102 { 102 {
103 iface = new OWirelessNetworkInterface( this, (const char*) str ); 103 iface = new OWirelessNetworkInterface( this, (const char*) str );
104 odebug << "ONetwork: interface '" << str << "' has Wireless Extensions" << oendl; 104 odebug << "ONetwork: interface '" << str << "' has Wireless Extensions" << oendl;
105 } 105 }
106 else 106 else
107 { 107 {
108 iface = new ONetworkInterface( this, (const char*) str ); 108 iface = new ONetworkInterface( this, (const char*) str );
109 } 109 }
110 _interfaces.insert( str, iface ); 110 _interfaces.insert( str, iface );
111 s.readLine(); 111 s.readLine();
112 } 112 }
113} 113}
114 114
115 115
116short ONetwork::wirelessExtensionVersion() 116short ONetwork::wirelessExtensionVersion()
117{ 117{
118 return WIRELESS_EXT; 118 return WIRELESS_EXT;
119} 119}
120 120
121 121
122int ONetwork::count() const 122int ONetwork::count() const
123{ 123{
124 return _interfaces.count(); 124 return _interfaces.count();
125} 125}
126 126
127 127
128ONetworkInterface* ONetwork::interface( const QString& iface ) const 128ONetworkInterface* ONetwork::interface( const QString& iface ) const
129{ 129{
130 return _interfaces[iface]; 130 return _interfaces[iface];
131} 131}
132 132
133 133
134ONetwork* ONetwork::instance() 134ONetwork* ONetwork::instance()
135{ 135{
136 if ( !_instance ) _instance = new ONetwork(); 136 if ( !_instance ) _instance = new ONetwork();
137 return _instance; 137 return _instance;
138} 138}
139 139
140 140
141ONetwork::InterfaceIterator ONetwork::iterator() const 141ONetwork::InterfaceIterator ONetwork::iterator() const
142{ 142{
143 return ONetwork::InterfaceIterator( _interfaces ); 143 return ONetwork::InterfaceIterator( _interfaces );
144} 144}
145 145
146 146
147bool ONetwork::isWirelessInterface( const char* name ) const 147bool ONetwork::isWirelessInterface( const char* name ) const
148{ 148{
149 int sfd = socket( AF_INET, SOCK_STREAM, 0 ); 149 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
150 struct iwreq iwr; 150 struct iwreq iwr;
151 memset( &iwr, 0, sizeof( struct iwreq ) ); 151 memset( &iwr, 0, sizeof( struct iwreq ) );
152 strcpy( (char*) &iwr.ifr_name, name ); 152 strcpy( (char*) &iwr.ifr_name, name );
153 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr ); 153 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
154 return result != -1; 154 return result != -1;
155} 155}
156 156
157/*====================================================================================== 157/*======================================================================================
158 * ONetworkInterface 158 * ONetworkInterface
159 *======================================================================================*/ 159 *======================================================================================*/
160 160
161ONetworkInterface::ONetworkInterface( QObject* parent, const char* name ) 161ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
162 :QObject( parent, name ), 162 :QObject( parent, name ),
163 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 163 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
164{ 164{
165 odebug << "ONetworkInterface::ONetworkInterface()" << oendl; 165 odebug << "ONetworkInterface::ONetworkInterface()" << oendl;
166 init(); 166 init();
167} 167}
168 168
169 169
170struct ifreq& ONetworkInterface::ifr() const 170struct ifreq& ONetworkInterface::ifr() const
171{ 171{
172 return _ifr; 172 return _ifr;
173} 173}
174 174
175 175
176void ONetworkInterface::init() 176void ONetworkInterface::init()
177{ 177{
178 odebug << "ONetworkInterface::init()" << oendl; 178 odebug << "ONetworkInterface::init()" << oendl;
179 179
180 memset( &_ifr, 0, sizeof( struct ifreq ) ); 180 memset( &_ifr, 0, sizeof( struct ifreq ) );
181 181
182 if ( _sfd == -1 ) 182 if ( _sfd == -1 )
183 { 183 {
184 odebug << "ONetworkInterface::init(): Warning - can't get socket for device '" << name() << "'" << oendl; 184 odebug << "ONetworkInterface::init(): Warning - can't get socket for device '" << name() << "'" << oendl;
185 return; 185 return;
186 } 186 }
187} 187}
188 188
189 189
190bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const 190bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const
191{ 191{
192 #ifndef NODEBUG 192 #ifndef NODEBUG
193 int result = ::ioctl( _sfd, call, &ifreq ); 193 int result = ::ioctl( _sfd, call, &ifreq );
194 if ( result == -1 ) 194 if ( result == -1 )
195 odebug << "ONetworkInterface::ioctl (" << name() << ") call '" << debugmapper->map( call ) 195 odebug << "ONetworkInterface::ioctl (" << name() << ") call '" << debugmapper->map( call )
196 << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl; 196 << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl;
@@ -393,771 +393,792 @@ OChannelHopper::~OChannelHopper()
393 393
394bool OChannelHopper::isActive() const 394bool OChannelHopper::isActive() const
395{ 395{
396 return _tid; 396 return _tid;
397} 397}
398 398
399 399
400int OChannelHopper::channel() const 400int OChannelHopper::channel() const
401{ 401{
402 return *_channel; 402 return *_channel;
403} 403}
404 404
405 405
406void OChannelHopper::timerEvent( QTimerEvent* ) 406void OChannelHopper::timerEvent( QTimerEvent* )
407{ 407{
408 _iface->setChannel( *_channel ); 408 _iface->setChannel( *_channel );
409 emit( hopped( *_channel ) ); 409 emit( hopped( *_channel ) );
410 odebug << "OChannelHopper::timerEvent(): set channel " << *_channel << " on interface '" << _iface->name() << "'" << oendl; 410 odebug << "OChannelHopper::timerEvent(): set channel " << *_channel << " on interface '" << _iface->name() << "'" << oendl;
411 if ( ++_channel == _channels.end() ) _channel = _channels.begin(); 411 if ( ++_channel == _channels.end() ) _channel = _channels.begin();
412} 412}
413 413
414 414
415void OChannelHopper::setInterval( int interval ) 415void OChannelHopper::setInterval( int interval )
416{ 416{
417 if ( interval == _interval ) 417 if ( interval == _interval )
418 return; 418 return;
419 419
420 if ( _interval ) 420 if ( _interval )
421 killTimer( _tid ); 421 killTimer( _tid );
422 422
423 _tid = 0; 423 _tid = 0;
424 _interval = interval; 424 _interval = interval;
425 425
426 if ( _interval ) 426 if ( _interval )
427 { 427 {
428 _tid = startTimer( interval ); 428 _tid = startTimer( interval );
429 } 429 }
430} 430}
431 431
432 432
433int OChannelHopper::interval() const 433int OChannelHopper::interval() const
434{ 434{
435 return _interval; 435 return _interval;
436} 436}
437 437
438 438
439/*====================================================================================== 439/*======================================================================================
440 * OWirelessNetworkInterface 440 * OWirelessNetworkInterface
441 *======================================================================================*/ 441 *======================================================================================*/
442 442
443OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name ) 443OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name )
444 :ONetworkInterface( parent, name ), _hopper( 0 ) 444 :ONetworkInterface( parent, name ), _hopper( 0 )
445{ 445{
446 odebug << "OWirelessNetworkInterface::OWirelessNetworkInterface()" << oendl; 446 odebug << "OWirelessNetworkInterface::OWirelessNetworkInterface()" << oendl;
447 init(); 447 init();
448} 448}
449 449
450 450
451OWirelessNetworkInterface::~OWirelessNetworkInterface() 451OWirelessNetworkInterface::~OWirelessNetworkInterface()
452{ 452{
453} 453}
454 454
455 455
456struct iwreq& OWirelessNetworkInterface::iwr() const 456struct iwreq& OWirelessNetworkInterface::iwr() const
457{ 457{
458 return _iwr; 458 return _iwr;
459} 459}
460 460
461 461
462void OWirelessNetworkInterface::init() 462void OWirelessNetworkInterface::init()
463{ 463{
464 odebug << "OWirelessNetworkInterface::init()" << oendl; 464 odebug << "OWirelessNetworkInterface::init()" << oendl;
465 memset( &_iwr, 0, sizeof( struct iwreq ) ); 465 memset( &_iwr, 0, sizeof( struct iwreq ) );
466 buildInformation(); 466 buildInformation();
467 buildPrivateList(); 467 buildPrivateList();
468 dumpInformation(); 468 dumpInformation();
469} 469}
470 470
471 471
472bool OWirelessNetworkInterface::isAssociated() const 472bool OWirelessNetworkInterface::isAssociated() const
473{ 473{
474 //FIXME: handle different modes 474 //FIXME: handle different modes
475 return !(associatedAP() == OMacAddress::unknown); 475 return !(associatedAP() == OMacAddress::unknown);
476} 476}
477 477
478 478
479OMacAddress OWirelessNetworkInterface::associatedAP() const 479OMacAddress OWirelessNetworkInterface::associatedAP() const
480{ 480{
481 if ( ioctl( SIOCGIWAP ) ) 481 if ( ioctl( SIOCGIWAP ) )
482 return (const unsigned char*) &_ifr.ifr_hwaddr.sa_data[0]; 482 return (const unsigned char*) &_ifr.ifr_hwaddr.sa_data[0];
483 else 483 else
484 return OMacAddress::unknown; 484 return OMacAddress::unknown;
485} 485}
486 486
487 487
488void OWirelessNetworkInterface::buildInformation() 488void OWirelessNetworkInterface::buildInformation()
489{ 489{
490 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck 490 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
491 //ML: The HostAP drivers need more than sizeof struct_iw range to complete 491 //ML: The HostAP drivers need more than sizeof struct_iw range to complete
492 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length". 492 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
493 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate 493 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
494 //ML: _too much_ space. This is damn shitty crap *sigh* 494 //ML: _too much_ space. This is damn shitty crap *sigh*
495 //ML: We allocate a large memory region in RAM and check whether the 495 //ML: We allocate a large memory region in RAM and check whether the
496 //ML: driver pollutes this extra space. The complaint will be made on stdout, 496 //ML: driver pollutes this extra space. The complaint will be made on stdout,
497 //ML: so please forward this... 497 //ML: so please forward this...
498 498
499 struct iwreq wrq; 499 struct iwreq wrq;
500 int len = sizeof( struct iw_range )*2; 500 int len = sizeof( struct iw_range )*2;
501 char *buffer = (char*) malloc( len ); 501 char *buffer = (char*) malloc( len );
502 //FIXME: Validate if we actually got the memory block 502 //FIXME: Validate if we actually got the memory block
503 memset( buffer, 0, len ); 503 memset( buffer, 0, len );
504 memcpy( wrq.ifr_name, name(), IFNAMSIZ); 504 memcpy( wrq.ifr_name, name(), IFNAMSIZ);
505 wrq.u.data.pointer = (caddr_t) buffer; 505 wrq.u.data.pointer = (caddr_t) buffer;
506 wrq.u.data.length = sizeof( struct iw_range ); 506 wrq.u.data.length = sizeof( struct iw_range );
507 wrq.u.data.flags = 0; 507 wrq.u.data.flags = 0;
508 508
509 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) 509 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 )
510 { 510 {
511 owarn << "OWirelessNetworkInterface::buildInformation(): Can't get channel information - using default values." << oendl; 511 owarn << "OWirelessNetworkInterface::buildInformation(): Can't get channel information - using default values." << oendl;
512 _channels.insert( 2412, 1 ); // 2.412 GHz 512 _channels.insert( 2412, 1 ); // 2.412 GHz
513 _channels.insert( 2417, 2 ); // 2.417 GHz 513 _channels.insert( 2417, 2 ); // 2.417 GHz
514 _channels.insert( 2422, 3 ); // 2.422 GHz 514 _channels.insert( 2422, 3 ); // 2.422 GHz
515 _channels.insert( 2427, 4 ); // 2.427 GHz 515 _channels.insert( 2427, 4 ); // 2.427 GHz
516 _channels.insert( 2432, 5 ); // 2.432 GHz 516 _channels.insert( 2432, 5 ); // 2.432 GHz
517 _channels.insert( 2437, 6 ); // 2.437 GHz 517 _channels.insert( 2437, 6 ); // 2.437 GHz
518 _channels.insert( 2442, 7 ); // 2.442 GHz 518 _channels.insert( 2442, 7 ); // 2.442 GHz
519 _channels.insert( 2447, 8 ); // 2.447 GHz 519 _channels.insert( 2447, 8 ); // 2.447 GHz
520 _channels.insert( 2452, 9 ); // 2.452 GHz 520 _channels.insert( 2452, 9 ); // 2.452 GHz
521 _channels.insert( 2457, 10 ); // 2.457 GHz 521 _channels.insert( 2457, 10 ); // 2.457 GHz
522 _channels.insert( 2462, 11 ); // 2.462 GHz 522 _channels.insert( 2462, 11 ); // 2.462 GHz
523 523
524 memset( &_range, 0, sizeof( struct iw_range ) ); 524 memset( &_range, 0, sizeof( struct iw_range ) );
525 } 525 }
526 else 526 else
527 { 527 {
528 // <check if the driver overwrites stuff> 528 // <check if the driver overwrites stuff>
529 int max = 0; 529 int max = 0;
530 for ( int r = sizeof( struct iw_range ); r < len; r++ ) 530 for ( int r = sizeof( struct iw_range ); r < len; r++ )
531 if (buffer[r] != 0) 531 if (buffer[r] != 0)
532 max = r; 532 max = r;
533 if (max > 0) 533 if (max > 0)
534 { 534 {
535 owarn << "OWirelessNetworkInterface::buildInformation(): Driver for wireless interface '" << name() 535 owarn << "OWirelessNetworkInterface::buildInformation(): Driver for wireless interface '" << name()
536 << "' sucks! It overwrote the buffer end with at least " << max - sizeof( struct iw_range ) << " bytes!" << oendl; 536 << "' sucks! It overwrote the buffer end with at least " << max - sizeof( struct iw_range ) << " bytes!" << oendl;
537 } 537 }
538 // </check if the driver overwrites stuff> 538 // </check if the driver overwrites stuff>
539 539
540 struct iw_range range; 540 struct iw_range range;
541 memcpy( &range, buffer, sizeof range ); 541 memcpy( &range, buffer, sizeof range );
542 542
543 odebug << "OWirelessNetworkInterface::buildInformation(): Interface reported to have " << (int) range.num_frequency << " channels." << oendl; 543 odebug << "OWirelessNetworkInterface::buildInformation(): Interface reported to have " << (int) range.num_frequency << " channels." << oendl;
544 for ( int i = 0; i < range.num_frequency; ++i ) 544 for ( int i = 0; i < range.num_frequency; ++i )
545 { 545 {
546 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 ); 546 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
547 _channels.insert( freq, i+1 ); 547 _channels.insert( freq, i+1 );
548 } 548 }
549 } 549 }
550 550
551 memcpy( &_range, buffer, sizeof( struct iw_range ) ); 551 memcpy( &_range, buffer, sizeof( struct iw_range ) );
552 odebug << "OWirelessNetworkInterface::buildInformation(): Information block constructed." << oendl; 552 odebug << "OWirelessNetworkInterface::buildInformation(): Information block constructed." << oendl;
553 free(buffer); 553 free(buffer);
554} 554}
555 555
556 556
557void OWirelessNetworkInterface::buildPrivateList() 557void OWirelessNetworkInterface::buildPrivateList()
558{ 558{
559 odebug << "OWirelessNetworkInterface::buildPrivateList()" << oendl; 559 odebug << "OWirelessNetworkInterface::buildPrivateList()" << oendl;
560 560
561 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 561 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
562 562
563 _iwr.u.data.pointer = (char*) &priv; 563 _iwr.u.data.pointer = (char*) &priv;
564 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 564 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
565 _iwr.u.data.flags = 0; 565 _iwr.u.data.flags = 0;
566 566
567 if ( !wioctl( SIOCGIWPRIV ) ) 567 if ( !wioctl( SIOCGIWPRIV ) )
568 { 568 {
569 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information." << oendl; 569 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information." << oendl;
570 return; 570 return;
571 } 571 }
572 572
573 for ( int i = 0; i < _iwr.u.data.length; ++i ) 573 for ( int i = 0; i < _iwr.u.data.length; ++i )
574 { 574 {
575 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 575 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
576 } 576 }
577 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl; 577 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl;
578} 578}
579 579
580 580
581void OWirelessNetworkInterface::dumpInformation() const 581void OWirelessNetworkInterface::dumpInformation() const
582{ 582{
583 odebug << "OWirelessNetworkInterface::() -------------- dumping information block ----------------" << oendl; 583 odebug << "OWirelessNetworkInterface::() -------------- dumping information block ----------------" << oendl;
584 584
585 qDebug( " - driver's idea of maximum throughput is %d bps = %d byte/s = %d Kb/s = %f.2 Mb/s", _range.throughput, _range.throughput / 8, _range.throughput / 8 / 1024, float( _range.throughput ) / 8.0 / 1024.0 / 1024.0 ); 585 qDebug( " - driver's idea of maximum throughput is %d bps = %d byte/s = %d Kb/s = %f.2 Mb/s",
586 qDebug( " - driver for '%s' has been compiled against WE V%d (source=V%d)", name(), _range.we_version_compiled, _range.we_version_source ); 586 _range.throughput, _range.throughput / 8, _range.throughput / 8 / 1024, float( _range.throughput ) / 8.0 / 1024.0 / 1024.0 );
587 qDebug( " - driver for '%s' (V%d) has been compiled against WE V%d",
588 name(), _range.we_version_source, _range.we_version_compiled );
589
590 if ( _range.we_version_compiled != WIRELESS_EXT )
591 {
592 owarn << "Version mismatch! WE_DRIVER = " << _range.we_version_compiled << " and WE_OPIENET = " << WIRELESS_EXT << oendl;
593 }
587 594
588 odebug << "OWirelessNetworkInterface::() ---------------------------------------------------------" << oendl; 595 odebug << "OWirelessNetworkInterface::() ---------------------------------------------------------" << oendl;
589} 596}
590 597
591 598
592int OWirelessNetworkInterface::channel() const 599int OWirelessNetworkInterface::channel() const
593{ 600{
594 //FIXME: When monitoring enabled, then use it 601 //FIXME: When monitoring enabled, then use it
595 //FIXME: to gather the current RF channel 602 //FIXME: to gather the current RF channel
596 //FIXME: Until then, get active channel from hopper. 603 //FIXME: Until then, get active channel from hopper.
597 if ( _hopper && _hopper->isActive() ) 604 if ( _hopper && _hopper->isActive() )
598 return _hopper->channel(); 605 return _hopper->channel();
599 606
600 if ( !wioctl( SIOCGIWFREQ ) ) 607 if ( !wioctl( SIOCGIWFREQ ) )
601 { 608 {
602 return -1; 609 return -1;
603 } 610 }
604 else 611 else
605 { 612 {
606 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ]; 613 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ];
607 } 614 }
608} 615}
609 616
610 617
611void OWirelessNetworkInterface::setChannel( int c ) const 618void OWirelessNetworkInterface::setChannel( int c ) const
612{ 619{
613 if ( !c ) 620 if ( !c )
614 { 621 {
615 oerr << "OWirelessNetworkInterface::setChannel( 0 ) called - fix your application!" << oendl; 622 oerr << "OWirelessNetworkInterface::setChannel( 0 ) called - fix your application!" << oendl;
616 return; 623 return;
617 } 624 }
618 625
619 if ( !_mon ) 626 if ( !_mon )
620 { 627 {
621 memset( &_iwr, 0, sizeof( struct iwreq ) ); 628 memset( &_iwr, 0, sizeof( struct iwreq ) );
622 _iwr.u.freq.m = c; 629 _iwr.u.freq.m = c;
623 _iwr.u.freq.e = 0; 630 _iwr.u.freq.e = 0;
624 wioctl( SIOCSIWFREQ ); 631 wioctl( SIOCSIWFREQ );
625 } 632 }
626 else 633 else
627 { 634 {
628 _mon->setChannel( c ); 635 _mon->setChannel( c );
629 } 636 }
630} 637}
631 638
632 639
633double OWirelessNetworkInterface::frequency() const 640double OWirelessNetworkInterface::frequency() const
634{ 641{
635 if ( !wioctl( SIOCGIWFREQ ) ) 642 if ( !wioctl( SIOCGIWFREQ ) )
636 { 643 {
637 return -1.0; 644 return -1.0;
638 } 645 }
639 else 646 else
640 { 647 {
641 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0; 648 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0;
642 } 649 }
643} 650}
644 651
645 652
646int OWirelessNetworkInterface::channels() const 653int OWirelessNetworkInterface::channels() const
647{ 654{
648 return _channels.count(); 655 return _channels.count();
649} 656}
650 657
651 658
652void OWirelessNetworkInterface::setChannelHopping( int interval ) 659void OWirelessNetworkInterface::setChannelHopping( int interval )
653{ 660{
654 if ( !_hopper ) _hopper = new OChannelHopper( this ); 661 if ( !_hopper ) _hopper = new OChannelHopper( this );
655 _hopper->setInterval( interval ); 662 _hopper->setInterval( interval );
656 //FIXME: When and by whom will the channel hopper be deleted? 663 //FIXME: When and by whom will the channel hopper be deleted?
657 //TODO: rely on QObject hierarchy 664 //TODO: rely on QObject hierarchy
658} 665}
659 666
660 667
661int OWirelessNetworkInterface::channelHopping() const 668int OWirelessNetworkInterface::channelHopping() const
662{ 669{
663 return _hopper->interval(); 670 return _hopper->interval();
664} 671}
665 672
666 673
667OChannelHopper* OWirelessNetworkInterface::channelHopper() const 674OChannelHopper* OWirelessNetworkInterface::channelHopper() const
668{ 675{
669 return _hopper; 676 return _hopper;
670} 677}
671 678
672 679
673void OWirelessNetworkInterface::commit() const 680void OWirelessNetworkInterface::commit() const
674{ 681{
675 wioctl( SIOCSIWCOMMIT ); 682 wioctl( SIOCSIWCOMMIT );
676} 683}
677 684
678 685
679void OWirelessNetworkInterface::setMode( const QString& newMode ) 686void OWirelessNetworkInterface::setMode( const QString& newMode )
680{ 687{
681 #ifdef FINALIZE 688 #ifdef FINALIZE
682 QString currentMode = mode(); 689 QString currentMode = mode();
683 if ( currentMode == newMode ) return; 690 if ( currentMode == newMode ) return;
684 #endif 691 #endif
685 692
686 odebug << "OWirelessNetworkInterface::setMode(): trying to set mode " << newMode << oendl; 693 odebug << "OWirelessNetworkInterface::setMode(): trying to set mode " << newMode << oendl;
687 694
688 _iwr.u.mode = stringToMode( newMode ); 695 _iwr.u.mode = stringToMode( newMode );
689 696
690 if ( _iwr.u.mode != IW_MODE_MONITOR ) 697 if ( _iwr.u.mode != IW_MODE_MONITOR )
691 { 698 {
692 // IWR.U.MODE WIRD DURCH ABFRAGE DES MODE HIER PLATTGEMACHT!!!!!!!!!!!!!!!!!!!!! DEPP! 699 // IWR.U.MODE WIRD DURCH ABFRAGE DES MODE HIER PLATTGEMACHT!!!!!!!!!!!!!!!!!!!!! DEPP!
693 _iwr.u.mode = stringToMode( newMode ); 700 _iwr.u.mode = stringToMode( newMode );
694 wioctl( SIOCSIWMODE ); 701 wioctl( SIOCSIWMODE );
695 702
696 // special iwpriv fallback for monitor mode (check if we're really out of monitor mode now) 703 // special iwpriv fallback for monitor mode (check if we're really out of monitor mode now)
697 704
698 if ( mode() == "monitor" ) 705 if ( mode() == "monitor" )
699 { 706 {
700 odebug << "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not sufficient - trying fallback to iwpriv..." << oendl; 707 odebug << "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not sufficient - trying fallback to iwpriv..." << oendl;
701 if ( _mon ) 708 if ( _mon )
702 _mon->setEnabled( false ); 709 _mon->setEnabled( false );
703 else 710 else
704 odebug << "ONetwork(): can't switch monitor mode without installed monitoring interface" << oendl; 711 odebug << "ONetwork(): can't switch monitor mode without installed monitoring interface" << oendl;
705 } 712 }
706 713
707 } 714 }
708 else // special iwpriv fallback for monitor mode 715 else // special iwpriv fallback for monitor mode
709 { 716 {
710 if ( wioctl( SIOCSIWMODE ) ) 717 if ( wioctl( SIOCSIWMODE ) )
711 { 718 {
712 odebug << "OWirelessNetworkInterface::setMode(): IW_MODE_MONITOR ok" << oendl; 719 odebug << "OWirelessNetworkInterface::setMode(): IW_MODE_MONITOR ok" << oendl;
713 } 720 }
714 else 721 else
715 { 722 {
716 odebug << "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not working - trying fallback to iwpriv..." << oendl; 723 odebug << "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not working - trying fallback to iwpriv..." << oendl;
717 724
718 if ( _mon ) 725 if ( _mon )
719 _mon->setEnabled( true ); 726 _mon->setEnabled( true );
720 else 727 else
721 odebug << "ONetwork(): can't switch monitor mode without installed monitoring interface" << oendl; 728 odebug << "ONetwork(): can't switch monitor mode without installed monitoring interface" << oendl;
722 } 729 }
723 } 730 }
724} 731}
725 732
726 733
727QString OWirelessNetworkInterface::mode() const 734QString OWirelessNetworkInterface::mode() const
728{ 735{
729 memset( &_iwr, 0, sizeof( struct iwreq ) ); 736 memset( &_iwr, 0, sizeof( struct iwreq ) );
730 737
731 if ( !wioctl( SIOCGIWMODE ) ) 738 if ( !wioctl( SIOCGIWMODE ) )
732 { 739 {
733 return "<unknown>"; 740 return "<unknown>";
734 } 741 }
735 742
736 odebug << "OWirelessNetworkInterface::setMode(): WE's idea of current mode seems to be " << modeToString( _iwr.u.mode ) << oendl; 743 odebug << "OWirelessNetworkInterface::setMode(): WE's idea of current mode seems to be " << modeToString( _iwr.u.mode ) << oendl;
737 744
738 // legacy compatible monitor mode check 745 // legacy compatible monitor mode check
739 746
740 if ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ) 747 if ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 )
741 { 748 {
742 return "monitor"; 749 return "monitor";
743 } 750 }
744 else 751 else
745 { 752 {
746 return modeToString( _iwr.u.mode ); 753 return modeToString( _iwr.u.mode );
747 } 754 }
748} 755}
749 756
750void OWirelessNetworkInterface::setNickName( const QString& nickname ) 757void OWirelessNetworkInterface::setNickName( const QString& nickname )
751{ 758{
752 _iwr.u.essid.pointer = const_cast<char*>( (const char*) nickname ); 759 _iwr.u.essid.pointer = const_cast<char*>( (const char*) nickname );
753 _iwr.u.essid.length = nickname.length(); 760 _iwr.u.essid.length = nickname.length();
754 wioctl( SIOCSIWNICKN ); 761 wioctl( SIOCSIWNICKN );
755} 762}
756 763
757 764
758QString OWirelessNetworkInterface::nickName() const 765QString OWirelessNetworkInterface::nickName() const
759{ 766{
760 char str[IW_ESSID_MAX_SIZE]; 767 char str[IW_ESSID_MAX_SIZE];
761 _iwr.u.data.pointer = &str[0]; 768 _iwr.u.data.pointer = &str[0];
762 _iwr.u.data.length = IW_ESSID_MAX_SIZE; 769 _iwr.u.data.length = IW_ESSID_MAX_SIZE;
763 if ( !wioctl( SIOCGIWNICKN ) ) 770 if ( !wioctl( SIOCGIWNICKN ) )
764 { 771 {
765 return "<unknown>"; 772 return "<unknown>";
766 } 773 }
767 else 774 else
768 { 775 {
769 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string 776 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string
770 return str; 777 return str;
771 } 778 }
772} 779}
773 780
774 781
775void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... ) 782void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... )
776{ 783{
777 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) ); 784 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) );
778 if ( !priv ) 785 if ( !priv )
779 { 786 {
780 owarn << "OWirelessNetworkInterface::setPrivate(): interface '" << name() 787 owarn << "OWirelessNetworkInterface::setPrivate(): interface '" << name()
781 << "' does not support private ioctl '" << call << "'" << oendl; 788 << "' does not support private ioctl '" << call << "'" << oendl;
782 return; 789 return;
783 } 790 }
784 if ( priv->numberSetArgs() != numargs ) 791 if ( priv->numberSetArgs() != numargs )
785 { 792 {
786 owarn << "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '" 793 owarn << "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '"
787 << call << "' expects " << priv->numberSetArgs() << ", but got " << numargs << oendl; 794 << call << "' expects " << priv->numberSetArgs() << ", but got " << numargs << oendl;
788 return; 795 return;
789 } 796 }
790 797
791 odebug << "OWirelessNetworkInterface::setPrivate(): about to call '" << call << "' on interface '" << name() << "'" << oendl; 798 odebug << "OWirelessNetworkInterface::setPrivate(): about to call '" << call << "' on interface '" << name() << "'" << oendl;
792 memset( &_iwr, 0, sizeof _iwr ); 799 memset( &_iwr, 0, sizeof _iwr );
793 va_list argp; 800 va_list argp;
794 va_start( argp, numargs ); 801 va_start( argp, numargs );
795 for ( int i = 0; i < numargs; ++i ) 802 for ( int i = 0; i < numargs; ++i )
796 { 803 {
797 priv->setParameter( i, va_arg( argp, int ) ); 804 priv->setParameter( i, va_arg( argp, int ) );
798 } 805 }
799 va_end( argp ); 806 va_end( argp );
800 priv->invoke(); 807 priv->invoke();
801} 808}
802 809
803 810
804void OWirelessNetworkInterface::getPrivate( const QString& call ) 811void OWirelessNetworkInterface::getPrivate( const QString& call )
805{ 812{
806 oerr << "OWirelessNetworkInterface::getPrivate() is not implemented yet." << oendl; 813 oerr << "OWirelessNetworkInterface::getPrivate() is not implemented yet." << oendl;
807} 814}
808 815
809 816
810bool OWirelessNetworkInterface::hasPrivate( const QString& call ) 817bool OWirelessNetworkInterface::hasPrivate( const QString& call )
811{ 818{
812 return child( (const char*) call ); 819 return child( (const char*) call );
813} 820}
814 821
815 822
816QString OWirelessNetworkInterface::SSID() const 823QString OWirelessNetworkInterface::SSID() const
817{ 824{
818 char str[IW_ESSID_MAX_SIZE]; 825 char str[IW_ESSID_MAX_SIZE];
819 _iwr.u.essid.pointer = &str[0]; 826 _iwr.u.essid.pointer = &str[0];
820 _iwr.u.essid.length = IW_ESSID_MAX_SIZE; 827 _iwr.u.essid.length = IW_ESSID_MAX_SIZE;
821 if ( !wioctl( SIOCGIWESSID ) ) 828 if ( !wioctl( SIOCGIWESSID ) )
822 { 829 {
823 return "<unknown>"; 830 return "<unknown>";
824 } 831 }
825 else 832 else
826 { 833 {
827 return str; 834 return str;
828 } 835 }
829} 836}
830 837
831 838
832void OWirelessNetworkInterface::setSSID( const QString& ssid ) 839void OWirelessNetworkInterface::setSSID( const QString& ssid )
833{ 840{
834 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid ); 841 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
835 _iwr.u.essid.length = ssid.length(); 842 _iwr.u.essid.length = ssid.length();
836 wioctl( SIOCSIWESSID ); 843 wioctl( SIOCSIWESSID );
837} 844}
838 845
839 846
840OStationList* OWirelessNetworkInterface::scanNetwork() 847OStationList* OWirelessNetworkInterface::scanNetwork()
841{ 848{
842 _iwr.u.param.flags = IW_SCAN_DEFAULT; 849 _iwr.u.param.flags = IW_SCAN_DEFAULT;
843 _iwr.u.param.value = 0; 850 _iwr.u.param.value = 0;
844 if ( !wioctl( SIOCSIWSCAN ) ) 851 if ( !wioctl( SIOCSIWSCAN ) )
845 { 852 {
846 return 0; 853 return 0;
847 } 854 }
848 855
849 OStationList* stations = new OStationList(); 856 OStationList* stations = new OStationList();
850 857
851 int timeout = 1000000; 858 int timeout = 1000000;
852 859
853 odebug << "ONetworkInterface::scanNetwork() - scan started." << oendl; 860 odebug << "ONetworkInterface::scanNetwork() - scan started." << oendl;
854 861
855 bool results = false; 862 bool results = false;
856 struct timeval tv; 863 struct timeval tv;
857 tv.tv_sec = 0; 864 tv.tv_sec = 0;
858 tv.tv_usec = 250000; // initial timeout ~ 250ms 865 tv.tv_usec = 250000; // initial timeout ~ 250ms
859 char buffer[IW_SCAN_MAX_DATA]; 866 char buffer[IW_SCAN_MAX_DATA];
860 867
861 while ( !results && timeout > 0 ) 868 while ( !results && timeout > 0 )
862 { 869 {
863 timeout -= tv.tv_usec; 870 timeout -= tv.tv_usec;
864 select( 0, 0, 0, 0, &tv ); 871 select( 0, 0, 0, 0, &tv );
865 872
866 _iwr.u.data.pointer = &buffer[0]; 873 _iwr.u.data.pointer = &buffer[0];
867 _iwr.u.data.flags = 0; 874 _iwr.u.data.flags = 0;
868 _iwr.u.data.length = sizeof buffer; 875 _iwr.u.data.length = sizeof buffer;
869 if ( wioctl( SIOCGIWSCAN ) ) 876 if ( wioctl( SIOCGIWSCAN ) )
870 { 877 {
871 results = true; 878 results = true;
872 continue; 879 continue;
873 } 880 }
874 else if ( errno == EAGAIN) 881 else if ( errno == EAGAIN)
875 { 882 {
876 odebug << "ONetworkInterface::scanNetwork() - scan in progress..." << oendl; 883 odebug << "ONetworkInterface::scanNetwork() - scan in progress..." << oendl;
877 #if 0 884 #if 0
878 if ( qApp ) 885 if ( qApp )
879 { 886 {
880 qApp->processEvents( 100 ); 887 qApp->processEvents( 100 );
881 continue; 888 continue;
882 } 889 }
883 #endif 890 #endif
884 tv.tv_sec = 0; 891 tv.tv_sec = 0;
885 tv.tv_usec = 100000; 892 tv.tv_usec = 100000;
886 continue; 893 continue;
887 } 894 }
888 } 895 }
889 896
890 odebug << "ONetworkInterface::scanNetwork() - scan finished." << oendl; 897 odebug << "ONetworkInterface::scanNetwork() - scan finished." << oendl;
891 898
892 if ( results ) 899 if ( results )
893 { 900 {
894 odebug << " - result length = " << _iwr.u.data.length << oendl; 901 odebug << " - result length = " << _iwr.u.data.length << oendl;
895 if ( !_iwr.u.data.length ) 902 if ( !_iwr.u.data.length )
896 { 903 {
897 odebug << " - no results (empty neighbourhood)" << oendl; 904 odebug << " - no results (empty neighbourhood)" << oendl;
898 return stations; 905 return stations;
899 } 906 }
900 907
901 odebug << " - results are in!" << oendl; 908 odebug << " - results are in!" << oendl;
902 dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length ); 909 dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length );
903 910
904 // parse results 911 // parse results
905 912
906 int offset = 0; 913 int offset = 0;
907 struct iw_event* we = (struct iw_event*) &buffer[0]; 914 struct iw_event* we = (struct iw_event*) &buffer[0];
908 915
909 while ( offset < _iwr.u.data.length ) 916 while ( offset < _iwr.u.data.length )
910 { 917 {
911 //const char* cmd = *(*_ioctlmap)[we->cmd]; 918 //const char* cmd = *(*_ioctlmap)[we->cmd];
912 //if ( !cmd ) cmd = "<unknown>"; 919 //if ( !cmd ) cmd = "<unknown>";
913 odebug << " - reading next event... cmd=" << we->cmd << ", len=" << we->len << oendl; 920 odebug << " - reading next event... cmd=" << we->cmd << ", len=" << we->len << oendl;
914 switch (we->cmd) 921 switch (we->cmd)
915 { 922 {
916 case SIOCGIWAP: 923 case SIOCGIWAP:
917 { 924 {
918 odebug << "SIOCGIWAP" << oendl; 925 odebug << "SIOCGIWAP" << oendl;
919 stations->append( new OStation() ); 926 stations->append( new OStation() );
920 stations->last()->macAddress = (const unsigned char*) &we->u.ap_addr.sa_data[0]; 927 stations->last()->macAddress = (const unsigned char*) &we->u.ap_addr.sa_data[0];
921 break; 928 break;
922 } 929 }
923 case SIOCGIWMODE: 930 case SIOCGIWMODE:
924 { 931 {
925 odebug << "SIOCGIWMODE" << oendl; 932 odebug << "SIOCGIWMODE" << oendl;
926 stations->last()->type = modeToString( we->u.mode ); 933 stations->last()->type = modeToString( we->u.mode );
927 break; 934 break;
928 } 935 }
929 case SIOCGIWFREQ: 936 case SIOCGIWFREQ:
930 { 937 {
931 odebug << "SIOCGIWFREQ" << oendl; 938 odebug << "SIOCGIWFREQ" << oendl;
932 stations->last()->channel = _channels[ static_cast<int>(double( we->u.freq.m ) * pow( 10.0, we->u.freq.e ) / 1000000) ]; 939 stations->last()->channel = _channels[ static_cast<int>(double( we->u.freq.m ) * pow( 10.0, we->u.freq.e ) / 1000000) ];
933 break; 940 break;
934 } 941 }
935 case SIOCGIWESSID: 942 case SIOCGIWESSID:
936 { 943 {
937 odebug << "SIOCGIWESSID" << oendl; 944 odebug << "SIOCGIWESSID" << oendl;
938 stations->last()->ssid = we->u.essid.pointer; 945 stations->last()->ssid = we->u.essid.pointer;
939 break; 946 break;
940 } 947 }
941 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break; 948 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break;
942 case SIOCGIWENCODE: odebug << "SIOCGIWENCODE" << oendl; break; 949 case SIOCGIWENCODE: odebug << "SIOCGIWENCODE" << oendl; break;
943 case IWEVTXDROP: odebug << "IWEVTXDROP" << oendl; break; /* Packet dropped to excessive retry */ 950 case IWEVTXDROP: odebug << "IWEVTXDROP" << oendl; break; /* Packet dropped to excessive retry */
944 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */ 951 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */
945 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */ 952 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */
946 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */ 953 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */
947 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */ 954 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */
948 default: odebug << "unhandled event" << oendl; 955 default: odebug << "unhandled event" << oendl;
949 } 956 }
950 957
951 offset += we->len; 958 offset += we->len;
952 we = (struct iw_event*) &buffer[offset]; 959 we = (struct iw_event*) &buffer[offset];
953 } 960 }
954 return stations; 961 return stations;
955 962
956 return stations; 963 return stations;
957 964
958 } 965 }
959 else 966 else
960 { 967 {
961 odebug << " - no results (timeout) :(" << oendl; 968 odebug << " - no results (timeout) :(" << oendl;
962 return stations; 969 return stations;
963 } 970 }
964} 971}
965 972
966 973
967int OWirelessNetworkInterface::signalStrength() const 974int OWirelessNetworkInterface::signalStrength() const
968{ 975{
969 int max = _range.max_qual.level; 976 iw_statistics stat;
970 odebug << "signalStrength(): max quality seems to be " << max << "dBM" << oendl; 977 ::memset( &stat, 0, sizeof stat );
971 return 50; 978 _iwr.u.data.pointer = (char*) &stat;
979 _iwr.u.data.flags = 0;
980 _iwr.u.data.length = sizeof stat;
981
982 if ( !wioctl( SIOCGIWSTATS ) )
983 {
984 return -1;
985 }
986
987 int max = _range.max_qual.qual;
988 int cur = stat.qual.qual;
989 int lev = stat.qual.level; //FIXME: Do something with them?
990 int noi = stat.qual.noise; //FIXME: Do something with them?
991
992 return cur*100/max;
972} 993}
973 994
974 995
975bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 996bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
976{ 997{
977 #ifndef NODEBUG 998 #ifndef NODEBUG
978 int result = ::ioctl( _sfd, call, &iwreq ); 999 int result = ::ioctl( _sfd, call, &iwreq );
979 1000
980 if ( result == -1 ) 1001 if ( result == -1 )
981 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1002 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
982 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl; 1003 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl;
983 else 1004 else
984 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1005 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
985 << debugmapper->map( call ) << "' - Status: Ok." << oendl; 1006 << debugmapper->map( call ) << "' - Status: Ok." << oendl;
986 1007
987 return ( result != -1 ); 1008 return ( result != -1 );
988 #else 1009 #else
989 return ::ioctl( _sfd, call, &iwreq ) != -1; 1010 return ::ioctl( _sfd, call, &iwreq ) != -1;
990 #endif 1011 #endif
991} 1012}
992 1013
993 1014
994bool OWirelessNetworkInterface::wioctl( int call ) const 1015bool OWirelessNetworkInterface::wioctl( int call ) const
995{ 1016{
996 strcpy( _iwr.ifr_name, name() ); 1017 strcpy( _iwr.ifr_name, name() );
997 return wioctl( call, _iwr ); 1018 return wioctl( call, _iwr );
998} 1019}
999 1020
1000 1021
1001/*====================================================================================== 1022/*======================================================================================
1002 * OMonitoringInterface 1023 * OMonitoringInterface
1003 *======================================================================================*/ 1024 *======================================================================================*/
1004 1025
1005OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1026OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1006 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ), _prismHeader( prismHeader ) 1027 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ), _prismHeader( prismHeader )
1007{ 1028{
1008} 1029}
1009 1030
1010 1031
1011OMonitoringInterface::~OMonitoringInterface() 1032OMonitoringInterface::~OMonitoringInterface()
1012{ 1033{
1013} 1034}
1014 1035
1015 1036
1016void OMonitoringInterface::setChannel( int c ) 1037void OMonitoringInterface::setChannel( int c )
1017{ 1038{
1018 // use standard WE channel switching protocol 1039 // use standard WE channel switching protocol
1019 memset( &_if->_iwr, 0, sizeof( struct iwreq ) ); 1040 memset( &_if->_iwr, 0, sizeof( struct iwreq ) );
1020 _if->_iwr.u.freq.m = c; 1041 _if->_iwr.u.freq.m = c;
1021 _if->_iwr.u.freq.e = 0; 1042 _if->_iwr.u.freq.e = 0;
1022 _if->wioctl( SIOCSIWFREQ ); 1043 _if->wioctl( SIOCSIWFREQ );
1023} 1044}
1024 1045
1025 1046
1026void OMonitoringInterface::setEnabled( bool b ) 1047void OMonitoringInterface::setEnabled( bool b )
1027{ 1048{
1028} 1049}
1029 1050
1030 1051
1031/*====================================================================================== 1052/*======================================================================================
1032 * OCiscoMonitoringInterface 1053 * OCiscoMonitoringInterface
1033 *======================================================================================*/ 1054 *======================================================================================*/
1034 1055
1035OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1056OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1036 :OMonitoringInterface( iface, prismHeader ) 1057 :OMonitoringInterface( iface, prismHeader )
1037{ 1058{
1038 iface->setMonitoring( this ); 1059 iface->setMonitoring( this );
1039} 1060}
1040 1061
1041 1062
1042OCiscoMonitoringInterface::~OCiscoMonitoringInterface() 1063OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
1043{ 1064{
1044} 1065}
1045 1066
1046 1067
1047void OCiscoMonitoringInterface::setEnabled( bool b ) 1068void OCiscoMonitoringInterface::setEnabled( bool b )
1048{ 1069{
1049 QString fname; 1070 QString fname;
1050 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() ); 1071 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() );
1051 QFile f( fname ); 1072 QFile f( fname );
1052 if ( !f.exists() ) return; 1073 if ( !f.exists() ) return;
1053 1074
1054 if ( f.open( IO_WriteOnly ) ) 1075 if ( f.open( IO_WriteOnly ) )
1055 { 1076 {
1056 QTextStream s( &f ); 1077 QTextStream s( &f );
1057 s << "Mode: r"; 1078 s << "Mode: r";
1058 s << "Mode: y"; 1079 s << "Mode: y";
1059 s << "XmitPower: 1"; 1080 s << "XmitPower: 1";
1060 } 1081 }
1061 1082
1062 // flushing and closing will be done automatically when f goes out of scope 1083 // flushing and closing will be done automatically when f goes out of scope
1063} 1084}
1064 1085
1065 1086
1066QString OCiscoMonitoringInterface::name() const 1087QString OCiscoMonitoringInterface::name() const
1067{ 1088{
1068 return "cisco"; 1089 return "cisco";
1069} 1090}
1070 1091
1071 1092
1072void OCiscoMonitoringInterface::setChannel( int ) 1093void OCiscoMonitoringInterface::setChannel( int )
1073{ 1094{
1074 // cisco devices automatically switch channels when in monitor mode 1095 // cisco devices automatically switch channels when in monitor mode
1075} 1096}
1076 1097
1077 1098
1078/*====================================================================================== 1099/*======================================================================================
1079 * OWlanNGMonitoringInterface 1100 * OWlanNGMonitoringInterface
1080 *======================================================================================*/ 1101 *======================================================================================*/
1081 1102
1082 1103
1083OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1104OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1084 :OMonitoringInterface( iface, prismHeader ) 1105 :OMonitoringInterface( iface, prismHeader )
1085{ 1106{
1086 iface->setMonitoring( this ); 1107 iface->setMonitoring( this );
1087} 1108}
1088 1109
1089 1110
1090OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface() 1111OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
1091{ 1112{
1092} 1113}
1093 1114
1094 1115
1095void OWlanNGMonitoringInterface::setEnabled( bool b ) 1116void OWlanNGMonitoringInterface::setEnabled( bool b )
1096{ 1117{
1097 //FIXME: do nothing if its already in the same mode 1118 //FIXME: do nothing if its already in the same mode
1098 1119
1099 QString enable = b ? "true" : "false"; 1120 QString enable = b ? "true" : "false";
1100 QString prism = _prismHeader ? "true" : "false"; 1121 QString prism = _prismHeader ? "true" : "false";
1101 QString cmd; 1122 QString cmd;
1102 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s", 1123 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s",
1103 (const char*) _if->name(), 1, (const char*) enable, (const char*) prism ); 1124 (const char*) _if->name(), 1, (const char*) enable, (const char*) prism );
1104 system( cmd ); 1125 system( cmd );
1105} 1126}
1106 1127
1107 1128
1108QString OWlanNGMonitoringInterface::name() const 1129QString OWlanNGMonitoringInterface::name() const
1109{ 1130{
1110 return "wlan-ng"; 1131 return "wlan-ng";
1111} 1132}
1112 1133
1113 1134
1114void OWlanNGMonitoringInterface::setChannel( int c ) 1135void OWlanNGMonitoringInterface::setChannel( int c )
1115{ 1136{
1116 //NOTE: Older wlan-ng drivers automatically hopped channels while lnxreq_wlansniff=true. Newer ones don't. 1137 //NOTE: Older wlan-ng drivers automatically hopped channels while lnxreq_wlansniff=true. Newer ones don't.
1117 1138
1118 QString enable = "true"; //_if->monitorMode() ? "true" : "false"; 1139 QString enable = "true"; //_if->monitorMode() ? "true" : "false";
1119 QString prism = _prismHeader ? "true" : "false"; 1140 QString prism = _prismHeader ? "true" : "false";
1120 QString cmd; 1141 QString cmd;
1121 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s", 1142 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s",
1122 (const char*) _if->name(), c, (const char*) enable, (const char*) prism ); 1143 (const char*) _if->name(), c, (const char*) enable, (const char*) prism );
1123 system( cmd ); 1144 system( cmd );
1124} 1145}
1125 1146
1126 1147
1127/*====================================================================================== 1148/*======================================================================================
1128 * OHostAPMonitoringInterface 1149 * OHostAPMonitoringInterface
1129 *======================================================================================*/ 1150 *======================================================================================*/
1130 1151
1131OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1152OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1132 :OMonitoringInterface( iface, prismHeader ) 1153 :OMonitoringInterface( iface, prismHeader )
1133{ 1154{
1134 iface->setMonitoring( this ); 1155 iface->setMonitoring( this );
1135} 1156}
1136 1157
1137OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 1158OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
1138{ 1159{
1139} 1160}
1140 1161
1141void OHostAPMonitoringInterface::setEnabled( bool b ) 1162void OHostAPMonitoringInterface::setEnabled( bool b )
1142{ 1163{
1143 int monitorCode = _prismHeader ? 1 : 2; 1164 int monitorCode = _prismHeader ? 1 : 2;
1144 if ( b ) 1165 if ( b )
1145 { 1166 {
1146 _if->setPrivate( "monitor", 1, monitorCode ); 1167 _if->setPrivate( "monitor", 1, monitorCode );
1147 } 1168 }
1148 else 1169 else
1149 { 1170 {
1150 _if->setPrivate( "monitor", 1, 0 ); 1171 _if->setPrivate( "monitor", 1, 0 );
1151 } 1172 }
1152} 1173}
1153 1174
1154 1175
1155QString OHostAPMonitoringInterface::name() const 1176QString OHostAPMonitoringInterface::name() const
1156{ 1177{
1157 return "hostap"; 1178 return "hostap";
1158} 1179}
1159 1180
1160 1181
1161/*====================================================================================== 1182/*======================================================================================
1162 * OOrinocoNetworkInterface 1183 * OOrinocoNetworkInterface
1163 *======================================================================================*/ 1184 *======================================================================================*/
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
index 9b8a0d4..0a51108 100644
--- a/libopie2/opienet/onetwork.h
+++ b/libopie2/opienet/onetwork.h
@@ -1,226 +1,236 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer 3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer
4 =. <mickey@Vanille.de> 4 =. <mickey@Vanille.de>
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28 28
29*/ 29*/
30 30
31#ifndef ONETWORK_H 31#ifndef ONETWORK_H
32#define ONETWORK_H 32#define ONETWORK_H
33 33
34#include "wireless.h" 34#if !defined( OPIE_WE_VERSION )
35#error Need to define a wireless extension version to build against!
36#endif
37
38#if OPIE_WE_VERSION == 15
39#include "wireless.15.h"
40#endif
41
42#if OPIE_WE_VERSION == 16
43#include "wireless.16.h"
44#endif
35 45
36/* OPIE */ 46/* OPIE */
37 47
38#include <opie2/onetutils.h> 48#include <opie2/onetutils.h>
39#include <opie2/ostation.h> 49#include <opie2/ostation.h>
40 50
41/* QT */ 51/* QT */
42 52
43#include <qvaluelist.h> 53#include <qvaluelist.h>
44#include <qdict.h> 54#include <qdict.h>
45#include <qmap.h> 55#include <qmap.h>
46#include <qobject.h> 56#include <qobject.h>
47#include <qhostaddress.h> 57#include <qhostaddress.h>
48 58
49class ONetworkInterface; 59class ONetworkInterface;
50class OWirelessNetworkInterface; 60class OWirelessNetworkInterface;
51class OChannelHopper; 61class OChannelHopper;
52class OMonitoringInterface; 62class OMonitoringInterface;
53 63
54/*====================================================================================== 64/*======================================================================================
55 * ONetwork 65 * ONetwork
56 *======================================================================================*/ 66 *======================================================================================*/
57 67
58/** 68/**
59 * @brief A container class for all network interfaces 69 * @brief A container class for all network interfaces
60 * 70 *
61 * This class provides access to all available network interfaces of your computer. 71 * This class provides access to all available network interfaces of your computer.
62 * 72 *
63 * @author Michael 'Mickey' Lauer <mickey@vanille.de> 73 * @author Michael 'Mickey' Lauer <mickey@vanille.de>
64 */ 74 */
65class ONetwork : public QObject 75class ONetwork : public QObject
66{ 76{
67 Q_OBJECT 77 Q_OBJECT
68 78
69 public: 79 public:
70 typedef QDict<ONetworkInterface> InterfaceMap; 80 typedef QDict<ONetworkInterface> InterfaceMap;
71 typedef QDictIterator<ONetworkInterface> InterfaceIterator; 81 typedef QDictIterator<ONetworkInterface> InterfaceIterator;
72 82
73 public: 83 public:
74 /** 84 /**
75 * @returns the number of available interfaces 85 * @returns the number of available interfaces
76 */ 86 */
77 int count() const; 87 int count() const;
78 /** 88 /**
79 * @returns a pointer to the (one and only) @ref ONetwork instance. 89 * @returns a pointer to the (one and only) @ref ONetwork instance.
80 */ 90 */
81 static ONetwork* instance(); 91 static ONetwork* instance();
82 /** 92 /**
83 * @returns an iterator usable for iterating through all network interfaces. 93 * @returns an iterator usable for iterating through all network interfaces.
84 */ 94 */
85 InterfaceIterator iterator() const; 95 InterfaceIterator iterator() const;
86 /** 96 /**
87 * @returns true, if the @a interface supports the wireless extension protocol. 97 * @returns true, if the @a interface supports the wireless extension protocol.
88 */ 98 */
89 bool isWirelessInterface( const char* interface ) const; 99 bool isWirelessInterface( const char* interface ) const;
90 /** 100 /**
91 * @returns a pointer to the @ref ONetworkInterface object for the specified @a interface or 0, if not found. 101 * @returns a pointer to the @ref ONetworkInterface object for the specified @a interface or 0, if not found.
92 * @see ONetworkInterface 102 * @see ONetworkInterface
93 */ 103 */
94 ONetworkInterface* interface( const QString& interface ) const; 104 ONetworkInterface* interface( const QString& interface ) const;
95 /** 105 /**
96 * @internal Rebuild the internal interface database 106 * @internal Rebuild the internal interface database
97 * @note Sometimes it might be useful to call this from client code, 107 * @note Sometimes it might be useful to call this from client code,
98 * e.g. after issuing a cardctl insert 108 * e.g. after issuing a cardctl insert
99 */ 109 */
100 void synchronize(); 110 void synchronize();
101 /** 111 /**
102 * @returns the wireless extension version used at compile time. 112 * @returns the wireless extension version used at compile time.
103 **/ 113 **/
104 static short wirelessExtensionVersion(); 114 static short wirelessExtensionVersion();
105 115
106 protected: 116 protected:
107 ONetwork(); 117 ONetwork();
108 118
109 private: 119 private:
110 static ONetwork* _instance; 120 static ONetwork* _instance;
111 InterfaceMap _interfaces; 121 InterfaceMap _interfaces;
112}; 122};
113 123
114 124
115/*====================================================================================== 125/*======================================================================================
116 * ONetworkInterface 126 * ONetworkInterface
117 *======================================================================================*/ 127 *======================================================================================*/
118 128
119/** 129/**
120 * @brief A network interface wrapper. 130 * @brief A network interface wrapper.
121 * 131 *
122 * This class provides a wrapper for a network interface. All the cumbersume details of 132 * This class provides a wrapper for a network interface. All the cumbersume details of
123 * Linux ioctls are hidden under a convenient high-level interface. 133 * Linux ioctls are hidden under a convenient high-level interface.
124 * @warning Most of the setting methods contained in this class require the appropriate 134 * @warning Most of the setting methods contained in this class require the appropriate
125 * process permissions to work. 135 * process permissions to work.
126 * 136 *
127 * @author Michael 'Mickey' Lauer <mickey@vanille.de> 137 * @author Michael 'Mickey' Lauer <mickey@vanille.de>
128 */ 138 */
129class ONetworkInterface : public QObject 139class ONetworkInterface : public QObject
130{ 140{
131 friend class OMonitoringInterface; 141 friend class OMonitoringInterface;
132 friend class OCiscoMonitoringInterface; 142 friend class OCiscoMonitoringInterface;
133 friend class OWlanNGMonitoringInterface; 143 friend class OWlanNGMonitoringInterface;
134 friend class OHostAPMonitoringInterface; 144 friend class OHostAPMonitoringInterface;
135 friend class OOrinocoMonitoringInterface; 145 friend class OOrinocoMonitoringInterface;
136 146
137 public: 147 public:
138 /** 148 /**
139 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself, 149 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself,
140 * but access them via @ref ONetwork::interface(). 150 * but access them via @ref ONetwork::interface().
141 */ 151 */
142 ONetworkInterface( QObject* parent, const char* name ); 152 ONetworkInterface( QObject* parent, const char* name );
143 /** 153 /**
144 * Destructor. 154 * Destructor.
145 */ 155 */
146 virtual ~ONetworkInterface(); 156 virtual ~ONetworkInterface();
147 /** 157 /**
148 * Associates a @a monitoring interface with this network interface. 158 * Associates a @a monitoring interface with this network interface.
149 * @note This is currently only useful with @ref OWirelessNetworkInterface objects. 159 * @note This is currently only useful with @ref OWirelessNetworkInterface objects.
150 */ 160 */
151 void setMonitoring( OMonitoringInterface* monitoring ); 161 void setMonitoring( OMonitoringInterface* monitoring );
152 /** 162 /**
153 * @returns the currently associated monitoring interface or 0, if no monitoring is associated. 163 * @returns the currently associated monitoring interface or 0, if no monitoring is associated.
154 */ 164 */
155 OMonitoringInterface* monitoring() const; 165 OMonitoringInterface* monitoring() const;
156 /** 166 /**
157 * Setting an interface to promiscuous mode enables the device to receive 167 * Setting an interface to promiscuous mode enables the device to receive
158 * all packets on the shared medium - as opposed to packets which are addressed to this interface. 168 * all packets on the shared medium - as opposed to packets which are addressed to this interface.
159 */ 169 */
160 bool setPromiscuousMode( bool ); 170 bool setPromiscuousMode( bool );
161 /** 171 /**
162 * @returns true if the interface is set to promiscuous mode. 172 * @returns true if the interface is set to promiscuous mode.
163 */ 173 */
164 bool promiscuousMode() const; 174 bool promiscuousMode() const;
165 /** 175 /**
166 * Setting an interface to up enables it to receive packets. 176 * Setting an interface to up enables it to receive packets.
167 */ 177 */
168 bool setUp( bool ); 178 bool setUp( bool );
169 /** 179 /**
170 * @returns true if the interface is up. 180 * @returns true if the interface is up.
171 */ 181 */
172 bool isUp() const; 182 bool isUp() const;
173 /** 183 /**
174 * @returns true if the interface is a loopback interface. 184 * @returns true if the interface is a loopback interface.
175 */ 185 */
176 bool isLoopback() const; 186 bool isLoopback() const;
177 /** 187 /**
178 * @returns true if the interface is featuring supports the wireless extension protocol. 188 * @returns true if the interface is featuring supports the wireless extension protocol.
179 */ 189 */
180 bool isWireless() const; 190 bool isWireless() const;
181 /** 191 /**
182 * Associate the IP address @ addr with the interface. 192 * Associate the IP address @ addr with the interface.
183 */ 193 */
184 void setIPV4Address( const QHostAddress& addr ); 194 void setIPV4Address( const QHostAddress& addr );
185 /** 195 /**
186 * @returns the IPv4 address associated with the interface. 196 * @returns the IPv4 address associated with the interface.
187 */ 197 */
188 QString ipV4Address() const; //TODO: make this return an OHostAddress 198 QString ipV4Address() const; //TODO: make this return an OHostAddress
189 /** 199 /**
190 * Associate the MAC address @a addr with the interface. 200 * Associate the MAC address @a addr with the interface.
191 * @note It can be necessary to shut down the interface prior to calling this method. 201 * @note It can be necessary to shut down the interface prior to calling this method.
192 * @warning This is not supported by all drivers. 202 * @warning This is not supported by all drivers.
193 */ 203 */
194 void setMacAddress( const OMacAddress& addr ); 204 void setMacAddress( const OMacAddress& addr );
195 /** 205 /**
196 * @returns the MAC address associated with the interface. 206 * @returns the MAC address associated with the interface.
197 */ 207 */
198 OMacAddress macAddress() const; 208 OMacAddress macAddress() const;
199 /** 209 /**
200 * Associate the IPv4 @a netmask with the interface. 210 * Associate the IPv4 @a netmask with the interface.
201 */ 211 */
202 void setIPV4Netmask( const QHostAddress& netmask ); 212 void setIPV4Netmask( const QHostAddress& netmask );
203 /** 213 /**
204 * @returns the IPv4 netmask associated with the interface. 214 * @returns the IPv4 netmask associated with the interface.
205 */ 215 */
206 QString ipV4Netmask() const; //TODO: make this return an OHostAddress 216 QString ipV4Netmask() const; //TODO: make this return an OHostAddress
207 /** 217 /**
208 * @returns the data link type currently associated with the interface. 218 * @returns the data link type currently associated with the interface.
209 * @see #include <net/if_arp.h> for possible values. 219 * @see #include <net/if_arp.h> for possible values.
210 */ 220 */
211 int dataLinkType() const; 221 int dataLinkType() const;
212 222
213 protected: 223 protected:
214 const int _sfd; 224 const int _sfd;
215 mutable ifreq _ifr; 225 mutable ifreq _ifr;
216 OMonitoringInterface* _mon; 226 OMonitoringInterface* _mon;
217 227
218 protected: 228 protected:
219 struct ifreq& ifr() const; 229 struct ifreq& ifr() const;
220 virtual void init(); 230 virtual void init();
221 bool ioctl( int call ) const; 231 bool ioctl( int call ) const;
222 bool ioctl( int call, struct ifreq& ) const; 232 bool ioctl( int call, struct ifreq& ) const;
223}; 233};
224 234
225/*====================================================================================== 235/*======================================================================================
226 * OChannelHopper 236 * OChannelHopper
diff --git a/libopie2/opienet/opienet.pro b/libopie2/opienet/opienet.pro
index cab6da6..97bcf31 100644
--- a/libopie2/opienet/opienet.pro
+++ b/libopie2/opienet/opienet.pro
@@ -1,34 +1,36 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qt warn_on debug 2CONFIG += qt warn_on debug
3DESTDIR = $(OPIEDIR)/lib 3DESTDIR = $(OPIEDIR)/lib
4HEADERS = 802_11_user.h \ 4HEADERS = 802_11_user.h \
5 dhcp.h \ 5 dhcp.h \
6 udp_ports.h \ 6 udp_ports.h \
7 wireless.h \ 7 wireless.15.h \
8 wireless.16.h \
8 odebugmapper.h \ 9 odebugmapper.h \
9 omanufacturerdb.h \ 10 omanufacturerdb.h \
10 onetutils.h \ 11 onetutils.h \
11 onetwork.h \ 12 onetwork.h \
12 opcap.h \ 13 opcap.h \
13 ostation.h 14 ostation.h
14SOURCES = odebugmapper.cpp \ 15SOURCES = odebugmapper.cpp \
15 omanufacturerdb.cpp \ 16 omanufacturerdb.cpp \
16 onetutils.cpp \ 17 onetutils.cpp \
17 onetwork.cpp \ 18 onetwork.cpp \
18 opcap.cpp \ 19 opcap.cpp \
19 ostation.cpp 20 ostation.cpp
20INTERFACES = 21INTERFACES =
21TARGET = opienet2 22TARGET = opienet2
22VERSION = 1.8.3 23VERSION = 1.8.3
23INCLUDEPATH += $(OPIEDIR)/include 24INCLUDEPATH += $(OPIEDIR)/include
24DEPENDPATH += $(OPIEDIR)/include 25DEPENDPATH += $(OPIEDIR)/include
25LIBS += -lpcap 26LIBS += -lpcap
26 27
27 28
28!contains( platform, x11 ) { 29!contains( platform, x11 ) {
29 include ( $(OPIEDIR)/include.pro ) 30 include ( $(OPIEDIR)/include.pro )
30} 31}
31 32
32contains( platform, x11 ) { 33contains( platform, x11 ) {
33 LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib 34 LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib
34} 35}
36
diff --git a/libopie2/opienet/wireless.h b/libopie2/opienet/wireless.15.h
index 8135e97..8135e97 100644
--- a/libopie2/opienet/wireless.h
+++ b/libopie2/opienet/wireless.15.h
diff --git a/libopie2/opienet/wireless.h b/libopie2/opienet/wireless.16.h
index 8135e97..9a9accd 100644
--- a/libopie2/opienet/wireless.h
+++ b/libopie2/opienet/wireless.16.h
@@ -1,705 +1,740 @@
1/* 1/*
2 * This file define a set of standard wireless extensions 2 * This file define a set of standard wireless extensions
3 * 3 *
4 * Version : 1512.7.02 4 * Version : 162.4.03
5 * 5 *
6 * Authors :Jean Tourrilhes - HPL - <jt@hpl.hp.com> 6 * Authors :Jean Tourrilhes - HPL - <jt@hpl.hp.com>
7 * Copyright (c) 1997-2002 Jean Tourrilhes, All Rights Reserved. 7 * Copyright (c) 1997-2002 Jean Tourrilhes, All Rights Reserved.
8 */ 8 */
9 9
10#ifndef _LINUX_WIRELESS_H 10#ifndef _LINUX_WIRELESS_H
11#define _LINUX_WIRELESS_H 11#define _LINUX_WIRELESS_H
12 12
13/************************** DOCUMENTATION **************************/ 13/************************** DOCUMENTATION **************************/
14/* 14/*
15 * Initial APIs (1996 -> onward) : 15 * Initial APIs (1996 -> onward) :
16 * ----------------------------- 16 * -----------------------------
17 * Basically, the wireless extensions are for now a set of standard ioctl 17 * Basically, the wireless extensions are for now a set of standard ioctl
18 * call + /proc/net/wireless 18 * call + /proc/net/wireless
19 * 19 *
20 * The entry /proc/net/wireless give statistics and information on the 20 * The entry /proc/net/wireless give statistics and information on the
21 * driver. 21 * driver.
22 * This is better than having each driver having its entry because 22 * This is better than having each driver having its entry because
23 * its centralised and we may remove the driver module safely. 23 * its centralised and we may remove the driver module safely.
24 * 24 *
25 * Ioctl are used to configure the driver and issue commands. This is 25 * Ioctl are used to configure the driver and issue commands. This is
26 * better than command line options of insmod because we may want to 26 * better than command line options of insmod because we may want to
27 * change dynamically (while the driver is running) some parameters. 27 * change dynamically (while the driver is running) some parameters.
28 * 28 *
29 * The ioctl mechanimsm are copied from standard devices ioctl. 29 * The ioctl mechanimsm are copied from standard devices ioctl.
30 * We have the list of command plus a structure descibing the 30 * We have the list of command plus a structure descibing the
31 * data exchanged... 31 * data exchanged...
32 * Note that to add these ioctl, I was obliged to modify : 32 * Note that to add these ioctl, I was obliged to modify :
33 *# net/core/dev.c (two place + add include) 33 *# net/core/dev.c (two place + add include)
34 *# net/ipv4/af_inet.c (one place + add include) 34 *# net/ipv4/af_inet.c (one place + add include)
35 * 35 *
36 * /proc/net/wireless is a copy of /proc/net/dev. 36 * /proc/net/wireless is a copy of /proc/net/dev.
37 * We have a structure for data passed from the driver to /proc/net/wireless 37 * We have a structure for data passed from the driver to /proc/net/wireless
38 * Too add this, I've modified : 38 * Too add this, I've modified :
39 *# net/core/dev.c (two other places) 39 *# net/core/dev.c (two other places)
40 *# include/linux/netdevice.h (one place) 40 *# include/linux/netdevice.h (one place)
41 *# include/linux/proc_fs.h (one place) 41 *# include/linux/proc_fs.h (one place)
42 * 42 *
43 * New driver API (2002 -> onward) : 43 * New driver API (2002 -> onward) :
44 * ------------------------------- 44 * -------------------------------
45 * This file is only concerned with the user space API and common definitions. 45 * This file is only concerned with the user space API and common definitions.
46 * The new driver API is defined and documented in : 46 * The new driver API is defined and documented in :
47 *# include/net/iw_handler.h 47 *# include/net/iw_handler.h
48 * 48 *
49 * Note as well that /proc/net/wireless implementation has now moved in : 49 * Note as well that /proc/net/wireless implementation has now moved in :
50 *# include/linux/wireless.c 50 *# include/linux/wireless.c
51 * 51 *
52 * Wireless Events (2002 -> onward) : 52 * Wireless Events (2002 -> onward) :
53 * -------------------------------- 53 * --------------------------------
54 * Events are defined at the end of this file, and implemented in : 54 * Events are defined at the end of this file, and implemented in :
55 *# include/linux/wireless.c 55 *# include/linux/wireless.c
56 * 56 *
57 * Other comments : 57 * Other comments :
58 * -------------- 58 * --------------
59 * Do not add here things that are redundant with other mechanisms 59 * Do not add here things that are redundant with other mechanisms
60 * (drivers init, ifconfig, /proc/net/dev, ...) and with are not 60 * (drivers init, ifconfig, /proc/net/dev, ...) and with are not
61 * wireless specific. 61 * wireless specific.
62 * 62 *
63 * These wireless extensions are not magic : each driver has to provide 63 * These wireless extensions are not magic : each driver has to provide
64 * support for them... 64 * support for them...
65 * 65 *
66 * IMPORTANT NOTE : As everything in the kernel, this is very much a 66 * IMPORTANT NOTE : As everything in the kernel, this is very much a
67 * work in progress. Contact me if you have ideas of improvements... 67 * work in progress. Contact me if you have ideas of improvements...
68 */ 68 */
69 69
70/***************************** INCLUDES *****************************/ 70/***************************** INCLUDES *****************************/
71 71
72/* To minimise problems in user space, I might remove those headers
73 * at some point. Jean II */
72#include <sys/types.h> 74#include <sys/types.h>
73#include <net/if.h> 75#include <net/if.h>
74#include <linux/types.h> 76#include <linux/types.h>
75 77
76#ifndef IFNAMSIZ 78#ifndef IFNAMSIZ
77#define IFNAMSIZ 16 79#define IFNAMSIZ 16
78#endif 80#endif
79#ifndef IW_MAX_PRIV_DEF 81#ifndef IW_MAX_PRIV_DEF
80#define IW_MAX_PRIV_DEF 128 82#define IW_MAX_PRIV_DEF 128
81#endif 83#endif
82 84
83/***************************** VERSION *****************************/ 85/***************************** VERSION *****************************/
84/* 86/*
85 * This constant is used to know the availability of the wireless 87 * This constant is used to know the availability of the wireless
86 * extensions and to know which version of wireless extensions it is 88 * extensions and to know which version of wireless extensions it is
87 * (there is some stuff that will be added in the future...) 89 * (there is some stuff that will be added in the future...)
88 * I just plan to increment with each new version. 90 * I just plan to increment with each new version.
89 */ 91 */
90 #define WIRELESS_EXT15 92 #define WIRELESS_EXT16
91 93
92/* 94/*
93 * Changes : 95 * Changes :
94 * 96 *
95 * V2 to V3 97 * V2 to V3
96 * -------- 98 * --------
97 *Alan Cox start some incompatibles changes. I've integrated a bit more. 99 *Alan Cox start some incompatibles changes. I've integrated a bit more.
98 *- Encryption renamed to Encode to avoid US regulation problems 100 *- Encryption renamed to Encode to avoid US regulation problems
99 *- Frequency changed from float to struct to avoid problems on old 386 101 *- Frequency changed from float to struct to avoid problems on old 386
100 * 102 *
101 * V3 to V4 103 * V3 to V4
102 * -------- 104 * --------
103 *- Add sensitivity 105 *- Add sensitivity
104 * 106 *
105 * V4 to V5 107 * V4 to V5
106 * -------- 108 * --------
107 *- Missing encoding definitions in range 109 *- Missing encoding definitions in range
108 *- Access points stuff 110 *- Access points stuff
109 * 111 *
110 * V5 to V6 112 * V5 to V6
111 * -------- 113 * --------
112 *- 802.11 support (ESSID ioctls) 114 *- 802.11 support (ESSID ioctls)
113 * 115 *
114 * V6 to V7 116 * V6 to V7
115 * -------- 117 * --------
116 *- define IW_ESSID_MAX_SIZE and IW_MAX_AP 118 *- define IW_ESSID_MAX_SIZE and IW_MAX_AP
117 * 119 *
118 * V7 to V8 120 * V7 to V8
119 * -------- 121 * --------
120 *- Changed my e-mail address 122 *- Changed my e-mail address
121 *- More 802.11 support (nickname, rate, rts, frag) 123 *- More 802.11 support (nickname, rate, rts, frag)
122 *- List index in frequencies 124 *- List index in frequencies
123 * 125 *
124 * V8 to V9 126 * V8 to V9
125 * -------- 127 * --------
126 *- Support for 'mode of operation' (ad-hoc, managed...) 128 *- Support for 'mode of operation' (ad-hoc, managed...)
127 *- Support for unicast and multicast power saving 129 *- Support for unicast and multicast power saving
128 *- Change encoding to support larger tokens (>64 bits) 130 *- Change encoding to support larger tokens (>64 bits)
129 *- Updated iw_params (disable, flags) and use it for NWID 131 *- Updated iw_params (disable, flags) and use it for NWID
130 *- Extracted iw_point from iwreq for clarity 132 *- Extracted iw_point from iwreq for clarity
131 * 133 *
132 * V9 to V10 134 * V9 to V10
133 * --------- 135 * ---------
134 *- Add PM capability to range structure 136 *- Add PM capability to range structure
135 *- Add PM modifier : MAX/MIN/RELATIVE 137 *- Add PM modifier : MAX/MIN/RELATIVE
136 *- Add encoding option : IW_ENCODE_NOKEY 138 *- Add encoding option : IW_ENCODE_NOKEY
137 *- Add TxPower ioctls (work like TxRate) 139 *- Add TxPower ioctls (work like TxRate)
138 * 140 *
139 * V10 to V11 141 * V10 to V11
140 * ---------- 142 * ----------
141 *- Add WE version in range (help backward/forward compatibility) 143 *- Add WE version in range (help backward/forward compatibility)
142 *- Add retry ioctls (work like PM) 144 *- Add retry ioctls (work like PM)
143 * 145 *
144 * V11 to V12 146 * V11 to V12
145 * ---------- 147 * ----------
146 *- Add SIOCSIWSTATS to get /proc/net/wireless programatically 148 *- Add SIOCSIWSTATS to get /proc/net/wireless programatically
147 *- Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space 149 *- Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space
148 *- Add new statistics (frag, retry, beacon) 150 *- Add new statistics (frag, retry, beacon)
149 *- Add average quality (for user space calibration) 151 *- Add average quality (for user space calibration)
150 * 152 *
151 * V12 to V13 153 * V12 to V13
152 * ---------- 154 * ----------
153 *- Document creation of new driver API. 155 *- Document creation of new driver API.
154 *- Extract union iwreq_data from struct iwreq (for new driver API). 156 *- Extract union iwreq_data from struct iwreq (for new driver API).
155 *- Rename SIOCSIWNAME as SIOCSIWCOMMIT 157 *- Rename SIOCSIWNAME as SIOCSIWCOMMIT
156 * 158 *
157 * V13 to V14 159 * V13 to V14
158 * ---------- 160 * ----------
159 *- Wireless Events support : define struct iw_event 161 *- Wireless Events support : define struct iw_event
160 *- Define additional specific event numbers 162 *- Define additional specific event numbers
161 *- Add "addr" and "param" fields in union iwreq_data 163 *- Add "addr" and "param" fields in union iwreq_data
162 *- AP scanning stuff (SIOCSIWSCAN and friends) 164 *- AP scanning stuff (SIOCSIWSCAN and friends)
163 * 165 *
164 * V14 to V15 166 * V14 to V15
165 * ---------- 167 * ----------
166 *- Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg 168 *- Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg
167 *- Make struct iw_freq signed (both m & e), add explicit padding 169 *- Make struct iw_freq signed (both m & e), add explicit padding
168 *- Add IWEVCUSTOM for driver specific event/scanning token 170 *- Add IWEVCUSTOM for driver specific event/scanning token
169 *- Add IW_MAX_GET_SPY for driver returning a lot of addresses 171 *- Add IW_MAX_GET_SPY for driver returning a lot of addresses
170 *- Add IW_TXPOW_RANGE for range of Tx Powers 172 *- Add IW_TXPOW_RANGE for range of Tx Powers
171 *- Add IWEVREGISTERED & IWEVEXPIRED events for Access Points 173 *- Add IWEVREGISTERED & IWEVEXPIRED events for Access Points
172 *- Add IW_MODE_MONITOR for passive monitor 174 *- Add IW_MODE_MONITOR for passive monitor
175 *
176 * V15 to V16
177 * ----------
178 *- Increase the number of bitrates in iw_range to 32 (for 802.11g)
179 *- Increase the number of frequencies in iw_range to 32 (for 802.11b+a)
180 *- Reshuffle struct iw_range for increases, add filler
181 *- Increase IW_MAX_AP to 64 for driver returning a lot of addresses
182 *- Remove IW_MAX_GET_SPY because conflict with enhanced spy support
183 *- Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy"
184 *- Add IW_ENCODE_TEMP and iw_range->encoding_login_index
173 */ 185 */
174 186
175/**************************** CONSTANTS ****************************/ 187/**************************** CONSTANTS ****************************/
176 188
177/* -------------------------- IOCTL LIST -------------------------- */ 189/* -------------------------- IOCTL LIST -------------------------- */
178 190
179/* Wireless Identification */ 191/* Wireless Identification */
180 #define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */ 192 #define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */
181 #define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ 193 #define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
182/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. 194/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
183 * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... 195 * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
184 * Don't put the name of your driver there, it's useless. */ 196 * Don't put the name of your driver there, it's useless. */
185 197
186/* Basic operations */ 198/* Basic operations */
187 #define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ 199 #define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */
188 #define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ 200 #define SIOCGIWNWID 0x8B03 /* get network id (the cell) */
189 #define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ 201 #define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */
190 #define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ 202 #define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */
191 #define SIOCSIWMODE 0x8B06 /* set operation mode */ 203 #define SIOCSIWMODE 0x8B06 /* set operation mode */
192 #define SIOCGIWMODE 0x8B07 /* get operation mode */ 204 #define SIOCGIWMODE 0x8B07 /* get operation mode */
193 #define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ 205 #define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */
194 #define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ 206 #define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */
195 207
196/* Informative stuff */ 208/* Informative stuff */
197 #define SIOCSIWRANGE 0x8B0A /* Unused */ 209 #define SIOCSIWRANGE 0x8B0A /* Unused */
198 #define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ 210 #define SIOCGIWRANGE 0x8B0B /* Get range of parameters */
199 #define SIOCSIWPRIV 0x8B0C /* Unused */ 211 #define SIOCSIWPRIV 0x8B0C /* Unused */
200 #define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ 212 #define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */
201 #define SIOCSIWSTATS 0x8B0E /* Unused */ 213 #define SIOCSIWSTATS 0x8B0E /* Unused */
202 #define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */ 214 #define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */
203/* SIOCGIWSTATS is strictly used between user space and the kernel, and 215/* SIOCGIWSTATS is strictly used between user space and the kernel, and
204 * is never passed to the driver (i.e. the driver will never see it). */ 216 * is never passed to the driver (i.e. the driver will never see it). */
205 217
206/* Mobile IP support (statistics per MAC address) */ 218/* Spy support (statistics per MAC address - used for Mobile IP support) */
207 #define SIOCSIWSPY 0x8B10 /* set spy addresses */ 219 #define SIOCSIWSPY 0x8B10 /* set spy addresses */
208 #define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ 220 #define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */
221 #define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */
222 #define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */
209 223
210/* Access Point manipulation */ 224/* Access Point manipulation */
211 #define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ 225 #define SIOCSIWAP 0x8B14 /* set access point MAC addresses */
212 #define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ 226 #define SIOCGIWAP 0x8B15 /* get access point MAC addresses */
213 #define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */ 227 #define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */
214 #define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ 228 #define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */
215 #define SIOCGIWSCAN 0x8B19 /* get scanning results */ 229 #define SIOCGIWSCAN 0x8B19 /* get scanning results */
216 230
217/* 802.11 specific support */ 231/* 802.11 specific support */
218 #define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ 232 #define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */
219 #define SIOCGIWESSID 0x8B1B /* get ESSID */ 233 #define SIOCGIWESSID 0x8B1B /* get ESSID */
220 #define SIOCSIWNICKN 0x8B1C /* set node name/nickname */ 234 #define SIOCSIWNICKN 0x8B1C /* set node name/nickname */
221 #define SIOCGIWNICKN 0x8B1D /* get node name/nickname */ 235 #define SIOCGIWNICKN 0x8B1D /* get node name/nickname */
222/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit 236/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit
223 * within the 'iwreq' structure, so we need to use the 'data' member to 237 * within the 'iwreq' structure, so we need to use the 'data' member to
224 * point to a string in user space, like it is done for RANGE... */ 238 * point to a string in user space, like it is done for RANGE... */
225 239
226/* Other parameters useful in 802.11 and some other devices */ 240/* Other parameters useful in 802.11 and some other devices */
227 #define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ 241 #define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */
228 #define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ 242 #define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */
229 #define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ 243 #define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */
230 #define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ 244 #define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */
231 #define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ 245 #define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */
232 #define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ 246 #define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */
233 #define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ 247 #define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */
234 #define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ 248 #define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */
235 #define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */ 249 #define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */
236 #define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */ 250 #define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */
237 251
238/* Encoding stuff (scrambling, hardware security, WEP...) */ 252/* Encoding stuff (scrambling, hardware security, WEP...) */
239 #define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */ 253 #define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */
240 #define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */ 254 #define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */
241/* Power saving stuff (power management, unicast and multicast) */ 255/* Power saving stuff (power management, unicast and multicast) */
242 #define SIOCSIWPOWER 0x8B2C /* set Power Management settings */ 256 #define SIOCSIWPOWER 0x8B2C /* set Power Management settings */
243 #define SIOCGIWPOWER 0x8B2D /* get Power Management settings */ 257 #define SIOCGIWPOWER 0x8B2D /* get Power Management settings */
244 258
245/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */ 259/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */
246 260
247/* These 16 ioctl are wireless device private. 261/* These 16 ioctl are wireless device private.
248 * Each driver is free to use them for whatever purpose it chooses, 262 * Each driver is free to use them for whatever purpose it chooses,
249 * however the driver *must* export the description of those ioctls 263 * however the driver *must* export the description of those ioctls
250 * with SIOCGIWPRIV and *must* use arguments as defined below. 264 * with SIOCGIWPRIV and *must* use arguments as defined below.
251 * If you don't follow those rules, DaveM is going to hate you (reason : 265 * If you don't follow those rules, DaveM is going to hate you (reason :
252 * it make mixed 32/64bit operation impossible). 266 * it make mixed 32/64bit operation impossible).
253 */ 267 */
254 #define SIOCIWFIRSTPRIV0x8BE0 268 #define SIOCIWFIRSTPRIV0x8BE0
255 #define SIOCIWLASTPRIV0x8BFF 269 #define SIOCIWLASTPRIV0x8BFF
256/* Previously, we were using SIOCDEVPRIVATE, but we now have our 270/* Previously, we were using SIOCDEVPRIVATE, but we now have our
257 * separate range because of collisions with other tools such as 271 * separate range because of collisions with other tools such as
258 * 'mii-tool'. 272 * 'mii-tool'.
259 * We now have 32 commands, so a bit more space ;-). 273 * We now have 32 commands, so a bit more space ;-).
260 * Also, all 'odd' commands are only usable by root and don't return the 274 * Also, all 'odd' commands are only usable by root and don't return the
261 * content of ifr/iwr to user (but you are not obliged to use the set/get 275 * content of ifr/iwr to user (but you are not obliged to use the set/get
262 * convention, just use every other two command). 276 * convention, just use every other two command).
263 * And I repeat : you are not obliged to use them with iwspy, but you 277 * And I repeat : you are not obliged to use them with iwspy, but you
264 * must be compliant with it. 278 * must be compliant with it.
265 */ 279 */
266 280
267/* ------------------------- IOCTL STUFF ------------------------- */ 281/* ------------------------- IOCTL STUFF ------------------------- */
268 282
269/* The first and the last (range) */ 283/* The first and the last (range) */
270 #define SIOCIWFIRST0x8B00 284 #define SIOCIWFIRST0x8B00
271 #define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ 285 #define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */
272 286
273/* Even : get (world access), odd : set (root access) */ 287/* Even : get (world access), odd : set (root access) */
274 #define IW_IS_SET(cmd)(!((cmd) & 0x1)) 288 #define IW_IS_SET(cmd)(!((cmd) & 0x1))
275 #define IW_IS_GET(cmd)((cmd) & 0x1) 289 #define IW_IS_GET(cmd)((cmd) & 0x1)
276 290
277/* ----------------------- WIRELESS EVENTS ----------------------- */ 291/* ----------------------- WIRELESS EVENTS ----------------------- */
278/* Those are *NOT* ioctls, do not issue request on them !!! */ 292/* Those are *NOT* ioctls, do not issue request on them !!! */
279/* Most events use the same identifier as ioctl requests */ 293/* Most events use the same identifier as ioctl requests */
280 294
281 #define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */ 295 #define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */
282 #define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */ 296 #define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */
283 #define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */ 297 #define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */
284 #define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ 298 #define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */
285 #define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */ 299 #define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */
286 300
287 #define IWEVFIRST0x8C00 301 #define IWEVFIRST0x8C00
288 302
289/* ------------------------- PRIVATE INFO ------------------------- */ 303/* ------------------------- PRIVATE INFO ------------------------- */
290/* 304/*
291 * The following is used with SIOCGIWPRIV. It allow a driver to define 305 * The following is used with SIOCGIWPRIV. It allow a driver to define
292 * the interface (name, type of data) for its private ioctl. 306 * the interface (name, type of data) for its private ioctl.
293 * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV 307 * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV
294 */ 308 */
295 309
296 #define IW_PRIV_TYPE_MASK 0x7000/* Type of arguments */ 310 #define IW_PRIV_TYPE_MASK 0x7000/* Type of arguments */
297 #define IW_PRIV_TYPE_NONE0x0000 311 #define IW_PRIV_TYPE_NONE0x0000
298 #define IW_PRIV_TYPE_BYTE 0x1000/* Char as number */ 312 #define IW_PRIV_TYPE_BYTE 0x1000/* Char as number */
299 #define IW_PRIV_TYPE_CHAR 0x2000/* Char as character */ 313 #define IW_PRIV_TYPE_CHAR 0x2000/* Char as character */
300 #define IW_PRIV_TYPE_INT 0x4000/* 32 bits int */ 314 #define IW_PRIV_TYPE_INT 0x4000/* 32 bits int */
301 #define IW_PRIV_TYPE_FLOAT 0x5000/* struct iw_freq */ 315 #define IW_PRIV_TYPE_FLOAT 0x5000/* struct iw_freq */
302 #define IW_PRIV_TYPE_ADDR 0x6000/* struct sockaddr */ 316 #define IW_PRIV_TYPE_ADDR 0x6000/* struct sockaddr */
303 317
304 #define IW_PRIV_SIZE_FIXED 0x0800/* Variable or fixed nuber of args */ 318 #define IW_PRIV_SIZE_FIXED 0x0800/* Variable or fixed number of args */
305 319
306 #define IW_PRIV_SIZE_MASK 0x07FF/* Max number of those args */ 320 #define IW_PRIV_SIZE_MASK 0x07FF/* Max number of those args */
307 321
308/* 322/*
309 * Note : if the number of args is fixed and the size < 16 octets, 323 * Note : if the number of args is fixed and the size < 16 octets,
310 * instead of passing a pointer we will put args in the iwreq struct... 324 * instead of passing a pointer we will put args in the iwreq struct...
311 */ 325 */
312 326
313/* ----------------------- OTHER CONSTANTS ----------------------- */ 327/* ----------------------- OTHER CONSTANTS ----------------------- */
314 328
315/* Maximum frequencies in the range struct */ 329/* Maximum frequencies in the range struct */
316 #define IW_MAX_FREQUENCIES16 330 #define IW_MAX_FREQUENCIES32
317/* Note : if you have something like 80 frequencies, 331/* Note : if you have something like 80 frequencies,
318 * don't increase this constant and don't fill the frequency list. 332 * don't increase this constant and don't fill the frequency list.
319 * The user will be able to set by channel anyway... */ 333 * The user will be able to set by channel anyway... */
320 334
321/* Maximum bit rates in the range struct */ 335/* Maximum bit rates in the range struct */
322 #define IW_MAX_BITRATES 8 336 #define IW_MAX_BITRATES 32
323 337
324/* Maximum tx powers in the range struct */ 338/* Maximum tx powers in the range struct */
325 #define IW_MAX_TXPOWER 8 339 #define IW_MAX_TXPOWER 8
326/* Note : if you more than 8 TXPowers, just set the max and min or 340/* Note : if you more than 8 TXPowers, just set the max and min or
327 * a few of them in the struct iw_range. */ 341 * a few of them in the struct iw_range. */
328 342
329/* Maximum of address that you may set with SPY */ 343/* Maximum of address that you may set with SPY */
330 #define IW_MAX_SPY 8/* set */ 344 #define IW_MAX_SPY 8
331 #define IW_MAX_GET_SPY 64/* get */
332 345
333/* Maximum of address that you may get in the 346/* Maximum of address that you may get in the
334 list of access points in range */ 347 list of access points in range */
335 #define IW_MAX_AP 64 348 #define IW_MAX_AP 64
336 349
337/* Maximum size of the ESSID and NICKN strings */ 350/* Maximum size of the ESSID and NICKN strings */
338 #define IW_ESSID_MAX_SIZE32 351 #define IW_ESSID_MAX_SIZE32
339 352
340/* Modes of operation */ 353/* Modes of operation */
341 #define IW_MODE_AUTO 0/* Let the driver decides */ 354 #define IW_MODE_AUTO 0/* Let the driver decides */
342 #define IW_MODE_ADHOC 1/* Single cell network */ 355 #define IW_MODE_ADHOC 1/* Single cell network */
343 #define IW_MODE_INFRA 2/* Multi cell network, roaming, ... */ 356 #define IW_MODE_INFRA 2/* Multi cell network, roaming, ... */
344 #define IW_MODE_MASTER 3/* Synchronisation master or Access Point */ 357 #define IW_MODE_MASTER 3/* Synchronisation master or Access Point */
345 #define IW_MODE_REPEAT 4/* Wireless Repeater (forwarder) */ 358 #define IW_MODE_REPEAT 4/* Wireless Repeater (forwarder) */
346 #define IW_MODE_SECOND 5/* Secondary master/repeater (backup) */ 359 #define IW_MODE_SECOND 5/* Secondary master/repeater (backup) */
347 #define IW_MODE_MONITOR 6/* Passive monitor (listen only) */ 360 #define IW_MODE_MONITOR 6/* Passive monitor (listen only) */
348 361
349/* Maximum number of size of encoding token available 362/* Maximum number of size of encoding token available
350 * they are listed in the range structure */ 363 * they are listed in the range structure */
351 #define IW_MAX_ENCODING_SIZES8 364 #define IW_MAX_ENCODING_SIZES8
352 365
353/* Maximum size of the encoding token in bytes */ 366/* Maximum size of the encoding token in bytes */
354 #define IW_ENCODING_TOKEN_MAX 32/* 256 bits (for now) */ 367 #define IW_ENCODING_TOKEN_MAX 32/* 256 bits (for now) */
355 368
356/* Flags for encoding (along with the token) */ 369/* Flags for encoding (along with the token) */
357 #define IW_ENCODE_INDEX 0x00FF/* Token index (if needed) */ 370 #define IW_ENCODE_INDEX 0x00FF/* Token index (if needed) */
358 #define IW_ENCODE_FLAGS 0xFF00/* Flags defined below */ 371 #define IW_ENCODE_FLAGS 0xFF00/* Flags defined below */
359 #define IW_ENCODE_MODE 0xF000/* Modes defined below */ 372 #define IW_ENCODE_MODE 0xF000/* Modes defined below */
360 #define IW_ENCODE_DISABLED 0x8000/* Encoding disabled */ 373 #define IW_ENCODE_DISABLED 0x8000/* Encoding disabled */
361 #define IW_ENCODE_ENABLED 0x0000/* Encoding enabled */ 374 #define IW_ENCODE_ENABLED 0x0000/* Encoding enabled */
362 #define IW_ENCODE_RESTRICTED 0x4000/* Refuse non-encoded packets */ 375 #define IW_ENCODE_RESTRICTED 0x4000/* Refuse non-encoded packets */
363 #define IW_ENCODE_OPEN 0x2000/* Accept non-encoded packets */ 376 #define IW_ENCODE_OPEN 0x2000/* Accept non-encoded packets */
364#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ 377 #define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */
378 #define IW_ENCODE_TEMP 0x0400 /* Temporary key */
365 379
366/* Power management flags available (along with the value, if any) */ 380/* Power management flags available (along with the value, if any) */
367 #define IW_POWER_ON 0x0000/* No details... */ 381 #define IW_POWER_ON 0x0000/* No details... */
368 #define IW_POWER_TYPE 0xF000/* Type of parameter */ 382 #define IW_POWER_TYPE 0xF000/* Type of parameter */
369 #define IW_POWER_PERIOD 0x1000/* Value is a period/duration of */ 383 #define IW_POWER_PERIOD 0x1000/* Value is a period/duration of */
370 #define IW_POWER_TIMEOUT 0x2000/* Value is a timeout (to go asleep) */ 384 #define IW_POWER_TIMEOUT 0x2000/* Value is a timeout (to go asleep) */
371 #define IW_POWER_MODE 0x0F00/* Power Management mode */ 385 #define IW_POWER_MODE 0x0F00/* Power Management mode */
372 #define IW_POWER_UNICAST_R 0x0100/* Receive only unicast messages */ 386 #define IW_POWER_UNICAST_R 0x0100/* Receive only unicast messages */
373 #define IW_POWER_MULTICAST_R 0x0200/* Receive only multicast messages */ 387 #define IW_POWER_MULTICAST_R 0x0200/* Receive only multicast messages */
374 #define IW_POWER_ALL_R 0x0300/* Receive all messages though PM */ 388 #define IW_POWER_ALL_R 0x0300/* Receive all messages though PM */
375 #define IW_POWER_FORCE_S 0x0400/* Force PM procedure for sending unicast */ 389 #define IW_POWER_FORCE_S 0x0400/* Force PM procedure for sending unicast */
376 #define IW_POWER_REPEATER 0x0800/* Repeat broadcast messages in PM period */ 390 #define IW_POWER_REPEATER 0x0800/* Repeat broadcast messages in PM period */
377 #define IW_POWER_MODIFIER 0x000F/* Modify a parameter */ 391 #define IW_POWER_MODIFIER 0x000F/* Modify a parameter */
378 #define IW_POWER_MIN 0x0001/* Value is a minimum */ 392 #define IW_POWER_MIN 0x0001/* Value is a minimum */
379 #define IW_POWER_MAX 0x0002/* Value is a maximum */ 393 #define IW_POWER_MAX 0x0002/* Value is a maximum */
380 #define IW_POWER_RELATIVE 0x0004/* Value is not in seconds/ms/us */ 394 #define IW_POWER_RELATIVE 0x0004/* Value is not in seconds/ms/us */
381 395
382/* Transmit Power flags available */ 396/* Transmit Power flags available */
383 #define IW_TXPOW_TYPE 0x00FF/* Type of value */ 397 #define IW_TXPOW_TYPE 0x00FF/* Type of value */
384 #define IW_TXPOW_DBM 0x0000/* Value is in dBm */ 398 #define IW_TXPOW_DBM 0x0000/* Value is in dBm */
385 #define IW_TXPOW_MWATT 0x0001/* Value is in mW */ 399 #define IW_TXPOW_MWATT 0x0001/* Value is in mW */
386 #define IW_TXPOW_RANGE 0x1000/* Range of value between min/max */ 400 #define IW_TXPOW_RANGE 0x1000/* Range of value between min/max */
387 401
388/* Retry limits and lifetime flags available */ 402/* Retry limits and lifetime flags available */
389 #define IW_RETRY_ON 0x0000/* No details... */ 403 #define IW_RETRY_ON 0x0000/* No details... */
390 #define IW_RETRY_TYPE 0xF000/* Type of parameter */ 404 #define IW_RETRY_TYPE 0xF000/* Type of parameter */
391 #define IW_RETRY_LIMIT 0x1000/* Maximum number of retries*/ 405 #define IW_RETRY_LIMIT 0x1000/* Maximum number of retries*/
392 #define IW_RETRY_LIFETIME 0x2000/* Maximum duration of retries in us */ 406 #define IW_RETRY_LIFETIME 0x2000/* Maximum duration of retries in us */
393 #define IW_RETRY_MODIFIER 0x000F/* Modify a parameter */ 407 #define IW_RETRY_MODIFIER 0x000F/* Modify a parameter */
394 #define IW_RETRY_MIN 0x0001/* Value is a minimum */ 408 #define IW_RETRY_MIN 0x0001/* Value is a minimum */
395 #define IW_RETRY_MAX 0x0002/* Value is a maximum */ 409 #define IW_RETRY_MAX 0x0002/* Value is a maximum */
396 #define IW_RETRY_RELATIVE 0x0004/* Value is not in seconds/ms/us */ 410 #define IW_RETRY_RELATIVE 0x0004/* Value is not in seconds/ms/us */
397 411
398/* Scanning request flags */ 412/* Scanning request flags */
399 #define IW_SCAN_DEFAULT 0x0000/* Default scan of the driver */ 413 #define IW_SCAN_DEFAULT 0x0000/* Default scan of the driver */
400 #define IW_SCAN_ALL_ESSID 0x0001/* Scan all ESSIDs */ 414 #define IW_SCAN_ALL_ESSID 0x0001/* Scan all ESSIDs */
401 #define IW_SCAN_THIS_ESSID 0x0002/* Scan only this ESSID */ 415 #define IW_SCAN_THIS_ESSID 0x0002/* Scan only this ESSID */
402 #define IW_SCAN_ALL_FREQ 0x0004/* Scan all Frequencies */ 416 #define IW_SCAN_ALL_FREQ 0x0004/* Scan all Frequencies */
403 #define IW_SCAN_THIS_FREQ 0x0008/* Scan only this Frequency */ 417 #define IW_SCAN_THIS_FREQ 0x0008/* Scan only this Frequency */
404 #define IW_SCAN_ALL_MODE 0x0010/* Scan all Modes */ 418 #define IW_SCAN_ALL_MODE 0x0010/* Scan all Modes */
405 #define IW_SCAN_THIS_MODE 0x0020/* Scan only this Mode */ 419 #define IW_SCAN_THIS_MODE 0x0020/* Scan only this Mode */
406 #define IW_SCAN_ALL_RATE 0x0040/* Scan all Bit-Rates */ 420 #define IW_SCAN_ALL_RATE 0x0040/* Scan all Bit-Rates */
407 #define IW_SCAN_THIS_RATE 0x0080/* Scan only this Bit-Rate */ 421 #define IW_SCAN_THIS_RATE 0x0080/* Scan only this Bit-Rate */
408/* Maximum size of returned data */ 422/* Maximum size of returned data */
409 #define IW_SCAN_MAX_DATA 4096/* In bytes */ 423 #define IW_SCAN_MAX_DATA 4096/* In bytes */
410 424
411/* Max number of char in custom event - use multiple of them if needed */ 425/* Max number of char in custom event - use multiple of them if needed */
412 #define IW_CUSTOM_MAX 256/* In bytes */ 426 #define IW_CUSTOM_MAX 256/* In bytes */
413 427
414/****************************** TYPES ******************************/ 428/****************************** TYPES ******************************/
415 429
416/* --------------------------- SUBTYPES --------------------------- */ 430/* --------------------------- SUBTYPES --------------------------- */
417/* 431/*
418 *Generic format for most parameters that fit in an int 432 *Generic format for most parameters that fit in an int
419 */ 433 */
420 structiw_param 434 structiw_param
421{ 435{
422 __s32 value; /* The value of the parameter itself */ 436 __s32 value; /* The value of the parameter itself */
423 __u8 fixed; /* Hardware should not use auto select */ 437 __u8 fixed; /* Hardware should not use auto select */
424 __u8 disabled;/* Disable the feature */ 438 __u8 disabled;/* Disable the feature */
425 __u16 flags; /* Various specifc flags (if any) */ 439 __u16 flags; /* Various specifc flags (if any) */
426}; 440};
427 441
428/* 442/*
429 *For all data larger than 16 octets, we need to use a 443 *For all data larger than 16 octets, we need to use a
430 *pointer to memory allocated in user space. 444 *pointer to memory allocated in user space.
431 */ 445 */
432 structiw_point 446 structiw_point
433{ 447{
434 caddr_t pointer;/* Pointer to the data (in user space) */ 448 caddr_t pointer;/* Pointer to the data (in user space) */
435 __u16 length; /* number of fields or size in bytes */ 449 __u16 length; /* number of fields or size in bytes */
436 __u16 flags; /* Optional params */ 450 __u16 flags; /* Optional params */
437}; 451};
438 452
439/* 453/*
440 *A frequency 454 *A frequency
441 *For numbers lower than 10^9, we encode the number in 'm' and 455 *For numbers lower than 10^9, we encode the number in 'm' and
442 *set 'e' to 0 456 *set 'e' to 0
443 *For number greater than 10^9, we divide it by the lowest power 457 *For number greater than 10^9, we divide it by the lowest power
444 *of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... 458 *of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
445 *The power of 10 is in 'e', the result of the division is in 'm'. 459 *The power of 10 is in 'e', the result of the division is in 'm'.
446 */ 460 */
447 structiw_freq 461 structiw_freq
448{ 462{
449 __s32 m; /* Mantissa */ 463 __s32 m; /* Mantissa */
450 __s16 e; /* Exponent */ 464 __s16 e; /* Exponent */
451 __u8 i; /* List index (when in range struct) */ 465 __u8 i; /* List index (when in range struct) */
452 __u8 pad; /* Unused - just for alignement */ 466 __u8 pad; /* Unused - just for alignement */
453}; 467};
454 468
455/* 469/*
456 *Quality of the link 470 *Quality of the link
457 */ 471 */
458 structiw_quality 472 structiw_quality
459{ 473{
460 __u8 qual; /* link quality (%retries, SNR, 474 __u8 qual; /* link quality (%retries, SNR,
461 %missed beacons or better...) */ 475 %missed beacons or better...) */
462 __u8 level; /* signal level (dBm) */ 476 __u8 level; /* signal level (dBm) */
463 __u8 noise; /* noise level (dBm) */ 477 __u8 noise; /* noise level (dBm) */
464 __u8 updated;/* Flags to know if updated */ 478 __u8 updated;/* Flags to know if updated */
465}; 479};
466 480
467/* 481/*
468 *Packet discarded in the wireless adapter due to 482 *Packet discarded in the wireless adapter due to
469 *"wireless" specific problems... 483 *"wireless" specific problems...
470 *Note : the list of counter and statistics in net_device_stats 484 *Note : the list of counter and statistics in net_device_stats
471 *is already pretty exhaustive, and you should use that first. 485 *is already pretty exhaustive, and you should use that first.
472 *This is only additional stats... 486 *This is only additional stats...
473 */ 487 */
474 structiw_discarded 488 structiw_discarded
475{ 489{
476 __u32 nwid; /* Rx : Wrong nwid/essid */ 490 __u32 nwid; /* Rx : Wrong nwid/essid */
477 __u32 code; /* Rx : Unable to code/decode (WEP) */ 491 __u32 code; /* Rx : Unable to code/decode (WEP) */
478 __u32 fragment;/* Rx : Can't perform MAC reassembly */ 492 __u32 fragment;/* Rx : Can't perform MAC reassembly */
479 __u32 retries;/* Tx : Max MAC retries num reached */ 493 __u32 retries;/* Tx : Max MAC retries num reached */
480 __u32 misc; /* Others cases */ 494 __u32 misc; /* Others cases */
481}; 495};
482 496
483/* 497/*
484 *Packet/Time period missed in the wireless adapter due to 498 *Packet/Time period missed in the wireless adapter due to
485 *"wireless" specific problems... 499 *"wireless" specific problems...
486 */ 500 */
487 structiw_missed 501 structiw_missed
488{ 502{
489 __u32 beacon; /* Missed beacons/superframe */ 503 __u32 beacon; /* Missed beacons/superframe */
490}; 504};
491 505
506/*
507 *Quality range (for spy threshold)
508 */
509 structiw_thrspy
510{
511 struct sockaddr addr; /* Source address (hw/mac) */
512 struct iw_quality qual; /* Quality of the link */
513 struct iw_quality low; /* Low threshold */
514 struct iw_quality high; /* High threshold */
515};
516
492/* ------------------------ WIRELESS STATS ------------------------ */ 517/* ------------------------ WIRELESS STATS ------------------------ */
493/* 518/*
494 * Wireless statistics (used for /proc/net/wireless) 519 * Wireless statistics (used for /proc/net/wireless)
495 */ 520 */
496 structiw_statistics 521 structiw_statistics
497{ 522{
498 __u16 status; /* Status 523 __u16 status; /* Status
499 * - device dependent for now */ 524 * - device dependent for now */
500 525
501 struct iw_quality qual; /* Quality of the link 526 struct iw_quality qual; /* Quality of the link
502 * (instant/mean/max) */ 527 * (instant/mean/max) */
503 struct iw_discarded discard;/* Packet discarded counts */ 528 struct iw_discarded discard;/* Packet discarded counts */
504 struct iw_missed miss; /* Packet missed counts */ 529 struct iw_missed miss; /* Packet missed counts */
505}; 530};
506 531
507/* ------------------------ IOCTL REQUEST ------------------------ */ 532/* ------------------------ IOCTL REQUEST ------------------------ */
508/* 533/*
509 * This structure defines the payload of an ioctl, and is used 534 * This structure defines the payload of an ioctl, and is used
510 * below. 535 * below.
511 * 536 *
512 * Note that this structure should fit on the memory footprint 537 * Note that this structure should fit on the memory footprint
513 * of iwreq (which is the same as ifreq), which mean a max size of 538 * of iwreq (which is the same as ifreq), which mean a max size of
514 * 16 octets = 128 bits. Warning, pointers might be 64 bits wide... 539 * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...
515 * You should check this when increasing the structures defined 540 * You should check this when increasing the structures defined
516 * above in this file... 541 * above in this file...
517 */ 542 */
518 unioniwreq_data 543 unioniwreq_data
519{ 544{
520 /* Config - generic */ 545 /* Config - generic */
521 char name[IFNAMSIZ]; 546 char name[IFNAMSIZ];
522 /* Name : used to verify the presence of wireless extensions. 547 /* Name : used to verify the presence of wireless extensions.
523 * Name of the protocol/provider... */ 548 * Name of the protocol/provider... */
524 549
525 struct iw_point essid; /* Extended network name */ 550 struct iw_point essid; /* Extended network name */
526 struct iw_param nwid; /* network id (or domain - the cell) */ 551 struct iw_param nwid; /* network id (or domain - the cell) */
527 struct iw_freq freq; /* frequency or channel : 552 struct iw_freq freq; /* frequency or channel :
528 * 0-1000 = channel 553 * 0-1000 = channel
529 * > 1000 = frequency in Hz */ 554 * > 1000 = frequency in Hz */
530 555
531 struct iw_param sens; /* signal level threshold */ 556 struct iw_param sens; /* signal level threshold */
532 struct iw_param bitrate;/* default bit rate */ 557 struct iw_param bitrate;/* default bit rate */
533 struct iw_param txpower;/* default transmit power */ 558 struct iw_param txpower;/* default transmit power */
534 struct iw_param rts; /* RTS threshold threshold */ 559 struct iw_param rts; /* RTS threshold threshold */
535 struct iw_param frag; /* Fragmentation threshold */ 560 struct iw_param frag; /* Fragmentation threshold */
536 __u32 mode; /* Operation mode */ 561 __u32 mode; /* Operation mode */
537 struct iw_param retry; /* Retry limits & lifetime */ 562 struct iw_param retry; /* Retry limits & lifetime */
538 563
539 struct iw_point encoding;/* Encoding stuff : tokens */ 564 struct iw_point encoding;/* Encoding stuff : tokens */
540 struct iw_param power; /* PM duration/timeout */ 565 struct iw_param power; /* PM duration/timeout */
541 struct iw_quality qual; /* Quality part of statistics */ 566 struct iw_quality qual; /* Quality part of statistics */
542 567
543 struct sockaddr ap_addr;/* Access point address */ 568 struct sockaddr ap_addr;/* Access point address */
544 struct sockaddr addr; /* Destination address (hw) */ 569 struct sockaddr addr; /* Destination address (hw/mac) */
545 570
546 struct iw_param param; /* Other small parameters */ 571 struct iw_param param; /* Other small parameters */
547 struct iw_point data; /* Other large parameters */ 572 struct iw_point data; /* Other large parameters */
548}; 573};
549 574
550/* 575/*
551 * The structure to exchange data for ioctl. 576 * The structure to exchange data for ioctl.
552 * This structure is the same as 'struct ifreq', but (re)defined for 577 * This structure is the same as 'struct ifreq', but (re)defined for
553 * convenience... 578 * convenience...
554 * Do I need to remind you about structure size (32 octets) ? 579 * Do I need to remind you about structure size (32 octets) ?
555 */ 580 */
556 structiwreq 581 structiwreq
557{ 582{
558 union 583 union
559 { 584 {
560 char ifrn_name[IFNAMSIZ];/* if name, e.g. "eth0" */ 585 char ifrn_name[IFNAMSIZ];/* if name, e.g. "eth0" */
561 } ifr_ifrn; 586 } ifr_ifrn;
562 587
563 /* Data part (defined just above) */ 588 /* Data part (defined just above) */
564 union iwreq_datau; 589 union iwreq_datau;
565}; 590};
566 591
567/* -------------------------- IOCTL DATA -------------------------- */ 592/* -------------------------- IOCTL DATA -------------------------- */
568/* 593/*
569 *For those ioctl which want to exchange mode data that what could 594 *For those ioctl which want to exchange mode data that what could
570 *fit in the above structure... 595 *fit in the above structure...
571 */ 596 */
572 597
573/* 598/*
574 *Range of parameters 599 *Range of parameters
575 */ 600 */
576 601
577 structiw_range 602 structiw_range
578{ 603{
579 /* Informative stuff (to choose between different interface) */ 604 /* Informative stuff (to choose between different interface) */
580 __u32 throughput;/* To give an idea... */ 605 __u32 throughput;/* To give an idea... */
581 /* In theory this value should be the maximum benchmarked 606 /* In theory this value should be the maximum benchmarked
582 * TCP/IP throughput, because with most of these devices the 607 * TCP/IP throughput, because with most of these devices the
583 * bit rate is meaningless (overhead an co) to estimate how 608 * bit rate is meaningless (overhead an co) to estimate how
584 * fast the connection will go and pick the fastest one. 609 * fast the connection will go and pick the fastest one.
585 * I suggest people to play with Netperf or any benchmark... 610 * I suggest people to play with Netperf or any benchmark...
586 */ 611 */
587 612
588 /* NWID (or domain id) */ 613 /* NWID (or domain id) */
589 __u32 min_nwid;/* Minimal NWID we are able to set */ 614 __u32 min_nwid;/* Minimal NWID we are able to set */
590 __u32 max_nwid;/* Maximal NWID we are able to set */ 615 __u32 max_nwid;/* Maximal NWID we are able to set */
591 616
592 /* Frequency */ 617 /* Old Frequency (backward compat - moved lower ) */
593 __u16 num_channels;/* Number of channels [0; num - 1] */ 618 __u16 old_num_channels;
594 __u8 num_frequency;/* Number of entry in the list */ 619 __u8 old_num_frequency;
595 struct iw_freq freq[IW_MAX_FREQUENCIES];/* list */ 620 /* Filler to keep "version" at the same offset */
596 /* Note : this frequency list doesn't need to fit channel numbers */ 621 __s32 old_freq[6];
597 622
598 /* signal level threshold range */ 623 /* signal level threshold range */
599 __s32sensitivity; 624 __s32sensitivity;
600 625
601 /* Quality of link & SNR stuff */ 626 /* Quality of link & SNR stuff */
627 /* Quality range (link, level, noise)
628 * If the quality is absolute, it will be in the range [0 ; max_qual],
629 * if the quality is dBm, it will be in the range [max_qual ; 0].
630 * Don't forget that we use 8 bit arithmetics... */
602 struct iw_quality max_qual;/* Quality of the link */ 631 struct iw_quality max_qual;/* Quality of the link */
632 /* This should contain the average/typical values of the quality
633 * indicator. This should be the threshold between a "good" and
634 * a "bad" link (example : monitor going from green to orange).
635 * Currently, user space apps like quality monitors don't have any
636 * way to calibrate the measurement. With this, they can split
637 * the range between 0 and max_qual in different quality level
638 * (using a geometric subdivision centered on the average).
639 * I expect that people doing the user space apps will feedback
640 * us on which value we need to put in each driver... */
641 struct iw_quality avg_qual;/* Quality of the link */
603 642
604 /* Rates */ 643 /* Rates */
605 __u8 num_bitrates;/* Number of entries in the list */ 644 __u8 num_bitrates;/* Number of entries in the list */
606 __s32 bitrate[IW_MAX_BITRATES];/* list, in bps */ 645 __s32 bitrate[IW_MAX_BITRATES];/* list, in bps */
607 646
608 /* RTS threshold */ 647 /* RTS threshold */
609 __s32 min_rts;/* Minimal RTS threshold */ 648 __s32 min_rts;/* Minimal RTS threshold */
610 __s32 max_rts;/* Maximal RTS threshold */ 649 __s32 max_rts;/* Maximal RTS threshold */
611 650
612 /* Frag threshold */ 651 /* Frag threshold */
613 __s32 min_frag;/* Minimal frag threshold */ 652 __s32 min_frag;/* Minimal frag threshold */
614 __s32 max_frag;/* Maximal frag threshold */ 653 __s32 max_frag;/* Maximal frag threshold */
615 654
616 /* Power Management duration & timeout */ 655 /* Power Management duration & timeout */
617 __s32 min_pmp;/* Minimal PM period */ 656 __s32 min_pmp;/* Minimal PM period */
618 __s32 max_pmp;/* Maximal PM period */ 657 __s32 max_pmp;/* Maximal PM period */
619 __s32 min_pmt;/* Minimal PM timeout */ 658 __s32 min_pmt;/* Minimal PM timeout */
620 __s32 max_pmt;/* Maximal PM timeout */ 659 __s32 max_pmt;/* Maximal PM timeout */
621 __u16 pmp_flags;/* How to decode max/min PM period */ 660 __u16 pmp_flags;/* How to decode max/min PM period */
622 __u16 pmt_flags;/* How to decode max/min PM timeout */ 661 __u16 pmt_flags;/* How to decode max/min PM timeout */
623 __u16 pm_capa;/* What PM options are supported */ 662 __u16 pm_capa;/* What PM options are supported */
624 663
625 /* Encoder stuff */ 664 /* Encoder stuff */
626 __u16 encoding_size[IW_MAX_ENCODING_SIZES];/* Different token sizes */ 665 __u16 encoding_size[IW_MAX_ENCODING_SIZES];/* Different token sizes */
627 __u8 num_encoding_sizes;/* Number of entry in the list */ 666 __u8 num_encoding_sizes;/* Number of entry in the list */
628 __u8 max_encoding_tokens;/* Max number of tokens */ 667 __u8 max_encoding_tokens;/* Max number of tokens */
668 /* For drivers that need a "login/passwd" form */
669 __u8 encoding_login_index;/* token index for login token */
629 670
630 /* Transmit power */ 671 /* Transmit power */
631 __u16 txpower_capa;/* What options are supported */ 672 __u16 txpower_capa;/* What options are supported */
632 __u8 num_txpower;/* Number of entries in the list */ 673 __u8 num_txpower;/* Number of entries in the list */
633 __s32 txpower[IW_MAX_TXPOWER];/* list, in bps */ 674 __s32 txpower[IW_MAX_TXPOWER];/* list, in bps */
634 675
635 /* Wireless Extension version info */ 676 /* Wireless Extension version info */
636 __u8 we_version_compiled;/* Must be WIRELESS_EXT */ 677 __u8 we_version_compiled;/* Must be WIRELESS_EXT */
637 __u8 we_version_source;/* Last update of source */ 678 __u8 we_version_source;/* Last update of source */
638 679
639 /* Retry limits and lifetime */ 680 /* Retry limits and lifetime */
640 __u16 retry_capa;/* What retry options are supported */ 681 __u16 retry_capa;/* What retry options are supported */
641 __u16 retry_flags;/* How to decode max/min retry limit */ 682 __u16 retry_flags;/* How to decode max/min retry limit */
642 __u16 r_time_flags;/* How to decode max/min retry life */ 683 __u16 r_time_flags;/* How to decode max/min retry life */
643 __s32 min_retry;/* Minimal number of retries */ 684 __s32 min_retry;/* Minimal number of retries */
644 __s32 max_retry;/* Maximal number of retries */ 685 __s32 max_retry;/* Maximal number of retries */
645 __s32 min_r_time;/* Minimal retry lifetime */ 686 __s32 min_r_time;/* Minimal retry lifetime */
646 __s32 max_r_time;/* Maximal retry lifetime */ 687 __s32 max_r_time;/* Maximal retry lifetime */
647 688
648 /* Average quality of link & SNR */ 689 /* Frequency */
649 struct iw_quality avg_qual;/* Quality of the link */ 690 __u16 num_channels;/* Number of channels [0; num - 1] */
650 /* This should contain the average/typical values of the quality 691 __u8 num_frequency;/* Number of entry in the list */
651 * indicator. This should be the threshold between a "good" and 692 struct iw_freq freq[IW_MAX_FREQUENCIES];/* list */
652 * a "bad" link (example : monitor going from green to orange). 693 /* Note : this frequency list doesn't need to fit channel numbers,
653 * Currently, user space apps like quality monitors don't have any 694 * because each entry contain its channel index */
654 * way to calibrate the measurement. With this, they can split
655 * the range between 0 and max_qual in different quality level
656 * (using a geometric subdivision centered on the average).
657 * I expect that people doing the user space apps will feedback
658 * us on which value we need to put in each driver...
659 */
660}; 695};
661 696
662/* 697/*
663 * Private ioctl interface information 698 * Private ioctl interface information
664 */ 699 */
665 700
666 structiw_priv_args 701 structiw_priv_args
667{ 702{
668 __u32 cmd; /* Number of the ioctl to issue */ 703 __u32 cmd; /* Number of the ioctl to issue */
669 __u16 set_args;/* Type and number of args */ 704 __u16 set_args;/* Type and number of args */
670 __u16 get_args;/* Type and number of args */ 705 __u16 get_args;/* Type and number of args */
671 char name[IFNAMSIZ];/* Name of the extension */ 706 char name[IFNAMSIZ];/* Name of the extension */
672}; 707};
673 708
674/* ----------------------- WIRELESS EVENTS ----------------------- */ 709/* ----------------------- WIRELESS EVENTS ----------------------- */
675/* 710/*
676 * Wireless events are carried through the rtnetlink socket to user 711 * Wireless events are carried through the rtnetlink socket to user
677 * space. They are encapsulated in the IFLA_WIRELESS field of 712 * space. They are encapsulated in the IFLA_WIRELESS field of
678 * a RTM_NEWLINK message. 713 * a RTM_NEWLINK message.
679 */ 714 */
680 715
681/* 716/*
682 * A Wireless Event. Contains basically the same data as the ioctl... 717 * A Wireless Event. Contains basically the same data as the ioctl...
683 */ 718 */
684struct iw_event 719struct iw_event
685{ 720{
686 __u16 len; /* Real lenght of this stuff */ 721 __u16 len; /* Real lenght of this stuff */
687 __u16 cmd; /* Wireless IOCTL */ 722 __u16 cmd; /* Wireless IOCTL */
688 union iwreq_data u; /* IOCTL fixed payload */ 723 union iwreq_data u; /* IOCTL fixed payload */
689}; 724};
690 725
691/* Size of the Event prefix (including padding and alignement junk) */ 726/* Size of the Event prefix (including padding and alignement junk) */
692 #define IW_EV_LCP_LEN(sizeof(struct iw_event) - sizeof(union iwreq_data)) 727 #define IW_EV_LCP_LEN(sizeof(struct iw_event) - sizeof(union iwreq_data))
693/* Size of the various events */ 728/* Size of the various events */
694 #define IW_EV_CHAR_LEN(IW_EV_LCP_LEN + IFNAMSIZ) 729 #define IW_EV_CHAR_LEN(IW_EV_LCP_LEN + IFNAMSIZ)
695 #define IW_EV_UINT_LEN(IW_EV_LCP_LEN + sizeof(__u32)) 730 #define IW_EV_UINT_LEN(IW_EV_LCP_LEN + sizeof(__u32))
696 #define IW_EV_FREQ_LEN(IW_EV_LCP_LEN + sizeof(struct iw_freq)) 731 #define IW_EV_FREQ_LEN(IW_EV_LCP_LEN + sizeof(struct iw_freq))
697 #define IW_EV_POINT_LEN(IW_EV_LCP_LEN + sizeof(struct iw_point)) 732 #define IW_EV_POINT_LEN(IW_EV_LCP_LEN + sizeof(struct iw_point))
698 #define IW_EV_PARAM_LEN(IW_EV_LCP_LEN + sizeof(struct iw_param)) 733 #define IW_EV_PARAM_LEN(IW_EV_LCP_LEN + sizeof(struct iw_param))
699 #define IW_EV_ADDR_LEN(IW_EV_LCP_LEN + sizeof(struct sockaddr)) 734 #define IW_EV_ADDR_LEN(IW_EV_LCP_LEN + sizeof(struct sockaddr))
700 #define IW_EV_QUAL_LEN(IW_EV_LCP_LEN + sizeof(struct iw_quality)) 735 #define IW_EV_QUAL_LEN(IW_EV_LCP_LEN + sizeof(struct iw_quality))
701 736
702/* Note : in the case of iw_point, the extra data will come at the 737/* Note : in the case of iw_point, the extra data will come at the
703 * end of the event */ 738 * end of the event */
704 739
705 #endif/* _LINUX_WIRELESS_H */ 740 #endif/* _LINUX_WIRELESS_H */