author | mickeyl <mickeyl> | 2003-03-30 14:48:08 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-03-30 14:48:08 (UTC) |
commit | f921599651459b393e6a9846a1ecf7551323f4c2 (patch) (unidiff) | |
tree | 1fe6c881d29597c289a2dbbc30ad020996faac91 | |
parent | 9e3dc048e171af6d88f0cc3f16ad0c9fb6a15ce2 (diff) | |
download | opie-f921599651459b393e6a9846a1ecf7551323f4c2.zip opie-f921599651459b393e6a9846a1ecf7551323f4c2.tar.gz opie-f921599651459b393e6a9846a1ecf7551323f4c2.tar.bz2 |
- implement switching monitor mode on hostap
- work around damn buggy hostap drivers needing more space for SIOCGIWRANGE than defined by sizeof(struct iw_range)...
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 21fa390..cd36f16 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp | |||
@@ -364,38 +364,40 @@ OWirelessNetworkInterface::~OWirelessNetworkInterface() | |||
364 | } | 364 | } |
365 | 365 | ||
366 | 366 | ||
367 | iwreqstruct& OWirelessNetworkInterface::iwr() const | 367 | iwreqstruct& OWirelessNetworkInterface::iwr() const |
368 | { | 368 | { |
369 | return _iwr; | 369 | return _iwr; |
370 | } | 370 | } |
371 | 371 | ||
372 | 372 | ||
373 | void OWirelessNetworkInterface::init() | 373 | void OWirelessNetworkInterface::init() |
374 | { | 374 | { |
375 | qDebug( "OWirelessNetworkInterface::init()" ); | 375 | qDebug( "OWirelessNetworkInterface::init()" ); |
376 | 376 | ||
377 | memset( &_iwr, 0, sizeof( struct iwreq ) ); | 377 | memset( &_iwr, 0, sizeof( struct iwreq ) ); |
378 | 378 | ||
379 | // IEEE802.11(b) radio frequency channels | 379 | // IEEE802.11(b) radio frequency channels |
380 | //FIXME: get these directly from the interface | ||
381 | //FIXME: check if these channels are off-by-one | ||
382 | 380 | ||
383 | iwrangestruct range; | 381 | iwrangestruct range; |
382 | //ML: work around an ugly HostAP bug, which needs | ||
383 | //ML: extra space or will complain with "invalid argument length"... :-( | ||
384 | char __extraBufferForBuggyDrivers[sizeof range]; | ||
384 | _iwr.u.data.pointer = (char*) ⦥ | 385 | _iwr.u.data.pointer = (char*) ⦥ |
385 | _iwr.u.data.length = sizeof( iwrangestruct ); | 386 | _iwr.u.data.length = (sizeof range) * 2; |
387 | _iwr.u.data.flags = 0; | ||
386 | if ( !wioctl( SIOCGIWRANGE ) ) | 388 | if ( !wioctl( SIOCGIWRANGE ) ) |
387 | { | 389 | { |
388 | qDebug( "OWirelessNetworkInterface::init(): SIOCGIWRANGE failed (%s)", strerror( errno ) ); | 390 | qDebug( "OWirelessNetworkInterface::init(): SIOCGIWRANGE failed (%s)", strerror( errno ) ); |
389 | return; | 391 | return; |
390 | } | 392 | } |
391 | 393 | ||
392 | for ( int i = 0; i < range.num_frequency; ++i ) | 394 | for ( int i = 0; i < range.num_frequency; ++i ) |
393 | { | 395 | { |
394 | int freq = (int) ( double( range.freq[i].m ) * pow( 10, range.freq[i].e ) / 1000000.0 ); | 396 | int freq = (int) ( double( range.freq[i].m ) * pow( 10, range.freq[i].e ) / 1000000.0 ); |
395 | _channels.insert( freq, i+1 ); | 397 | _channels.insert( freq, i+1 ); |
396 | } | 398 | } |
397 | } | 399 | } |
398 | 400 | ||
399 | 401 | ||
400 | QString OWirelessNetworkInterface::associatedAP() const | 402 | QString OWirelessNetworkInterface::associatedAP() const |
401 | { | 403 | { |
@@ -708,41 +710,56 @@ void OWlanNGMonitoringInterface::setChannel( int ) | |||
708 | 710 | ||
709 | OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) | 711 | OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) |
710 | :OMonitoringInterface( iface ) | 712 | :OMonitoringInterface( iface ) |
711 | { | 713 | { |
712 | iface->setMonitoring( this ); | 714 | iface->setMonitoring( this ); |
713 | } | 715 | } |
714 | 716 | ||
715 | OHostAPMonitoringInterface::~OHostAPMonitoringInterface() | 717 | OHostAPMonitoringInterface::~OHostAPMonitoringInterface() |
716 | { | 718 | { |
717 | } | 719 | } |
718 | 720 | ||
719 | void OHostAPMonitoringInterface::setEnabled( bool b ) | 721 | void OHostAPMonitoringInterface::setEnabled( bool b ) |
720 | { | 722 | { |
721 | // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 | 723 | // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 |
722 | // Wireless Extensions < Version 15 need iwpriv commandos for monitoring | 724 | // Wireless Extensions < Version 15 need iwpriv commandos for monitoring |
723 | 725 | ||
724 | #if WIRELESS_EXT > 14 | 726 | if ( b ) |
725 | _if->_iwr.u.mode = IW_MODE_MONITOR; | 727 | { |
726 | _if->wioctl( SIOCSIWMODE ); | 728 | #if WIRELESS_EXT > 14 |
727 | #else | 729 | _if->_iwr.u.mode = IW_MODE_MONITOR; |
728 | int* args = (int*) &_if->_iwr.u.name; | 730 | _if->wioctl( SIOCSIWMODE ); |
729 | args[0] = 2; | 731 | #else |
730 | args[1] = 0; | 732 | int* args = (int*) &_if->_iwr.u.name; |
731 | _if->wioctl( SIOCDEVPRIVATE ); | 733 | args[0] = 2; |
732 | #endif | 734 | args[1] = 0; |
735 | _if->wioctl( SIOCDEVPRIVATE ); | ||
736 | #endif | ||
737 | } | ||
738 | else | ||
739 | { | ||
740 | #if WIRELESS_EXT > 14 | ||
741 | _if->_iwr.u.mode = IW_MODE_INFRA; | ||
742 | _if->wioctl( SIOCSIWMODE ); | ||
743 | #else | ||
744 | int* args = (int*) &_if->_iwr.u.name; | ||
745 | args[0] = 0; | ||
746 | args[1] = 0; | ||
747 | _if->wioctl( SIOCDEVPRIVATE ); | ||
748 | #endif | ||
749 | } | ||
733 | 750 | ||
734 | OMonitoringInterface::setEnabled( b ); | 751 | OMonitoringInterface::setEnabled( b ); |
735 | } | 752 | } |
736 | 753 | ||
737 | 754 | ||
738 | QString OHostAPMonitoringInterface::name() const | 755 | QString OHostAPMonitoringInterface::name() const |
739 | { | 756 | { |
740 | return "hostap"; | 757 | return "hostap"; |
741 | } | 758 | } |
742 | 759 | ||
743 | 760 | ||
744 | /*====================================================================================== | 761 | /*====================================================================================== |
745 | * OOrinocoNetworkInterface | 762 | * OOrinocoNetworkInterface |
746 | *======================================================================================*/ | 763 | *======================================================================================*/ |
747 | 764 | ||
748 | OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) | 765 | OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) |