summaryrefslogtreecommitdiff
path: root/libopie2/opienet/onetwork.cpp
Unidiff
Diffstat (limited to 'libopie2/opienet/onetwork.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp10
1 files changed, 4 insertions, 6 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index f4bdbe0..05513f8 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -520,35 +520,34 @@ void OWirelessNetworkInterface::buildInformation()
520{ 520{
521 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck 521 //ML: If you listen carefully enough, you can hear lots of WLAN drivers suck
522 //ML: The HostAP drivers need more than sizeof struct_iw range to complete 522 //ML: The HostAP drivers need more than sizeof struct_iw range to complete
523 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length". 523 //ML: SIOCGIWRANGE otherwise they fail with "Invalid Argument Length".
524 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate 524 //ML: The Wlan-NG drivers on the otherside fail (segfault!) if you allocate
525 //ML: _too much_ space. This is damn shitty crap *sigh* 525 //ML: _too much_ space. This is damn shitty crap *sigh*
526 //ML: We allocate a large memory region in RAM and check whether the 526 //ML: We allocate a large memory region in RAM and check whether the
527 //ML: driver pollutes this extra space. The complaint will be made on stdout, 527 //ML: driver pollutes this extra space. The complaint will be made on stdout,
528 //ML: so please forward this... 528 //ML: so please forward this...
529 529
530 struct iwreq wrq; 530 struct iwreq wrq;
531 int len = sizeof( struct iw_range )*2; 531 int len = sizeof( struct iw_range )*2;
532 char *buffer = (char*) malloc( len ); 532 char buffer[len];
533 //FIXME: Validate if we actually got the memory block
534 memset( buffer, 0, len ); 533 memset( buffer, 0, len );
535 memcpy( wrq.ifr_name, name(), IFNAMSIZ); 534 memcpy( wrq.ifr_name, name(), IFNAMSIZ);
536 wrq.u.data.pointer = (caddr_t) buffer; 535 wrq.u.data.pointer = (caddr_t) buffer;
537 wrq.u.data.length = sizeof( struct iw_range ); 536 wrq.u.data.length = sizeof buffer;
538 wrq.u.data.flags = 0; 537 wrq.u.data.flags = 0;
539 538
540 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) 539 if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 )
541 { 540 {
542 owarn << "OWirelessNetworkInterface::buildInformation(): Can't get channel information - using default values." << oendl; 541 owarn << "OWirelessNetworkInterface::buildInformation(): Can't get driver information (" << strerror( errno ) << ") - using default values." << oendl;
543 _channels.insert( 2412, 1 ); // 2.412 GHz 542 _channels.insert( 2412, 1 ); // 2.412 GHz
544 _channels.insert( 2417, 2 ); // 2.417 GHz 543 _channels.insert( 2417, 2 ); // 2.417 GHz
545 _channels.insert( 2422, 3 ); // 2.422 GHz 544 _channels.insert( 2422, 3 ); // 2.422 GHz
546 _channels.insert( 2427, 4 ); // 2.427 GHz 545 _channels.insert( 2427, 4 ); // 2.427 GHz
547 _channels.insert( 2432, 5 ); // 2.432 GHz 546 _channels.insert( 2432, 5 ); // 2.432 GHz
548 _channels.insert( 2437, 6 ); // 2.437 GHz 547 _channels.insert( 2437, 6 ); // 2.437 GHz
549 _channels.insert( 2442, 7 ); // 2.442 GHz 548 _channels.insert( 2442, 7 ); // 2.442 GHz
550 _channels.insert( 2447, 8 ); // 2.447 GHz 549 _channels.insert( 2447, 8 ); // 2.447 GHz
551 _channels.insert( 2452, 9 ); // 2.452 GHz 550 _channels.insert( 2452, 9 ); // 2.452 GHz
552 _channels.insert( 2457, 10 ); // 2.457 GHz 551 _channels.insert( 2457, 10 ); // 2.457 GHz
553 _channels.insert( 2462, 11 ); // 2.462 GHz 552 _channels.insert( 2462, 11 ); // 2.462 GHz
554 553
@@ -573,47 +572,46 @@ void OWirelessNetworkInterface::buildInformation()
573 572
574 odebug << "OWirelessNetworkInterface::buildInformation(): Interface reported to have " << (int) range.num_frequency << " channels." << oendl; 573 odebug << "OWirelessNetworkInterface::buildInformation(): Interface reported to have " << (int) range.num_frequency << " channels." << oendl;
575 for ( int i = 0; i < range.num_frequency; ++i ) 574 for ( int i = 0; i < range.num_frequency; ++i )
576 { 575 {
577 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 ); 576 int freq = (int) ( double( range.freq[i].m ) * pow( 10.0, range.freq[i].e ) / 1000000.0 );
578 odebug << "OWirelessNetworkInterface::buildInformation: Adding frequency " << freq << " as channel " << i+1 << oendl; 577 odebug << "OWirelessNetworkInterface::buildInformation: Adding frequency " << freq << " as channel " << i+1 << oendl;
579 _channels.insert( freq, i+1 ); 578 _channels.insert( freq, i+1 );
580 } 579 }
581 } 580 }
582 581
583 memcpy( &_range, buffer, sizeof( struct iw_range ) ); 582 memcpy( &_range, buffer, sizeof( struct iw_range ) );
584 odebug << "OWirelessNetworkInterface::buildInformation(): Information block constructed." << oendl; 583 odebug << "OWirelessNetworkInterface::buildInformation(): Information block constructed." << oendl;
585 free(buffer);
586} 584}
587 585
588 586
589short OWirelessNetworkInterface::wirelessExtensionDriverVersion() const 587short OWirelessNetworkInterface::wirelessExtensionDriverVersion() const
590{ 588{
591 return _range.we_version_compiled; 589 return _range.we_version_compiled;
592} 590}
593 591
594 592
595void OWirelessNetworkInterface::buildPrivateList() 593void OWirelessNetworkInterface::buildPrivateList()
596{ 594{
597 odebug << "OWirelessNetworkInterface::buildPrivateList()" << oendl; 595 odebug << "OWirelessNetworkInterface::buildPrivateList()" << oendl;
598 596
599 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 597 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
600 598
601 _iwr.u.data.pointer = (char*) &priv; 599 _iwr.u.data.pointer = (char*) &priv;
602 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 600 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
603 _iwr.u.data.flags = 0; 601 _iwr.u.data.flags = 0;
604 602
605 if ( !wioctl( SIOCGIWPRIV ) ) 603 if ( !wioctl( SIOCGIWPRIV ) )
606 { 604 {
607 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information." << oendl; 605 owarn << "OWirelessNetworkInterface::buildPrivateList(): Can't get private ioctl information (" << strerror( errno ) << ")." << oendl;
608 return; 606 return;
609 } 607 }
610 608
611 for ( int i = 0; i < _iwr.u.data.length; ++i ) 609 for ( int i = 0; i < _iwr.u.data.length; ++i )
612 { 610 {
613 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 611 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
614 } 612 }
615 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl; 613 odebug << "OWirelessNetworkInterface::buildPrivateList(): Private ioctl list constructed." << oendl;
616} 614}
617 615
618 616
619void OWirelessNetworkInterface::dumpInformation() const 617void OWirelessNetworkInterface::dumpInformation() const