summaryrefslogtreecommitdiff
path: root/libopie2
authormickeyl <mickeyl>2003-07-01 22:08:53 (UTC)
committer mickeyl <mickeyl>2003-07-01 22:08:53 (UTC)
commitfbf388246a16c1cd36e209ba24731929b93c21c0 (patch) (unidiff)
treec6fd6bf3f6e341460feec4cca67355ac04f845ac /libopie2
parentd12216b371c89ee1142ade36e7e519041bcb8370 (diff)
downloadopie-fbf388246a16c1cd36e209ba24731929b93c21c0.zip
opie-fbf388246a16c1cd36e209ba24731929b93c21c0.tar.gz
opie-fbf388246a16c1cd36e209ba24731929b93c21c0.tar.bz2
add monitor mode handling for recent kernels (WE>14)
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp28
-rw-r--r--libopie2/opienet/onetwork.h8
2 files changed, 29 insertions, 7 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index 6cef5cf..751d841 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -22,138 +22,145 @@
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34/* OPIE */ 34/* OPIE */
35 35
36#include <opie2/onetwork.h> 36#include <opie2/onetwork.h>
37 37
38/* QT */ 38/* QT */
39 39
40#include <qfile.h> 40#include <qfile.h>
41#include <qtextstream.h> 41#include <qtextstream.h>
42 42
43/* UNIX */ 43/* UNIX */
44 44
45#include <assert.h> 45#include <assert.h>
46#include <arpa/inet.h> 46#include <arpa/inet.h>
47#include <cerrno> 47#include <cerrno>
48#include <cstring> 48#include <cstring>
49#include <cstdlib> 49#include <cstdlib>
50#include <math.h> 50#include <math.h>
51#include <sys/ioctl.h> 51#include <sys/ioctl.h>
52#include <sys/socket.h> 52#include <sys/socket.h>
53#include <sys/types.h> 53#include <sys/types.h>
54#include <unistd.h> 54#include <unistd.h>
55#include <linux/sockios.h> 55#include <linux/sockios.h>
56#include <net/if_arp.h> 56#include <net/if_arp.h>
57#include <stdarg.h> 57#include <stdarg.h>
58 58
59using namespace std; 59using namespace std;
60 60
61/*====================================================================================== 61/*======================================================================================
62 * ONetwork 62 * ONetwork
63 *======================================================================================*/ 63 *======================================================================================*/
64 64
65ONetwork* ONetwork::_instance = 0; 65ONetwork* ONetwork::_instance = 0;
66 66
67ONetwork::ONetwork() 67ONetwork::ONetwork()
68{ 68{
69 qDebug( "ONetwork::ONetwork()" ); 69 qDebug( "ONetwork::ONetwork()" );
70 qDebug( "ONetwork: This code has been compiled against Wireless Extensions V%d", WIRELESS_EXT );
70 synchronize(); 71 synchronize();
71} 72}
72 73
73void ONetwork::synchronize() 74void ONetwork::synchronize()
74{ 75{
75 // gather available interfaces by inspecting /proc/net/dev 76 // gather available interfaces by inspecting /proc/net/dev
76 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices 77 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
77 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices 78 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices
78 79
79 _interfaces.clear(); 80 _interfaces.clear();
80 QString str; 81 QString str;
81 QFile f( "/proc/net/dev" ); 82 QFile f( "/proc/net/dev" );
82 bool hasFile = f.open( IO_ReadOnly ); 83 bool hasFile = f.open( IO_ReadOnly );
83 if ( !hasFile ) 84 if ( !hasFile )
84 { 85 {
85 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" ); 86 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" );
86 return; 87 return;
87 } 88 }
88 QTextStream s( &f ); 89 QTextStream s( &f );
89 s.readLine(); 90 s.readLine();
90 s.readLine(); 91 s.readLine();
91 while ( !s.atEnd() ) 92 while ( !s.atEnd() )
92 { 93 {
93 s >> str; 94 s >> str;
94 str.truncate( str.find( ':' ) ); 95 str.truncate( str.find( ':' ) );
95 qDebug( "ONetwork: found interface '%s'", (const char*) str ); 96 qDebug( "ONetwork: found interface '%s'", (const char*) str );
96 ONetworkInterface* iface; 97 ONetworkInterface* iface;
97 if ( isWirelessInterface( str ) ) 98 if ( isWirelessInterface( str ) )
98 { 99 {
99 iface = new OWirelessNetworkInterface( this, (const char*) str ); 100 iface = new OWirelessNetworkInterface( this, (const char*) str );
100 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); 101 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str );
101 } 102 }
102 else 103 else
103 { 104 {
104 iface = new ONetworkInterface( this, (const char*) str ); 105 iface = new ONetworkInterface( this, (const char*) str );
105 } 106 }
106 _interfaces.insert( str, iface ); 107 _interfaces.insert( str, iface );
107 s.readLine(); 108 s.readLine();
108 } 109 }
109} 110}
110 111
111 112
113short ONetwork::wirelessExtensionVersion()
114{
115 return WIRELESS_EXT;
116}
117
118
112int ONetwork::count() const 119int ONetwork::count() const
113{ 120{
114 return _interfaces.count(); 121 return _interfaces.count();
115} 122}
116 123
117 124
118ONetworkInterface* ONetwork::interface( const QString& iface ) const 125ONetworkInterface* ONetwork::interface( const QString& iface ) const
119{ 126{
120 return _interfaces[iface]; 127 return _interfaces[iface];
121} 128}
122 129
123 130
124ONetwork* ONetwork::instance() 131ONetwork* ONetwork::instance()
125{ 132{
126 if ( !_instance ) _instance = new ONetwork(); 133 if ( !_instance ) _instance = new ONetwork();
127 return _instance; 134 return _instance;
128} 135}
129 136
130 137
131ONetwork::InterfaceIterator ONetwork::iterator() const 138ONetwork::InterfaceIterator ONetwork::iterator() const
132{ 139{
133 return ONetwork::InterfaceIterator( _interfaces ); 140 return ONetwork::InterfaceIterator( _interfaces );
134} 141}
135 142
136 143
137bool ONetwork::isWirelessInterface( const char* name ) const 144bool ONetwork::isWirelessInterface( const char* name ) const
138{ 145{
139 int sfd = socket( AF_INET, SOCK_STREAM, 0 ); 146 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
140 struct iwreq iwr; 147 struct iwreq iwr;
141 memset( &iwr, 0, sizeof( struct iwreq ) ); 148 memset( &iwr, 0, sizeof( struct iwreq ) );
142 strcpy( (char*) &iwr.ifr_name, name ); 149 strcpy( (char*) &iwr.ifr_name, name );
143 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr ); 150 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
144 return result != -1; 151 return result != -1;
145} 152}
146 153
147/*====================================================================================== 154/*======================================================================================
148 * ONetworkInterface 155 * ONetworkInterface
149 *======================================================================================*/ 156 *======================================================================================*/
150 157
151ONetworkInterface::ONetworkInterface( QObject* parent, const char* name ) 158ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
152 :QObject( parent, name ), 159 :QObject( parent, name ),
153 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 160 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
154{ 161{
155 qDebug( "ONetworkInterface::ONetworkInterface()" ); 162 qDebug( "ONetworkInterface::ONetworkInterface()" );
156 init(); 163 init();
157} 164}
158 165
159 166
@@ -904,110 +911,123 @@ OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
904{ 911{
905} 912}
906 913
907 914
908void OWlanNGMonitoringInterface::setEnabled( bool b ) 915void OWlanNGMonitoringInterface::setEnabled( bool b )
909{ 916{
910 //FIXME: do nothing if its already in the same mode 917 //FIXME: do nothing if its already in the same mode
911 918
912 QString enable = b ? "true" : "false"; 919 QString enable = b ? "true" : "false";
913 QString prism = _prismHeader ? "true" : "false"; 920 QString prism = _prismHeader ? "true" : "false";
914 QString cmd; 921 QString cmd;
915 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s", 922 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s prismheader=%s",
916 (const char*) _if->name(), 1, (const char*) enable, (const char*) prism ); 923 (const char*) _if->name(), 1, (const char*) enable, (const char*) prism );
917 system( cmd ); 924 system( cmd );
918} 925}
919 926
920 927
921QString OWlanNGMonitoringInterface::name() const 928QString OWlanNGMonitoringInterface::name() const
922{ 929{
923 return "wlan-ng"; 930 return "wlan-ng";
924} 931}
925 932
926 933
927void OWlanNGMonitoringInterface::setChannel( int ) 934void OWlanNGMonitoringInterface::setChannel( int )
928{ 935{
929 // wlan-ng devices automatically switch channels when in monitor mode 936 // wlan-ng devices automatically switch channels when in monitor mode
930} 937}
931 938
932 939
933/*====================================================================================== 940/*======================================================================================
934 * OHostAPMonitoringInterface 941 * OHostAPMonitoringInterface
935 *======================================================================================*/ 942 *======================================================================================*/
936 943
937OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 944OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
938 :OMonitoringInterface( iface, prismHeader ) 945 :OMonitoringInterface( iface, prismHeader )
939{ 946{
940 iface->setMonitoring( this ); 947 iface->setMonitoring( this );
941} 948}
942 949
943OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 950OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
944{ 951{
945} 952}
946 953
947void OHostAPMonitoringInterface::setEnabled( bool b ) 954void OHostAPMonitoringInterface::setEnabled( bool b )
948{ 955{
949 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 956 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
950 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring 957 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
951 958
952 //TODO: check wireless extensions version on runtime and use 959 #if WIRELESS_EXT > 14
953 //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15 960 if ( b )
954 961 _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header
962 else
963 _if->setMode( "managed" );
964 #else
955 int monitorCode = _prismHeader ? 1 : 2; 965 int monitorCode = _prismHeader ? 1 : 2;
956
957 if ( b ) 966 if ( b )
958 { 967 {
959 _if->setPrivate( "monitor", 1, monitorCode ); 968 _if->setPrivate( "monitor", 1, monitorCode );
960 } 969 }
961 else 970 else
962 { 971 {
963 _if->setPrivate( "monitor", 1, 0 ); 972 _if->setPrivate( "monitor", 1, 0 );
964 } 973 }
974 #endif
965} 975}
966 976
967 977
968QString OHostAPMonitoringInterface::name() const 978QString OHostAPMonitoringInterface::name() const
969{ 979{
970 return "hostap"; 980 return "hostap";
971} 981}
972 982
973 983
974/*====================================================================================== 984/*======================================================================================
975 * OOrinocoNetworkInterface 985 * OOrinocoNetworkInterface
976 *======================================================================================*/ 986 *======================================================================================*/
977 987
978OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 988OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
979 :OMonitoringInterface( iface, prismHeader ) 989 :OMonitoringInterface( iface, prismHeader )
980{ 990{
981 iface->setMonitoring( this ); 991 iface->setMonitoring( this );
982} 992}
983 993
984 994
985OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() 995OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface()
986{ 996{
987} 997}
988 998
989 999
990void OOrinocoMonitoringInterface::setChannel( int c ) 1000void OOrinocoMonitoringInterface::setChannel( int c )
991{ 1001{
992 int monitorCode = _prismHeader ? 1 : 2; 1002 int monitorCode = _prismHeader ? 1 : 2;
993 _if->setPrivate( "monitor", 2, monitorCode, c ); 1003 _if->setPrivate( "monitor", 2, monitorCode, c );
994} 1004}
995 1005
996 1006
997void OOrinocoMonitoringInterface::setEnabled( bool b ) 1007void OOrinocoMonitoringInterface::setEnabled( bool b )
998{ 1008{
1009 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
1010 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
1011
1012 #if WIRELESS_EXT > 14
1013 if ( b )
1014 _if->setMode( "monitor" ); // IW_MODE_MONITOR doesn't support prism header
1015 else
1016 _if->setMode( "managed" );
1017 #else
999 if ( b ) 1018 if ( b )
1000 { 1019 {
1001 setChannel( 1 ); 1020 setChannel( 1 );
1002 } 1021 }
1003 else 1022 else
1004 { 1023 {
1005 _if->setPrivate( "monitor", 2, 0, 0 ); 1024 _if->setPrivate( "monitor", 2, 0, 0 );
1006 } 1025 }
1026 #endif
1007} 1027}
1008 1028
1009 1029
1010QString OOrinocoMonitoringInterface::name() const 1030QString OOrinocoMonitoringInterface::name() const
1011{ 1031{
1012 return "orinoco"; 1032 return "orinoco";
1013} 1033}
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
index cfb999d..2553a61 100644
--- a/libopie2/opienet/onetwork.h
+++ b/libopie2/opienet/onetwork.h
@@ -59,110 +59,112 @@
59#endif 59#endif
60#ifndef IW_MAX_PRIV_DEF 60#ifndef IW_MAX_PRIV_DEF
61#define IW_MAX_PRIV_DEF 128 61#define IW_MAX_PRIV_DEF 128
62#endif 62#endif
63 63
64#define _LINUX_IF_H 64#define _LINUX_IF_H
65#include <linux/wireless.h> 65#include <linux/wireless.h>
66 66
67class ONetworkInterface; 67class ONetworkInterface;
68class OWirelessNetworkInterface; 68class OWirelessNetworkInterface;
69class OChannelHopper; 69class OChannelHopper;
70class OMonitoringInterface; 70class OMonitoringInterface;
71 71
72/*====================================================================================== 72/*======================================================================================
73 * ONetwork 73 * ONetwork
74 *======================================================================================*/ 74 *======================================================================================*/
75 75
76/** 76/**
77 * @brief A container class for all network interfaces 77 * @brief A container class for all network interfaces
78 * 78 *
79 * This class provides access to all available network interfaces of your computer. 79 * This class provides access to all available network interfaces of your computer.
80 * 80 *
81 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 81 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
82 */ 82 */
83class ONetwork : public QObject 83class ONetwork : public QObject
84{ 84{
85 Q_OBJECT 85 Q_OBJECT
86 86
87 public: 87 public:
88 typedef QDict<ONetworkInterface> InterfaceMap; 88 typedef QDict<ONetworkInterface> InterfaceMap;
89 typedef QDictIterator<ONetworkInterface> InterfaceIterator; 89 typedef QDictIterator<ONetworkInterface> InterfaceIterator;
90 90
91 public: 91 public:
92 /** 92 /**
93 * @returns the number of available interfaces 93 * @returns the number of available interfaces
94 */ 94 */
95 int count() const; 95 int count() const;
96 /** 96 /**
97 * @returns a pointer to the (one and only) @ref ONetwork instance. 97 * @returns a pointer to the (one and only) @ref ONetwork instance.
98 */ 98 */
99 static ONetwork* instance(); 99 static ONetwork* instance();
100 /** 100 /**
101 * @returns an iterator usable for iterating through all network interfaces. 101 * @returns an iterator usable for iterating through all network interfaces.
102 */ 102 */
103 InterfaceIterator iterator() const; 103 InterfaceIterator iterator() const;
104 /** 104 /**
105 * @returns true, if the @a interface supports the wireless extension protocol. 105 * @returns true, if the @a interface supports the wireless extension protocol.
106 */ 106 */
107 // FIXME QString? -zecke
108 bool isWirelessInterface( const char* interface ) const; 107 bool isWirelessInterface( const char* interface ) const;
109 /** 108 /**
110 * @returns a pointer to the @ref ONetworkInterface object for the specified @a interface or 0, if not found 109 * @returns a pointer to the @ref ONetworkInterface object for the specified @a interface or 0, if not found.
111 * @see ONetworkInterface 110 * @see ONetworkInterface
112 */ 111 */
113 // FIXME: const QString& is prefered over QString!!! -zecke
114 ONetworkInterface* interface( const QString& interface ) const; 112 ONetworkInterface* interface( const QString& interface ) const;
115 /** 113 /**
116 * @internal Rebuild the internal interface database 114 * @internal Rebuild the internal interface database
117 * @note Sometimes it might be useful to call this from client code, 115 * @note Sometimes it might be useful to call this from client code,
118 * e.g. after issuing a cardctl insert 116 * e.g. after issuing a cardctl insert
119 */ 117 */
120 void synchronize(); 118 void synchronize();
119 /**
120 * @returns the wireless extension version used at compile time.
121 **/
122 static short wirelessExtensionVersion();
121 123
122 protected: 124 protected:
123 ONetwork(); 125 ONetwork();
124 126
125 private: 127 private:
126 static ONetwork* _instance; 128 static ONetwork* _instance;
127 InterfaceMap _interfaces; 129 InterfaceMap _interfaces;
128}; 130};
129 131
130 132
131/*====================================================================================== 133/*======================================================================================
132 * ONetworkInterface 134 * ONetworkInterface
133 *======================================================================================*/ 135 *======================================================================================*/
134 136
135/** 137/**
136 * @brief A network interface wrapper. 138 * @brief A network interface wrapper.
137 * 139 *
138 * This class provides a wrapper for a network interface. All the cumbersume details of 140 * This class provides a wrapper for a network interface. All the cumbersume details of
139 * Linux ioctls are hidden under a convenient high-level interface. 141 * Linux ioctls are hidden under a convenient high-level interface.
140 * @warning Most of the setting methods contained in this class require the appropriate 142 * @warning Most of the setting methods contained in this class require the appropriate
141 * process permissions to work. 143 * process permissions to work.
142 * 144 *
143 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 145 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
144 */ 146 */
145class ONetworkInterface : public QObject 147class ONetworkInterface : public QObject
146{ 148{
147 friend class OMonitoringInterface; 149 friend class OMonitoringInterface;
148 friend class OCiscoMonitoringInterface; 150 friend class OCiscoMonitoringInterface;
149 friend class OWlanNGMonitoringInterface; 151 friend class OWlanNGMonitoringInterface;
150 friend class OHostAPMonitoringInterface; 152 friend class OHostAPMonitoringInterface;
151 friend class OOrinocoMonitoringInterface; 153 friend class OOrinocoMonitoringInterface;
152 154
153 public: 155 public:
154 /** 156 /**
155 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself, 157 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself,
156 * but access them via @ref ONetwork::interface(). 158 * but access them via @ref ONetwork::interface().
157 */ 159 */
158 ONetworkInterface( QObject* parent, const char* name ); 160 ONetworkInterface( QObject* parent, const char* name );
159 /** 161 /**
160 * Destructor. 162 * Destructor.
161 */ 163 */
162 virtual ~ONetworkInterface(); 164 virtual ~ONetworkInterface();
163 /** 165 /**
164 * Associates a @a monitoring interface with this network interface. 166 * Associates a @a monitoring interface with this network interface.
165 * @note This is currently only useful with @ref OWirelessNetworkInterface objects. 167 * @note This is currently only useful with @ref OWirelessNetworkInterface objects.
166 */ 168 */
167 void setMonitoring( OMonitoringInterface* monitoring ); 169 void setMonitoring( OMonitoringInterface* monitoring );
168 /** 170 /**