summaryrefslogtreecommitdiff
path: root/libopie2/opienet/onetwork.cpp
Unidiff
Diffstat (limited to 'libopie2/opienet/onetwork.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index 915814d..e5b091f 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -123,48 +123,59 @@ int ONetwork::count() const
123{ 123{
124 return _interfaces.count(); 124 return _interfaces.count();
125} 125}
126 126
127 127
128ONetworkInterface* ONetwork::interface( const QString& iface ) const 128ONetworkInterface* ONetwork::interface( const QString& iface ) const
129{ 129{
130 return _interfaces[iface]; 130 return _interfaces[iface];
131} 131}
132 132
133 133
134ONetwork* ONetwork::instance() 134ONetwork* ONetwork::instance()
135{ 135{
136 if ( !_instance ) _instance = new ONetwork(); 136 if ( !_instance ) _instance = new ONetwork();
137 return _instance; 137 return _instance;
138} 138}
139 139
140 140
141ONetwork::InterfaceIterator ONetwork::iterator() const 141ONetwork::InterfaceIterator ONetwork::iterator() const
142{ 142{
143 return ONetwork::InterfaceIterator( _interfaces ); 143 return ONetwork::InterfaceIterator( _interfaces );
144} 144}
145 145
146 146
147bool ONetwork::isPresent( const char* name ) const
148{
149 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
150 struct ifreq ifr;
151 memset( &ifr, 0, sizeof( struct ifreq ) );
152 strcpy( (char*) &ifr.ifr_name, name );
153 int result = ::ioctl( sfd, SIOCGIFFLAGS, &ifr );
154 return result != -1;
155}
156
157
147bool ONetwork::isWirelessInterface( const char* name ) const 158bool ONetwork::isWirelessInterface( const char* name ) const
148{ 159{
149 int sfd = socket( AF_INET, SOCK_STREAM, 0 ); 160 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
150 struct iwreq iwr; 161 struct iwreq iwr;
151 memset( &iwr, 0, sizeof( struct iwreq ) ); 162 memset( &iwr, 0, sizeof( struct iwreq ) );
152 strcpy( (char*) &iwr.ifr_name, name ); 163 strcpy( (char*) &iwr.ifr_name, name );
153 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr ); 164 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
154 return result != -1; 165 return result != -1;
155} 166}
156 167
157/*====================================================================================== 168/*======================================================================================
158 * ONetworkInterface 169 * ONetworkInterface
159 *======================================================================================*/ 170 *======================================================================================*/
160 171
161ONetworkInterface::ONetworkInterface( QObject* parent, const char* name ) 172ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
162 :QObject( parent, name ), 173 :QObject( parent, name ),
163 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 174 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
164{ 175{
165 odebug << "ONetworkInterface::ONetworkInterface()" << oendl; 176 odebug << "ONetworkInterface::ONetworkInterface()" << oendl;
166 init(); 177 init();
167} 178}
168 179
169 180
170struct ifreq& ONetworkInterface::ifr() const 181struct ifreq& ONetworkInterface::ifr() const
@@ -561,53 +572,53 @@ void OWirelessNetworkInterface::buildPrivateList()
561 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 572 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
562 573
563 _iwr.u.data.pointer = (char*) &priv; 574 _iwr.u.data.pointer = (char*) &priv;
564 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 575 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
565 _iwr.u.data.flags = 0; 576 _iwr.u.data.flags = 0;
566 577
567 if ( !wioctl( SIOCGIWPRIV ) ) 578 if ( !wioctl( SIOCGIWPRIV ) )
568 { 579 {
569 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information." << oendl; 580 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information." << oendl;
570 return; 581 return;
571 } 582 }
572 583
573 for ( int i = 0; i < _iwr.u.data.length; ++i ) 584 for ( int i = 0; i < _iwr.u.data.length; ++i )
574 { 585 {
575 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 586 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
576 } 587 }
577 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl; 588 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl;
578} 589}
579 590
580 591
581void OWirelessNetworkInterface::dumpInformation() const 592void OWirelessNetworkInterface::dumpInformation() const
582{ 593{
583 odebug << "OWirelessNetworkInterface::() -------------- dumping information block ----------------" << oendl; 594 odebug << "OWirelessNetworkInterface::() -------------- dumping information block ----------------" << oendl;
584 595
585 qDebug( " - driver's idea of maximum throughput is %d bps = %d byte/s = %d Kb/s = %f.2 Mb/s", 596 qDebug( " - driver's idea of maximum throughput is %d bps = %d byte/s = %d Kb/s = %f.2 Mb/s",
586 _range.throughput, _range.throughput / 8, _range.throughput / 8 / 1024, float( _range.throughput ) / 8.0 / 1024.0 / 1024.0 ); 597 _range.throughput, _range.throughput / 8, _range.throughput / 8 / 1024, float( _range.throughput ) / 8.0 / 1024.0 / 1024.0 );
587 qDebug( " - driver for '%s' (V%d) has been compiled against WE V%d", 598 qDebug( " - driver for '%s' (V%d) has been compiled against WE V%d",
588 name(), _range.we_version_source, _range.we_version_compiled ); 599 name(), _range.we_version_source, _range.we_version_compiled );
589 600
590 if ( _range.we_version_compiled != WIRELESS_EXT ) 601 if ( _range.we_version_compiled != WIRELESS_EXT )
591 { 602 {
592 owarn << "Version mismatch! WE_DRIVER = " << _range.we_version_compiled << " and WE_OPIENET = " << WIRELESS_EXT << oendl; 603 owarn << "Version mismatch! WE_DRIVER = " << _range.we_version_compiled << " and WE_OPIENET = " << WIRELESS_EXT << oendl;
593 } 604 }
594 605
595 odebug << "OWirelessNetworkInterface::() ---------------------------------------------------------" << oendl; 606 odebug << "OWirelessNetworkInterface::() ---------------------------------------------------------" << oendl;
596} 607}
597 608
598 609
599int OWirelessNetworkInterface::channel() const 610int OWirelessNetworkInterface::channel() const
600{ 611{
601 //FIXME: When monitoring enabled, then use it 612 //FIXME: When monitoring enabled, then use it
602 //FIXME: to gather the current RF channel 613 //FIXME: to gather the current RF channel
603 //FIXME: Until then, get active channel from hopper. 614 //FIXME: Until then, get active channel from hopper.
604 if ( _hopper && _hopper->isActive() ) 615 if ( _hopper && _hopper->isActive() )
605 return _hopper->channel(); 616 return _hopper->channel();
606 617
607 if ( !wioctl( SIOCGIWFREQ ) ) 618 if ( !wioctl( SIOCGIWFREQ ) )
608 { 619 {
609 return -1; 620 return -1;
610 } 621 }
611 else 622 else
612 { 623 {
613 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ]; 624 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ];
@@ -951,65 +962,65 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
951 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */ 962 case IWEVQUAL: odebug << "IWEVQUAL" << oendl; break; /* Quality part of statistics (scan) */
952 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */ 963 case IWEVCUSTOM: odebug << "IWEVCUSTOM" << oendl; break; /* Driver specific ascii string */
953 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */ 964 case IWEVREGISTERED: odebug << "IWEVREGISTERED" << oendl; break; /* Discovered a new node (AP mode) */
954 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */ 965 case IWEVEXPIRED: odebug << "IWEVEXPIRED" << oendl; break; /* Expired a node (AP mode) */
955 default: odebug << "unhandled event" << oendl; 966 default: odebug << "unhandled event" << oendl;
956 } 967 }
957 968
958 offset += we->len; 969 offset += we->len;
959 we = (struct iw_event*) &buffer[offset]; 970 we = (struct iw_event*) &buffer[offset];
960 } 971 }
961 return stations; 972 return stations;
962 973
963 return stations; 974 return stations;
964 975
965 } 976 }
966 else 977 else
967 { 978 {
968 odebug << " - no results (timeout) :(" << oendl; 979 odebug << " - no results (timeout) :(" << oendl;
969 return stations; 980 return stations;
970 } 981 }
971} 982}
972 983
973 984
974int OWirelessNetworkInterface::signalStrength() const 985int OWirelessNetworkInterface::signalStrength() const
975{ 986{
976 iw_statistics stat; 987 iw_statistics stat;
977 ::memset( &stat, 0, sizeof stat ); 988 ::memset( &stat, 0, sizeof stat );
978 _iwr.u.data.pointer = (char*) &stat; 989 _iwr.u.data.pointer = (char*) &stat;
979 _iwr.u.data.flags = 0; 990 _iwr.u.data.flags = 0;
980 _iwr.u.data.length = sizeof stat; 991 _iwr.u.data.length = sizeof stat;
981 992
982 if ( !wioctl( SIOCGIWSTATS ) ) 993 if ( !wioctl( SIOCGIWSTATS ) )
983 { 994 {
984 return -1; 995 return -1;
985 } 996 }
986 997
987 int max = _range.max_qual.qual; 998 int max = _range.max_qual.qual;
988 int cur = stat.qual.qual; 999 int cur = stat.qual.qual;
989 int lev = stat.qual.level; //FIXME: Do something with them? 1000 int lev = stat.qual.level; //FIXME: Do something with them?
990 int noi = stat.qual.noise; //FIXME: Do something with them? 1001 int noi = stat.qual.noise; //FIXME: Do something with them?
991 1002
992 return cur*100/max; 1003 return cur*100/max;
993} 1004}
994 1005
995 1006
996bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 1007bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
997{ 1008{
998 #ifndef NODEBUG 1009 #ifndef NODEBUG
999 int result = ::ioctl( _sfd, call, &iwreq ); 1010 int result = ::ioctl( _sfd, call, &iwreq );
1000 1011
1001 if ( result == -1 ) 1012 if ( result == -1 )
1002 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1013 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
1003 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl; 1014 << debugmapper->map( call ) << "' FAILED! " << result << " (" << strerror( errno ) << ")" << oendl;
1004 else 1015 else
1005 odebug << "ONetworkInterface::wioctl (" << name() << ") call '" 1016 odebug << "ONetworkInterface::wioctl (" << name() << ") call '"
1006 << debugmapper->map( call ) << "' - Status: Ok." << oendl; 1017 << debugmapper->map( call ) << "' - Status: Ok." << oendl;
1007 1018
1008 return ( result != -1 ); 1019 return ( result != -1 );
1009 #else 1020 #else
1010 return ::ioctl( _sfd, call, &iwreq ) != -1; 1021 return ::ioctl( _sfd, call, &iwreq ) != -1;
1011 #endif 1022 #endif
1012} 1023}
1013 1024
1014 1025
1015bool OWirelessNetworkInterface::wioctl( int call ) const 1026bool OWirelessNetworkInterface::wioctl( int call ) const