wlanutilities/wlansniffer/engine/server/src/wsfwlanscanner.cpp
branchRCL_3
changeset 12 981afc7d3841
parent 10 dff6ebfd236f
child 18 aaabc7526ded
--- 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 );
     }