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 | 23 |
1 files changed, 20 insertions, 3 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 | |||
@@ -377,12 +377,14 @@ void OWirelessNetworkInterface::init() | |||
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 ) ); |
@@ -721,6 +723,8 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) | |||
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 | ||
726 | if ( b ) | ||
727 | { | ||
724 | #if WIRELESS_EXT > 14 | 728 | #if WIRELESS_EXT > 14 |
725 | _if->_iwr.u.mode = IW_MODE_MONITOR; | 729 | _if->_iwr.u.mode = IW_MODE_MONITOR; |
726 | _if->wioctl( SIOCSIWMODE ); | 730 | _if->wioctl( SIOCSIWMODE ); |
@@ -730,6 +734,19 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) | |||
730 | args[1] = 0; | 734 | args[1] = 0; |
731 | _if->wioctl( SIOCDEVPRIVATE ); | 735 | _if->wioctl( SIOCDEVPRIVATE ); |
732 | #endif | 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 | } |