summaryrefslogtreecommitdiff
path: root/libopie2/opienet/onetwork.cpp
Unidiff
Diffstat (limited to 'libopie2/opienet/onetwork.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp98
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
676void OWirelessNetworkInterface::setMode( const QString& mode ) 676void 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
683QString OWirelessNetworkInterface::mode() const 682void 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
693void 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
702bool OWirelessNetworkInterface::monitorMode() const 730QString 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
972bool OMonitoringInterface::enabled() const
973{
974 return _if->monitorMode();
975}
976
977
978void OMonitoringInterface::setEnabled( bool b ) 1014void 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}