summaryrefslogtreecommitdiff
path: root/libopie2/opienet/onetwork.cpp
Side-by-side diff
Diffstat (limited to 'libopie2/opienet/onetwork.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp91
1 files changed, 40 insertions, 51 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index a85a510..50c6679 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -247,24 +247,25 @@ void ONetworkInterface::setIPV4Address( const QHostAddress& addr )
QString ONetworkInterface::ipV4Address() const
{
if ( ioctl( SIOCGIFADDR ) )
{
struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr;
//FIXME: Use QHostAddress here
return QString( inet_ntoa( sa->sin_addr ) );
}
else
return "<unknown>";
+
}
void ONetworkInterface::setMacAddress( const OMacAddress& addr )
{
_ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 );
ioctl( SIOCSIFHWADDR );
}
OMacAddress ONetworkInterface::macAddress() const
@@ -465,48 +466,34 @@ void OWirelessNetworkInterface::init()
{
qDebug( "OWirelessNetworkInterface::init()" );
memset( &_iwr, 0, sizeof( struct iwreq ) );
buildInformation();
buildPrivateList();
dumpInformation();
}
bool OWirelessNetworkInterface::isAssociated() const
{
//FIXME: handle different modes
- return associatedAP() != "44:44:44:44:44:44";
+ return !(associatedAP() == OMacAddress::unknown);
}
-QString OWirelessNetworkInterface::associatedAP() const
+OMacAddress OWirelessNetworkInterface::associatedAP() const
{
- //FIXME: use OMacAddress
- QString mac;
-
if ( ioctl( SIOCGIWAP ) )
- {
- mac.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
- _ifr.ifr_hwaddr.sa_data[0]&0xff,
- _ifr.ifr_hwaddr.sa_data[1]&0xff,
- _ifr.ifr_hwaddr.sa_data[2]&0xff,
- _ifr.ifr_hwaddr.sa_data[3]&0xff,
- _ifr.ifr_hwaddr.sa_data[4]&0xff,
- _ifr.ifr_hwaddr.sa_data[5]&0xff );
- }
+ return (const unsigned char*) &_ifr.ifr_hwaddr.sa_data[0];
else
- {
- mac = "<Unknown>";
- }
- return mac;
+ return OMacAddress::unknown;
}
void OWirelessNetworkInterface::buildInformation()
{
//ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
//ML: The HostAP drivers need more than sizeof struct_iw range to complete
//ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
//ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
//ML: _too much_ space. This is damn shitty crap *sigh*
//ML: We allocate a large memory region in RAM and check whether the
//ML: driver pollutes this extra space. The complaint will be made on stdout,
@@ -679,57 +666,36 @@ int OWirelessNetworkInterface::channelHopping() const
return _hopper->interval();
}
OChannelHopper* OWirelessNetworkInterface::channelHopper() const
{
return _hopper;
}
void OWirelessNetworkInterface::setMode( const QString& mode )
{
- if ( mode == "auto" ) _iwr.u.mode = IW_MODE_AUTO;
- else if ( mode == "adhoc" ) _iwr.u.mode = IW_MODE_ADHOC;
- else if ( mode == "managed" ) _iwr.u.mode = IW_MODE_INFRA;
- else if ( mode == "master" ) _iwr.u.mode = IW_MODE_MASTER;
- else if ( mode == "repeater" ) _iwr.u.mode = IW_MODE_REPEAT;
- else if ( mode == "secondary" ) _iwr.u.mode = IW_MODE_SECOND;
- else if ( mode == "monitor" ) _iwr.u.mode = IW_MODE_MONITOR;
- else
- {
- qDebug( "ONetwork: Warning! Invalid IEEE 802.11 mode '%s' specified.", (const char*) mode );
- return;
- }
+ _iwr.u.mode = stringToMode( mode );
wioctl( SIOCSIWMODE );
}
QString OWirelessNetworkInterface::mode() const
{
if ( !wioctl( SIOCGIWMODE ) )
{
return "<unknown>";
}
- switch ( _iwr.u.mode )
- {
- case IW_MODE_AUTO: return "auto";
- case IW_MODE_ADHOC: return "adhoc";
- case IW_MODE_INFRA: return "managed";
- case IW_MODE_MASTER: return "master";
- case IW_MODE_REPEAT: return "repeater";
- case IW_MODE_SECOND: return "secondary";
- case IW_MODE_MONITOR: return "monitor";
- default: assert( 0 ); // shouldn't happen
- }
+ return modeToString( _iwr.u.mode );
}
void OWirelessNetworkInterface::setMonitorMode( bool b )
{
if ( _mon )
_mon->setEnabled( b );
else
qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" );
}
@@ -821,33 +787,35 @@ QString OWirelessNetworkInterface::SSID() const
}
}
void OWirelessNetworkInterface::setSSID( const QString& ssid )
{
_iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
_iwr.u.essid.length = ssid.length();
wioctl( SIOCSIWESSID );
}
-int OWirelessNetworkInterface::scanNetwork()
+OStationList* OWirelessNetworkInterface::scanNetwork()
{
_iwr.u.param.flags = IW_SCAN_DEFAULT;
_iwr.u.param.value = 0;
if ( !wioctl( SIOCSIWSCAN ) )
{
- return -1;
+ return 0;
}
+ OStationList* stations = new OStationList();
+
int timeout = 1000000;
qDebug( "ONetworkInterface::scanNetwork() - scan started." );
bool results = false;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 250000; // initial timeout ~ 250ms
char buffer[IW_SCAN_MAX_DATA];
while ( !results && timeout > 0 )
{
@@ -877,67 +845,88 @@ int OWirelessNetworkInterface::scanNetwork()
continue;
}
}
qDebug( "ONetworkInterface::scanNetwork() - scan finished." );
if ( results )
{
qDebug( " - result length = %d", _iwr.u.data.length );
if ( !_iwr.u.data.length )
{
qDebug( " - no results (empty neighbourhood)" );
- return 0;
+ return stations;
}
qDebug( " - results are in!" );
dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length );
- int stations = 0;
-
// parse results
int offset = 0;
struct iw_event* we = (struct iw_event*) &buffer[0];
while ( offset < _iwr.u.data.length )
{
//const char* cmd = *(*_ioctlmap)[we->cmd];
//if ( !cmd ) cmd = "<unknown>";
qDebug( "reading next event... cmd=%d, len=%d", we->cmd, we->len );
switch (we->cmd)
{
- case SIOCGIWAP: qDebug( "SIOCGIWAP" ); stations++; break;
- case SIOCGIWMODE: qDebug( "SIOCGIWMODE" ); break;
- case SIOCGIWFREQ: qDebug( "SIOCGIWFREQ" ); break;
- case SIOCGIWESSID: qDebug( "SIOCGIWESSID" ); break;
+ case SIOCGIWAP:
+ {
+ qDebug( "SIOCGIWAP" );
+ stations->append( new OStation() );
+ stations->last()->macAddress = (const unsigned char*) &we->u.ap_addr.sa_data[0];
+ break;
+ }
+ case SIOCGIWMODE:
+ {
+ qDebug( "SIOCGIWMODE" );
+ stations->last()->type = modeToString( we->u.mode );
+ break;
+ }
+ case SIOCGIWFREQ:
+ {
+ qDebug( "SIOCGIWFREQ" );
+ stations->last()->channel = _channels[ static_cast<int>(double( we->u.freq.m ) * pow( 10.0, we->u.freq.e ) / 1000000) ];
+ break;
+ }
+ case SIOCGIWESSID:
+ {
+ qDebug( "SIOCGIWESSID" );
+ stations->last()->ssid = we->u.essid.pointer;
+ break;
+ }
case SIOCGIWSENS: qDebug( "SIOCGIWSENS" ); break;
case SIOCGIWENCODE: qDebug( "SIOCGIWENCODE" ); break;
case IWEVTXDROP: qDebug( "IWEVTXDROP" ); break; /* Packet dropped to excessive retry */
case IWEVQUAL: qDebug( "IWEVQUAL" ); break; /* Quality part of statistics (scan) */
case IWEVCUSTOM: qDebug( "IWEVCUSTOM" ); break; /* Driver specific ascii string */
case IWEVREGISTERED: qDebug( "IWEVREGISTERED" ); break; /* Discovered a new node (AP mode) */
case IWEVEXPIRED: qDebug( "IWEVEXPIRED" ); break; /* Expired a node (AP mode) */
default: qDebug( "unhandled event" );
}
offset += we->len;
we = (struct iw_event*) &buffer[offset];
}
+ return stations;
+
}
else
{
qDebug( " - no results (timeout) :(" );
- return 0;
+ return stations;
}
}
bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
{
#ifndef NODEBUG
int result = ::ioctl( _sfd, call, &iwreq );
if ( result == -1 )
qDebug( "ONetworkInterface::wioctl (%s) call %s (0x%04X) - Status: Failed: %d (%s)", name(), (const char*) *(*_ioctlmap)[call], call, result, strerror( errno ) );
else
qDebug( "ONetworkInterface::wioctl (%s) call %s (0x%04X) - Status: Ok.", name(), (const char*) *(*_ioctlmap)[call], call );