-rw-r--r-- | libopie2/opienet/onetwork.cpp | 98 |
1 files changed, 58 insertions, 40 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 50c6679..c329e9a 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp | |||
@@ -675,6 +675,5 @@ OChannelHopper* OWirelessNetworkInterface::channelHopper() const | |||
675 | 675 | ||
676 | void OWirelessNetworkInterface::setMode( const QString& mode ) | 676 | void OWirelessNetworkInterface::commit() const |
677 | { | 677 | { |
678 | _iwr.u.mode = stringToMode( mode ); | 678 | wioctl( SIOCSIWCOMMIT ); |
679 | wioctl( SIOCSIWMODE ); | ||
680 | } | 679 | } |
@@ -682,16 +681,26 @@ void OWirelessNetworkInterface::setMode( const QString& mode ) | |||
682 | 681 | ||
683 | QString OWirelessNetworkInterface::mode() const | 682 | void OWirelessNetworkInterface::setMode( const QString& newMode ) |
684 | { | 683 | { |
685 | if ( !wioctl( SIOCGIWMODE ) ) | 684 | #ifdef FINALIZE |
685 | QString currentMode = mode(); | ||
686 | if ( currentMode == newMode ) return; | ||
687 | #endif | ||
688 | |||
689 | qDebug( "OWirelessNetworkInterface::setMode(): trying to set mode '%s' (%d)", (const char*) newMode, stringToMode( newMode ) ); | ||
690 | |||
691 | _iwr.u.mode = stringToMode( newMode ); | ||
692 | |||
693 | if ( _iwr.u.mode != IW_MODE_MONITOR ) | ||
686 | { | 694 | { |
687 | return "<unknown>"; | 695 | // IWR.U.MODE WIRD DURCH ABFRAGE DES MODE HIER PLATTGEMACHT!!!!!!!!!!!!!!!!!!!!! DEPP! |
688 | } | 696 | _iwr.u.mode = stringToMode( newMode ); |
689 | return modeToString( _iwr.u.mode ); | 697 | wioctl( SIOCSIWMODE ); |
690 | } | ||
691 | 698 | ||
699 | // special iwpriv fallback for monitor mode (check if we're really out of monitor mode now) | ||
692 | 700 | ||
693 | void OWirelessNetworkInterface::setMonitorMode( bool b ) | 701 | if ( mode() == "monitor" ) |
694 | { | 702 | { |
703 | qDebug( "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not sufficient - trying fallback to iwpriv..." ); | ||
695 | if ( _mon ) | 704 | if ( _mon ) |
696 | _mon->setEnabled( b ); | 705 | _mon->setEnabled( false ); |
697 | else | 706 | else |
@@ -700,11 +709,44 @@ void OWirelessNetworkInterface::setMonitorMode( bool b ) | |||
700 | 709 | ||
710 | } | ||
711 | else // special iwpriv fallback for monitor mode | ||
712 | { | ||
713 | if ( wioctl( SIOCSIWMODE ) ) | ||
714 | { | ||
715 | qDebug( "OWirelessNetworkInterface::setMode(): IW_MODE_MONITOR ok" ); | ||
716 | } | ||
717 | else | ||
718 | { | ||
719 | qDebug( "OWirelessNetworkInterface::setMode(): SIOCSIWMODE not working - trying fallback to iwpriv..." ); | ||
720 | |||
721 | if ( _mon ) | ||
722 | _mon->setEnabled( true ); | ||
723 | else | ||
724 | qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); | ||
725 | } | ||
726 | } | ||
727 | } | ||
728 | |||
701 | 729 | ||
702 | bool OWirelessNetworkInterface::monitorMode() const | 730 | QString OWirelessNetworkInterface::mode() const |
703 | { | 731 | { |
704 | qDebug( "dataLinkType = %d", dataLinkType() ); | 732 | memset( &_iwr, 0, sizeof( struct iwreq ) ); |
705 | return ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ); | 733 | |
706 | //FIXME: 802 is the header type for PRISM - Linux support for this is pending... | 734 | if ( !wioctl( SIOCGIWMODE ) ) |
707 | //FIXME: What is 119, by the way? | 735 | { |
736 | return "<unknown>"; | ||
708 | } | 737 | } |
709 | 738 | ||
739 | qDebug( "DEBUG: WE's idea of current mode seems to be '%s'", (const char*) modeToString( _iwr.u.mode ) ); | ||
740 | |||
741 | // legacy compatible monitor mode check | ||
742 | |||
743 | if ( dataLinkType() == ARPHRD_IEEE80211 || dataLinkType() == 802 ) | ||
744 | { | ||
745 | return "monitor"; | ||
746 | } | ||
747 | else | ||
748 | { | ||
749 | return modeToString( _iwr.u.mode ); | ||
750 | } | ||
751 | } | ||
710 | 752 | ||
@@ -971,8 +1013,2 @@ void OMonitoringInterface::setChannel( int c ) | |||
971 | 1013 | ||
972 | bool OMonitoringInterface::enabled() const | ||
973 | { | ||
974 | return _if->monitorMode(); | ||
975 | } | ||
976 | |||
977 | |||
978 | void OMonitoringInterface::setEnabled( bool b ) | 1014 | void OMonitoringInterface::setEnabled( bool b ) |
@@ -1094,11 +1130,2 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) | |||
1094 | { | 1130 | { |
1095 | // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 | ||
1096 | // Wireless Extensions < Version 15 need iwpriv commandos for monitoring | ||
1097 | |||
1098 | #if WIRELESS_EXT > 14 | ||
1099 | if ( b ) | ||
1100 | _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header | ||
1101 | else | ||
1102 | _if->setMode( "managed" ); | ||
1103 | #else | ||
1104 | int monitorCode = _prismHeader ? 1 : 2; | 1131 | int monitorCode = _prismHeader ? 1 : 2; |
@@ -1112,3 +1139,2 @@ void OHostAPMonitoringInterface::setEnabled( bool b ) | |||
1112 | } | 1139 | } |
1113 | #endif | ||
1114 | } | 1140 | } |
@@ -1151,9 +1177,2 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) | |||
1151 | 1177 | ||
1152 | #if 0 | ||
1153 | //#if WIRELESS_EXT > 14 | ||
1154 | if ( b ) | ||
1155 | _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header | ||
1156 | else | ||
1157 | _if->setMode( "managed" ); | ||
1158 | #else | ||
1159 | if ( b ) | 1178 | if ( b ) |
@@ -1166,3 +1185,2 @@ void OOrinocoMonitoringInterface::setEnabled( bool b ) | |||
1166 | } | 1185 | } |
1167 | #endif | ||
1168 | } | 1186 | } |