summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp21
1 files changed, 11 insertions, 10 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index ab3e77f..26a6c81 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -12,109 +12,109 @@
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28 28
29*/ 29*/
30 30
31/* OPIE */ 31/* OPIE */
32 32
33#include <opie2/onetwork.h> 33#include <opie2/onetwork.h>
34#include <opie2/ostation.h> 34#include <opie2/ostation.h>
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36 36
37/* QT */ 37/* QT */
38 38
39#include <qfile.h> 39#include <qfile.h>
40#include <qtextstream.h> 40#include <qtextstream.h>
41 41
42/* UNIX */ 42/* UNIX */
43 43
44#include <assert.h> 44#include <assert.h>
45#include <arpa/inet.h> 45#include <arpa/inet.h>
46#include <errno.h> 46#include <errno.h>
47#include <string.h> 47#include <string.h>
48#include <stdlib.h> 48#include <stdlib.h>
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
58#ifndef NODEBUG 58#ifndef NODEBUG
59#include <opie2/odebugmapper.h> 59#include <opie2/odebugmapper.h>
60 60
61 61
62using namespace Opie::Core; 62using namespace Opie::Core;
63using namespace Opie::Net::Private; 63using namespace Opie::Net::Private;
64DebugMapper* debugmapper = new DebugMapper(); 64DebugMapper* debugmapper = new DebugMapper();
65#endif 65#endif
66 66
67/*====================================================================================== 67/*======================================================================================
68 * ONetwork 68 * ONetwork
69 *======================================================================================*/ 69 *======================================================================================*/
70 70
71namespace Opie { 71namespace Opie {
72namespace Net { 72namespace Net {
73ONetwork* ONetwork::_instance = 0; 73ONetwork* ONetwork::_instance = 0;
74 74
75ONetwork::ONetwork() 75ONetwork::ONetwork()
76{ 76{
77 odebug << "ONetwork::ONetwork()" << oendl; 77 odebug << "ONetwork::ONetwork()" << oendl;
78 odebug << "ONetwork: This code has been compiled against Wireless Extensions V" << WIRELESS_EXT << oendl; 78 odebug << "ONetwork: This code has been compiled against Wireless Extensions V" << WIRELESS_EXT << oendl;
79 synchronize(); 79 synchronize();
80} 80}
81 81
82void ONetwork::synchronize() 82void ONetwork::synchronize()
83{ 83{
84 // gather available interfaces by inspecting /proc/net/dev 84 // gather available interfaces by inspecting /proc/net/dev
85 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices 85 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
86 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices 86 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices
87 //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev 87 //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev
88 88
89 _interfaces.clear(); 89 _interfaces.clear();
90 QString str; 90 QString str;
91 QFile f( "/proc/net/dev" ); 91 QFile f( "/proc/net/dev" );
92 bool hasFile = f.open( IO_ReadOnly ); 92 bool hasFile = f.open( IO_ReadOnly );
93 if ( !hasFile ) 93 if ( !hasFile )
94 { 94 {
95 odebug << "ONetwork: /proc/net/dev not existing. No network devices available" << oendl; 95 odebug << "ONetwork: /proc/net/dev not existing. No network devices available" << oendl;
96 return; 96 return;
97 } 97 }
98 QTextStream s( &f ); 98 QTextStream s( &f );
99 s.readLine(); 99 s.readLine();
100 s.readLine(); 100 s.readLine();
101 while ( !s.atEnd() ) 101 while ( !s.atEnd() )
102 { 102 {
103 s >> str; 103 s >> str;
104 str.truncate( str.find( ':' ) ); 104 str.truncate( str.find( ':' ) );
105 odebug << "ONetwork: found interface '" << str << "'" << oendl; 105 odebug << "ONetwork: found interface '" << str << "'" << oendl;
106 ONetworkInterface* iface; 106 ONetworkInterface* iface;
107 if ( isWirelessInterface( str ) ) 107 if ( isWirelessInterface( str ) )
108 { 108 {
109 iface = new OWirelessNetworkInterface( this, (const char*) str ); 109 iface = new OWirelessNetworkInterface( this, (const char*) str );
110 odebug << "ONetwork: interface '" << str << "' has Wireless Extensions" << oendl; 110 odebug << "ONetwork: interface '" << str << "' has Wireless Extensions" << oendl;
111 } 111 }
112 else 112 else
113 { 113 {
114 iface = new ONetworkInterface( this, (const char*) str ); 114 iface = new ONetworkInterface( this, (const char*) str );
115 } 115 }
116 _interfaces.insert( str, iface ); 116 _interfaces.insert( str, iface );
117 s.readLine(); 117 s.readLine();
118 } 118 }
119} 119}
120 120
@@ -961,97 +961,98 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
961 odebug << "SIOCGIWESSID" << oendl; 961 odebug << "SIOCGIWESSID" << oendl;
962 stations->last()->ssid = we->u.essid.pointer; 962 stations->last()->ssid = we->u.essid.pointer;
963 break; 963 break;
964 } 964 }
965 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break; 965 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break;
966 case SIOCGIWENCODE: odebug << "SIOCGIWENCODE" << oendl; break; 966 case SIOCGIWENCODE: odebug << "SIOCGIWENCODE" << oendl; break;
967 case IWEVTXDROP: odebug << "IWEVTXDROP" << oendl; break; /* Packet dropped to excessive retry */ 967 case IWEVTXDROP: odebug << "IWEVTXDROP" << oendl; break; /* Packet dropped to excessive retry */
968 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */ 968 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */
969 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */ 969 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */
970 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */ 970 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */
971 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */ 971 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */
972 default: odebug << "unhandled event" << oendl; 972 default: odebug << "unhandled event" << oendl;
973 } 973 }
974 974
975 offset += we->len; 975 offset += we->len;
976 we = (struct iw_event*) &buffer[offset]; 976 we = (struct iw_event*) &buffer[offset];
977 } 977 }
978 return stations; 978 return stations;
979 979
980 return stations; 980 return stations;
981 981
982 } 982 }
983 else 983 else
984 { 984 {
985 odebug << " - no results (timeout) :(" << oendl; 985 odebug << " - no results (timeout) :(" << oendl;
986 return stations; 986 return stations;
987 } 987 }
988} 988}
989 989
990 990
991int OWirelessNetworkInterface::signalStrength() const 991int OWirelessNetworkInterface::signalStrength() const
992{ 992{
993 iw_statistics stat; 993 iw_statistics stat;
994 ::memset( &stat, 0, sizeof stat ); 994 ::memset( &stat, 0, sizeof stat );
995 _iwr.u.data.pointer = (char*) &stat; 995 _iwr.u.data.pointer = (char*) &stat;
996 _iwr.u.data.flags = 0; 996 _iwr.u.data.flags = 0;
997 _iwr.u.data.length = sizeof stat; 997 _iwr.u.data.length = sizeof stat;
998 998
999 if ( !wioctl( SIOCGIWSTATS ) ) 999 if ( !wioctl( SIOCGIWSTATS ) )
1000 { 1000 {
1001 return -1; 1001 return -1;
1002 } 1002 }
1003 1003
1004 int max = _range.max_qual.qual; 1004 int max = _range.max_qual.qual;
1005 int cur = stat.qual.qual; 1005 int cur = stat.qual.qual;
1006 int lev = stat.qual.level; //FIXME: Do something with them? 1006 int lev = stat.qual.level; //FIXME: Do something with them?
1007 int noi = stat.qual.noise; //FIXME: Do something with them? 1007 int noi = stat.qual.noise; //FIXME: Do something with them?
1008 1008
1009 return cur*100/max; 1009
1010 return max != 0 ? cur*100/max: -1;
1010} 1011}
1011 1012
1012 1013
1013bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 1014bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
1014{ 1015{
1015 #ifndef NODEBUG 1016 #ifndef NODEBUG
1016 int result = ::ioctl( _sfd, call, &iwreq ); 1017 int result = ::ioctl( _sfd, call, &iwreq );
1017 1018
1018 if ( result == -1 ) 1019 if ( result == -1 )
1019 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1020 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
1020 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl; 1021 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl;
1021 else 1022 else
1022 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1023 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
1023 << debugmapper->map( call ) << "' - Status: Ok." << oendl; 1024 << debugmapper->map( call ) << "' - Status: Ok." << oendl;
1024 1025
1025 return ( result != -1 ); 1026 return ( result != -1 );
1026 #else 1027 #else
1027 return ::ioctl( _sfd, call, &iwreq ) != -1; 1028 return ::ioctl( _sfd, call, &iwreq ) != -1;
1028 #endif 1029 #endif
1029} 1030}
1030 1031
1031 1032
1032bool OWirelessNetworkInterface::wioctl( int call ) const 1033bool OWirelessNetworkInterface::wioctl( int call ) const
1033{ 1034{
1034 strcpy( _iwr.ifr_name, name() ); 1035 strcpy( _iwr.ifr_name, name() );
1035 return wioctl( call, _iwr ); 1036 return wioctl( call, _iwr );
1036} 1037}
1037 1038
1038 1039
1039/*====================================================================================== 1040/*======================================================================================
1040 * OMonitoringInterface 1041 * OMonitoringInterface
1041 *======================================================================================*/ 1042 *======================================================================================*/
1042 1043
1043OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1044OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1044 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ), _prismHeader( prismHeader ) 1045 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ), _prismHeader( prismHeader )
1045{ 1046{
1046} 1047}
1047 1048
1048 1049
1049OMonitoringInterface::~OMonitoringInterface() 1050OMonitoringInterface::~OMonitoringInterface()
1050{ 1051{
1051} 1052}
1052 1053
1053 1054
1054void OMonitoringInterface::setChannel( int c ) 1055void OMonitoringInterface::setChannel( int c )
1055{ 1056{
1056 // use standard WE channel switching protocol 1057 // use standard WE channel switching protocol
1057 memset( &_if->_iwr, 0, sizeof( struct iwreq ) ); 1058 memset( &_if->_iwr, 0, sizeof( struct iwreq ) );
@@ -1198,51 +1199,51 @@ QString OHostAPMonitoringInterface::name() const
1198 1199
1199/*====================================================================================== 1200/*======================================================================================
1200 * OOrinocoNetworkInterface 1201 * OOrinocoNetworkInterface
1201 *======================================================================================*/ 1202 *======================================================================================*/
1202 1203
1203OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface, bool prismHeader ) 1204OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface, bool prismHeader )
1204 :OMonitoringInterface( iface, prismHeader ) 1205 :OMonitoringInterface( iface, prismHeader )
1205{ 1206{
1206 iface->setMonitoring( this ); 1207 iface->setMonitoring( this );
1207} 1208}
1208 1209
1209 1210
1210OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface() 1211OOrinocoMonitoringInterface::~OOrinocoMonitoringInterface()
1211{ 1212{
1212} 1213}
1213 1214
1214 1215
1215void OOrinocoMonitoringInterface::setChannel( int c ) 1216void OOrinocoMonitoringInterface::setChannel( int c )
1216{ 1217{
1217 if ( !_if->hasPrivate( "monitor" ) ) 1218 if ( !_if->hasPrivate( "monitor" ) )
1218 { 1219 {
1219 this->OMonitoringInterface::setChannel( c ); 1220 this->OMonitoringInterface::setChannel( c );
1220 } 1221 }
1221 else 1222 else
1222 { 1223 {
1223 int monitorCode = _prismHeader ? 1 : 2; 1224 int monitorCode = _prismHeader ? 1 : 2;
1224 _if->setPrivate( "monitor", 2, monitorCode, c ); 1225 _if->setPrivate( "monitor", 2, monitorCode, c );
1225 } 1226 }
1226} 1227}
1227 1228
1228 1229
1229void OOrinocoMonitoringInterface::setEnabled( bool b ) 1230void OOrinocoMonitoringInterface::setEnabled( bool b )
1230{ 1231{
1231 if ( b ) 1232 if ( b )
1232 { 1233 {
1233 setChannel( 1 ); 1234 setChannel( 1 );
1234 } 1235 }
1235 else 1236 else
1236 { 1237 {
1237 _if->setPrivate( "monitor", 2, 0, 0 ); 1238 _if->setPrivate( "monitor", 2, 0, 0 );
1238 } 1239 }
1239} 1240}
1240 1241
1241 1242
1242QString OOrinocoMonitoringInterface::name() const 1243QString OOrinocoMonitoringInterface::name() const
1243{ 1244{
1244 return "orinoco"; 1245 return "orinoco";
1245} 1246}
1246 1247
1247} 1248}
1248} 1249}