diff -r 8b0eae1b1d71 -r 981afc7d3841 wlanutilities/wlansniffer/engine/server/src/wsfwlanscanner.cpp --- a/wlanutilities/wlansniffer/engine/server/src/wsfwlanscanner.cpp Mon Mar 15 12:44:54 2010 +0200 +++ b/wlanutilities/wlansniffer/engine/server/src/wsfwlanscanner.cpp Wed Mar 31 23:17:49 2010 +0300 @@ -642,6 +642,8 @@ LOG_ENTERFN( "CWsfWlanScanner::RestartScanning" ); TBool restarted( EFalse ); + LOG_WRITEF( "iScanState = %d isActive = %d iShowAvailability = %d", + iScanState, IsActive(), iShowAvailability ); if ( iScanState == EIdle && ( IsActive() || iShowAvailability ) ) { @@ -656,6 +658,7 @@ restarted = ETrue; } + LOG_WRITEF( "restarted = %d", restarted ); return restarted; } @@ -862,7 +865,7 @@ TWsfWlanInfo* temp = matchArray[i]; ++temp->iCoverage; RefreshSignalStrength( *temp ); - RefreshMaxRate( *temp ); + RefreshTechnology( *temp ); } } // Close() for matchArray @@ -1035,7 +1038,7 @@ // not hidden RefreshNetworkMode( *wlanInfo ); RefreshSecurityMode( *wlanInfo ); - RefreshMaxRate( *wlanInfo ); + RefreshTechnology( *wlanInfo ); // check if we already have an entry/entries corresponding to a scan result // (multiple entries for one scan result possible if GetAvailableIaps() @@ -1052,7 +1055,7 @@ { wlanInfo->iCoverage = 1; RefreshSignalStrength( *wlanInfo ); - RefreshMaxRate( *wlanInfo ); + RefreshTechnology( *wlanInfo ); ++nElem; // new entry, inc index in array } else // if found inc coverage and refresh signal strength and rate @@ -1062,7 +1065,7 @@ TWsfWlanInfo* temp = matchArray[i]; ++temp->iCoverage; RefreshSignalStrength( *temp ); - RefreshMaxRate( *temp ); + RefreshTechnology( *temp ); if ( temp->iIapId ) { @@ -1576,56 +1579,154 @@ } +// ----------------------------------------------------------------------------- +// CWsfWlanScanner::ConvertTxRateToTxRateEnum +// ----------------------------------------------------------------------------- +// +core_tx_rate_e CWsfWlanScanner::ConvertTxRateToTxRateEnum( TUint8 aRate ) + { + LOG_ENTERFN( "CWsfWlanScanner::ConvertTxRateToTxRateEnum" ); + + switch ( aRate ) + { + case core_tx_rate_value_1mbit: + return core_tx_rate_1mbit; + case core_tx_rate_value_2mbit: + return core_tx_rate_2mbit; + case core_tx_rate_value_5p5mbit: + return core_tx_rate_5p5mbit; + case core_tx_rate_value_6mbit: + return core_tx_rate_6mbit; + case core_tx_rate_value_9mbit: + return core_tx_rate_9mbit; + case core_tx_rate_value_11mbit: + return core_tx_rate_11mbit; + case core_tx_rate_value_12mbit: + return core_tx_rate_12mbit; + case core_tx_rate_value_18mbit: + return core_tx_rate_18mbit; + case core_tx_rate_value_22mbit: + return core_tx_rate_22mbit; + case core_tx_rate_value_24mbit: + return core_tx_rate_24mbit; + case core_tx_rate_value_33mbit: + return core_tx_rate_33mbit; + case core_tx_rate_value_36mbit: + return core_tx_rate_36mbit; + case core_tx_rate_value_48mbit: + return core_tx_rate_48mbit; + case core_tx_rate_value_54mbit: + return core_tx_rate_54mbit; + default: + return core_tx_rate_none; + } + } + + // --------------------------------------------------------------------------- -// CWsfWlanScanner::RefreshMaxRate +// CWsfWlanScanner::RefreshTechnology // --------------------------------------------------------------------------- // -void CWsfWlanScanner::RefreshMaxRate( TWsfWlanInfo& aWlanInfo ) +void CWsfWlanScanner::RefreshTechnology( TWsfWlanInfo& aWlanInfo ) { - LOG_ENTERFN( "CWsfWlanScanner::RefreshMaxRate" ); + LOG_ENTERFN( "CWsfWlanScanner::RefreshTechnology" ); - TUint8 ieLen( 0 ); + TUint8 ieLen(0); const TUint8* ieData; TUint8 dataRates[KMaxNumberOfRates]; - TUint8 maxDataRate( aWlanInfo.iTransferRate * 2 ); + + if ( iScanInfo->InformationElement( E802Dot11HtCapabilitiesIE, ieLen, + &ieData ) == 0 ) + { + // 802.11n supported + aWlanInfo.iTransferRate = 0x8; + } + else + { + Mem::FillZ( &dataRates[0], sizeof( dataRates ) ); + core_tx_rate_e rate( core_tx_rate_none ); + TUint32 basic_rates( 0 ); + TUint32 supported_rates( 0 ); + + // Supported Rates + iScanInfo->InformationElement( E802Dot11SupportedRatesIE, ieLen, + &ieData ); + + Mem::Copy( dataRates, ieData, ieLen ); - Mem::FillZ( &dataRates[0], sizeof( dataRates ) ); + TUint32 temp_basic_rates( 0 ); + TUint32 temp_supported_rates( 0 ); + + for ( TInt a = 0; a < ieLen; a++ ) + { + rate = ConvertTxRateToTxRateEnum( dataRates[a] + & ~TX_RATE_BASIC_MASK ); + + temp_supported_rates |= rate; - // Supported Rates - iScanInfo->InformationElement( E802Dot11SupportedRatesIE, ieLen, &ieData ); + if ( dataRates[a] & TX_RATE_BASIC_MASK ) + { + /** + * The highest bit is enabled, the rate is both a basic rate + * and a supported rate. + */ + temp_basic_rates |= rate; + } + } + + basic_rates |= temp_basic_rates; + supported_rates |= temp_supported_rates; - Mem::Copy( dataRates, ieData, ieLen ); + // Extended Supported Rates + Mem::FillZ( &dataRates[0], sizeof( dataRates ) ); + + iScanInfo->InformationElement( E802Dot11ExtendedRatesIE, ieLen, + &ieData ); + + Mem::Copy( dataRates, ieData, ieLen ); + + if ( ieData ) + { + temp_basic_rates = 0; + temp_supported_rates = 0; + + for ( TInt a = 0; a < ieLen; a++ ) + { + rate = ConvertTxRateToTxRateEnum( dataRates[a] + & ~TX_RATE_BASIC_MASK ); + + temp_supported_rates |= rate; - for ( TInt a = 0; a < ieLen; a++ ) - { - // ignore the highest bit - dataRates[a] &= 0x7f; - if ( maxDataRate < dataRates[a] ) + if ( dataRates[a] & TX_RATE_BASIC_MASK ) + { + /** + * The highest bit is enabled, the rate is both a basic rate + * and a supported rate. + */ + temp_basic_rates |= rate; + } + } + + basic_rates |= temp_basic_rates; + supported_rates |= temp_supported_rates; + } + + aWlanInfo.iTransferRate = 0x4; // 802.11bg + + // AP is 802.11b only if only 802.11b rates + // are advertised as supported rates. + if ( !( supported_rates & ~CORE_TX_RATES_802P11B ) ) { - maxDataRate = dataRates[a]; + aWlanInfo.iTransferRate = 0x1; // 802.11b + } + // AP is 802.11g only if any of the 802.11g rates is a basic rate. + else if ( basic_rates & CORE_TX_RATES_802P11G ) + { + aWlanInfo.iTransferRate = 0x2; // 802.11g } } - // Extended Supported Rates - Mem::FillZ( &dataRates[0], sizeof( dataRates ) ); - - iScanInfo->InformationElement( E802Dot11ExtendedRatesIE, ieLen, &ieData ); - - Mem::Copy( dataRates, ieData, ieLen ); - - if ( ieData ) - { - for ( TInt a = 0; a < ieLen; a++ ) - { - dataRates[a] &= 0x7f; - if ( maxDataRate < dataRates[a] ) - { - maxDataRate = dataRates[a]; - } - } - } - aWlanInfo.iTransferRate = maxDataRate / 2; - LOG_WRITEF( "maxRate = %d", aWlanInfo.iTransferRate ); + LOG_WRITEF( "technology = %d", aWlanInfo.iTransferRate ); }