summaryrefslogtreecommitdiff
path: root/libopie2/opienet
Unidiff
Diffstat (limited to 'libopie2/opienet') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/omanufacturerdb.h1
-rw-r--r--libopie2/opienet/onetutils.h3
-rw-r--r--libopie2/opienet/onetwork.cpp2
-rw-r--r--libopie2/opienet/onetwork.h4
-rw-r--r--libopie2/opienet/opcap.h28
5 files changed, 27 insertions, 11 deletions
diff --git a/libopie2/opienet/omanufacturerdb.h b/libopie2/opienet/omanufacturerdb.h
index 5e66c37..cb0b6c8 100644
--- a/libopie2/opienet/omanufacturerdb.h
+++ b/libopie2/opienet/omanufacturerdb.h
@@ -1,37 +1,38 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. 2** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved.
3** 3**
4** This file is part of Opie Environment. 4** This file is part of Opie Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14**********************************************************************/ 14**********************************************************************/
15 15
16#ifndef OMANUFACTURERDB_H 16#ifndef OMANUFACTURERDB_H
17#define OMANUFACTURERDB_H 17#define OMANUFACTURERDB_H
18 18
19#include <qmap.h> 19#include <qmap.h>
20 20
21class OManufacturerDB 21class OManufacturerDB
22{ 22{
23 public: 23 public:
24 //FIXME make us consistent -zecke I use self(), sandman inst() you use instance() so we need to chose one!
24 static OManufacturerDB* instance(); 25 static OManufacturerDB* instance();
25 const QString& lookup( const QString& macaddr ) const; 26 const QString& lookup( const QString& macaddr ) const;
26 27
27 protected: 28 protected:
28 OManufacturerDB(); 29 OManufacturerDB();
29 virtual ~OManufacturerDB(); 30 virtual ~OManufacturerDB();
30 31
31 private: 32 private:
32 QMap<QString, QString> manufacturers; 33 QMap<QString, QString> manufacturers;
33 static OManufacturerDB* _instance; 34 static OManufacturerDB* _instance;
34}; 35};
35 36
36#endif 37#endif
37 38
diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h
index bedea63..9611518 100644
--- a/libopie2/opienet/onetutils.h
+++ b/libopie2/opienet/onetutils.h
@@ -1,158 +1,161 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3 3
4              (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 4              (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
5 =. 5 =.
6 .=l. 6 .=l.
7           .>+-= 7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can 8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under 9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software 11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License, 12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version. 13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_. 14    .%`+i>       _;_.
15    .i_,=:_.      -<s. This program is distributed in the hope that 15    .i_,=:_.      -<s. This program is distributed in the hope that
16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
17    : ..    .:,     . . . without even the implied warranty of 17    : ..    .:,     . . . without even the implied warranty of
18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.=       =       ; Library General Public License for more 20..}^=.=       =       ; Library General Public License for more
21++=   -.     .`     .: details. 21++=   -.     .`     .: details.
22 :     =  ...= . :.=- 22 :     =  ...= . :.=-
23 -.   .:....=;==+<; You should have received a copy of the GNU 23 -.   .:....=;==+<; You should have received a copy of the GNU
24  -_. . .   )=.  = Library General Public License along with 24  -_. . .   )=.  = Library General Public License along with
25    --        :-=` this library; see the file COPYING.LIB. 25    --        :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation, 26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330, 27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. 28 Boston, MA 02111-1307, USA.
29 29
30*/ 30*/
31 31
32#ifndef ONETUTILS_H 32#ifndef ONETUTILS_H
33#define ONETUTILS_H 33#define ONETUTILS_H
34 34
35#include <qdict.h> 35#include <qdict.h>
36#include <qmap.h> 36#include <qmap.h>
37#include <qstring.h> 37#include <qstring.h>
38#include <qhostaddress.h> 38#include <qhostaddress.h>
39#include <qobject.h> 39#include <qobject.h>
40 40
41#include <sys/types.h> 41#include <sys/types.h>
42 42
43struct ifreq; 43struct ifreq;
44class OWirelessNetworkInterface; 44class OWirelessNetworkInterface;
45 45
46/*====================================================================================== 46/*======================================================================================
47 * OMacAddress 47 * OMacAddress
48 *======================================================================================*/ 48 *======================================================================================*/
49 49
50class OMacAddress 50class OMacAddress
51{ 51{
52 public: 52 public:
53 // QString c'tor? -zecke
53 OMacAddress( unsigned char* ); 54 OMacAddress( unsigned char* );
54 OMacAddress( const unsigned char* ); 55 OMacAddress( const unsigned char* );
55 OMacAddress( struct ifreq& ); 56 OMacAddress( struct ifreq& );
56 ~OMacAddress(); 57 ~OMacAddress();
57 58
58 QString manufacturer() const; 59 QString manufacturer() const;
59 QString toString( bool substitute = false ) const; 60 QString toString( bool substitute = false ) const;
60 const unsigned char* native() const; 61 const unsigned char* native() const;
61 62
63 // no c'tor but this one why not make it a c'tor. it could also replace the others or is this the problem?
62 static OMacAddress fromString( const QString& ); 64 static OMacAddress fromString( const QString& );
63 65
64 public: 66 public:
65 static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff 67 static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff
66 static const OMacAddress& unknown; // 44:44:44:44:44:44 68 static const OMacAddress& unknown; // 44:44:44:44:44:44
67 69
68 private: 70 private:
69 unsigned char _bytes[6]; 71 unsigned char _bytes[6];
70 72
71 friend bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); 73 friend bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
72 74
73}; 75};
74 76
75bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); 77bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
76 78
77 79
78/*====================================================================================== 80/*======================================================================================
79 * OHostAddress 81 * OHostAddress
80 *======================================================================================*/ 82 *======================================================================================*/
81 83
82class OHostAddress : public QHostAddress 84class OHostAddress : public QHostAddress
83{ 85{
84 public: 86 public:
85 OHostAddress(); 87 OHostAddress();
86 ~OHostAddress(); 88 ~OHostAddress();
87}; 89};
88 90
89 91
90/*====================================================================================== 92/*======================================================================================
91 * OPrivateIOCTL 93 * OPrivateIOCTL
92 *======================================================================================*/ 94 *======================================================================================*/
93 95
94class OPrivateIOCTL : public QObject 96class OPrivateIOCTL : public QObject
95{ 97{
96 public: 98 public:
97 OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs ); 99 OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs );
98 ~OPrivateIOCTL(); 100 ~OPrivateIOCTL();
99 101
100 int numberGetArgs() const; 102 int numberGetArgs() const;
101 int typeGetArgs() const; 103 int typeGetArgs() const;
102 int numberSetArgs() const; 104 int numberSetArgs() const;
103 int typeSetArgs() const; 105 int typeSetArgs() const;
104 106
107 // FIXME return int? as ::ioctl does? -zecke
105 void invoke() const; 108 void invoke() const;
106 void setParameter( int, u_int32_t ); 109 void setParameter( int, u_int32_t );
107 110
108 private: 111 private:
109 u_int32_t _ioctl; 112 u_int32_t _ioctl;
110 u_int16_t _getargs; 113 u_int16_t _getargs;
111 u_int16_t _setargs; 114 u_int16_t _setargs;
112 115
113}; 116};
114 117
115 /*====================================================================================== 118 /*======================================================================================
116 * Miscellaneous 119 * Miscellaneous
117 *======================================================================================*/ 120 *======================================================================================*/
118 121
119/* dump bytes */ 122/* dump bytes */
120 123
121void dumpBytes( const unsigned char* data, int num ); 124void dumpBytes( const unsigned char* data, int num );
122 125
123/* Network to host order macros */ 126/* Network to host order macros */
124 127
125#ifdef LBL_ALIGN 128#ifdef LBL_ALIGN
126#define EXTRACT_16BITS(p) \ 129#define EXTRACT_16BITS(p) \
127 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \ 130 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \
128 (u_int16_t)*((const u_int8_t *)(p) + 1))) 131 (u_int16_t)*((const u_int8_t *)(p) + 1)))
129#define EXTRACT_32BITS(p) \ 132#define EXTRACT_32BITS(p) \
130 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \ 133 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \
131 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \ 134 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \
132 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \ 135 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \
133 (u_int32_t)*((const u_int8_t *)(p) + 3))) 136 (u_int32_t)*((const u_int8_t *)(p) + 3)))
134#else 137#else
135#define EXTRACT_16BITS(p) \ 138#define EXTRACT_16BITS(p) \
136 ((u_int16_t)ntohs(*(const u_int16_t *)(p))) 139 ((u_int16_t)ntohs(*(const u_int16_t *)(p)))
137#define EXTRACT_32BITS(p) \ 140#define EXTRACT_32BITS(p) \
138 ((u_int32_t)ntohl(*(const u_int32_t *)(p))) 141 ((u_int32_t)ntohl(*(const u_int32_t *)(p)))
139#endif 142#endif
140 143
141#define EXTRACT_24BITS(p) \ 144#define EXTRACT_24BITS(p) \
142 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \ 145 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \
143 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 146 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
144 (u_int32_t)*((const u_int8_t *)(p) + 2))) 147 (u_int32_t)*((const u_int8_t *)(p) + 2)))
145 148
146/* Little endian protocol host order macros */ 149/* Little endian protocol host order macros */
147#define EXTRACT_LE_8BITS(p) (*(p)) 150#define EXTRACT_LE_8BITS(p) (*(p))
148#define EXTRACT_LE_16BITS(p) \ 151#define EXTRACT_LE_16BITS(p) \
149 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \ 152 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \
150 (u_int16_t)*((const u_int8_t *)(p) + 0))) 153 (u_int16_t)*((const u_int8_t *)(p) + 0)))
151#define EXTRACT_LE_32BITS(p) \ 154#define EXTRACT_LE_32BITS(p) \
152 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \ 155 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \
153 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \ 156 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \
154 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 157 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
155 (u_int32_t)*((const u_int8_t *)(p) + 0))) 158 (u_int32_t)*((const u_int8_t *)(p) + 0)))
156 159
157#endif // ONETUTILS_H 160#endif // ONETUTILS_H
158 161
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index 73b543b..f0094c7 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -1,917 +1,917 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
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 <arpa/inet.h> 45#include <arpa/inet.h>
46#include <cerrno> 46#include <cerrno>
47#include <cstring> 47#include <cstring>
48#include <cstdlib> 48#include <cstdlib>
49#include <math.h> 49#include <math.h>
50#include <sys/ioctl.h> 50#include <sys/ioctl.h>
51#include <sys/socket.h> 51#include <sys/socket.h>
52#include <sys/types.h> 52#include <sys/types.h>
53#include <unistd.h> 53#include <unistd.h>
54#include <linux/sockios.h> 54#include <linux/sockios.h>
55#include <net/if_arp.h> 55#include <net/if_arp.h>
56#include <stdarg.h> 56#include <stdarg.h>
57 57
58using namespace std; 58using namespace std;
59 59
60/*====================================================================================== 60/*======================================================================================
61 * ONetwork 61 * ONetwork
62 *======================================================================================*/ 62 *======================================================================================*/
63 63
64ONetwork* ONetwork::_instance = 0; 64ONetwork* ONetwork::_instance = 0;
65 65
66ONetwork::ONetwork() 66ONetwork::ONetwork()
67{ 67{
68 qDebug( "ONetwork::ONetwork()" ); 68 qDebug( "ONetwork::ONetwork()" );
69 synchronize(); 69 synchronize();
70} 70}
71 71
72void ONetwork::synchronize() 72void ONetwork::synchronize()
73{ 73{
74 // gather available interfaces by inspecting /proc/net/dev 74 // gather available interfaces by inspecting /proc/net/dev
75 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices 75 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
76 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices 76 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices
77 77
78 _interfaces.clear(); 78 _interfaces.clear();
79 QString str; 79 QString str;
80 QFile f( "/proc/net/dev" ); 80 QFile f( "/proc/net/dev" );
81 bool hasFile = f.open( IO_ReadOnly ); 81 bool hasFile = f.open( IO_ReadOnly );
82 if ( !hasFile ) 82 if ( !hasFile )
83 { 83 {
84 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" ); 84 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" );
85 return; 85 return;
86 } 86 }
87 QTextStream s( &f ); 87 QTextStream s( &f );
88 s.readLine(); 88 s.readLine();
89 s.readLine(); 89 s.readLine();
90 while ( !s.atEnd() ) 90 while ( !s.atEnd() )
91 { 91 {
92 s >> str; 92 s >> str;
93 str.truncate( str.find( ':' ) ); 93 str.truncate( str.find( ':' ) );
94 qDebug( "ONetwork: found interface '%s'", (const char*) str ); 94 qDebug( "ONetwork: found interface '%s'", (const char*) str );
95 ONetworkInterface* iface; 95 ONetworkInterface* iface;
96 if ( isWirelessInterface( str ) ) 96 if ( isWirelessInterface( str ) )
97 { 97 {
98 iface = new OWirelessNetworkInterface( this, (const char*) str ); 98 iface = new OWirelessNetworkInterface( this, (const char*) str );
99 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); 99 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str );
100 } 100 }
101 else 101 else
102 { 102 {
103 iface = new ONetworkInterface( this, (const char*) str ); 103 iface = new ONetworkInterface( this, (const char*) str );
104 } 104 }
105 _interfaces.insert( str, iface ); 105 _interfaces.insert( str, iface );
106 s.readLine(); 106 s.readLine();
107 } 107 }
108} 108}
109 109
110 110
111ONetworkInterface* ONetwork::interface( QString iface ) const 111ONetworkInterface* ONetwork::interface( const QString& iface ) const
112{ 112{
113 return _interfaces[iface]; 113 return _interfaces[iface];
114} 114}
115 115
116 116
117ONetwork* ONetwork::instance() 117ONetwork* ONetwork::instance()
118{ 118{
119 if ( !_instance ) _instance = new ONetwork(); 119 if ( !_instance ) _instance = new ONetwork();
120 return _instance; 120 return _instance;
121} 121}
122 122
123 123
124ONetwork::InterfaceIterator ONetwork::iterator() const 124ONetwork::InterfaceIterator ONetwork::iterator() const
125{ 125{
126 return ONetwork::InterfaceIterator( _interfaces ); 126 return ONetwork::InterfaceIterator( _interfaces );
127} 127}
128 128
129 129
130bool ONetwork::isWirelessInterface( const char* name ) const 130bool ONetwork::isWirelessInterface( const char* name ) const
131{ 131{
132 int sfd = socket( AF_INET, SOCK_STREAM, 0 ); 132 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
133 struct iwreq iwr; 133 struct iwreq iwr;
134 memset( &iwr, 0, sizeof( struct iwreq ) ); 134 memset( &iwr, 0, sizeof( struct iwreq ) );
135 strcpy( (char*) &iwr.ifr_name, name ); 135 strcpy( (char*) &iwr.ifr_name, name );
136 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr ); 136 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
137 return result != -1; 137 return result != -1;
138} 138}
139 139
140/*====================================================================================== 140/*======================================================================================
141 * ONetworkInterface 141 * ONetworkInterface
142 *======================================================================================*/ 142 *======================================================================================*/
143 143
144ONetworkInterface::ONetworkInterface( QObject* parent, const char* name ) 144ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
145 :QObject( parent, name ), 145 :QObject( parent, name ),
146 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 146 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
147{ 147{
148 qDebug( "ONetworkInterface::ONetworkInterface()" ); 148 qDebug( "ONetworkInterface::ONetworkInterface()" );
149 init(); 149 init();
150} 150}
151 151
152 152
153struct ifreq& ONetworkInterface::ifr() const 153struct ifreq& ONetworkInterface::ifr() const
154{ 154{
155 return _ifr; 155 return _ifr;
156} 156}
157 157
158 158
159void ONetworkInterface::init() 159void ONetworkInterface::init()
160{ 160{
161 qDebug( "ONetworkInterface::init()" ); 161 qDebug( "ONetworkInterface::init()" );
162 162
163 memset( &_ifr, 0, sizeof( struct ifreq ) ); 163 memset( &_ifr, 0, sizeof( struct ifreq ) );
164 164
165 if ( _sfd == -1 ) 165 if ( _sfd == -1 )
166 { 166 {
167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", name() ); 167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", name() );
168 return; 168 return;
169 } 169 }
170} 170}
171 171
172 172
173bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const 173bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const
174{ 174{
175 int result = ::ioctl( _sfd, call, &ifreq ); 175 int result = ::ioctl( _sfd, call, &ifreq );
176 if ( result == -1 ) 176 if ( result == -1 )
177 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) ); 177 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) );
178 else 178 else
179 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Ok.", name(), call ); 179 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Ok.", name(), call );
180 return ( result != -1 ); 180 return ( result != -1 );
181} 181}
182 182
183 183
184bool ONetworkInterface::ioctl( int call ) const 184bool ONetworkInterface::ioctl( int call ) const
185{ 185{
186 strcpy( _ifr.ifr_name, name() ); 186 strcpy( _ifr.ifr_name, name() );
187 return ioctl( call, _ifr ); 187 return ioctl( call, _ifr );
188} 188}
189 189
190 190
191bool ONetworkInterface::isLoopback() const 191bool ONetworkInterface::isLoopback() const
192{ 192{
193 ioctl( SIOCGIFFLAGS ); 193 ioctl( SIOCGIFFLAGS );
194 return _ifr.ifr_flags & IFF_LOOPBACK; 194 return _ifr.ifr_flags & IFF_LOOPBACK;
195} 195}
196 196
197 197
198bool ONetworkInterface::setUp( bool b ) 198bool ONetworkInterface::setUp( bool b )
199{ 199{
200 ioctl( SIOCGIFFLAGS ); 200 ioctl( SIOCGIFFLAGS );
201 if ( b ) _ifr.ifr_flags |= IFF_UP; 201 if ( b ) _ifr.ifr_flags |= IFF_UP;
202 else _ifr.ifr_flags &= (~IFF_UP); 202 else _ifr.ifr_flags &= (~IFF_UP);
203 return ioctl( SIOCSIFFLAGS ); 203 return ioctl( SIOCSIFFLAGS );
204} 204}
205 205
206 206
207bool ONetworkInterface::isUp() const 207bool ONetworkInterface::isUp() const
208{ 208{
209 ioctl( SIOCGIFFLAGS ); 209 ioctl( SIOCGIFFLAGS );
210 return _ifr.ifr_flags & IFF_UP; 210 return _ifr.ifr_flags & IFF_UP;
211} 211}
212 212
213 213
214QString ONetworkInterface::ipV4Address() const 214QString ONetworkInterface::ipV4Address() const
215{ 215{
216 if ( ioctl( SIOCGIFADDR ) ) 216 if ( ioctl( SIOCGIFADDR ) )
217 { 217 {
218 struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; 218 struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr;
219 //FIXME: Use QHostAddress here 219 //FIXME: Use QHostAddress here
220 return QString( inet_ntoa( sa->sin_addr ) ); 220 return QString( inet_ntoa( sa->sin_addr ) );
221 } 221 }
222 else 222 else
223 return "<unknown>"; 223 return "<unknown>";
224} 224}
225 225
226 226
227void ONetworkInterface::setMacAddress( const OMacAddress& addr ) 227void ONetworkInterface::setMacAddress( const OMacAddress& addr )
228{ 228{
229 _ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; 229 _ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
230 memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 ); 230 memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 );
231 ioctl( SIOCSIFHWADDR ); 231 ioctl( SIOCSIFHWADDR );
232} 232}
233 233
234 234
235OMacAddress ONetworkInterface::macAddress() const 235OMacAddress ONetworkInterface::macAddress() const
236{ 236{
237 if ( ioctl( SIOCGIFHWADDR ) ) 237 if ( ioctl( SIOCGIFHWADDR ) )
238 { 238 {
239 return OMacAddress( _ifr ); 239 return OMacAddress( _ifr );
240 } 240 }
241 else 241 else
242 { 242 {
243 return OMacAddress::unknown; 243 return OMacAddress::unknown;
244 } 244 }
245} 245}
246 246
247 247
248int ONetworkInterface::dataLinkType() const 248int ONetworkInterface::dataLinkType() const
249{ 249{
250 if ( ioctl( SIOCGIFHWADDR ) ) 250 if ( ioctl( SIOCGIFHWADDR ) )
251 { 251 {
252 return _ifr.ifr_hwaddr.sa_family; 252 return _ifr.ifr_hwaddr.sa_family;
253 } 253 }
254 else 254 else
255 { 255 {
256 return -1; 256 return -1;
257 } 257 }
258} 258}
259 259
260 260
261void ONetworkInterface::setMonitoring( OMonitoringInterface* m ) 261void ONetworkInterface::setMonitoring( OMonitoringInterface* m )
262{ 262{
263 _mon = m; 263 _mon = m;
264 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), name() ); 264 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), name() );
265} 265}
266 266
267 267
268OMonitoringInterface* ONetworkInterface::monitoring() const 268OMonitoringInterface* ONetworkInterface::monitoring() const
269{ 269{
270 return _mon; 270 return _mon;
271} 271}
272 272
273 273
274ONetworkInterface::~ONetworkInterface() 274ONetworkInterface::~ONetworkInterface()
275{ 275{
276 qDebug( "ONetworkInterface::~ONetworkInterface()" ); 276 qDebug( "ONetworkInterface::~ONetworkInterface()" );
277 if ( _sfd != -1 ) ::close( _sfd ); 277 if ( _sfd != -1 ) ::close( _sfd );
278} 278}
279 279
280 280
281bool ONetworkInterface::setPromiscuousMode( bool b ) 281bool ONetworkInterface::setPromiscuousMode( bool b )
282{ 282{
283 ioctl( SIOCGIFFLAGS ); 283 ioctl( SIOCGIFFLAGS );
284 if ( b ) _ifr.ifr_flags |= IFF_PROMISC; 284 if ( b ) _ifr.ifr_flags |= IFF_PROMISC;
285 else _ifr.ifr_flags &= (~IFF_PROMISC); 285 else _ifr.ifr_flags &= (~IFF_PROMISC);
286 return ioctl( SIOCSIFFLAGS ); 286 return ioctl( SIOCSIFFLAGS );
287} 287}
288 288
289 289
290bool ONetworkInterface::promiscuousMode() const 290bool ONetworkInterface::promiscuousMode() const
291{ 291{
292 ioctl( SIOCGIFFLAGS ); 292 ioctl( SIOCGIFFLAGS );
293 return _ifr.ifr_flags & IFF_PROMISC; 293 return _ifr.ifr_flags & IFF_PROMISC;
294} 294}
295 295
296 296
297bool ONetworkInterface::isWireless() const 297bool ONetworkInterface::isWireless() const
298{ 298{
299 return ioctl( SIOCGIWNAME ); 299 return ioctl( SIOCGIWNAME );
300} 300}
301 301
302 302
303/*====================================================================================== 303/*======================================================================================
304 * OChannelHopper 304 * OChannelHopper
305 *======================================================================================*/ 305 *======================================================================================*/
306 306
307OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface ) 307OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface )
308 :QObject( 0, "Mickey's funky hopper" ), 308 :QObject( 0, "Mickey's funky hopper" ),
309 _iface( iface ), _interval( 0 ), _tid( 0 ) 309 _iface( iface ), _interval( 0 ), _tid( 0 )
310{ 310{
311 int _maxChannel = iface->channels()+1; 311 int _maxChannel = iface->channels()+1;
312 // generate fancy hopping sequence honoring the device capabilities 312 // generate fancy hopping sequence honoring the device capabilities
313 if ( _maxChannel >= 1 ) _channels.append( 1 ); 313 if ( _maxChannel >= 1 ) _channels.append( 1 );
314 if ( _maxChannel >= 7 ) _channels.append( 7 ); 314 if ( _maxChannel >= 7 ) _channels.append( 7 );
315 if ( _maxChannel >= 13 ) _channels.append( 13 ); 315 if ( _maxChannel >= 13 ) _channels.append( 13 );
316 if ( _maxChannel >= 2 ) _channels.append( 2 ); 316 if ( _maxChannel >= 2 ) _channels.append( 2 );
317 if ( _maxChannel >= 8 ) _channels.append( 8 ); 317 if ( _maxChannel >= 8 ) _channels.append( 8 );
318 if ( _maxChannel >= 3 ) _channels.append( 3 ); 318 if ( _maxChannel >= 3 ) _channels.append( 3 );
319 if ( _maxChannel >= 14 ) _channels.append( 14 ); 319 if ( _maxChannel >= 14 ) _channels.append( 14 );
320 if ( _maxChannel >= 9 ) _channels.append( 9 ); 320 if ( _maxChannel >= 9 ) _channels.append( 9 );
321 if ( _maxChannel >= 4 ) _channels.append( 4 ); 321 if ( _maxChannel >= 4 ) _channels.append( 4 );
322 if ( _maxChannel >= 10 ) _channels.append( 10 ); 322 if ( _maxChannel >= 10 ) _channels.append( 10 );
323 if ( _maxChannel >= 5 ) _channels.append( 5 ); 323 if ( _maxChannel >= 5 ) _channels.append( 5 );
324 if ( _maxChannel >= 11 ) _channels.append( 11 ); 324 if ( _maxChannel >= 11 ) _channels.append( 11 );
325 if ( _maxChannel >= 6 ) _channels.append( 6 ); 325 if ( _maxChannel >= 6 ) _channels.append( 6 );
326 if ( _maxChannel >= 12 ) _channels.append( 12 ); 326 if ( _maxChannel >= 12 ) _channels.append( 12 );
327 _channel = _channels.begin(); 327 _channel = _channels.begin();
328 328
329} 329}
330 330
331 331
332OChannelHopper::~OChannelHopper() 332OChannelHopper::~OChannelHopper()
333{ 333{
334} 334}
335 335
336 336
337bool OChannelHopper::isActive() const 337bool OChannelHopper::isActive() const
338{ 338{
339 return _tid; 339 return _tid;
340} 340}
341 341
342 342
343int OChannelHopper::channel() const 343int OChannelHopper::channel() const
344{ 344{
345 return *_channel; 345 return *_channel;
346} 346}
347 347
348 348
349void OChannelHopper::timerEvent( QTimerEvent* ) 349void OChannelHopper::timerEvent( QTimerEvent* )
350{ 350{
351 _iface->setChannel( *_channel ); 351 _iface->setChannel( *_channel );
352 emit( hopped( *_channel ) ); 352 emit( hopped( *_channel ) );
353 qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'", 353 qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'",
354 *_channel, (const char*) _iface->name() ); 354 *_channel, (const char*) _iface->name() );
355 if ( ++_channel == _channels.end() ) _channel = _channels.begin(); 355 if ( ++_channel == _channels.end() ) _channel = _channels.begin();
356} 356}
357 357
358 358
359void OChannelHopper::setInterval( int interval ) 359void OChannelHopper::setInterval( int interval )
360{ 360{
361 if ( interval == _interval ) 361 if ( interval == _interval )
362 return; 362 return;
363 363
364 if ( _interval ) 364 if ( _interval )
365 killTimer( _tid ); 365 killTimer( _tid );
366 366
367 _tid = 0; 367 _tid = 0;
368 _interval = interval; 368 _interval = interval;
369 369
370 if ( _interval ) 370 if ( _interval )
371 { 371 {
372 _tid = startTimer( interval ); 372 _tid = startTimer( interval );
373 } 373 }
374} 374}
375 375
376 376
377int OChannelHopper::interval() const 377int OChannelHopper::interval() const
378{ 378{
379 return _interval; 379 return _interval;
380} 380}
381 381
382 382
383/*====================================================================================== 383/*======================================================================================
384 * OWirelessNetworkInterface 384 * OWirelessNetworkInterface
385 *======================================================================================*/ 385 *======================================================================================*/
386 386
387OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name ) 387OWirelessNetworkInterface::OWirelessNetworkInterface( QObject* parent, const char* name )
388 :ONetworkInterface( parent, name ), _hopper( 0 ) 388 :ONetworkInterface( parent, name ), _hopper( 0 )
389{ 389{
390 qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" ); 390 qDebug( "OWirelessNetworkInterface::OWirelessNetworkInterface()" );
391 init(); 391 init();
392} 392}
393 393
394 394
395OWirelessNetworkInterface::~OWirelessNetworkInterface() 395OWirelessNetworkInterface::~OWirelessNetworkInterface()
396{ 396{
397} 397}
398 398
399 399
400struct iwreq& OWirelessNetworkInterface::iwr() const 400struct iwreq& OWirelessNetworkInterface::iwr() const
401{ 401{
402 return _iwr; 402 return _iwr;
403} 403}
404 404
405 405
406void OWirelessNetworkInterface::init() 406void OWirelessNetworkInterface::init()
407{ 407{
408 qDebug( "OWirelessNetworkInterface::init()" ); 408 qDebug( "OWirelessNetworkInterface::init()" );
409 memset( &_iwr, 0, sizeof( struct iwreq ) ); 409 memset( &_iwr, 0, sizeof( struct iwreq ) );
410 buildChannelList(); 410 buildChannelList();
411 buildPrivateList(); 411 buildPrivateList();
412} 412}
413 413
414 414
415QString OWirelessNetworkInterface::associatedAP() const 415QString OWirelessNetworkInterface::associatedAP() const
416{ 416{
417 //FIXME: use OMacAddress 417 //FIXME: use OMacAddress
418 QString mac; 418 QString mac;
419 419
420 if ( ioctl( SIOCGIWAP ) ) 420 if ( ioctl( SIOCGIWAP ) )
421 { 421 {
422 mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", 422 mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
423 _ifr.ifr_hwaddr.sa_data[0]&0xff, 423 _ifr.ifr_hwaddr.sa_data[0]&0xff,
424 _ifr.ifr_hwaddr.sa_data[1]&0xff, 424 _ifr.ifr_hwaddr.sa_data[1]&0xff,
425 _ifr.ifr_hwaddr.sa_data[2]&0xff, 425 _ifr.ifr_hwaddr.sa_data[2]&0xff,
426 _ifr.ifr_hwaddr.sa_data[3]&0xff, 426 _ifr.ifr_hwaddr.sa_data[3]&0xff,
427 _ifr.ifr_hwaddr.sa_data[4]&0xff, 427 _ifr.ifr_hwaddr.sa_data[4]&0xff,
428 _ifr.ifr_hwaddr.sa_data[5]&0xff ); 428 _ifr.ifr_hwaddr.sa_data[5]&0xff );
429 } 429 }
430 else 430 else
431 { 431 {
432 mac = "<Unknown>"; 432 mac = "<Unknown>";
433 } 433 }
434 return mac; 434 return mac;
435} 435}
436 436
437 437
438void OWirelessNetworkInterface::buildChannelList() 438void OWirelessNetworkInterface::buildChannelList()
439{ 439{
440 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck 440 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
441 //ML: The HostAP drivers need more than sizeof struct_iw range to complete 441 //ML: The HostAP drivers need more than sizeof struct_iw range to complete
442 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length". 442 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
443 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate 443 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
444 //ML: _too much_ space. This is damn shitty crap *sigh* 444 //ML: _too much_ space. This is damn shitty crap *sigh*
445 //ML: We allocate a large memory region in RAM and check whether the 445 //ML: We allocate a large memory region in RAM and check whether the
446 //ML: driver pollutes this extra space. The complaint will be made on stdout, 446 //ML: driver pollutes this extra space. The complaint will be made on stdout,
447 //ML: so please forward this... 447 //ML: so please forward this...
448 448
449 struct iwreq wrq; 449 struct iwreq wrq;
450 int len = sizeof( struct iw_range )*2; 450 int len = sizeof( struct iw_range )*2;
451 char *buffer = (char*) malloc( len ); 451 char *buffer = (char*) malloc( len );
452 //FIXME: Validate if we actually got the memory block 452 //FIXME: Validate if we actually got the memory block
453 memset( buffer, 0, len ); 453 memset( buffer, 0, len );
454 memcpy( wrq.ifr_name, name(), IFNAMSIZ); 454 memcpy( wrq.ifr_name, name(), IFNAMSIZ);
455 wrq.u.data.pointer = (caddr_t) buffer; 455 wrq.u.data.pointer = (caddr_t) buffer;
456 wrq.u.data.length = sizeof( struct iw_range ); 456 wrq.u.data.length = sizeof( struct iw_range );
457 wrq.u.data.flags = 0; 457 wrq.u.data.flags = 0;
458 458
459 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) 459 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 )
460 { 460 {
461 qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) ); 461 qDebug( "OWirelessNetworkInterface::buildChannelList(): SIOCGIWRANGE failed (%s) - defaulting to 11 channels", strerror( errno ) );
462 _channels.insert( 2412, 1 ); // 2.412 GHz 462 _channels.insert( 2412, 1 ); // 2.412 GHz
463 _channels.insert( 2417, 2 ); // 2.417 GHz 463 _channels.insert( 2417, 2 ); // 2.417 GHz
464 _channels.insert( 2422, 3 ); // 2.422 GHz 464 _channels.insert( 2422, 3 ); // 2.422 GHz
465 _channels.insert( 2427, 4 ); // 2.427 GHz 465 _channels.insert( 2427, 4 ); // 2.427 GHz
466 _channels.insert( 2432, 5 ); // 2.432 GHz 466 _channels.insert( 2432, 5 ); // 2.432 GHz
467 _channels.insert( 2437, 6 ); // 2.437 GHz 467 _channels.insert( 2437, 6 ); // 2.437 GHz
468 _channels.insert( 2442, 7 ); // 2.442 GHz 468 _channels.insert( 2442, 7 ); // 2.442 GHz
469 _channels.insert( 2447, 8 ); // 2.447 GHz 469 _channels.insert( 2447, 8 ); // 2.447 GHz
470 _channels.insert( 2452, 9 ); // 2.452 GHz 470 _channels.insert( 2452, 9 ); // 2.452 GHz
471 _channels.insert( 2457, 10 ); // 2.457 GHz 471 _channels.insert( 2457, 10 ); // 2.457 GHz
472 _channels.insert( 2462, 11 ); // 2.462 GHz 472 _channels.insert( 2462, 11 ); // 2.462 GHz
473 } 473 }
474 else 474 else
475 { 475 {
476 // <check if the driver overwrites stuff> 476 // <check if the driver overwrites stuff>
477 int max = 0; 477 int max = 0;
478 for ( int r = sizeof( struct iw_range ); r < len; r++ ) 478 for ( int r = sizeof( struct iw_range ); r < len; r++ )
479 if (buffer[r] != 0) 479 if (buffer[r] != 0)
480 max = r; 480 max = r;
481 if (max > 0) 481 if (max > 0)
482 { 482 {
483 qWarning( "OWirelessNetworkInterface::buildChannelList(): Driver for wireless interface '%s'" 483 qWarning( "OWirelessNetworkInterface::buildChannelList(): Driver for wireless interface '%s'"
484 "overwrote buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) ); 484 "overwrote buffer end with at least %i bytes!\n", name(), max - sizeof( struct iw_range ) );
485 } 485 }
486 // </check if the driver overwrites stuff> 486 // </check if the driver overwrites stuff>
487 487
488 struct iw_range range; 488 struct iw_range range;
489 memcpy( &range, buffer, sizeof range ); 489 memcpy( &range, buffer, sizeof range );
490 490
491 qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency ); 491 qDebug( "OWirelessNetworkInterface::buildChannelList(): Interface %s reported to have %d channels.", name(), range.num_frequency );
492 for ( int i = 0; i < range.num_frequency; ++i ) 492 for ( int i = 0; i < range.num_frequency; ++i )
493 { 493 {
494 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 ); 494 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
495 _channels.insert( freq, i+1 ); 495 _channels.insert( freq, i+1 );
496 } 496 }
497 } 497 }
498 498
499 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." ); 499 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." );
500 free(buffer); 500 free(buffer);
501} 501}
502 502
503 503
504void OWirelessNetworkInterface::buildPrivateList() 504void OWirelessNetworkInterface::buildPrivateList()
505{ 505{
506 qDebug( "OWirelessNetworkInterface::buildPrivateList()" ); 506 qDebug( "OWirelessNetworkInterface::buildPrivateList()" );
507 507
508 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 508 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
509 509
510 _iwr.u.data.pointer = (char*) &priv; 510 _iwr.u.data.pointer = (char*) &priv;
511 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 511 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
512 _iwr.u.data.flags = 0; 512 _iwr.u.data.flags = 0;
513 513
514 if ( !wioctl( SIOCGIWPRIV ) ) 514 if ( !wioctl( SIOCGIWPRIV ) )
515 { 515 {
516 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) ); 516 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) );
517 return; 517 return;
518 } 518 }
519 519
520 for ( int i = 0; i < _iwr.u.data.length; ++i ) 520 for ( int i = 0; i < _iwr.u.data.length; ++i )
521 { 521 {
522 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 522 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
523 } 523 }
524 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." ); 524 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." );
525} 525}
526 526
527 527
528int OWirelessNetworkInterface::channel() const 528int OWirelessNetworkInterface::channel() const
529{ 529{
530 //FIXME: When monitoring enabled, then use it 530 //FIXME: When monitoring enabled, then use it
531 //FIXME: to gather the current RF channel 531 //FIXME: to gather the current RF channel
532 //FIXME: Until then, get active channel from hopper. 532 //FIXME: Until then, get active channel from hopper.
533 if ( _hopper && _hopper->isActive() ) 533 if ( _hopper && _hopper->isActive() )
534 return _hopper->channel(); 534 return _hopper->channel();
535 535
536 if ( !wioctl( SIOCGIWFREQ ) ) 536 if ( !wioctl( SIOCGIWFREQ ) )
537 { 537 {
538 return -1; 538 return -1;
539 } 539 }
540 else 540 else
541 { 541 {
542 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ]; 542 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ];
543 } 543 }
544} 544}
545 545
546 546
547void OWirelessNetworkInterface::setChannel( int c ) const 547void OWirelessNetworkInterface::setChannel( int c ) const
548{ 548{
549 if ( !_mon ) 549 if ( !_mon )
550 { 550 {
551 memset( &_iwr, 0, sizeof( struct iwreq ) ); 551 memset( &_iwr, 0, sizeof( struct iwreq ) );
552 _iwr.u.freq.m = c; 552 _iwr.u.freq.m = c;
553 _iwr.u.freq.e = 0; 553 _iwr.u.freq.e = 0;
554 wioctl( SIOCSIWFREQ ); 554 wioctl( SIOCSIWFREQ );
555 } 555 }
556 else 556 else
557 { 557 {
558 _mon->setChannel( c ); 558 _mon->setChannel( c );
559 } 559 }
560} 560}
561 561
562 562
563double OWirelessNetworkInterface::frequency() const 563double OWirelessNetworkInterface::frequency() const
564{ 564{
565 if ( !wioctl( SIOCGIWFREQ ) ) 565 if ( !wioctl( SIOCGIWFREQ ) )
566 { 566 {
567 return -1.0; 567 return -1.0;
568 } 568 }
569 else 569 else
570 { 570 {
571 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0; 571 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0;
572 } 572 }
573} 573}
574 574
575 575
576int OWirelessNetworkInterface::channels() const 576int OWirelessNetworkInterface::channels() const
577{ 577{
578 return _channels.count(); 578 return _channels.count();
579} 579}
580 580
581 581
582void OWirelessNetworkInterface::setChannelHopping( int interval ) 582void OWirelessNetworkInterface::setChannelHopping( int interval )
583{ 583{
584 if ( !_hopper ) _hopper = new OChannelHopper( this ); 584 if ( !_hopper ) _hopper = new OChannelHopper( this );
585 _hopper->setInterval( interval ); 585 _hopper->setInterval( interval );
586 //FIXME: When and by whom will the channel hopper be deleted? 586 //FIXME: When and by whom will the channel hopper be deleted?
587 //TODO: rely on QObject hierarchy 587 //TODO: rely on QObject hierarchy
588} 588}
589 589
590 590
591int OWirelessNetworkInterface::channelHopping() const 591int OWirelessNetworkInterface::channelHopping() const
592{ 592{
593 return _hopper->interval(); 593 return _hopper->interval();
594} 594}
595 595
596 596
597OChannelHopper* OWirelessNetworkInterface::channelHopper() const 597OChannelHopper* OWirelessNetworkInterface::channelHopper() const
598{ 598{
599 return _hopper; 599 return _hopper;
600} 600}
601 601
602 602
603void OWirelessNetworkInterface::setMonitorMode( bool b ) 603void OWirelessNetworkInterface::setMonitorMode( bool b )
604{ 604{
605 if ( _mon ) 605 if ( _mon )
606 _mon->setEnabled( b ); 606 _mon->setEnabled( b );
607 else 607 else
608 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); 608 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" );
609} 609}
610 610
611 611
612bool OWirelessNetworkInterface::monitorMode() const 612bool OWirelessNetworkInterface::monitorMode() const
613{ 613{
614 qDebug( "dataLinkType = %d", dataLinkType() ); 614 qDebug( "dataLinkType = %d", dataLinkType() );
615 return dataLinkType() == ARPHRD_IEEE80211; 615 return dataLinkType() == ARPHRD_IEEE80211;
616} 616}
617 617
618 618
619QString OWirelessNetworkInterface::nickName() const 619QString OWirelessNetworkInterface::nickName() const
620{ 620{
621 char str[IW_ESSID_MAX_SIZE]; 621 char str[IW_ESSID_MAX_SIZE];
622 _iwr.u.data.pointer = &str[0]; 622 _iwr.u.data.pointer = &str[0];
623 _iwr.u.data.length = IW_ESSID_MAX_SIZE; 623 _iwr.u.data.length = IW_ESSID_MAX_SIZE;
624 if ( !wioctl( SIOCGIWNICKN ) ) 624 if ( !wioctl( SIOCGIWNICKN ) )
625 { 625 {
626 return "<unknown>"; 626 return "<unknown>";
627 } 627 }
628 else 628 else
629 { 629 {
630 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string 630 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string
631 return str; 631 return str;
632 } 632 }
633} 633}
634 634
635 635
636void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... ) 636void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... )
637{ 637{
638 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) ); 638 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) );
639 if ( !priv ) 639 if ( !priv )
640 { 640 {
641 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call ); 641 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call );
642 return; 642 return;
643 } 643 }
644 if ( priv->numberSetArgs() != numargs ) 644 if ( priv->numberSetArgs() != numargs )
645 { 645 {
646 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs ); 646 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs );
647 return; 647 return;
648 } 648 }
649 649
650 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() ); 650 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() );
651 memset( &_iwr, 0, sizeof _iwr ); 651 memset( &_iwr, 0, sizeof _iwr );
652 va_list argp; 652 va_list argp;
653 va_start( argp, numargs ); 653 va_start( argp, numargs );
654 for ( int i = 0; i < numargs; ++i ) 654 for ( int i = 0; i < numargs; ++i )
655 { 655 {
656 priv->setParameter( i, va_arg( argp, int ) ); 656 priv->setParameter( i, va_arg( argp, int ) );
657 } 657 }
658 va_end( argp ); 658 va_end( argp );
659 priv->invoke(); 659 priv->invoke();
660} 660}
661 661
662 662
663void OWirelessNetworkInterface::getPrivate( const QString& call ) 663void OWirelessNetworkInterface::getPrivate( const QString& call )
664{ 664{
665 qWarning( "OWirelessNetworkInterface::getPrivate() is not implemented yet." ); 665 qWarning( "OWirelessNetworkInterface::getPrivate() is not implemented yet." );
666} 666}
667 667
668 668
669bool OWirelessNetworkInterface::hasPrivate( const QString& call ) 669bool OWirelessNetworkInterface::hasPrivate( const QString& call )
670{ 670{
671 return child( (const char*) call ); 671 return child( (const char*) call );
672} 672}
673 673
674 674
675QString OWirelessNetworkInterface::SSID() const 675QString OWirelessNetworkInterface::SSID() const
676{ 676{
677 char str[IW_ESSID_MAX_SIZE]; 677 char str[IW_ESSID_MAX_SIZE];
678 _iwr.u.essid.pointer = &str[0]; 678 _iwr.u.essid.pointer = &str[0];
679 _iwr.u.essid.length = IW_ESSID_MAX_SIZE; 679 _iwr.u.essid.length = IW_ESSID_MAX_SIZE;
680 if ( !wioctl( SIOCGIWESSID ) ) 680 if ( !wioctl( SIOCGIWESSID ) )
681 { 681 {
682 return "<unknown>"; 682 return "<unknown>";
683 } 683 }
684 else 684 else
685 { 685 {
686 return str; 686 return str;
687 } 687 }
688} 688}
689 689
690 690
691void OWirelessNetworkInterface::setSSID( const QString& ssid ) 691void OWirelessNetworkInterface::setSSID( const QString& ssid )
692{ 692{
693 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid ); 693 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
694 _iwr.u.essid.length = ssid.length(); 694 _iwr.u.essid.length = ssid.length();
695 wioctl( SIOCSIWESSID ); 695 wioctl( SIOCSIWESSID );
696} 696}
697 697
698 698
699bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 699bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
700{ 700{
701 int result = ::ioctl( _sfd, call, &iwreq ); 701 int result = ::ioctl( _sfd, call, &iwreq );
702 if ( result == -1 ) 702 if ( result == -1 )
703 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) ); 703 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) );
704 else 704 else
705 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call ); 705 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call );
706 return ( result != -1 ); 706 return ( result != -1 );
707} 707}
708 708
709 709
710bool OWirelessNetworkInterface::wioctl( int call ) const 710bool OWirelessNetworkInterface::wioctl( int call ) const
711{ 711{
712 strcpy( _iwr.ifr_name, name() ); 712 strcpy( _iwr.ifr_name, name() );
713 return wioctl( call, _iwr ); 713 return wioctl( call, _iwr );
714} 714}
715 715
716 716
717/*====================================================================================== 717/*======================================================================================
718 * OMonitoringInterface 718 * OMonitoringInterface
719 *======================================================================================*/ 719 *======================================================================================*/
720 720
721OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface ) 721OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface )
722 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ) 722 :_if( static_cast<OWirelessNetworkInterface*>( iface ) )
723{ 723{
724} 724}
725 725
726 726
727OMonitoringInterface::~OMonitoringInterface() 727OMonitoringInterface::~OMonitoringInterface()
728{ 728{
729} 729}
730 730
731 731
732void OMonitoringInterface::setChannel( int c ) 732void OMonitoringInterface::setChannel( int c )
733{ 733{
734 // use standard WE channel switching protocol 734 // use standard WE channel switching protocol
735 memset( &_if->_iwr, 0, sizeof( struct iwreq ) ); 735 memset( &_if->_iwr, 0, sizeof( struct iwreq ) );
736 _if->_iwr.u.freq.m = c; 736 _if->_iwr.u.freq.m = c;
737 _if->_iwr.u.freq.e = 0; 737 _if->_iwr.u.freq.e = 0;
738 _if->wioctl( SIOCSIWFREQ ); 738 _if->wioctl( SIOCSIWFREQ );
739} 739}
740 740
741 741
742bool OMonitoringInterface::enabled() const 742bool OMonitoringInterface::enabled() const
743{ 743{
744 return _if->monitorMode(); 744 return _if->monitorMode();
745} 745}
746 746
747 747
748void OMonitoringInterface::setEnabled( bool b ) 748void OMonitoringInterface::setEnabled( bool b )
749{ 749{
750} 750}
751 751
752 752
753/*====================================================================================== 753/*======================================================================================
754 * OCiscoMonitoringInterface 754 * OCiscoMonitoringInterface
755 *======================================================================================*/ 755 *======================================================================================*/
756 756
757OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface ) 757OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface )
758 :OMonitoringInterface( iface ) 758 :OMonitoringInterface( iface )
759{ 759{
760 iface->setMonitoring( this ); 760 iface->setMonitoring( this );
761} 761}
762 762
763 763
764OCiscoMonitoringInterface::~OCiscoMonitoringInterface() 764OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
765{ 765{
766} 766}
767 767
768 768
769void OCiscoMonitoringInterface::setEnabled( bool b ) 769void OCiscoMonitoringInterface::setEnabled( bool b )
770{ 770{
771 QString fname; 771 QString fname;
772 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() ); 772 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() );
773 QFile f( fname ); 773 QFile f( fname );
774 if ( !f.exists() ) return; 774 if ( !f.exists() ) return;
775 775
776 if ( f.open( IO_WriteOnly ) ) 776 if ( f.open( IO_WriteOnly ) )
777 { 777 {
778 QTextStream s( &f ); 778 QTextStream s( &f );
779 s << "Mode: r"; 779 s << "Mode: r";
780 s << "Mode: y"; 780 s << "Mode: y";
781 s << "XmitPower: 1"; 781 s << "XmitPower: 1";
782 } 782 }
783 783
784 // flushing and closing will be done automatically when f goes out of scope 784 // flushing and closing will be done automatically when f goes out of scope
785} 785}
786 786
787 787
788QString OCiscoMonitoringInterface::name() const 788QString OCiscoMonitoringInterface::name() const
789{ 789{
790 return "cisco"; 790 return "cisco";
791} 791}
792 792
793 793
794void OCiscoMonitoringInterface::setChannel( int ) 794void OCiscoMonitoringInterface::setChannel( int )
795{ 795{
796 // cisco devices automatically switch channels when in monitor mode 796 // cisco devices automatically switch channels when in monitor mode
797} 797}
798 798
799 799
800/*====================================================================================== 800/*======================================================================================
801 * OWlanNGMonitoringInterface 801 * OWlanNGMonitoringInterface
802 *======================================================================================*/ 802 *======================================================================================*/
803 803
804 804
805OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface ) 805OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface )
806 :OMonitoringInterface( iface ) 806 :OMonitoringInterface( iface )
807{ 807{
808 iface->setMonitoring( this ); 808 iface->setMonitoring( this );
809} 809}
810 810
811 811
812OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface() 812OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
813{ 813{
814} 814}
815 815
816 816
817void OWlanNGMonitoringInterface::setEnabled( bool b ) 817void OWlanNGMonitoringInterface::setEnabled( bool b )
818{ 818{
819 //FIXME: do nothing if its already in the same mode 819 //FIXME: do nothing if its already in the same mode
820 820
821 QString enable = b ? "true" : "false"; 821 QString enable = b ? "true" : "false";
822 QString cmd; 822 QString cmd;
823 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable ); 823 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable );
824 system( cmd ); 824 system( cmd );
825} 825}
826 826
827 827
828QString OWlanNGMonitoringInterface::name() const 828QString OWlanNGMonitoringInterface::name() const
829{ 829{
830 return "wlan-ng"; 830 return "wlan-ng";
831} 831}
832 832
833 833
834void OWlanNGMonitoringInterface::setChannel( int ) 834void OWlanNGMonitoringInterface::setChannel( int )
835{ 835{
836 // wlan-ng devices automatically switch channels when in monitor mode 836 // wlan-ng devices automatically switch channels when in monitor mode
837} 837}
838 838
839 839
840/*====================================================================================== 840/*======================================================================================
841 * OHostAPMonitoringInterface 841 * OHostAPMonitoringInterface
842 *======================================================================================*/ 842 *======================================================================================*/
843 843
844OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) 844OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface )
845 :OMonitoringInterface( iface ) 845 :OMonitoringInterface( iface )
846{ 846{
847 iface->setMonitoring( this ); 847 iface->setMonitoring( this );
848} 848}
849 849
850OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 850OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
851{ 851{
852} 852}
853 853
854void OHostAPMonitoringInterface::setEnabled( bool b ) 854void OHostAPMonitoringInterface::setEnabled( bool b )
855{ 855{
856 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 856 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
857 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring 857 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
858 858
859 //TODO: check wireless extensions version on runtime and use 859 //TODO: check wireless extensions version on runtime and use
860 //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15 860 //TODO: SIOCSIWMODE( IW_MODE_MONITOR ) if running on WE >= 15
861 861
862 if ( b ) 862 if ( b )
863 { 863 {
864 _if->setPrivate( "monitor", 1, 2 ); 864 _if->setPrivate( "monitor", 1, 2 );
865 } 865 }
866 else 866 else
867 { 867 {
868 _if->setPrivate( "monitor", 1, 0 ); 868 _if->setPrivate( "monitor", 1, 0 );
869 } 869 }
870} 870}
871 871
872 872
873QString OHostAPMonitoringInterface::name() const 873QString OHostAPMonitoringInterface::name() const
874{ 874{
875 return "hostap"; 875 return "hostap";
876} 876}
877 877
878 878
879/*====================================================================================== 879/*======================================================================================
880 * OOrinocoNetworkInterface 880 * OOrinocoNetworkInterface
881 *======================================================================================*/ 881 *======================================================================================*/
882 882
883OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) 883OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface )
884 :OMonitoringInterface( iface ) 884 :OMonitoringInterface( iface )
885{ 885{
886 iface->setMonitoring( this ); 886 iface->setMonitoring( this );
887} 887}
888 888
889 889
890OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() 890OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface()
891{ 891{
892} 892}
893 893
894 894
895void OOrinocoMonitoringInterface::setChannel( int c ) 895void OOrinocoMonitoringInterface::setChannel( int c )
896{ 896{
897 _if->setPrivate( "monitor", 2, 2, c ); 897 _if->setPrivate( "monitor", 2, 2, c );
898} 898}
899 899
900 900
901void OOrinocoMonitoringInterface::setEnabled( bool b ) 901void OOrinocoMonitoringInterface::setEnabled( bool b )
902{ 902{
903 if ( b ) 903 if ( b )
904 { 904 {
905 setChannel( 1 ); 905 setChannel( 1 );
906 } 906 }
907 else 907 else
908 { 908 {
909 _if->setPrivate( "monitor", 2, 0, 0 ); 909 _if->setPrivate( "monitor", 2, 0, 0 );
910 } 910 }
911} 911}
912 912
913 913
914QString OOrinocoMonitoringInterface::name() const 914QString OOrinocoMonitoringInterface::name() const
915{ 915{
916 return "orinoco"; 916 return "orinoco";
917} 917}
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
index d2cc25d..db8e702 100644
--- a/libopie2/opienet/onetwork.h
+++ b/libopie2/opienet/onetwork.h
@@ -1,470 +1,472 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
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#ifndef ONETWORK_H 34#ifndef ONETWORK_H
35#define ONETWORK_H 35#define ONETWORK_H
36 36
37/* QT */ 37/* QT */
38 38
39#include <qvaluelist.h> 39#include <qvaluelist.h>
40#include <qdict.h> 40#include <qdict.h>
41#include <qmap.h> 41#include <qmap.h>
42#include <qobject.h> 42#include <qobject.h>
43#include <qhostaddress.h> 43#include <qhostaddress.h>
44 44
45/* OPIE */ 45/* OPIE */
46 46
47#include <opie2/onetutils.h> 47#include <opie2/onetutils.h>
48 48
49#ifndef IFNAMSIZ 49#ifndef IFNAMSIZ
50#define IFNAMSIZ 16 50#define IFNAMSIZ 16
51#endif 51#endif
52#ifndef IW_MAX_PRIV_DEF 52#ifndef IW_MAX_PRIV_DEF
53#define IW_MAX_PRIV_DEF 128 53#define IW_MAX_PRIV_DEF 128
54#endif 54#endif
55 55
56// ML: Yeah, I hate to include kernel headers, but it's necessary here 56// ML: Yeah, I hate to include kernel headers, but it's necessary here
57// ML: Here comes an ugly hack to prevent <linux/wireless.h> including <linux/if.h> 57// ML: Here comes an ugly hack to prevent <linux/wireless.h> including <linux/if.h>
58// ML: which conflicts with the user header <net/if.h> 58// ML: which conflicts with the user header <net/if.h>
59// ML: We really a user header for the Wireless Extensions, something like <net/wireless.h> 59// ML: We really a user header for the Wireless Extensions, something like <net/wireless.h>
60// ML: I will drop Jean an mail on that subject 60// ML: I will drop Jean an mail on that subject
61 61
62#include <net/if.h> 62#include <net/if.h>
63#define _LINUX_IF_H 63#define _LINUX_IF_H
64#include <linux/wireless.h> 64#include <linux/wireless.h>
65 65
66class ONetworkInterface; 66class ONetworkInterface;
67class OWirelessNetworkInterface; 67class OWirelessNetworkInterface;
68class OChannelHopper; 68class OChannelHopper;
69class OMonitoringInterface; 69class OMonitoringInterface;
70 70
71/*====================================================================================== 71/*======================================================================================
72 * ONetwork 72 * ONetwork
73 *======================================================================================*/ 73 *======================================================================================*/
74 74
75/** 75/**
76 * @brief A container class for all network devices. 76 * @brief A container class for all network devices.
77 * 77 *
78 * This class provides access to all available network devices of your computer. 78 * This class provides access to all available network devices of your computer.
79 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 79 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
80 */ 80 */
81class ONetwork : public QObject 81class ONetwork : public QObject
82{ 82{
83 Q_OBJECT 83 Q_OBJECT
84 84
85 public: 85 public:
86 typedef QDict<ONetworkInterface> InterfaceMap; 86 typedef QDict<ONetworkInterface> InterfaceMap;
87 typedef QDictIterator<ONetworkInterface> InterfaceIterator; 87 typedef QDictIterator<ONetworkInterface> InterfaceIterator;
88 88
89 public: 89 public:
90 /** 90 /**
91 * @returns a pointer to the (one and only) @ref ONetwork instance. 91 * @returns a pointer to the (one and only) @ref ONetwork instance.
92 */ 92 */
93 static ONetwork* instance(); 93 static ONetwork* instance();
94 /** 94 /**
95 * @returns an iterator usable for iterating through all network interfaces. 95 * @returns an iterator usable for iterating through all network interfaces.
96 */ 96 */
97 InterfaceIterator iterator() const; 97 InterfaceIterator iterator() const;
98 /** 98 /**
99 * @returns true, if the @p interface supports the wireless extension protocol. 99 * @returns true, if the @p interface supports the wireless extension protocol.
100 */ 100 */
101 // FIXME QString? -zecke
101 bool isWirelessInterface( const char* interface ) const; 102 bool isWirelessInterface( const char* interface ) const;
102 /** 103 /**
103 * @returns a pointer to the @ref ONetworkInterface object for the specified @p interface or 0, if not found 104 * @returns a pointer to the @ref ONetworkInterface object for the specified @p interface or 0, if not found
104 * @see ONetworkInterface 105 * @see ONetworkInterface
105 */ 106 */
106 ONetworkInterface* interface( QString interface ) const; 107 // FIXME: const QString& is prefered over QString!!! -zecke
108 ONetworkInterface* interface( const QString& interface ) const;
107 109
108 protected: 110 protected:
109 ONetwork(); 111 ONetwork();
110 void synchronize(); 112 void synchronize();
111 113
112 private: 114 private:
113 static ONetwork* _instance; 115 static ONetwork* _instance;
114 InterfaceMap _interfaces; 116 InterfaceMap _interfaces;
115}; 117};
116 118
117 119
118/*====================================================================================== 120/*======================================================================================
119 * ONetworkInterface 121 * ONetworkInterface
120 *======================================================================================*/ 122 *======================================================================================*/
121 123
122/** 124/**
123 * @brief A network interface wrapper. 125 * @brief A network interface wrapper.
124 * 126 *
125 * This class provides a wrapper for a network interface. All the cumbersume details of 127 * This class provides a wrapper for a network interface. All the cumbersume details of
126 * Linux ioctls are hidden under a convenient high-level interface. 128 * Linux ioctls are hidden under a convenient high-level interface.
127 * @warning Most of the setting methods contained in this class require the appropriate 129 * @warning Most of the setting methods contained in this class require the appropriate
128 * process permissions to work. 130 * process permissions to work.
129 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 131 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
130 */ 132 */
131class ONetworkInterface : public QObject 133class ONetworkInterface : public QObject
132{ 134{
133 friend class OMonitoringInterface; 135 friend class OMonitoringInterface;
134 friend class OCiscoMonitoringInterface; 136 friend class OCiscoMonitoringInterface;
135 friend class OWlanNGMonitoringInterface; 137 friend class OWlanNGMonitoringInterface;
136 friend class OHostAPMonitoringInterface; 138 friend class OHostAPMonitoringInterface;
137 friend class OOrinocoMonitoringInterface; 139 friend class OOrinocoMonitoringInterface;
138 140
139 public: 141 public:
140 /** 142 /**
141 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself, 143 * Constructor. Normally you don't create @ref ONetworkInterface objects yourself,
142 * but access them via @ref ONetwork::interface(). 144 * but access them via @ref ONetwork::interface().
143 */ 145 */
144 ONetworkInterface( QObject* parent, const char* name ); 146 ONetworkInterface( QObject* parent, const char* name );
145 /** 147 /**
146 * Destructor. 148 * Destructor.
147 */ 149 */
148 virtual ~ONetworkInterface(); 150 virtual ~ONetworkInterface();
149 /** 151 /**
150 * Associates a @a monitoring interface with this network interface. 152 * Associates a @a monitoring interface with this network interface.
151 * @note This is currently only useful with @ref OWirelessNetworkInterface objects. 153 * @note This is currently only useful with @ref OWirelessNetworkInterface objects.
152 */ 154 */
153 void setMonitoring( OMonitoringInterface* monitoring ); 155 void setMonitoring( OMonitoringInterface* monitoring );
154 /** 156 /**
155 * @returns the currently associated monitoring interface or 0, if no monitoring is associated. 157 * @returns the currently associated monitoring interface or 0, if no monitoring is associated.
156 */ 158 */
157 OMonitoringInterface* monitoring() const; 159 OMonitoringInterface* monitoring() const;
158 /** 160 /**
159 * Setting an interface to promiscuous mode enables the device to receive 161 * Setting an interface to promiscuous mode enables the device to receive
160 * all packets on the shared medium - as opposed to packets which are addressed to this interface. 162 * all packets on the shared medium - as opposed to packets which are addressed to this interface.
161 */ 163 */
162 bool setPromiscuousMode( bool ); 164 bool setPromiscuousMode( bool );
163 /** 165 /**
164 * @returns true if the interface is set to promiscuous mode. 166 * @returns true if the interface is set to promiscuous mode.
165 */ 167 */
166 bool promiscuousMode() const; 168 bool promiscuousMode() const;
167 /** 169 /**
168 * Setting an interface to up enables it to receive packets. 170 * Setting an interface to up enables it to receive packets.
169 */ 171 */
170 bool setUp( bool ); 172 bool setUp( bool );
171 /** 173 /**
172 * @returns true if the interface is up. 174 * @returns true if the interface is up.
173 */ 175 */
174 bool isUp() const; 176 bool isUp() const;
175 /* 177 /*
176 * @returns true if the interface is a loopback interface. 178 * @returns true if the interface is a loopback interface.
177 */ 179 */
178 bool isLoopback() const; 180 bool isLoopback() const;
179 /* 181 /*
180 * @returns true if the interface is featuring supports the wireless extension protocol. 182 * @returns true if the interface is featuring supports the wireless extension protocol.
181 */ 183 */
182 bool isWireless() const; 184 bool isWireless() const;
183 /* 185 /*
184 * @returns the IPv4 address associated with this interface. 186 * @returns the IPv4 address associated with this interface.
185 */ 187 */
186 QString ipV4Address() const; 188 QString ipV4Address() const;
187 /* 189 /*
188 * Associate the MAC address @a addr with the interface. 190 * Associate the MAC address @a addr with the interface.
189 * @note It can be necessary to shut down the interface prior to calling this method. 191 * @note It can be necessary to shut down the interface prior to calling this method.
190 * @warning This is not supported by all drivers. 192 * @warning This is not supported by all drivers.
191 */ 193 */
192 void setMacAddress( const OMacAddress& addr ); 194 void setMacAddress( const OMacAddress& addr );
193 /* 195 /*
194 * @returns the MAC address associated with this interface. 196 * @returns the MAC address associated with this interface.
195 */ 197 */
196 OMacAddress macAddress() const; 198 OMacAddress macAddress() const;
197 /* 199 /*
198 * @returns the data link type currently associated with this interface. 200 * @returns the data link type currently associated with this interface.
199 * @see #include <net/if_arp.h> for possible values. 201 * @see #include <net/if_arp.h> for possible values.
200 */ 202 */
201 int dataLinkType() const; 203 int dataLinkType() const;
202 204
203 protected: 205 protected:
204 const int _sfd; 206 const int _sfd;
205 mutable ifreq _ifr; 207 mutable ifreq _ifr;
206 OMonitoringInterface* _mon; 208 OMonitoringInterface* _mon;
207 209
208 protected: 210 protected:
209 struct ifreq& ifr() const; 211 struct ifreq& ifr() const;
210 virtual void init(); 212 virtual void init();
211 bool ioctl( int call ) const; 213 bool ioctl( int call ) const;
212 bool ioctl( int call, struct ifreq& ) const; 214 bool ioctl( int call, struct ifreq& ) const;
213}; 215};
214 216
215/*====================================================================================== 217/*======================================================================================
216 * OChannelHopper 218 * OChannelHopper
217 *======================================================================================*/ 219 *======================================================================================*/
218 220
219/** 221/**
220 * @brief A radio frequency channel hopper. 222 * @brief A radio frequency channel hopper.
221 * 223 *
222 * This class provides a channel hopper for radio frequencies. A channel hopper frequently 224 * This class provides a channel hopper for radio frequencies. A channel hopper frequently
223 * changes the radio frequency channel of its associated @ref OWirelessNetworkInterface. 225 * changes the radio frequency channel of its associated @ref OWirelessNetworkInterface.
224 * This is necessary when in monitoring mode and scanning for other devices, because 226 * This is necessary when in monitoring mode and scanning for other devices, because
225 * the radio frequency hardware can only detect packets sent on the same frequency. 227 * the radio frequency hardware can only detect packets sent on the same frequency.
226 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 228 * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
227 */ 229 */
228class OChannelHopper : public QObject 230class OChannelHopper : public QObject
229{ 231{
230 Q_OBJECT 232 Q_OBJECT
231 233
232 public: 234 public:
233 OChannelHopper( OWirelessNetworkInterface* ); 235 OChannelHopper( OWirelessNetworkInterface* );
234 virtual ~OChannelHopper(); 236 virtual ~OChannelHopper();
235 bool isActive() const; 237 bool isActive() const;
236 int channel() const; 238 int channel() const;
237 virtual void timerEvent( QTimerEvent* ); 239 virtual void timerEvent( QTimerEvent* );
238 void setInterval( int ); 240 void setInterval( int );
239 int interval() const; 241 int interval() const;
240 242
241 signals: 243 signals:
242 void hopped( int ); 244 void hopped( int );
243 245
244 private: 246 private:
245 OWirelessNetworkInterface* _iface; 247 OWirelessNetworkInterface* _iface;
246 int _interval; 248 int _interval;
247 int _tid; 249 int _tid;
248 QValueList<int> _channels; 250 QValueList<int> _channels;
249 QValueList<int>::Iterator _channel; 251 QValueList<int>::Iterator _channel;
250}; 252};
251 253
252 254
253/*====================================================================================== 255/*======================================================================================
254 * OWirelessNetworkInterface 256 * OWirelessNetworkInterface
255 *======================================================================================*/ 257 *======================================================================================*/
256 258
257/** 259/**
258 * @brief A network interface wrapper for interfaces supporting the wireless extensions protocol. 260 * @brief A network interface wrapper for interfaces supporting the wireless extensions protocol.
259 * 261 *
260 * This class provides a high-level encapsulation of the Linux wireless extension API. 262 * This class provides a high-level encapsulation of the Linux wireless extension API.
261 */ 263 */
262class OWirelessNetworkInterface : public ONetworkInterface 264class OWirelessNetworkInterface : public ONetworkInterface
263{ 265{
264 friend class OMonitoringInterface; 266 friend class OMonitoringInterface;
265 friend class OCiscoMonitoringInterface; 267 friend class OCiscoMonitoringInterface;
266 friend class OWlanNGMonitoringInterface; 268 friend class OWlanNGMonitoringInterface;
267 friend class OHostAPMonitoringInterface; 269 friend class OHostAPMonitoringInterface;
268 friend class OOrinocoMonitoringInterface; 270 friend class OOrinocoMonitoringInterface;
269 271
270 friend class OPrivateIOCTL; 272 friend class OPrivateIOCTL;
271 273
272 public: 274 public:
273 enum Mode { AdHoc, Managed, Monitor }; 275 enum Mode { AdHoc, Managed, Monitor };
274 276
275 /** 277 /**
276 * Constructor. 278 * Constructor.
277 */ 279 */
278 OWirelessNetworkInterface( QObject* parent, const char* name ); 280 OWirelessNetworkInterface( QObject* parent, const char* name );
279 /** 281 /**
280 * Destructor. 282 * Destructor.
281 */ 283 */
282 virtual ~OWirelessNetworkInterface(); 284 virtual ~OWirelessNetworkInterface();
283 /** 285 /**
284 * Setting the @a channel of the interface changes the radio frequency (RF) 286 * Setting the @a channel of the interface changes the radio frequency (RF)
285 * of the corresponding wireless network device. 287 * of the corresponding wireless network device.
286 */ 288 */
287 virtual void setChannel( int channel ) const; 289 virtual void setChannel( int channel ) const;
288 /** 290 /**
289 * @returns the channel index of the current radio frequency. 291 * @returns the channel index of the current radio frequency.
290 */ 292 */
291 virtual int channel() const; 293 virtual int channel() const;
292 /** 294 /**
293 * @returns the current radio frequency (in MHz). 295 * @returns the current radio frequency (in MHz).
294 */ 296 */
295 virtual double frequency() const; 297 virtual double frequency() const;
296 /** 298 /**
297 * @returns the number of radio frequency channels for the 299 * @returns the number of radio frequency channels for the
298 * corresponding wireless network device. 300 * corresponding wireless network device.
299 * @note European devices usually have 14 channels, while American typically feature 11 channels. 301 * @note European devices usually have 14 channels, while American typically feature 11 channels.
300 */ 302 */
301 virtual int channels() const; 303 virtual int channels() const;
302 //virtual double frequency(int) const; 304 //virtual double frequency(int) const;
303 305
304 virtual void setMode( Mode ) {}; //FIXME: Implement and document this 306 virtual void setMode( Mode ) {}; //FIXME: Implement and document this
305 virtual bool mode() const {}; //FIXME: Implement and document this 307 virtual bool mode() const {}; //FIXME: Implement and document this
306 308
307 /** 309 /**
308 * Setting the monitor mode on a wireless network interface enables 310 * Setting the monitor mode on a wireless network interface enables
309 * listening to IEEE 802.11 data and management frames which normally 311 * listening to IEEE 802.11 data and management frames which normally
310 * are handled by the device firmware. This can be used to detect 312 * are handled by the device firmware. This can be used to detect
311 * other wireless network devices, e.g. Access Points or Ad-hoc stations. 313 * other wireless network devices, e.g. Access Points or Ad-hoc stations.
312 * @warning Standard wireless network drives don't support the monitor mode. 314 * @warning Standard wireless network drives don't support the monitor mode.
313 * @warning You need a patched driver for this to work. 315 * @warning You need a patched driver for this to work.
314 * @note Enabling the monitor mode is highly driver dependent and requires 316 * @note Enabling the monitor mode is highly driver dependent and requires
315 * the proper @ref OMonitoringInterface to be associated with the interface. 317 * the proper @ref OMonitoringInterface to be associated with the interface.
316 * @see OMonitoringInterface 318 * @see OMonitoringInterface
317 */ 319 */
318 virtual void setMonitorMode( bool ); 320 virtual void setMonitorMode( bool );
319 /** 321 /**
320 * @returns true if the device is listening in IEEE 802.11 monitor mode 322 * @returns true if the device is listening in IEEE 802.11 monitor mode
321 */ 323 */
322 virtual bool monitorMode() const; 324 virtual bool monitorMode() const;
323 /** 325 /**
324 * Set the channel hopping @a interval. An @a interval of 0 disables channel hopping. 326 * Set the channel hopping @a interval. An @a interval of 0 disables channel hopping.
325 * @see OChannelHopper 327 * @see OChannelHopper
326 */ 328 */
327 virtual void setChannelHopping( int interval = 0 ); 329 virtual void setChannelHopping( int interval = 0 );
328 /** 330 /**
329 * @returns the channel hopping interval or 0, if channel hopping is disabled. 331 * @returns the channel hopping interval or 0, if channel hopping is disabled.
330 */ 332 */
331 virtual int channelHopping() const; 333 virtual int channelHopping() const;
332 /** 334 /**
333 * @returns the @ref OChannelHopper of this interface or 0, if channel hopping has not been activated before 335 * @returns the @ref OChannelHopper of this interface or 0, if channel hopping has not been activated before
334 */ 336 */
335 virtual OChannelHopper* channelHopper() const; 337 virtual OChannelHopper* channelHopper() const;
336 /** 338 /**
337 * Set the station @a nickname. 339 * Set the station @a nickname.
338 */ 340 */
339 virtual void setNickName( const QString& nickname ) {}; //FIXME: Implement this 341 virtual void setNickName( const QString& nickname ) {}; //FIXME: Implement this
340 /** 342 /**
341 * @returns the current station nickname. 343 * @returns the current station nickname.
342 */ 344 */
343 virtual QString nickName() const; 345 virtual QString nickName() const;
344 /** 346 /**
345 * Invoke the private IOCTL @a command with a @number of parameters on the network interface. 347 * Invoke the private IOCTL @a command with a @number of parameters on the network interface.
346 * @see OPrivateIOCTL 348 * @see OPrivateIOCTL
347 */ 349 */
348 virtual void setPrivate( const QString& command, int number, ... ); 350 virtual void setPrivate( const QString& command, int number, ... );
349 /** 351 /**
350 * @returns true if the interface is featuring the private IOCTL @command. 352 * @returns true if the interface is featuring the private IOCTL @command.
351 */ 353 */
352 virtual bool hasPrivate( const QString& command ); 354 virtual bool hasPrivate( const QString& command );
353 virtual void getPrivate( const QString& command ); //FIXME: Implement and document this 355 virtual void getPrivate( const QString& command ); //FIXME: Implement and document this
354 356
355 virtual bool isAssociated() const {}; //FIXME: Implement and document this 357 virtual bool isAssociated() const {}; //FIXME: Implement and document this
356 virtual QString associatedAP() const; //FIXME: Implement and document this 358 virtual QString associatedAP() const; //FIXME: Implement and document this
357 359
358 virtual void setSSID( const QString& ); 360 virtual void setSSID( const QString& );
359 virtual QString SSID() const; 361 virtual QString SSID() const;
360 362
361 protected: 363 protected:
362 void buildChannelList(); 364 void buildChannelList();
363 void buildPrivateList(); 365 void buildPrivateList();
364 virtual void init(); 366 virtual void init();
365 struct iwreq& iwr() const; 367 struct iwreq& iwr() const;
366 bool wioctl( int call ) const; 368 bool wioctl( int call ) const;
367 bool wioctl( int call, struct iwreq& ) const; 369 bool wioctl( int call, struct iwreq& ) const;
368 370
369 protected: 371 protected:
370 mutable struct iwreq _iwr; 372 mutable struct iwreq _iwr;
371 QMap<int,int> _channels; 373 QMap<int,int> _channels;
372 374
373 private: 375 private:
374 OChannelHopper* _hopper; 376 OChannelHopper* _hopper;
375}; 377};
376 378
377 379
378/*====================================================================================== 380/*======================================================================================
379 * OMonitoringInterface 381 * OMonitoringInterface
380 *======================================================================================*/ 382 *======================================================================================*/
381 383
382 384
383class OMonitoringInterface 385class OMonitoringInterface
384{ 386{
385 public: 387 public:
386 OMonitoringInterface(); 388 OMonitoringInterface();
387 OMonitoringInterface( ONetworkInterface* ); 389 OMonitoringInterface( ONetworkInterface* );
388 virtual ~OMonitoringInterface(); 390 virtual ~OMonitoringInterface();
389 391
390 public: 392 public:
391 virtual void setEnabled( bool ); 393 virtual void setEnabled( bool );
392 virtual bool enabled() const; 394 virtual bool enabled() const;
393 virtual void setChannel( int ); 395 virtual void setChannel( int );
394 396
395 virtual QString name() const = 0; 397 virtual QString name() const = 0;
396 398
397 protected: 399 protected:
398 OWirelessNetworkInterface* _if; 400 OWirelessNetworkInterface* _if;
399 401
400}; 402};
401 403
402 404
403/*====================================================================================== 405/*======================================================================================
404 * OCiscoMonitoring 406 * OCiscoMonitoring
405 *======================================================================================*/ 407 *======================================================================================*/
406 408
407 409
408class OCiscoMonitoringInterface : public OMonitoringInterface 410class OCiscoMonitoringInterface : public OMonitoringInterface
409{ 411{
410 public: 412 public:
411 OCiscoMonitoringInterface( ONetworkInterface* ); 413 OCiscoMonitoringInterface( ONetworkInterface* );
412 virtual ~OCiscoMonitoringInterface(); 414 virtual ~OCiscoMonitoringInterface();
413 415
414 virtual void setEnabled( bool ); 416 virtual void setEnabled( bool );
415 virtual QString name() const; 417 virtual QString name() const;
416 virtual void setChannel( int ); 418 virtual void setChannel( int );
417 419
418}; 420};
419 421
420/*====================================================================================== 422/*======================================================================================
421 * OWlanNGMonitoringInterface 423 * OWlanNGMonitoringInterface
422 *======================================================================================*/ 424 *======================================================================================*/
423 425
424class OWlanNGMonitoringInterface : public OMonitoringInterface 426class OWlanNGMonitoringInterface : public OMonitoringInterface
425{ 427{
426 public: 428 public:
427 OWlanNGMonitoringInterface( ONetworkInterface* ); 429 OWlanNGMonitoringInterface( ONetworkInterface* );
428 virtual ~OWlanNGMonitoringInterface(); 430 virtual ~OWlanNGMonitoringInterface();
429 431
430 public: 432 public:
431 virtual void setEnabled( bool ); 433 virtual void setEnabled( bool );
432 virtual QString name() const; 434 virtual QString name() const;
433 virtual void setChannel( int ); 435 virtual void setChannel( int );
434 436
435}; 437};
436 438
437/*====================================================================================== 439/*======================================================================================
438 * OHostAPMonitoringInterface 440 * OHostAPMonitoringInterface
439 *======================================================================================*/ 441 *======================================================================================*/
440 442
441class OHostAPMonitoringInterface : public OMonitoringInterface 443class OHostAPMonitoringInterface : public OMonitoringInterface
442{ 444{
443 public: 445 public:
444 OHostAPMonitoringInterface( ONetworkInterface* ); 446 OHostAPMonitoringInterface( ONetworkInterface* );
445 virtual ~OHostAPMonitoringInterface(); 447 virtual ~OHostAPMonitoringInterface();
446 448
447 public: 449 public:
448 virtual void setEnabled( bool ); 450 virtual void setEnabled( bool );
449 virtual QString name() const; 451 virtual QString name() const;
450 }; 452 };
451 453
452/*====================================================================================== 454/*======================================================================================
453 * OOrinocoMonitoringInterface 455 * OOrinocoMonitoringInterface
454 *======================================================================================*/ 456 *======================================================================================*/
455 457
456class OOrinocoMonitoringInterface : public OMonitoringInterface 458class OOrinocoMonitoringInterface : public OMonitoringInterface
457{ 459{
458 public: 460 public:
459 OOrinocoMonitoringInterface( ONetworkInterface* ); 461 OOrinocoMonitoringInterface( ONetworkInterface* );
460 virtual ~OOrinocoMonitoringInterface(); 462 virtual ~OOrinocoMonitoringInterface();
461 463
462 public: 464 public:
463 virtual void setChannel( int ); 465 virtual void setChannel( int );
464 virtual void setEnabled( bool ); 466 virtual void setEnabled( bool );
465 virtual QString name() const; 467 virtual QString name() const;
466 468
467}; 469};
468 470
469#endif // ONETWORK_H 471#endif // ONETWORK_H
470 472
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index 99631ba..6bf7416 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -1,507 +1,517 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
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#ifndef OPCAP_H 34#ifndef OPCAP_H
35#define OPCAP_H 35#define OPCAP_H
36 36
37/* LINUX */ 37/* LINUX */
38extern "C" // work around a bpf/pcap conflict in recent headers 38extern "C" // work around a bpf/pcap conflict in recent headers
39{ 39{
40 #include <pcap.h> 40 #include <pcap.h>
41} 41}
42#include <netinet/ether.h> 42#include <netinet/ether.h>
43#include <netinet/ip.h> 43#include <netinet/ip.h>
44#include <netinet/udp.h> 44#include <netinet/udp.h>
45#include <netinet/tcp.h> 45#include <netinet/tcp.h>
46#include <time.h> 46#include <time.h>
47 47
48/* QT */ 48/* QT */
49#include <qevent.h> 49#include <qevent.h>
50#include <qfile.h> 50#include <qfile.h>
51#include <qhostaddress.h> 51#include <qhostaddress.h>
52#include <qobject.h> 52#include <qobject.h>
53#include <qstring.h> 53#include <qstring.h>
54#include <qmap.h> 54#include <qmap.h>
55 55
56/* OPIE */ 56/* OPIE */
57#include <opie2/onetutils.h> 57#include <opie2/onetutils.h>
58#include "802_11_user.h" 58#include "802_11_user.h"
59 59
60/* TYPEDEFS */ 60/* TYPEDEFS */
61typedef struct timeval timevalstruct; 61typedef struct timeval timevalstruct;
62typedef struct pcap_pkthdr packetheaderstruct; 62typedef struct pcap_pkthdr packetheaderstruct;
63 63
64/* FORWARDS */ 64/* FORWARDS */
65class OPacketCapturer; 65class OPacketCapturer;
66class QSocketNotifier; 66class QSocketNotifier;
67 67
68/*====================================================================================== 68/*======================================================================================
69 * OPacket - A frame on the wire 69 * OPacket - A frame on the wire
70 *======================================================================================*/ 70 *======================================================================================*/
71 71// FIXME how many OPackets do we've at a time? QObject seams to be a big for that usage
72class OPacket : public QObject 72class OPacket : public QObject
73{ 73{
74 Q_OBJECT 74 Q_OBJECT
75 75
76 public: 76 public:
77 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent ); 77 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent );
78 virtual ~OPacket(); 78 virtual ~OPacket();
79 79
80 timevalstruct timeval() const; 80 timevalstruct timeval() const;
81 81
82 int caplen() const; 82 int caplen() const;
83 int len() const; 83 int len() const;
84 QString dump( int = 32 ) const; 84 QString dump( int = 32 ) const;
85 85
86 void updateStats( QMap<QString,int>&, QObjectList* ); 86 void updateStats( QMap<QString,int>&, QObjectList* );
87 87
88 private: 88 private:
89 const packetheaderstruct _hdr; // pcap packet header 89 const packetheaderstruct _hdr; // pcap packet header
90 const unsigned char* _data; // pcap packet data 90 const unsigned char* _data; // pcap packet data
91 const unsigned char* _end; // end of pcap packet data 91 const unsigned char* _end; // end of pcap packet data
92}; 92};
93 93
94/*====================================================================================== 94/*======================================================================================
95 * OEthernetPacket - DLT_EN10MB frame 95 * OEthernetPacket - DLT_EN10MB frame
96 *======================================================================================*/ 96 *======================================================================================*/
97 97
98//FIXME same critic as above -zecke
98class OEthernetPacket : public QObject 99class OEthernetPacket : public QObject
99{ 100{
100 Q_OBJECT 101 Q_OBJECT
101 102
102 public: 103 public:
103 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 ); 104 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 );
104 virtual ~OEthernetPacket(); 105 virtual ~OEthernetPacket();
105 106
106 OMacAddress sourceAddress() const; 107 OMacAddress sourceAddress() const;
107 OMacAddress destinationAddress() const; 108 OMacAddress destinationAddress() const;
108 int type() const; 109 int type() const;
109 110
110 private: 111 private:
111 const struct ether_header* _ether; 112 const struct ether_header* _ether;
112}; 113};
113 114
114 115
115/*====================================================================================== 116/*======================================================================================
116 * OWaveLanPacket - DLT_IEEE802_11 frame 117 * OWaveLanPacket - DLT_IEEE802_11 frame
117 *======================================================================================*/ 118 *======================================================================================*/
118 119//FIXME same
119class OWaveLanPacket : public QObject 120class OWaveLanPacket : public QObject
120{ 121{
121 Q_OBJECT 122 Q_OBJECT
122 123
123 public: 124 public:
124 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 ); 125 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 );
125 virtual ~OWaveLanPacket(); 126 virtual ~OWaveLanPacket();
126 127
127 int duration() const; 128 int duration() const;
128 bool fromDS() const; 129 bool fromDS() const;
129 bool toDS() const; 130 bool toDS() const;
130 virtual OMacAddress macAddress1() const; 131 virtual OMacAddress macAddress1() const;
131 virtual OMacAddress macAddress2() const; 132 virtual OMacAddress macAddress2() const;
132 virtual OMacAddress macAddress3() const; 133 virtual OMacAddress macAddress3() const;
133 virtual OMacAddress macAddress4() const; 134 virtual OMacAddress macAddress4() const;
134 bool usesPowerManagement() const; 135 bool usesPowerManagement() const;
135 int type() const; 136 int type() const;
136 int subType() const; 137 int subType() const;
137 int version() const; 138 int version() const;
138 bool usesWep() const; 139 bool usesWep() const;
139 140
140 private: 141 private:
141 const struct ieee_802_11_header* _wlanhdr; 142 const struct ieee_802_11_header* _wlanhdr;
142}; 143};
143 144
144 145
145/*====================================================================================== 146/*======================================================================================
146 * OWaveLanManagementPacket - type: management (T_MGMT) 147 * OWaveLanManagementPacket - type: management (T_MGMT)
147 *======================================================================================*/ 148 *======================================================================================*/
148 149//FIXME same as above -zecke
149class OWaveLanManagementPacket : public QObject 150class OWaveLanManagementPacket : public QObject
150{ 151{
151 Q_OBJECT 152 Q_OBJECT
152 153
153 public: 154 public:
154 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); 155 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 );
155 virtual ~OWaveLanManagementPacket(); 156 virtual ~OWaveLanManagementPacket();
156 157
157 QString managementType() const; 158 QString managementType() const;
158 159
159 int beaconInterval() const; 160 int beaconInterval() const;
160 int capabilities() const; // generic 161 int capabilities() const; // generic
161 162
162 bool canESS() const; 163 bool canESS() const;
163 bool canIBSS() const; 164 bool canIBSS() const;
164 bool canCFP() const; 165 bool canCFP() const;
165 bool canCFP_REQ() const; 166 bool canCFP_REQ() const;
166 bool canPrivacy() const; 167 bool canPrivacy() const;
167 168
168 private: 169 private:
169 const struct ieee_802_11_mgmt_header* _header; 170 const struct ieee_802_11_mgmt_header* _header;
170 const struct ieee_802_11_mgmt_body* _body; 171 const struct ieee_802_11_mgmt_body* _body;
171}; 172};
172 173
173 174
174/*====================================================================================== 175/*======================================================================================
175 * OWaveLanManagementSSID 176 * OWaveLanManagementSSID
176 *======================================================================================*/ 177 *======================================================================================*/
177 178//FIXME is QObject necessary? -zecke
178class OWaveLanManagementSSID : public QObject 179class OWaveLanManagementSSID : public QObject
179{ 180{
180 Q_OBJECT 181 Q_OBJECT
181 182
182 public: 183 public:
183 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 ); 184 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 );
184 virtual ~OWaveLanManagementSSID(); 185 virtual ~OWaveLanManagementSSID();
185 186
186 QString ID() const; 187 QString ID() const;
187 188
188 private: 189 private:
189 const struct ssid_t* _data; 190 const struct ssid_t* _data;
190}; 191};
191 192
192/*====================================================================================== 193/*======================================================================================
193 * OWaveLanManagementRates 194 * OWaveLanManagementRates
194 *======================================================================================*/ 195 *======================================================================================*/
195 196// FIXME same as above -zecke
196class OWaveLanManagementRates : public QObject 197class OWaveLanManagementRates : public QObject
197{ 198{
198 Q_OBJECT 199 Q_OBJECT
199 200
200 public: 201 public:
201 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 ); 202 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 );
202 virtual ~OWaveLanManagementRates(); 203 virtual ~OWaveLanManagementRates();
203 204
204 private: 205 private:
205 const struct rates_t* _data; 206 const struct rates_t* _data;
206}; 207};
207 208
208/*====================================================================================== 209/*======================================================================================
209 * OWaveLanManagementCF 210 * OWaveLanManagementCF
210 *======================================================================================*/ 211 *======================================================================================*/
211 212
213//FIXME same....
212class OWaveLanManagementCF : public QObject 214class OWaveLanManagementCF : public QObject
213{ 215{
214 Q_OBJECT 216 Q_OBJECT
215 217
216 public: 218 public:
217 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 ); 219 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 );
218 virtual ~OWaveLanManagementCF(); 220 virtual ~OWaveLanManagementCF();
219 221
220 private: 222 private:
221 const struct cf_t* _data; 223 const struct cf_t* _data;
222}; 224};
223 225
224/*====================================================================================== 226/*======================================================================================
225 * OWaveLanManagementFH 227 * OWaveLanManagementFH
226 *======================================================================================*/ 228 *======================================================================================*/
227 229
230//FIXME same
228class OWaveLanManagementFH : public QObject 231class OWaveLanManagementFH : public QObject
229{ 232{
230 Q_OBJECT 233 Q_OBJECT
231 234
232 public: 235 public:
233 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 ); 236 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 );
234 virtual ~OWaveLanManagementFH(); 237 virtual ~OWaveLanManagementFH();
235 238
236 private: 239 private:
237 const struct fh_t* _data; 240 const struct fh_t* _data;
238}; 241};
239 242
240/*====================================================================================== 243/*======================================================================================
241 * OWaveLanManagementDS 244 * OWaveLanManagementDS
242 *======================================================================================*/ 245 *======================================================================================*/
243 246//FIXME same
244class OWaveLanManagementDS : public QObject 247class OWaveLanManagementDS : public QObject
245{ 248{
246 Q_OBJECT 249 Q_OBJECT
247 250
248 public: 251 public:
249 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 ); 252 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 );
250 virtual ~OWaveLanManagementDS(); 253 virtual ~OWaveLanManagementDS();
251 254
252 int channel() const; 255 int channel() const;
253 256
254 private: 257 private:
255 const struct ds_t* _data; 258 const struct ds_t* _data;
256}; 259};
257 260
258/*====================================================================================== 261/*======================================================================================
259 * OWaveLanManagementTim 262 * OWaveLanManagementTim
260 *======================================================================================*/ 263 *======================================================================================*/
261 264
265//FIXME guess what?
262class OWaveLanManagementTim : public QObject 266class OWaveLanManagementTim : public QObject
263{ 267{
264 Q_OBJECT 268 Q_OBJECT
265 269
266 public: 270 public:
267 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 ); 271 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 );
268 virtual ~OWaveLanManagementTim(); 272 virtual ~OWaveLanManagementTim();
269 273
270 private: 274 private:
271 const struct tim_t* _data; 275 const struct tim_t* _data;
272}; 276};
273 277
274/*====================================================================================== 278/*======================================================================================
275 * OWaveLanManagementIBSS 279 * OWaveLanManagementIBSS
276 *======================================================================================*/ 280 *======================================================================================*/
277 281
282//FIXME same as above ( Qobject )
278class OWaveLanManagementIBSS : public QObject 283class OWaveLanManagementIBSS : public QObject
279{ 284{
280 Q_OBJECT 285 Q_OBJECT
281 286
282 public: 287 public:
283 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 ); 288 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 );
284 virtual ~OWaveLanManagementIBSS(); 289 virtual ~OWaveLanManagementIBSS();
285 290
286 private: 291 private:
287 const struct ibss_t* _data; 292 const struct ibss_t* _data;
288}; 293};
289 294
290/*====================================================================================== 295/*======================================================================================
291 * OWaveLanManagementChallenge 296 * OWaveLanManagementChallenge
292 *======================================================================================*/ 297 *======================================================================================*/
293 298
299// Qobject do we need that??
294class OWaveLanManagementChallenge : public QObject 300class OWaveLanManagementChallenge : public QObject
295{ 301{
296 Q_OBJECT 302 Q_OBJECT
297 303
298 public: 304 public:
299 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 ); 305 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 );
300 virtual ~OWaveLanManagementChallenge(); 306 virtual ~OWaveLanManagementChallenge();
301 307
302 private: 308 private:
303 const struct challenge_t* _data; 309 const struct challenge_t* _data;
304}; 310};
305 311
306/*====================================================================================== 312/*======================================================================================
307 * OWaveLanDataPacket - type: data (T_DATA) 313 * OWaveLanDataPacket - type: data (T_DATA)
308 *======================================================================================*/ 314 *======================================================================================*/
309 315// Qobject?
310class OWaveLanDataPacket : public QObject 316class OWaveLanDataPacket : public QObject
311{ 317{
312 Q_OBJECT 318 Q_OBJECT
313 319
314 public: 320 public:
315 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 ); 321 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 );
316 virtual ~OWaveLanDataPacket(); 322 virtual ~OWaveLanDataPacket();
317 323
318 private: 324 private:
319 const struct ieee_802_11_data_header* _header; 325 const struct ieee_802_11_data_header* _header;
320}; 326};
321 327
322/*====================================================================================== 328/*======================================================================================
323 * OWaveLanControlPacket - type: control (T_CTRL) 329 * OWaveLanControlPacket - type: control (T_CTRL)
324 *======================================================================================*/ 330 *======================================================================================*/
325 331// Qobject needed?
326class OWaveLanControlPacket : public QObject 332class OWaveLanControlPacket : public QObject
327{ 333{
328 Q_OBJECT 334 Q_OBJECT
329 335
330 public: 336 public:
331 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 ); 337 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 );
332 virtual ~OWaveLanControlPacket(); 338 virtual ~OWaveLanControlPacket();
333 339
334 private: 340 private:
335 const struct ieee_802_11_control_header* _header; 341 const struct ieee_802_11_control_header* _header;
336}; 342};
337 343
338/*====================================================================================== 344/*======================================================================================
339 * OLLCPacket - IEEE 802.2 Link Level Control 345 * OLLCPacket - IEEE 802.2 Link Level Control
340 *======================================================================================*/ 346 *======================================================================================*/
341 347
348// QObject needed?
342class OLLCPacket : public QObject 349class OLLCPacket : public QObject
343{ 350{
344 Q_OBJECT 351 Q_OBJECT
345 352
346 public: 353 public:
347 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 ); 354 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 );
348 virtual ~OLLCPacket(); 355 virtual ~OLLCPacket();
349 356
350 private: 357 private:
358 //FIXME how to get that header?
351 const struct ieee_802_11_802_2_header* _header; 359 const struct ieee_802_11_802_2_header* _header;
352}; 360};
353 361
354/*====================================================================================== 362/*======================================================================================
355 * OIPPacket 363 * OIPPacket
356 *======================================================================================*/ 364 *======================================================================================*/
357 365
366// Qobject as baseclass?
358class OIPPacket : public QObject 367class OIPPacket : public QObject
359{ 368{
360 Q_OBJECT 369 Q_OBJECT
361 370
362 public: 371 public:
363 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 ); 372 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 );
364 virtual ~OIPPacket(); 373 virtual ~OIPPacket();
365 374
366 QHostAddress fromIPAddress() const; 375 QHostAddress fromIPAddress() const;
367 QHostAddress toIPAddress() const; 376 QHostAddress toIPAddress() const;
368 377
369 int tos() const; 378 int tos() const;
370 int len() const; 379 int len() const;
371 int id() const; 380 int id() const;
372 int offset() const; 381 int offset() const;
373 int ttl() const; 382 int ttl() const;
374 int protocol() const; 383 int protocol() const;
375 int checksum() const; 384 int checksum() const;
376 385
377 private: 386 private:
378 const struct iphdr* _iphdr; 387 const struct iphdr* _iphdr;
379}; 388};
380 389
381/*====================================================================================== 390/*======================================================================================
382 * OUDPPacket 391 * OUDPPacket
383 *======================================================================================*/ 392 *======================================================================================*/
384 393// QObject?
385class OUDPPacket : public QObject 394class OUDPPacket : public QObject
386{ 395{
387 Q_OBJECT 396 Q_OBJECT
388 397
389 public: 398 public:
390 OUDPPacket( const unsigned char*, const struct udphdr*, QObject* parent = 0 ); 399 OUDPPacket( const unsigned char*, const struct udphdr*, QObject* parent = 0 );
391 virtual ~OUDPPacket(); 400 virtual ~OUDPPacket();
392 401
393 int fromPort() const; 402 int fromPort() const;
394 int toPort() const; 403 int toPort() const;
395 404
396 private: 405 private:
397 const struct udphdr* _udphdr; 406 const struct udphdr* _udphdr;
398}; 407};
399 408
400/*====================================================================================== 409/*======================================================================================
401 * OTCPPacket 410 * OTCPPacket
402 *======================================================================================*/ 411 *======================================================================================*/
403 412
413// Qobect needed?
404class OTCPPacket : public QObject 414class OTCPPacket : public QObject
405{ 415{
406 Q_OBJECT 416 Q_OBJECT
407 417
408 public: 418 public:
409 OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 ); 419 OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 );
410 virtual ~OTCPPacket(); 420 virtual ~OTCPPacket();
411 421
412 int fromPort() const; 422 int fromPort() const;
413 int toPort() const; 423 int toPort() const;
414 424
415 private: 425 private:
416 const struct tcphdr* _tcphdr; 426 const struct tcphdr* _tcphdr;
417}; 427};
418 428
419 429
420/*====================================================================================== 430/*======================================================================================
421 * OPacketCapturer 431 * OPacketCapturer
422 *======================================================================================*/ 432 *======================================================================================*/
423 433
424/** 434/**
425 * @brief A class based wrapper for network packet capturing. 435 * @brief A class based wrapper for network packet capturing.
426 * 436 *
427 * This class is the base of a high-level interface to the well known packet capturing 437 * This class is the base of a high-level interface to the well known packet capturing
428 * library libpcap. ... 438 * library libpcap. ...
429 */ 439 */
430class OPacketCapturer : public QObject 440class OPacketCapturer : public QObject
431{ 441{
432 Q_OBJECT 442 Q_OBJECT
433 443
434 public: 444 public:
435 /** 445 /**
436 * Constructor. 446 * Constructor.
437 */ 447 */
438 OPacketCapturer( QObject* parent = 0, const char* name = 0 ); 448 OPacketCapturer( QObject* parent = 0, const char* name = 0 );
439 /** 449 /**
440 * Destructor. 450 * Destructor.
441 */ 451 */
442 ~OPacketCapturer(); 452 ~OPacketCapturer();
443 /** 453 /**
444 * Setting the packet capturer to use blocking IO calls can be useful when 454 * Setting the packet capturer to use blocking IO calls can be useful when
445 * not using the socket notifier, e.g. without an application object. 455 * not using the socket notifier, e.g. without an application object.
446 */ 456 */
447 void setBlocking( bool ); 457 void setBlocking( bool );
448 /** 458 /**
449 * @returns true if the packet capturer uses blocking IO calls. 459 * @returns true if the packet capturer uses blocking IO calls.
450 */ 460 */
451 bool blocking() const; 461 bool blocking() const;
452 /** 462 /**
453 * Closes the packet capturer. This is automatically done in the destructor. 463 * Closes the packet capturer. This is automatically done in the destructor.
454 */ 464 */
455 void close(); 465 void close();
456 /** 466 /**
457 * @returns the data link type. 467 * @returns the data link type.
458 * @see <pcap.h> for possible values. 468 * @see <pcap.h> for possible values.
459 */ 469 */
460 int dataLink() const; 470 int dataLink() const;
461 /** 471 /**
462 * @returns the filedescriptor of the packet capturer. This is only useful, if 472 * @returns the filedescriptor of the packet capturer. This is only useful, if
463 * not using the socket notifier, e.g. without an application object. 473 * not using the socket notifier, e.g. without an application object.
464 */ 474 */
465 int fileno() const; 475 int fileno() const;
466 /** 476 /**
467 * @returns the next @ref OPacket from the packet capturer. 477 * @returns the next @ref OPacket from the packet capturer.
468 * @note If blocking mode is true then this call might block. 478 * @note If blocking mode is true then this call might block.
469 */ 479 */
470 OPacket* next(); 480 OPacket* next();
471 /** 481 /**
472 * Open the packet capturer to capture packets in live-mode from @a interface. 482 * Open the packet capturer to capture packets in live-mode from @a interface.
473 * If a @a filename is given, all captured packets are output to a tcpdump-compatible capture file. 483 * If a @a filename is given, all captured packets are output to a tcpdump-compatible capture file.
474 */ 484 */
475 bool open( const QString& interface, const QString& filename = QString::null ); 485 bool open( const QString& interface, const QString& filename = QString::null );
476 /** 486 /**
477 * Open the packet capturer to capture packets in offline-mode from @a file. 487 * Open the packet capturer to capture packets in offline-mode from @a file.
478 */ 488 */
479 bool open( const QFile& file ); 489 bool open( const QFile& file );
480 /** 490 /**
481 * @returns true if the packet capturer is open 491 * @returns true if the packet capturer is open
482 */ 492 */
483 bool isOpen() const; 493 bool isOpen() const;
484 494
485 const QMap<QString,int>& statistics() const; 495 const QMap<QString,int>& statistics() const;
486 496
487 signals: 497 signals:
488 /** 498 /**
489 * This signal is emitted, when a packet has been received. 499 * This signal is emitted, when a packet has been received.
490 */ 500 */
491 void receivedPacket( OPacket* ); 501 void receivedPacket( OPacket* );
492 502
493 protected slots: 503 protected slots:
494 void readyToReceive(); 504 void readyToReceive();
495 505
496 protected: 506 protected:
497 QString _name; // devicename 507 QString _name; // devicename
498 bool _open; // check this before doing pcap calls 508 bool _open; // check this before doing pcap calls
499 pcap_t* _pch; // pcap library handle 509 pcap_t* _pch; // pcap library handle
500 pcap_dumper_t* _pcd; // pcap dumper handle 510 pcap_dumper_t* _pcd; // pcap dumper handle
501 QSocketNotifier* _sn; // socket notifier for main loop 511 QSocketNotifier* _sn; // socket notifier for main loop
502 mutable char _errbuf[PCAP_ERRBUF_SIZE]; // holds error strings from libpcap 512 mutable char _errbuf[PCAP_ERRBUF_SIZE]; // holds error strings from libpcap
503 QMap<QString, int> _stats; // statistics; 513 QMap<QString, int> _stats; // statistics;
504}; 514};
505 515
506#endif // OPCAP_H 516#endif // OPCAP_H
507 517