summaryrefslogtreecommitdiff
path: root/libopie2/opienet
Unidiff
Diffstat (limited to 'libopie2/opienet') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetutils.cpp7
-rw-r--r--libopie2/opienet/onetutils.h1
-rw-r--r--libopie2/opienet/opcap.cpp27
-rw-r--r--libopie2/opienet/opcap.h5
4 files changed, 38 insertions, 2 deletions
diff --git a/libopie2/opienet/onetutils.cpp b/libopie2/opienet/onetutils.cpp
index 08c40b4..ad0e89d 100644
--- a/libopie2/opienet/onetutils.cpp
+++ b/libopie2/opienet/onetutils.cpp
@@ -1,190 +1,195 @@
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#include <opie2/onetutils.h> 32#include <opie2/onetutils.h>
33#include <opie2/onetwork.h> 33#include <opie2/onetwork.h>
34#include <opie2/omanufacturerdb.h> 34#include <opie2/omanufacturerdb.h>
35 35
36#include <net/if.h> 36#include <net/if.h>
37 37
38#include <cstdio> 38#include <cstdio>
39using namespace std; 39using namespace std;
40 40
41#define IW_PRIV_TYPE_MASK 0x7000 41#define IW_PRIV_TYPE_MASK 0x7000
42#define IW_PRIV_TYPE_NONE 0x0000 42#define IW_PRIV_TYPE_NONE 0x0000
43#define IW_PRIV_TYPE_BYTE 0x1000 43#define IW_PRIV_TYPE_BYTE 0x1000
44#define IW_PRIV_TYPE_CHAR 0x2000 44#define IW_PRIV_TYPE_CHAR 0x2000
45#define IW_PRIV_TYPE_INT 0x4000 45#define IW_PRIV_TYPE_INT 0x4000
46#define IW_PRIV_TYPE_FLOAT 0x5000 46#define IW_PRIV_TYPE_FLOAT 0x5000
47#define IW_PRIV_TYPE_ADDR 0x6000 47#define IW_PRIV_TYPE_ADDR 0x6000
48#define IW_PRIV_SIZE_FIXED 0x0800 48#define IW_PRIV_SIZE_FIXED 0x0800
49#define IW_PRIV_SIZE_MASK 0x07FF 49#define IW_PRIV_SIZE_MASK 0x07FF
50 50
51/*====================================================================================== 51/*======================================================================================
52 * OMacAddress 52 * OMacAddress
53 *======================================================================================*/ 53 *======================================================================================*/
54 54
55// static initializer for broadcast and unknown MAC Adresses 55// static initializer for broadcast and unknown MAC Adresses
56const unsigned char __broadcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 56const unsigned char __broadcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
57const OMacAddress& OMacAddress::broadcast = OMacAddress( __broadcast ); 57const OMacAddress& OMacAddress::broadcast = OMacAddress( __broadcast );
58const unsigned char __unknown[6] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }; 58const unsigned char __unknown[6] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };
59const OMacAddress& OMacAddress::unknown = OMacAddress( __unknown ); 59const OMacAddress& OMacAddress::unknown = OMacAddress( __unknown );
60 60
61//TODO: Incorporate Ethernet Manufacturer database here! (inline or so)
62
63OMacAddress::OMacAddress()
64{
65 memcpy( _bytes, __unknown, 6 );
66}
61 67
62//TODO: Incorporate Ethernet Manufacturer database here!
63 68
64OMacAddress::OMacAddress( unsigned char* p ) 69OMacAddress::OMacAddress( unsigned char* p )
65{ 70{
66 memcpy( _bytes, p, 6 ); 71 memcpy( _bytes, p, 6 );
67} 72}
68 73
69 74
70OMacAddress::OMacAddress( const unsigned char* p ) 75OMacAddress::OMacAddress( const unsigned char* p )
71{ 76{
72 memcpy( _bytes, p, 6 ); 77 memcpy( _bytes, p, 6 );
73} 78}
74 79
75 80
76OMacAddress::OMacAddress( struct ifreq& ifr ) 81OMacAddress::OMacAddress( struct ifreq& ifr )
77{ 82{
78 memcpy( _bytes, ifr.ifr_hwaddr.sa_data, 6 ); 83 memcpy( _bytes, ifr.ifr_hwaddr.sa_data, 6 );
79} 84}
80 85
81 86
82OMacAddress::~OMacAddress() 87OMacAddress::~OMacAddress()
83{ 88{
84} 89}
85 90
86 91
87//#ifdef QT_NO_DEBUG 92//#ifdef QT_NO_DEBUG
88//inline 93//inline
89//#endif 94//#endif
90const unsigned char* OMacAddress::native() const 95const unsigned char* OMacAddress::native() const
91{ 96{
92 return (const unsigned char*) &_bytes; 97 return (const unsigned char*) &_bytes;
93} 98}
94 99
95 100
96OMacAddress OMacAddress::fromString( const QString& str ) 101OMacAddress OMacAddress::fromString( const QString& str )
97{ 102{
98 QString addr( str ); 103 QString addr( str );
99 unsigned char buf[6]; 104 unsigned char buf[6];
100 bool ok = true; 105 bool ok = true;
101 int index = 14; 106 int index = 14;
102 for ( int i = 5; i >= 0; --i ) 107 for ( int i = 5; i >= 0; --i )
103 { 108 {
104 buf[i] = addr.right( 2 ).toUShort( &ok, 16 ); 109 buf[i] = addr.right( 2 ).toUShort( &ok, 16 );
105 if ( !ok ) return OMacAddress::unknown; 110 if ( !ok ) return OMacAddress::unknown;
106 addr.truncate( index ); 111 addr.truncate( index );
107 index -= 3; 112 index -= 3;
108 } 113 }
109 return (const unsigned char*) &buf; 114 return (const unsigned char*) &buf;
110} 115}
111 116
112 117
113QString OMacAddress::toString( bool substitute ) const 118QString OMacAddress::toString( bool substitute ) const
114{ 119{
115 QString manu; 120 QString manu;
116 manu.sprintf( "%.2X:%.2X:%.2X", _bytes[0]&0xff, _bytes[1]&0xff, _bytes[2]&0xff ); 121 manu.sprintf( "%.2X:%.2X:%.2X", _bytes[0]&0xff, _bytes[1]&0xff, _bytes[2]&0xff );
117 QString serial; 122 QString serial;
118 serial.sprintf( ":%.2X:%.2X:%.2X", _bytes[3]&0xff, _bytes[4]&0xff, _bytes[5]&0xff ); 123 serial.sprintf( ":%.2X:%.2X:%.2X", _bytes[3]&0xff, _bytes[4]&0xff, _bytes[5]&0xff );
119 if ( !substitute ) return manu+serial; 124 if ( !substitute ) return manu+serial;
120 // fallback - if no vendor is found, just use the number 125 // fallback - if no vendor is found, just use the number
121 QString textmanu = OManufacturerDB::instance()->lookup( manu ); 126 QString textmanu = OManufacturerDB::instance()->lookup( manu );
122 return textmanu.isNull() ? manu+serial : textmanu+serial; 127 return textmanu.isNull() ? manu+serial : textmanu+serial;
123} 128}
124 129
125 130
126QString OMacAddress::manufacturer() const 131QString OMacAddress::manufacturer() const
127{ 132{
128 return OManufacturerDB::instance()->lookupExt( toString() ); 133 return OManufacturerDB::instance()->lookupExt( toString() );
129} 134}
130 135
131 136
132bool operator==( const OMacAddress &m1, const OMacAddress &m2 ) 137bool operator==( const OMacAddress &m1, const OMacAddress &m2 )
133{ 138{
134 return memcmp( &m1._bytes, &m2._bytes, 6 ) == 0; 139 return memcmp( &m1._bytes, &m2._bytes, 6 ) == 0;
135} 140}
136 141
137 142
138/*====================================================================================== 143/*======================================================================================
139 * OHostAddress 144 * OHostAddress
140 *======================================================================================*/ 145 *======================================================================================*/
141 146
142 147
143/*====================================================================================== 148/*======================================================================================
144 * OPrivateIOCTL 149 * OPrivateIOCTL
145 *======================================================================================*/ 150 *======================================================================================*/
146 151
147OPrivateIOCTL::OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs ) 152OPrivateIOCTL::OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs )
148 :QObject( parent, name ), _ioctl( cmd ), _getargs( getargs ), _setargs( setargs ) 153 :QObject( parent, name ), _ioctl( cmd ), _getargs( getargs ), _setargs( setargs )
149{ 154{
150} 155}
151 156
152 157
153OPrivateIOCTL::~OPrivateIOCTL() 158OPrivateIOCTL::~OPrivateIOCTL()
154{ 159{
155} 160}
156 161
157 162
158int OPrivateIOCTL::numberGetArgs() const 163int OPrivateIOCTL::numberGetArgs() const
159{ 164{
160 return _getargs & IW_PRIV_SIZE_MASK; 165 return _getargs & IW_PRIV_SIZE_MASK;
161} 166}
162 167
163 168
164int OPrivateIOCTL::typeGetArgs() const 169int OPrivateIOCTL::typeGetArgs() const
165{ 170{
166 return _getargs & IW_PRIV_TYPE_MASK >> 12; 171 return _getargs & IW_PRIV_TYPE_MASK >> 12;
167} 172}
168 173
169 174
170int OPrivateIOCTL::numberSetArgs() const 175int OPrivateIOCTL::numberSetArgs() const
171{ 176{
172 return _setargs & IW_PRIV_SIZE_MASK; 177 return _setargs & IW_PRIV_SIZE_MASK;
173} 178}
174 179
175 180
176int OPrivateIOCTL::typeSetArgs() const 181int OPrivateIOCTL::typeSetArgs() const
177{ 182{
178 return _setargs & IW_PRIV_TYPE_MASK >> 12; 183 return _setargs & IW_PRIV_TYPE_MASK >> 12;
179} 184}
180 185
181 186
182void OPrivateIOCTL::invoke() const 187void OPrivateIOCTL::invoke() const
183{ 188{
184 ( (OWirelessNetworkInterface*) parent() )->wioctl( _ioctl ); 189 ( (OWirelessNetworkInterface*) parent() )->wioctl( _ioctl );
185} 190}
186 191
187 192
188void OPrivateIOCTL::setParameter( int num, u_int32_t value ) 193void OPrivateIOCTL::setParameter( int num, u_int32_t value )
189{ 194{
190 u_int32_t* arglist = (u_int32_t*) &( (OWirelessNetworkInterface*) parent() )->_iwr.u.name; 195 u_int32_t* arglist = (u_int32_t*) &( (OWirelessNetworkInterface*) parent() )->_iwr.u.name;
diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h
index 9611518..18731ba 100644
--- a/libopie2/opienet/onetutils.h
+++ b/libopie2/opienet/onetutils.h
@@ -1,161 +1,162 @@
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 // QString c'tor? -zecke
54 OMacAddress();
54 OMacAddress( unsigned char* ); 55 OMacAddress( unsigned char* );
55 OMacAddress( const unsigned char* ); 56 OMacAddress( const unsigned char* );
56 OMacAddress( struct ifreq& ); 57 OMacAddress( struct ifreq& );
57 ~OMacAddress(); 58 ~OMacAddress();
58 59
59 QString manufacturer() const; 60 QString manufacturer() const;
60 QString toString( bool substitute = false ) const; 61 QString toString( bool substitute = false ) const;
61 const unsigned char* native() const; 62 const unsigned char* native() const;
62 63
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? 64 // no c'tor but this one why not make it a c'tor. it could also replace the others or is this the problem?
64 static OMacAddress fromString( const QString& ); 65 static OMacAddress fromString( const QString& );
65 66
66 public: 67 public:
67 static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff 68 static const OMacAddress& broadcast; // ff:ff:ff:ff:ff:ff
68 static const OMacAddress& unknown; // 44:44:44:44:44:44 69 static const OMacAddress& unknown; // 44:44:44:44:44:44
69 70
70 private: 71 private:
71 unsigned char _bytes[6]; 72 unsigned char _bytes[6];
72 73
73 friend bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); 74 friend bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
74 75
75}; 76};
76 77
77bool operator==( const OMacAddress &m1, const OMacAddress &m2 ); 78bool operator==( const OMacAddress &m1, const OMacAddress &m2 );
78 79
79 80
80/*====================================================================================== 81/*======================================================================================
81 * OHostAddress 82 * OHostAddress
82 *======================================================================================*/ 83 *======================================================================================*/
83 84
84class OHostAddress : public QHostAddress 85class OHostAddress : public QHostAddress
85{ 86{
86 public: 87 public:
87 OHostAddress(); 88 OHostAddress();
88 ~OHostAddress(); 89 ~OHostAddress();
89}; 90};
90 91
91 92
92/*====================================================================================== 93/*======================================================================================
93 * OPrivateIOCTL 94 * OPrivateIOCTL
94 *======================================================================================*/ 95 *======================================================================================*/
95 96
96class OPrivateIOCTL : public QObject 97class OPrivateIOCTL : public QObject
97{ 98{
98 public: 99 public:
99 OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs ); 100 OPrivateIOCTL( QObject* parent, const char* name, int cmd, int getargs, int setargs );
100 ~OPrivateIOCTL(); 101 ~OPrivateIOCTL();
101 102
102 int numberGetArgs() const; 103 int numberGetArgs() const;
103 int typeGetArgs() const; 104 int typeGetArgs() const;
104 int numberSetArgs() const; 105 int numberSetArgs() const;
105 int typeSetArgs() const; 106 int typeSetArgs() const;
106 107
107 // FIXME return int? as ::ioctl does? -zecke 108 // FIXME return int? as ::ioctl does? -zecke
108 void invoke() const; 109 void invoke() const;
109 void setParameter( int, u_int32_t ); 110 void setParameter( int, u_int32_t );
110 111
111 private: 112 private:
112 u_int32_t _ioctl; 113 u_int32_t _ioctl;
113 u_int16_t _getargs; 114 u_int16_t _getargs;
114 u_int16_t _setargs; 115 u_int16_t _setargs;
115 116
116}; 117};
117 118
118 /*====================================================================================== 119 /*======================================================================================
119 * Miscellaneous 120 * Miscellaneous
120 *======================================================================================*/ 121 *======================================================================================*/
121 122
122/* dump bytes */ 123/* dump bytes */
123 124
124void dumpBytes( const unsigned char* data, int num ); 125void dumpBytes( const unsigned char* data, int num );
125 126
126/* Network to host order macros */ 127/* Network to host order macros */
127 128
128#ifdef LBL_ALIGN 129#ifdef LBL_ALIGN
129#define EXTRACT_16BITS(p) \ 130#define EXTRACT_16BITS(p) \
130 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \ 131 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \
131 (u_int16_t)*((const u_int8_t *)(p) + 1))) 132 (u_int16_t)*((const u_int8_t *)(p) + 1)))
132#define EXTRACT_32BITS(p) \ 133#define EXTRACT_32BITS(p) \
133 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \ 134 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \
134 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \ 135 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \
135 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \ 136 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \
136 (u_int32_t)*((const u_int8_t *)(p) + 3))) 137 (u_int32_t)*((const u_int8_t *)(p) + 3)))
137#else 138#else
138#define EXTRACT_16BITS(p) \ 139#define EXTRACT_16BITS(p) \
139 ((u_int16_t)ntohs(*(const u_int16_t *)(p))) 140 ((u_int16_t)ntohs(*(const u_int16_t *)(p)))
140#define EXTRACT_32BITS(p) \ 141#define EXTRACT_32BITS(p) \
141 ((u_int32_t)ntohl(*(const u_int32_t *)(p))) 142 ((u_int32_t)ntohl(*(const u_int32_t *)(p)))
142#endif 143#endif
143 144
144#define EXTRACT_24BITS(p) \ 145#define EXTRACT_24BITS(p) \
145 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \ 146 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \
146 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 147 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
147 (u_int32_t)*((const u_int8_t *)(p) + 2))) 148 (u_int32_t)*((const u_int8_t *)(p) + 2)))
148 149
149/* Little endian protocol host order macros */ 150/* Little endian protocol host order macros */
150#define EXTRACT_LE_8BITS(p) (*(p)) 151#define EXTRACT_LE_8BITS(p) (*(p))
151#define EXTRACT_LE_16BITS(p) \ 152#define EXTRACT_LE_16BITS(p) \
152 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \ 153 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \
153 (u_int16_t)*((const u_int8_t *)(p) + 0))) 154 (u_int16_t)*((const u_int8_t *)(p) + 0)))
154#define EXTRACT_LE_32BITS(p) \ 155#define EXTRACT_LE_32BITS(p) \
155 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \ 156 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \
156 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \ 157 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \
157 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 158 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
158 (u_int32_t)*((const u_int8_t *)(p) + 0))) 159 (u_int32_t)*((const u_int8_t *)(p) + 0)))
159 160
160#endif // ONETUTILS_H 161#endif // ONETUTILS_H
161 162
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index 7a6f61b..313f5bb 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -1,238 +1,261 @@
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/opcap.h> 36#include <opie2/opcap.h>
37 37
38/* QT */ 38/* QT */
39 39
40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) 40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects)
41#include <qsocketnotifier.h> 41#include <qsocketnotifier.h>
42#include <qobjectlist.h> 42#include <qobjectlist.h>
43 43
44#include "udp_ports.h" 44#include "udp_ports.h"
45 45
46/*====================================================================================== 46/*======================================================================================
47 * OPacket 47 * OPacket
48 *======================================================================================*/ 48 *======================================================================================*/
49 49
50OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) 50OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent )
51 :QObject( parent, "Generic" ), _hdr( header ), _data( data ) 51 :QObject( parent, "Generic" ), _hdr( header ), _data( data )
52{ 52{
53 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); 53 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen );
54 54
55 _end = (unsigned char*) data + header.len; 55 _end = (unsigned char*) data + header.len;
56 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); 56 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end );
57 57
58 switch ( datalink ) 58 switch ( datalink )
59 { 59 {
60 case DLT_EN10MB: 60 case DLT_EN10MB:
61 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); 61 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" );
62 new OEthernetPacket( _end, (const struct ether_header*) data, this ); 62 new OEthernetPacket( _end, (const struct ether_header*) data, this );
63 break; 63 break;
64 64
65 case DLT_IEEE802_11: 65 case DLT_IEEE802_11:
66 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); 66 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" );
67 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); 67 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this );
68 break; 68 break;
69 69
70 case DLT_PRISM_HEADER: 70 case DLT_PRISM_HEADER:
71 qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" ); 71 qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" );
72 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this ); 72 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this );
73 break; 73 break;
74 74
75 default: 75 default:
76 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink (type %d)!", datalink ); 76 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink (type %d)!", datalink );
77 } 77 }
78} 78}
79 79
80 80
81OPacket::~OPacket() 81OPacket::~OPacket()
82{ 82{
83} 83}
84 84
85 85
86timevalstruct OPacket::timeval() const 86timevalstruct OPacket::timeval() const
87{ 87{
88 return _hdr.ts; 88 return _hdr.ts;
89} 89}
90 90
91 91
92int OPacket::caplen() const 92int OPacket::caplen() const
93{ 93{
94 return _hdr.caplen; 94 return _hdr.caplen;
95} 95}
96 96
97 97
98void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) 98void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l )
99{ 99{
100 if (!l) return; 100 if (!l) return;
101 QObject* o = l->first(); 101 QObject* o = l->first();
102 while ( o ) 102 while ( o )
103 { 103 {
104 stats[o->name()]++; 104 stats[o->name()]++;
105 updateStats( stats, const_cast<QObjectList*>( o->children() ) ); 105 updateStats( stats, const_cast<QObjectList*>( o->children() ) );
106 o = l->next(); 106 o = l->next();
107 } 107 }
108} 108}
109 109
110 110
111void OPacket::dumpStructure( QObjectList* l )
112{
113 QString packetString( "[ |" + _dumpStructure( l ) + " ]" );
114 qDebug( "OPacket::dumpStructure: %s", (const char*) packetString );
115}
116
117
118QString OPacket::_dumpStructure( QObjectList* l )
119{
120 if (!l) return QString::null;
121 QObject* o = l->first();
122 QString str(" ");
123
124 while ( o )
125 {
126 str.append( o->name() );
127 str.append( " |" );
128 str += _dumpStructure( const_cast<QObjectList*>( o->children() ) );
129 o = l->next();
130 }
131 return str;
132}
133
111QString OPacket::dump( int bpl ) const 134QString OPacket::dump( int bpl ) const
112{ 135{
113 static int index = 0; 136 static int index = 0;
114 index++; 137 index++;
115 int len = _hdr.caplen; 138 int len = _hdr.caplen;
116 QString str; 139 QString str;
117 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); 140 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len );
118 str.append( "0000: " ); 141 str.append( "0000: " );
119 QString tmp; 142 QString tmp;
120 QString bytes; 143 QString bytes;
121 QString chars; 144 QString chars;
122 145
123 for ( int i = 0; i < len; ++i ) 146 for ( int i = 0; i < len; ++i )
124 { 147 {
125 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); 148 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp );
126 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); 149 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] );
127 else chars.append( '.' ); 150 else chars.append( '.' );
128 151
129 if ( !((i+1) % bpl) ) 152 if ( !((i+1) % bpl) )
130 { 153 {
131 str.append( bytes ); 154 str.append( bytes );
132 str.append( ' ' ); 155 str.append( ' ' );
133 str.append( chars ); 156 str.append( chars );
134 str.append( '\n' ); 157 str.append( '\n' );
135 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); 158 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp );
136 bytes = ""; 159 bytes = "";
137 chars = ""; 160 chars = "";
138 } 161 }
139 162
140 } 163 }
141 if ( (len % bpl) ) 164 if ( (len % bpl) )
142 { 165 {
143 str.append( bytes.leftJustify( 1 + 3*bpl ) ); 166 str.append( bytes.leftJustify( 1 + 3*bpl ) );
144 str.append( chars ); 167 str.append( chars );
145 } 168 }
146 str.append( '\n' ); 169 str.append( '\n' );
147 return str; 170 return str;
148} 171}
149 172
150 173
151int OPacket::len() const 174int OPacket::len() const
152{ 175{
153 return _hdr.len; 176 return _hdr.len;
154} 177}
155 178
156 179
157/*====================================================================================== 180/*======================================================================================
158 * OEthernetPacket 181 * OEthernetPacket
159 *======================================================================================*/ 182 *======================================================================================*/
160 183
161OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) 184OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent )
162 :QObject( parent, "Ethernet" ), _ether( data ) 185 :QObject( parent, "Ethernet" ), _ether( data )
163{ 186{
164 187
165 qDebug( "Source = %s", (const char*) sourceAddress().toString() ); 188 qDebug( "Source = %s", (const char*) sourceAddress().toString() );
166 qDebug( "Destination = %s", (const char*) destinationAddress().toString() ); 189 qDebug( "Destination = %s", (const char*) destinationAddress().toString() );
167 190
168 if ( sourceAddress() == OMacAddress::broadcast ) 191 if ( sourceAddress() == OMacAddress::broadcast )
169 qDebug( "Source is broadcast address" ); 192 qDebug( "Source is broadcast address" );
170 if ( destinationAddress() == OMacAddress::broadcast ) 193 if ( destinationAddress() == OMacAddress::broadcast )
171 qDebug( "Destination is broadcast address" ); 194 qDebug( "Destination is broadcast address" );
172 195
173 switch ( type() ) 196 switch ( type() )
174 { 197 {
175 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; 198 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break;
176 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } 199 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; }
177 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } 200 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; }
178 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); 201 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" );
179 } 202 }
180 203
181} 204}
182 205
183 206
184OEthernetPacket::~OEthernetPacket() 207OEthernetPacket::~OEthernetPacket()
185{ 208{
186} 209}
187 210
188 211
189OMacAddress OEthernetPacket::sourceAddress() const 212OMacAddress OEthernetPacket::sourceAddress() const
190{ 213{
191 return OMacAddress( _ether->ether_shost ); 214 return OMacAddress( _ether->ether_shost );
192} 215}
193 216
194 217
195OMacAddress OEthernetPacket::destinationAddress() const 218OMacAddress OEthernetPacket::destinationAddress() const
196{ 219{
197 return OMacAddress( _ether->ether_dhost ); 220 return OMacAddress( _ether->ether_dhost );
198} 221}
199 222
200int OEthernetPacket::type() const 223int OEthernetPacket::type() const
201{ 224{
202 return ntohs( _ether->ether_type ); 225 return ntohs( _ether->ether_type );
203} 226}
204 227
205 228
206/*====================================================================================== 229/*======================================================================================
207 * OIPPacket 230 * OIPPacket
208 *======================================================================================*/ 231 *======================================================================================*/
209 232
210 233
211OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) 234OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent )
212 :QObject( parent, "IP" ), _iphdr( data ) 235 :QObject( parent, "IP" ), _iphdr( data )
213{ 236{
214 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); 237 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." );
215 238
216 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) ); 239 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) );
217 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) ); 240 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) );
218 241
219 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() ); 242 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() );
220 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); 243 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() );
221 244
222 switch ( protocol() ) 245 switch ( protocol() )
223 { 246 {
224 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; 247 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break;
225 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; 248 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break;
226 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); 249 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() );
227 } 250 }
228 251
229} 252}
230 253
231OIPPacket::~OIPPacket() 254OIPPacket::~OIPPacket()
232{ 255{
233} 256}
234 257
235 258
236QHostAddress OIPPacket::fromIPAddress() const 259QHostAddress OIPPacket::fromIPAddress() const
237{ 260{
238 return EXTRACT_32BITS( &_iphdr->saddr ); 261 return EXTRACT_32BITS( &_iphdr->saddr );
@@ -991,257 +1014,259 @@ OWaveLanControlPacket::~OWaveLanControlPacket()
991{ 1014{
992} 1015}
993 1016
994 1017
995/*====================================================================================== 1018/*======================================================================================
996 * OPacketCapturer 1019 * OPacketCapturer
997 *======================================================================================*/ 1020 *======================================================================================*/
998 1021
999OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) 1022OPacketCapturer::OPacketCapturer( QObject* parent, const char* name )
1000 :QObject( parent, name ), _name( QString::null ), _open( false ), 1023 :QObject( parent, name ), _name( QString::null ), _open( false ),
1001 _pch( 0 ), _pcd( 0 ), _sn( 0 ) 1024 _pch( 0 ), _pcd( 0 ), _sn( 0 )
1002{ 1025{
1003} 1026}
1004 1027
1005 1028
1006OPacketCapturer::~OPacketCapturer() 1029OPacketCapturer::~OPacketCapturer()
1007{ 1030{
1008 if ( _open ) 1031 if ( _open )
1009 { 1032 {
1010 qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." ); 1033 qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." );
1011 close(); 1034 close();
1012 } 1035 }
1013} 1036}
1014 1037
1015 1038
1016void OPacketCapturer::setBlocking( bool b ) 1039void OPacketCapturer::setBlocking( bool b )
1017{ 1040{
1018 if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 ) 1041 if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 )
1019 { 1042 {
1020 qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." ); 1043 qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." );
1021 } 1044 }
1022 else 1045 else
1023 { 1046 {
1024 qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf ); 1047 qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf );
1025 } 1048 }
1026} 1049}
1027 1050
1028 1051
1029bool OPacketCapturer::blocking() const 1052bool OPacketCapturer::blocking() const
1030{ 1053{
1031 int b = pcap_getnonblock( _pch, _errbuf ); 1054 int b = pcap_getnonblock( _pch, _errbuf );
1032 if ( b == -1 ) 1055 if ( b == -1 )
1033 { 1056 {
1034 qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf ); 1057 qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf );
1035 return -1; 1058 return -1;
1036 } 1059 }
1037 return !b; 1060 return !b;
1038} 1061}
1039 1062
1040 1063
1041void OPacketCapturer::closeDumpFile() 1064void OPacketCapturer::closeDumpFile()
1042{ 1065{
1043 if ( _pcd ) 1066 if ( _pcd )
1044 { 1067 {
1045 pcap_dump_close( _pcd ); 1068 pcap_dump_close( _pcd );
1046 _pcd = 0; 1069 _pcd = 0;
1047 } 1070 }
1048 pcap_close( _pch ); 1071 pcap_close( _pch );
1049} 1072}
1050 1073
1051 1074
1052void OPacketCapturer::close() 1075void OPacketCapturer::close()
1053{ 1076{
1054 if ( _open ) 1077 if ( _open )
1055 { 1078 {
1056 if ( _sn ) 1079 if ( _sn )
1057 { 1080 {
1058 _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 1081 _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
1059 delete _sn; 1082 delete _sn;
1060 } 1083 }
1061 closeDumpFile(); 1084 closeDumpFile();
1062 _open = false; 1085 _open = false;
1063 } 1086 }
1064 1087
1065 qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." ); 1088 qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." );
1066 qDebug( "--------------------------------------------------" ); 1089 qDebug( "--------------------------------------------------" );
1067 for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it ) 1090 for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it )
1068 qDebug( "%s : %d", (const char*) it.key(), it.data() ); 1091 qDebug( "%s : %d", (const char*) it.key(), it.data() );
1069 qDebug( "--------------------------------------------------" ); 1092 qDebug( "--------------------------------------------------" );
1070 1093
1071} 1094}
1072 1095
1073 1096
1074int OPacketCapturer::dataLink() const 1097int OPacketCapturer::dataLink() const
1075{ 1098{
1076 return pcap_datalink( _pch ); 1099 return pcap_datalink( _pch );
1077} 1100}
1078 1101
1079 1102
1080void OPacketCapturer::dump( OPacket* p ) 1103void OPacketCapturer::dump( OPacket* p )
1081{ 1104{
1082 if ( !_pcd ) 1105 if ( !_pcd )
1083 { 1106 {
1084 qWarning( "OPacketCapturer::dump() - cannot dump without open capture file!" ); 1107 qWarning( "OPacketCapturer::dump() - cannot dump without open capture file!" );
1085 return; 1108 return;
1086 } 1109 }
1087 pcap_dump( (u_char*) _pcd, &p->_hdr, p->_data ); 1110 pcap_dump( (u_char*) _pcd, &p->_hdr, p->_data );
1088} 1111}
1089 1112
1090 1113
1091int OPacketCapturer::fileno() const 1114int OPacketCapturer::fileno() const
1092{ 1115{
1093 if ( _open ) 1116 if ( _open )
1094 { 1117 {
1095 return pcap_fileno( _pch ); 1118 return pcap_fileno( _pch );
1096 } 1119 }
1097 else 1120 else
1098 { 1121 {
1099 return -1; 1122 return -1;
1100 } 1123 }
1101} 1124}
1102 1125
1103OPacket* OPacketCapturer::next() 1126OPacket* OPacketCapturer::next()
1104{ 1127{
1105 packetheaderstruct header; 1128 packetheaderstruct header;
1106 qDebug( "==> OPacketCapturer::next()" ); 1129 qDebug( "==> OPacketCapturer::next()" );
1107 const unsigned char* pdata = pcap_next( _pch, &header ); 1130 const unsigned char* pdata = pcap_next( _pch, &header );
1108 qDebug( "<== OPacketCapturer::next()" ); 1131 qDebug( "<== OPacketCapturer::next()" );
1109 1132
1110 if ( pdata && header.len ) 1133 if ( pdata && header.len )
1111 { 1134 {
1112 OPacket* p = new OPacket( dataLink(), header, pdata, 0 ); 1135 OPacket* p = new OPacket( dataLink(), header, pdata, 0 );
1113 // packets shouldn't be inserted in the QObject child-parent hierarchy, 1136 // packets shouldn't be inserted in the QObject child-parent hierarchy,
1114 // because due to memory constraints they will be deleted as soon 1137 // because due to memory constraints they will be deleted as soon
1115 // as possible - that is right after they have been processed 1138 // as possible - that is right after they have been processed
1116 // by emit() [ see below ] 1139 // by emit() [ see below ]
1117 //TODO: make gathering statistics optional, because it takes time 1140 //TODO: make gathering statistics optional, because it takes time
1118 p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) ); 1141 p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) );
1119 1142 #ifndef NODEBUG
1143 p->dumpStructure( const_cast<QObjectList*>( p->children() ) );
1144 #endif
1120 return p; 1145 return p;
1121 } 1146 }
1122 else 1147 else
1123 { 1148 {
1124 qWarning( "OPacketCapturer::next() - no packet received!" ); 1149 qWarning( "OPacketCapturer::next() - no packet received!" );
1125 return 0; 1150 return 0;
1126 } 1151 }
1127} 1152}
1128 1153
1129 1154
1130bool OPacketCapturer::open( const QString& name ) 1155bool OPacketCapturer::open( const QString& name )
1131{ 1156{
1132 if ( _open ) 1157 if ( _open )
1133 { 1158 {
1134 if ( name == _name ) // ignore opening an already openend device 1159 if ( name == _name ) // ignore opening an already openend device
1135 { 1160 {
1136 return true; 1161 return true;
1137 } 1162 }
1138 else // close the last opened device 1163 else // close the last opened device
1139 { 1164 {
1140 close(); 1165 close();
1141 } 1166 }
1142 } 1167 }
1143 1168
1144 _name = name; 1169 _name = name;
1145 1170
1146 // open libpcap 1171 // open libpcap
1147 pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] ); 1172 pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] );
1148 1173
1149 if ( !handle ) 1174 if ( !handle )
1150 { 1175 {
1151 qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); 1176 qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
1152 return false; 1177 return false;
1153 } 1178 }
1154 1179
1155 qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name ); 1180 qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name );
1156 _pch = handle; 1181 _pch = handle;
1157 _open = true; 1182 _open = true;
1158 _stats.clear(); 1183 _stats.clear();
1159 1184
1160 // in case we have an application object, create a socket notifier 1185 // in case we have an application object, create a socket notifier
1161 if ( qApp ) //TODO: I don't like this here... 1186 if ( qApp ) //TODO: I don't like this here...
1162 { 1187 {
1163 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); 1188 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
1164 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 1189 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
1165 } 1190 }
1166 1191
1167 return true; 1192 return true;
1168} 1193}
1169 1194
1170 1195
1171bool OPacketCapturer::openDumpFile( const QString& filename ) 1196bool OPacketCapturer::openDumpFile( const QString& filename )
1172{ 1197{
1173 pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) ); 1198 pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) );
1174 if ( !dump ) 1199 if ( !dump )
1175 { 1200 {
1176 qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf ); 1201 qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf );
1177 return false; 1202 return false;
1178 } 1203 }
1179 qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename ); 1204 qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename );
1180 _pcd = dump; 1205 _pcd = dump;
1181 1206
1182 return true; 1207 return true;
1183} 1208}
1184 1209
1185 1210
1186bool OPacketCapturer::open( const QFile& file ) 1211bool OPacketCapturer::open( const QFile& file )
1187{ 1212{
1188 QString name = file.name(); 1213 QString name = file.name();
1189 1214
1190 if ( _open ) 1215 if ( _open )
1191 { 1216 {
1192 close(); 1217 close();
1193 if ( name == _name ) // ignore opening an already openend device 1218 if ( name == _name ) // ignore opening an already openend device
1194 { 1219 {
1195 return true; 1220 return true;
1196 } 1221 }
1197 else // close the last opened device 1222 else // close the last opened device
1198 { 1223 {
1199 close(); 1224 close();
1200 } 1225 }
1201 } 1226 }
1202 1227
1203 _name = name; 1228 _name = name;
1204 1229
1205 pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] ); 1230 pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] );
1206 1231
1207 if ( handle ) 1232 if ( handle )
1208 { 1233 {
1209 qDebug( "OPacketCapturer::open(): libpcap opened successfully." ); 1234 qDebug( "OPacketCapturer::open(): libpcap opened successfully." );
1210 _pch = handle; 1235 _pch = handle;
1211 _open = true; 1236 _open = true;
1212 1237
1213 // in case we have an application object, create a socket notifier 1238 // in case we have an application object, create a socket notifier
1214 if ( qApp ) 1239 if ( qApp )
1215 { 1240 {
1216 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); 1241 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
1217 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 1242 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
1218 } 1243 }
1219 1244
1220 return true; 1245 return true;
1221 } 1246 }
1222 else 1247 else
1223 { 1248 {
1224 qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); 1249 qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
1225 return false; 1250 return false;
1226 } 1251 }
1227 1252
1228} 1253}
1229 1254
1230 1255
1231bool OPacketCapturer::isOpen() const 1256bool OPacketCapturer::isOpen() const
1232{ 1257{
1233 return _open; 1258 return _open;
1234} 1259}
1235 1260
1236 1261
1237void OPacketCapturer::readyToReceive() 1262void OPacketCapturer::readyToReceive()
1238{ 1263{
1239 qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" ); 1264 qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" );
1240 OPacket* p = next(); 1265 OPacket* p = next();
1241 emit receivedPacket( p ); 1266 emit receivedPacket( p );
1242 // emit is synchronous - packet has been dealt with, now it's safe to delete 1267 // emit is synchronous - packet has been dealt with, now it's safe to delete
1243 delete p; 1268 delete p;
1244} 1269}
1245 1270
1246 1271
1247const QMap<QString,int>& OPacketCapturer::statistics() const 1272const QMap<QString,int>& OPacketCapturer::statistics() const
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index a031dd1..f0d1d81 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -8,256 +8,261 @@
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 58
59/* Custom Network Includes */ 59/* Custom Network Includes */
60#include "802_11_user.h" 60#include "802_11_user.h"
61#include "dhcp.h" 61#include "dhcp.h"
62 62
63/* TYPEDEFS */ 63/* TYPEDEFS */
64typedef struct timeval timevalstruct; 64typedef struct timeval timevalstruct;
65typedef struct pcap_pkthdr packetheaderstruct; 65typedef struct pcap_pkthdr packetheaderstruct;
66 66
67/* FORWARDS */ 67/* FORWARDS */
68class OPacketCapturer; 68class OPacketCapturer;
69class QSocketNotifier; 69class QSocketNotifier;
70 70
71/*====================================================================================== 71/*======================================================================================
72 * OPacket - A frame on the wire 72 * OPacket - A frame on the wire
73 *======================================================================================*/ 73 *======================================================================================*/
74 74
75/** @brief A class representing a data frame on the wire. 75/** @brief A class representing a data frame on the wire.
76 * 76 *
77 * The whole family of the packet classes are used when capturing frames from a network. 77 * The whole family of the packet classes are used when capturing frames from a network.
78 * Most standard network protocols in use share a common architecture, which mostly is 78 * Most standard network protocols in use share a common architecture, which mostly is
79 * a packet header and then the packet payload. In layered architectures, each lower layer 79 * a packet header and then the packet payload. In layered architectures, each lower layer
80 * encapsulates data from its upper layer - that is it 80 * encapsulates data from its upper layer - that is it
81 * treats the data from its upper layer as payload and prepends an own header to the packet, 81 * treats the data from its upper layer as payload and prepends an own header to the packet,
82 * which - again - is treated as the payload for the layer below. The figure below is an 82 * which - again - is treated as the payload for the layer below. The figure below is an
83 * example for how such a data frame is composed out of packets, e.g. when sending a mail. 83 * example for how such a data frame is composed out of packets, e.g. when sending a mail.
84 * 84 *
85 * <pre> 85 * <pre>
86 * | User Data | == Mail Data 86 * | User Data | == Mail Data
87 * | SMTP Header | User Data | == SMTP 87 * | SMTP Header | User Data | == SMTP
88 * | TCP Header | SMTP Header | User Data | == TCP 88 * | TCP Header | SMTP Header | User Data | == TCP
89 * | IP Header | TCP Header | SMTP Header | User Data | == IP 89 * | IP Header | TCP Header | SMTP Header | User Data | == IP
90 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC 90 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC
91 * 91 *
92 * </pre> 92 * </pre>
93 * 93 *
94 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer 94 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer
95 * also contains a few more levels of encapsulation. 95 * also contains a few more levels of encapsulation.
96 * Since the type of the payload is more or less independent from the encapsulating protocol, 96 * Since the type of the payload is more or less independent from the encapsulating protocol,
97 * the header must be inspected before attempting to decode the payload. Hence, the 97 * the header must be inspected before attempting to decode the payload. Hence, the
98 * encapsulation level varies and can't be deduced without actually looking into the packets. 98 * encapsulation level varies and can't be deduced without actually looking into the packets.
99 * 99 *
100 * For actually working with captured frames, it's useful to identify the packets via names and 100 * For actually working with captured frames, it's useful to identify the packets via names and
101 * insert them into a parent/child - relationship based on the encapsulation. This is why 101 * insert them into a parent/child - relationship based on the encapsulation. This is why
102 * all packet classes derive from QObject. The amount of overhead caused by the QObject is 102 * all packet classes derive from QObject. The amount of overhead caused by the QObject is
103 * not a problem in this case, because we're talking about a theoratical maximum of about 103 * not a problem in this case, because we're talking about a theoratical maximum of about
104 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the 104 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the
105 * QObject also cares about destroying the sub-, (child-) packets. 105 * QObject also cares about destroying the sub-, (child-) packets.
106 * 106 *
107 * This enables us to perform a simple look for packets of a certain type: 107 * This enables us to perform a simple look for packets of a certain type:
108 * @code 108 * @code
109 * OPacketCapturer* pcap = new OPacketCapturer(); 109 * OPacketCapturer* pcap = new OPacketCapturer();
110 * pcap->open( "eth0" ); 110 * pcap->open( "eth0" );
111 * OPacket* p = pcap->next(); 111 * OPacket* p = pcap->next();
112 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists 112 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists
113 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl; 113 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl;
114 * 114 *
115 */ 115 */
116 116
117class OPacket : public QObject 117class OPacket : public QObject
118{ 118{
119 Q_OBJECT 119 Q_OBJECT
120 120
121 friend class OPacketCapturer; 121 friend class OPacketCapturer;
122 122
123 public: 123 public:
124 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent ); 124 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent );
125 virtual ~OPacket(); 125 virtual ~OPacket();
126 126
127 timevalstruct timeval() const; 127 timevalstruct timeval() const;
128 128
129 int caplen() const; 129 int caplen() const;
130 int len() const; 130 int len() const;
131 QString dump( int = 32 ) const; 131 QString dump( int = 32 ) const;
132 132
133 void updateStats( QMap<QString,int>&, QObjectList* ); 133 void updateStats( QMap<QString,int>&, QObjectList* );
134 134
135 private: 135 private:
136
137 void dumpStructure( QObjectList* );
138 QString _dumpStructure( QObjectList* );
139
140 private:
136 const packetheaderstruct _hdr; // pcap packet header 141 const packetheaderstruct _hdr; // pcap packet header
137 const unsigned char* _data; // pcap packet data 142 const unsigned char* _data; // pcap packet data
138 const unsigned char* _end; // end of pcap packet data 143 const unsigned char* _end; // end of pcap packet data
139}; 144};
140 145
141/*====================================================================================== 146/*======================================================================================
142 * OEthernetPacket - DLT_EN10MB frame 147 * OEthernetPacket - DLT_EN10MB frame
143 *======================================================================================*/ 148 *======================================================================================*/
144 149
145class OEthernetPacket : public QObject 150class OEthernetPacket : public QObject
146{ 151{
147 Q_OBJECT 152 Q_OBJECT
148 153
149 public: 154 public:
150 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 ); 155 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 );
151 virtual ~OEthernetPacket(); 156 virtual ~OEthernetPacket();
152 157
153 OMacAddress sourceAddress() const; 158 OMacAddress sourceAddress() const;
154 OMacAddress destinationAddress() const; 159 OMacAddress destinationAddress() const;
155 int type() const; 160 int type() const;
156 161
157 private: 162 private:
158 const struct ether_header* _ether; 163 const struct ether_header* _ether;
159}; 164};
160 165
161/*====================================================================================== 166/*======================================================================================
162 * OPrismHeaderPacket - DLT_PRISM_HEADER frame 167 * OPrismHeaderPacket - DLT_PRISM_HEADER frame
163 *======================================================================================*/ 168 *======================================================================================*/
164 169
165class OPrismHeaderPacket : public QObject 170class OPrismHeaderPacket : public QObject
166{ 171{
167 Q_OBJECT 172 Q_OBJECT
168 173
169 public: 174 public:
170 OPrismHeaderPacket( const unsigned char*, const struct prism_hdr*, QObject* parent = 0 ); 175 OPrismHeaderPacket( const unsigned char*, const struct prism_hdr*, QObject* parent = 0 );
171 virtual ~OPrismHeaderPacket(); 176 virtual ~OPrismHeaderPacket();
172 177
173 unsigned int signalStrength() const; 178 unsigned int signalStrength() const;
174 179
175 private: 180 private:
176 const struct prism_hdr* _header; 181 const struct prism_hdr* _header;
177}; 182};
178 183
179/*====================================================================================== 184/*======================================================================================
180 * OWaveLanPacket - DLT_IEEE802_11 frame 185 * OWaveLanPacket - DLT_IEEE802_11 frame
181 *======================================================================================*/ 186 *======================================================================================*/
182 187
183class OWaveLanPacket : public QObject 188class OWaveLanPacket : public QObject
184{ 189{
185 Q_OBJECT 190 Q_OBJECT
186 191
187 public: 192 public:
188 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 ); 193 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 );
189 virtual ~OWaveLanPacket(); 194 virtual ~OWaveLanPacket();
190 195
191 int duration() const; 196 int duration() const;
192 bool fromDS() const; 197 bool fromDS() const;
193 bool toDS() const; 198 bool toDS() const;
194 virtual OMacAddress macAddress1() const; 199 virtual OMacAddress macAddress1() const;
195 virtual OMacAddress macAddress2() const; 200 virtual OMacAddress macAddress2() const;
196 virtual OMacAddress macAddress3() const; 201 virtual OMacAddress macAddress3() const;
197 virtual OMacAddress macAddress4() const; 202 virtual OMacAddress macAddress4() const;
198 bool usesPowerManagement() const; 203 bool usesPowerManagement() const;
199 int type() const; 204 int type() const;
200 int subType() const; 205 int subType() const;
201 int version() const; 206 int version() const;
202 bool usesWep() const; 207 bool usesWep() const;
203 208
204 private: 209 private:
205 const struct ieee_802_11_header* _wlanhdr; 210 const struct ieee_802_11_header* _wlanhdr;
206}; 211};
207 212
208 213
209/*====================================================================================== 214/*======================================================================================
210 * OWaveLanManagementPacket - type: management (T_MGMT) 215 * OWaveLanManagementPacket - type: management (T_MGMT)
211 *======================================================================================*/ 216 *======================================================================================*/
212 217
213class OWaveLanManagementPacket : public QObject 218class OWaveLanManagementPacket : public QObject
214{ 219{
215 Q_OBJECT 220 Q_OBJECT
216 221
217 public: 222 public:
218 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); 223 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 );
219 virtual ~OWaveLanManagementPacket(); 224 virtual ~OWaveLanManagementPacket();
220 225
221 QString managementType() const; 226 QString managementType() const;
222 227
223 int beaconInterval() const; 228 int beaconInterval() const;
224 int capabilities() const; // generic 229 int capabilities() const; // generic
225 230
226 bool canESS() const; 231 bool canESS() const;
227 bool canIBSS() const; 232 bool canIBSS() const;
228 bool canCFP() const; 233 bool canCFP() const;
229 bool canCFP_REQ() const; 234 bool canCFP_REQ() const;
230 bool canPrivacy() const; 235 bool canPrivacy() const;
231 236
232 private: 237 private:
233 const struct ieee_802_11_mgmt_header* _header; 238 const struct ieee_802_11_mgmt_header* _header;
234 const struct ieee_802_11_mgmt_body* _body; 239 const struct ieee_802_11_mgmt_body* _body;
235}; 240};
236 241
237 242
238/*====================================================================================== 243/*======================================================================================
239 * OWaveLanManagementSSID 244 * OWaveLanManagementSSID
240 *======================================================================================*/ 245 *======================================================================================*/
241 246
242class OWaveLanManagementSSID : public QObject 247class OWaveLanManagementSSID : public QObject
243{ 248{
244 Q_OBJECT 249 Q_OBJECT
245 250
246 public: 251 public:
247 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 ); 252 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 );
248 virtual ~OWaveLanManagementSSID(); 253 virtual ~OWaveLanManagementSSID();
249 254
250 QString ID() const; 255 QString ID() const;
251 256
252 private: 257 private:
253 const struct ssid_t* _data; 258 const struct ssid_t* _data;
254}; 259};
255 260
256/*====================================================================================== 261/*======================================================================================
257 * OWaveLanManagementRates 262 * OWaveLanManagementRates
258 *======================================================================================*/ 263 *======================================================================================*/
259 264
260class OWaveLanManagementRates : public QObject 265class OWaveLanManagementRates : public QObject
261{ 266{
262 Q_OBJECT 267 Q_OBJECT
263 268