wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp
branchRCL_3
changeset 14 13838cf40350
parent 11 a9473894c0f1
child 17 a828660c511c
--- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp	Tue May 25 14:40:09 2010 +0300
+++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp	Mon Jun 21 17:43:00 2010 +0300
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 105.1.1 %
+* %version: 105.1.3 %
 */
 
 #include <e32def.h>
@@ -207,11 +207,10 @@
     TWlanConversionUtil::ConvertMacAddress( core_mac, mac );
 
     // Get Device Settings
-    CWlanDeviceSettings::SWlanDeviceSettings deviceSettings;
-    GetWlanSettingsL( deviceSettings );
-    SetCachedRegion(deviceSettings.region, deviceSettings.regionTimestamp);    
+    GetWlanSettingsL( iDeviceSettings );
+    SetCachedRegion(iDeviceSettings.region, iDeviceSettings.regionTimestamp);    
     core_device_settings_s coreSettings; // core needs the settings here
-    TWlanConversionUtil::ConvertDeviceSettings( coreSettings, deviceSettings );
+    TWlanConversionUtil::ConvertDeviceSettings( coreSettings, iDeviceSettings );
 
     // Create core server    
     User::LeaveIfNull( iCoreServer = core_server_factory_c::instance(
@@ -221,7 +220,7 @@
         core_mac,
         TWlanConversionUtil::ConvertFeatureFlags(
             iSupportedFeatures,
-            deviceSettings.enabledFeatures ) ) );
+            iDeviceSettings.enabledFeatures ) ) );
     iCoreServer->disable_wlan( KWlanIntCmdDisableWlan );
 
     // Create scan timer
@@ -236,7 +235,7 @@
 
     // Create scan cache
     iCache = CWlanScanResultCache::NewL();
-    iConfiguredCacheLifetime = deviceSettings.scanExpirationTimer;
+    iConfiguredCacheLifetime = iDeviceSettings.scanExpirationTimer;
 
     // Create a callback for asynchronous core requests
     TCallBack callback( HandleCoreAsynchCb, this );
@@ -295,6 +294,7 @@
     // Stop all plugins
     iGenericWlanPlugin.StopPlugins();
 
+    iIapWeakList.Close();
     delete iCoreServer;
     delete iDriverIf;
     iNotificationArray.Close();
@@ -647,7 +647,8 @@
     TInt ret = GetCurrentIapId(
         static_cast<TUint>(lanServiceId), 
         *coreIapData );
-        
+    iConnectionIapId = coreIapData->iap_id;
+
     if (  ret != KErrNone )
         {
         secondarySsidList.Close();
@@ -1210,6 +1211,10 @@
     // Read cacheLifetime and maxDelay arguments
     TPckgBuf<TInt> cacheLifetimePckg( KWlmDefaultScanCacheLifetime );
     TPckgBuf<TUint> maxDelayPckg( 0 );
+    TBool isFiltered(
+        aMessage.Int3() );
+    DEBUG1( "CWlmServer::GetAvailableIaps() - isFiltered: %u",
+        isFiltered );
     if( aMessage.Read( 1, cacheLifetimePckg ) != KErrNone )
         {
         DEBUG( "CWlmServer::GetAvailableIaps() - unable to read lifetime parameter" );
@@ -1241,28 +1246,47 @@
      * See if cached IAP availability information is available.
      */
     RArray<TWlanLimitedIapData> iapList;
-    RArray<TUint>* list = iCache->AvailableIaps(
-                                            iapList,
-                                            ( cacheLifetimePckg() == 0 ? 1 : cacheLifetimePckg() ) );
-    
+    RArray<TWlmAvailabilityData>* list = iCache->AvailableIaps(
+        iapList,
+        ( cacheLifetimePckg() == 0 ? 1 : cacheLifetimePckg() ) );
     // Only complete with valid cache if maxDelay is zero
     if( list && maxDelayPckg() == 0 )
         {
-
-        TWlmAvailableIaps tmp;
-        const TInt listCount(
-            Min( list->Count(), KWlmMaxAvailableIaps ) );
-        
-        DEBUG1( "CWlmServer::GetAvailableIaps() - using cached IAP list, list contains %d IAP(s)", listCount );
-        
-        TInt listIdx( 0 );
-
-        while( listIdx < listCount )
+        TWlmAvailableIaps tmp = { 0 };
+        if( isFiltered )
+            {            
+            DEBUG1( "CWlmServer::GetAvailableIaps() - using filtered cached IAP list, list contains %d IAP(s)",
+                list->Count() );
+
+            for( TInt idx( 0 ); idx < list->Count() && tmp.count < KWlmMaxAvailableIaps; ++idx )
+                {
+                if( (*list)[idx].rcpi >= iDeviceSettings.minRcpiForIapAvailability &&
+                    iIapWeakList.Find( (*list)[idx].iapId ) == KErrNotFound )
+                    {
+                    DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u is available, RCPI is %u",
+                        (*list)[idx].iapId, (*list)[idx].rcpi );
+                    tmp.iaps[tmp.count++] = (*list)[idx];
+                    }
+                else
+                    {
+                    DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u filtered, RCPI is %u",
+                        (*list)[idx].iapId, (*list)[idx].rcpi );
+                    }
+                }
+            }
+        else
             {
-            tmp.iaps[ listIdx ] = (*list)[listIdx];
-            ++listIdx;
+            DEBUG1( "CWlmServer::GetAvailableIaps() - using cached IAP list, list contains %d IAP(s)",
+                list->Count() );
+
+            for( TInt idx( 0 ); idx < list->Count() && tmp.count < KWlmMaxAvailableIaps; ++idx )
+                {
+                DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u is available, RCPI is %u",
+                    (*list)[idx].iapId, (*list)[idx].rcpi );
+                tmp.iaps[tmp.count++] = (*list)[idx];                
+                }
             }
-        tmp.count = listCount;
+
         TPckg<TWlmAvailableIaps> outPckg( tmp );
         aMessage.Write( 0, outPckg );
         aMessage.Complete( KErrNone );
@@ -1317,8 +1341,9 @@
     iapList.Close();
 
     // Create output list
-    core_type_list_c<u32_t>* iapIdList = new core_type_list_c<u32_t>;
-    if( iapIdList == NULL )
+    core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList =
+        new core_type_list_c<core_iap_availability_data_s>;
+    if( iapAvailabilityList == NULL )
         {
         aMessage.Complete( KErrNoMemory );
         delete iapDataList;
@@ -1333,7 +1358,7 @@
         aMessage.Complete( KErrNoMemory );        
         delete iapDataList;
         delete iapSsidList;
-        delete iapIdList;
+        delete iapAvailabilityList;
         return;
         }
 
@@ -1349,7 +1374,7 @@
             aMessage.Complete( KErrNoMemory );
             delete iapDataList;
             delete iapSsidList;
-            delete iapIdList;
+            delete iapAvailabilityList;
             delete scanList;
     
             return;
@@ -1369,9 +1394,10 @@
     mapEntry.iRequestId = iRequestIdCounter++;
     mapEntry.iSessionId = aSessionId;    
     mapEntry.iParam0 = iapDataList;
-    mapEntry.iParam1 = iapIdList;
+    mapEntry.iParam1 = iapAvailabilityList;
     mapEntry.iParam2 = scanList;
     mapEntry.iParam3 = iapSsidList;
+    mapEntry.iParam4 = reinterpret_cast<TAny*>( isFiltered );
     mapEntry.iTime = scanTime;
     iRequestMap.Append( mapEntry );
 
@@ -1497,7 +1523,8 @@
 
         return err;
         }
-        
+    iDeviceSettings = settings;
+
     // Only if startup is complete, inform current settings to BgScan
     if( iIsStartupComplete )
         {
@@ -1632,12 +1659,11 @@
 //
 void CWlmServer::NotifyBackgroundScanDone(
     ScanList* aScanList, 
-    core_type_list_c<u32_t>* aIapIdList )
+    core_type_list_c<core_iap_availability_data_s>& aIapAvailabilityData )
     {
     DEBUG( "CWlmServer::NotifyBackgroundScanDone()" );
     ASSERT( aScanList != NULL );
-    ASSERT( aIapIdList != NULL );
-    
+
     // Unload the drivers immediately to conserve power.
     if( !iPlatform->IsWlanDisabled() &&
         iConnectionState == EWlanStateNotConnected )
@@ -1653,7 +1679,7 @@
     TBool newIaps( EFalse );
     TBool lostIaps( EFalse );
     iCache->UpdateAvailableNetworksList(
-        *aIapIdList,
+        aIapAvailabilityData,
         networkList,
         newIaps,
         lostIaps );
@@ -1800,6 +1826,7 @@
                 case EWlanStateNotConnected:
                     DEBUG( "CWlmServer::notify() - STATE: EWlanStateNotConnected" );
                     iIsRoaming = EFalse;
+                    iConnectionIapId = 0;
 
                     // set icon to "not available"
                     SetIconState( EWlmIconStatusNotAvailable );
@@ -1882,6 +1909,29 @@
         case EWlmNotifyAcTrafficStatusChanged:
             DEBUG( "CWlmServer::notify() - STATE: EWlmNotifyAcTrafficStatusChanged<ind>" );
             break;
+        case EWlmNotifyRcpChanged:
+            DEBUG( "CWlmServer::notify() - STATE: EWlmNotifyRcpChanged<ind>" );
+            if( static_cast<core_rcp_class_e>( data[0] ) == core_rcp_normal )
+                {
+                TInt idx = iIapWeakList.Find( iConnectionIapId );
+                if( idx >= 0 )
+                    {
+                    DEBUG1( "CWlmServer::notify() - removing IAP %u from weak list",
+                        iConnectionIapId );
+                    iIapWeakList.Remove( idx );
+                    }
+                }
+            else
+                {
+                TInt idx = iIapWeakList.Find( iConnectionIapId );
+                if( idx == KErrNotFound )
+                    {
+                    DEBUG1( "CWlmServer::notify() - adding IAP %u to weak list",
+                        iConnectionIapId );
+                    iIapWeakList.Append( iConnectionIapId );                    
+                    }
+                }
+            break;
         default:
             break;
         }
@@ -2607,9 +2657,8 @@
             
             ScanList* scanList = 
                 reinterpret_cast<ScanList*>( aRequest.iParam2 );
-            core_type_list_c<u32_t>* idList = 
-                reinterpret_cast<core_type_list_c<u32_t>*>( aRequest.iParam1 );
-                
+            core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList = 
+                reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( aRequest.iParam1 );
             core_type_list_c<core_iap_data_s>* iapDataList =
                 reinterpret_cast<core_type_list_c<core_iap_data_s>*>( aRequest.iParam0 );
             delete iapDataList;
@@ -2625,7 +2674,7 @@
 
                 if( aStatus == core_error_ok )
                     {
-                    NotifyBackgroundScanDone( scanList, idList );
+                    NotifyBackgroundScanDone( scanList, *iapAvailabilityList );
                     // cache takes the ownership of the scanList
                     scanList = NULL;
                     }
@@ -2637,8 +2686,8 @@
             
             delete scanList;
             scanList = NULL;
-            delete idList;
-            idList = NULL;
+            delete iapAvailabilityList;
+            iapAvailabilityList = NULL;
                         
             break;
             }
@@ -2774,29 +2823,33 @@
             // Create pointers to parameters
             core_type_list_c<core_ssid_entry_s>* iapSsidList;
             ScanList* scanList;
-            core_type_list_c<u32_t>* coreIdList;
+            core_type_list_c<core_iap_availability_data_s>* coreAvailabilityList;
             core_type_list_c<core_iap_data_s>* iapDataList;
+            TBool isFiltered( reinterpret_cast<TBool>( aRequest.iParam4 ) );
+            DEBUG1( "CWlmServer::CompleteExternalRequest() - isFiltered: %u",
+                isFiltered );
 
             iapSsidList = reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( aRequest.iParam3 );
             iapDataList = reinterpret_cast<core_type_list_c<core_iap_data_s>*>( aRequest.iParam0 );
             
             TUint* completedScanTime = reinterpret_cast<TUint*>( aRequest.iTime );
             ScanList* completedScanList = reinterpret_cast<ScanList*>( aRequest.iParam2);
-            core_type_list_c<u32_t>* completedIdList = reinterpret_cast<core_type_list_c<u32_t>*>( aRequest.iParam1 );
+            core_type_list_c<core_iap_availability_data_s>* completedAvailabilityList =
+                reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( aRequest.iParam1 );
             
             if( aTriggerRequest == NULL )
                 {
                 DEBUG( "CWlmServer::CompleteExternalRequest() - GetAvailableIaps request handled by core" );    
 
                 scanList = reinterpret_cast<ScanList*>( aRequest.iParam2);
-                coreIdList = reinterpret_cast<core_type_list_c<u32_t>*>( aRequest.iParam1 );
+                coreAvailabilityList = reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( aRequest.iParam1 );
                 }
             else
                 {
                 DEBUG( "CWlmServer::CompleteExternalRequest() - GetAvailableIaps request not handled by core" );    
                 //Use the results of the triggering request to complete also this other request
                 scanList = reinterpret_cast<ScanList*>( aTriggerRequest->iParam2);
-                coreIdList = reinterpret_cast<core_type_list_c<u32_t>*>( aTriggerRequest->iParam1 );                
+                coreAvailabilityList = reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( aTriggerRequest->iParam1 );                
                 }
 
             delete iapSsidList;
@@ -2816,27 +2869,75 @@
                 if( aTriggerRequest == NULL )
                     {
                     iCache->UpdateAvailableNetworksList(
-                        *coreIdList,
+                        *coreAvailabilityList,
                         networkList,
                         newIaps,
                         lostIaps );
                     }
                 networkList.Close();                
 
-                TWlmAvailableIaps tmp;                
-                TUint32* pInt = coreIdList->first();
-                TInt idx = 0;
-                while( pInt )
+                TWlmAvailableIaps tmp = { 0 };
+                core_iap_availability_data_s* pInt = coreAvailabilityList->first();
+                if( isFiltered )
                     {
-                    DEBUG1( "CWlmServer::CompleteExternalRequest() - IAP %u is available",
-                        *pInt );
-                    tmp.iaps[ idx ] = *pInt;
-                    idx++;
-                    pInt = coreIdList->next();
+                    while( pInt && tmp.count < KWlmMaxAvailableIaps )
+                        {
+                        if( pInt->rcpi < iDeviceSettings.minRcpiForIapAvailability )
+                            {
+                            DEBUG3( "CWlmServer::CompleteExternalRequest() - IAP %u filtered, RCPI is too weak (%u vs %u)",
+                                pInt->id, pInt->rcpi, iDeviceSettings.minRcpiForIapAvailability );
+                            }
+                        else if( iIapWeakList.Find( pInt->id ) != KErrNotFound )
+                            {
+                            if( pInt->rcpi < iDeviceSettings.rcpiTrigger )
+                                {
+                                DEBUG3( "CWlmServer::CompleteExternalRequest() - IAP %u filtered, in weak list and RCPI is too weak (%u vs %u)",
+                                    pInt->id, pInt->rcpi, iDeviceSettings.rcpiTrigger );                            
+                                }
+                            else
+                                {
+                                DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u, removed from weak list",
+                                    pInt->id, pInt->rcpi );
+                                tmp.iaps[tmp.count].iapId = pInt->id;
+                                tmp.iaps[tmp.count++].rcpi = pInt->rcpi;
+                                iIapWeakList.Remove(
+                                    iIapWeakList.Find( pInt->id ) );
+                                }
+                            }
+                        else
+                            {
+                            DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u",
+                                pInt->id, pInt->rcpi );
+                            tmp.iaps[tmp.count].iapId = pInt->id;
+                            tmp.iaps[tmp.count++].rcpi = pInt->rcpi;
+                            }
+                        pInt = coreAvailabilityList->next();
+                        }
                     }
-
-                tmp.count = idx;
-                
+                else
+                    {
+                    while( pInt && tmp.count < KWlmMaxAvailableIaps )
+                        {
+                        if( pInt->rcpi >= iDeviceSettings.rcpiTrigger &&
+                            iIapWeakList.Find( pInt->id ) != KErrNotFound )
+                            {                            
+                            DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u, removed from weak list",
+                                pInt->id, pInt->rcpi );
+                            iIapWeakList.Remove(
+                                iIapWeakList.Find( pInt->id ) );
+                            }
+                        else
+                            {
+                            DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u",
+                                pInt->id, pInt->rcpi );
+                            }
+
+                        tmp.iaps[tmp.count].iapId = pInt->id;
+                        tmp.iaps[tmp.count++].rcpi = pInt->rcpi;
+                        pInt = coreAvailabilityList->next();                        
+                        }
+                    }
+
                 if( IsSessionActive( aRequest ) )
                     {
                     TPckg<TWlmAvailableIaps> outPckg( tmp );
@@ -2844,14 +2945,14 @@
                     }
                 if( aTriggerRequest == NULL )
                     {
-                    DEBUG("CWlmServer::CompleteExternalRequest() - delete iapIdList" );
-                    delete coreIdList;	
+                    DEBUG("CWlmServer::CompleteExternalRequest() - delete coreAvailabilityList" );
+                    delete coreAvailabilityList;	
                     }
                 else
                     {
                     // If this completed request was not the triggering request then there is no need
                     // to cache anything. The triggering request results will be cached.
-                    delete completedIdList;
+                    delete completedAvailabilityList;
                     delete completedScanList;
                     }
 
@@ -2872,14 +2973,14 @@
                 // scan failed due to some reason: not caching anything
                 if( aTriggerRequest == NULL )
                     {
-                    delete coreIdList;
+                    delete coreAvailabilityList;
                     delete scanList;
                     }
                 else
                     {
                     // Delete only the lists of the completed request. Triggering request lists are
                     // deleted later on when that request is actually handled.
-                    delete completedIdList;
+                    delete completedAvailabilityList;
                     delete completedScanList; 
                     }
                 }
@@ -3011,6 +3112,7 @@
             TWlanAvailableNetwork network;
             network.ssid.Copy( ieData, ieLength );
             network.securityMode = info.SecurityMode();
+            network.rcpi = info.RXLevel();
             if( info.OperatingMode() == WlanOperatingModeInfra )
                 {
                 network.networkType = Infrastructure;                
@@ -3020,12 +3122,18 @@
                 network.networkType = Adhoc;
                 }
 
-            if ( aNetworkList.Find( network, isEqual ) == KErrNotFound )
+            TInt idx = aNetworkList.Find( network, isEqual ); 
+            if ( idx == KErrNotFound )
                 {
                 DEBUG1S( "CWlmServer::GetNetworkList() - appending SSID ",
                     ieLength, ieData );
                 aNetworkList.Append( network );
                 }
+            else if( idx >= 0 &&
+                     aNetworkList[idx].rcpi < network.rcpi )
+                {
+                aNetworkList[idx].rcpi = network.rcpi;            
+                }
             }
         }
 
@@ -3418,8 +3526,9 @@
     iapList.Close();
 
     // Create output list
-    core_type_list_c<u32_t>* iapIdList = new core_type_list_c<u32_t>;
-    if( iapIdList == NULL )
+    core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList =
+        new core_type_list_c<core_iap_availability_data_s>;
+    if( iapAvailabilityList == NULL )
         {
         DEBUG( "ERROR: Out of memory" );
         delete iapDataList;
@@ -3434,7 +3543,7 @@
         DEBUG( "CWlmServer::BackgroundScanRequest() - Out of memory when instantiating ScanList" );
         delete iapDataList;
         delete iapSsidList;
-        delete iapIdList;
+        delete iapAvailabilityList;
         return KErrNoMemory;
         }
 
@@ -3446,7 +3555,7 @@
 
         delete iapDataList;
         delete iapSsidList;
-        delete iapIdList;
+        delete iapAvailabilityList;
         delete scanList;
         return KErrNoMemory;
         }
@@ -3457,12 +3566,13 @@
     mapEntry.iRequestId = KWlanIntCmdBackgroundScan;
     mapEntry.iSessionId = 0;
     mapEntry.iParam0 = iapDataList;
-    mapEntry.iParam1 = iapIdList;
+    mapEntry.iParam1 = iapAvailabilityList;
     mapEntry.iParam2 = scanList;
     mapEntry.iParam3 = iapSsidList;
+    mapEntry.iParam4 = reinterpret_cast<TAny*>( EFalse );
     mapEntry.iTime = scanTime;
     iRequestMap.Append( mapEntry );
-    
+
     if( IsOnlyTimedScanRequestInRequestMap( mapEntry ) || *scanTime < iScanSchedulingTimerExpiration )
         {
         // Scan scheduling timer needs to be set again because this request needs the results earlier
@@ -3558,7 +3668,8 @@
         DEBUG( "CWlmServer::ScanSchedulingTimerExpired() - GetAvailableIaps requested" );
 
         core_type_list_c<core_iap_data_s>* iapDataList = reinterpret_cast<core_type_list_c<core_iap_data_s>*>( self->iRequestMap[index].iParam0 );
-        core_type_list_c<u32_t>* iapIdList =  reinterpret_cast<core_type_list_c<u32_t>*>( self->iRequestMap[index].iParam1 );
+        core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList =
+            reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( self->iRequestMap[index].iParam1 );
         ScanList* scanList =  reinterpret_cast<ScanList*>( self->iRequestMap[index].iParam2 );
         core_type_list_c<core_ssid_entry_s>* iapSsidList =  reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( self->iRequestMap[index].iParam3 );
         TUint* scanTime =  reinterpret_cast<TUint*>( self->iRequestMap[index].iTime );        
@@ -3579,8 +3690,8 @@
 
             delete iapDataList;
             iapDataList = NULL;
-            delete iapIdList;
-            iapIdList = NULL;
+            delete iapAvailabilityList;
+            iapAvailabilityList = NULL;
             delete scanList;
             scanList = NULL;
             delete iapSsidList;
@@ -3629,14 +3740,15 @@
         // pass request to core
         core_type_list_c<core_iap_data_s>* iapDataList = reinterpret_cast<core_type_list_c<core_iap_data_s>*>( self->iRequestMap[index].iParam0 );
         core_type_list_c<core_ssid_entry_s>* iapSsidList = reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( self->iRequestMap[index].iParam3 );
-        core_type_list_c<u32_t>* iapIdList = reinterpret_cast<core_type_list_c<u32_t>*>( self->iRequestMap[index].iParam1 );
+        core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList =
+            reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( self->iRequestMap[index].iParam1 );
         ScanList* scanList = reinterpret_cast<ScanList*>( self->iRequestMap[index].iParam2 );
         
         self->iCoreServer->get_available_iaps(
             self->iRequestMap[index].iRequestId,
             isActiveScanAllowed,
             *iapDataList,
-            *iapIdList,
+            *iapAvailabilityList,
             iapSsidList,
             *scanList );
         
@@ -3668,14 +3780,15 @@
         // pass request to core
         core_type_list_c<core_iap_data_s>* iapDataList = reinterpret_cast<core_type_list_c<core_iap_data_s>*>( self->iRequestMap[index].iParam0 );
         core_type_list_c<core_ssid_entry_s>* iapSsidList = reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( self->iRequestMap[index].iParam3 );
-        core_type_list_c<u32_t>* iapIdList = reinterpret_cast<core_type_list_c<u32_t>*>( self->iRequestMap[index].iParam1 );
+        core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList =
+            reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( self->iRequestMap[index].iParam1 );
         ScanList* scanList = reinterpret_cast<ScanList*>( self->iRequestMap[index].iParam2 );
         
         self->iCoreServer->get_available_iaps(
             self->iRequestMap[index].iRequestId,
             isActiveScanAllowed,
             *iapDataList,
-            *iapIdList,
+            *iapAvailabilityList,
             iapSsidList,
             *scanList );
         
@@ -4077,7 +4190,7 @@
             DEBUG( "CWlmServer::CancelScan() - remove entry from request map" );
             SRequestMapEntry entry = iRequestMap[index];
             delete reinterpret_cast<core_type_list_c<core_iap_data_s>*>( entry.iParam0 );
-            delete reinterpret_cast<core_type_list_c<u32_t>*>( entry.iParam1 );
+            delete reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( entry.iParam1 );
             delete reinterpret_cast<ScanList*>( entry.iParam2);
             delete reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( entry.iParam3 );
             delete reinterpret_cast<TUint*>( entry.iTime );
@@ -4114,7 +4227,7 @@
                 DEBUG( "CWlmServer::CancelScan() - remove entry from request map" );
                 SRequestMapEntry entry = iRequestMap[index];
                 delete reinterpret_cast<core_type_list_c<core_iap_data_s>*>( entry.iParam0 );
-                delete reinterpret_cast<core_type_list_c<u32_t>*>( entry.iParam1 );
+                delete reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( entry.iParam1 );
                 delete reinterpret_cast<ScanList*>( entry.iParam2);
                 delete reinterpret_cast<core_type_list_c<core_ssid_entry_s>*>( entry.iParam3 );
                 delete reinterpret_cast<TUint*>( entry.iTime );                
@@ -5016,8 +5129,8 @@
 
     ScanList* scanList =
         reinterpret_cast<ScanList*>( aMapEntry.iParam2 );
-    core_type_list_c<u32_t>* iapIdList = 
-        reinterpret_cast<core_type_list_c<u32_t>*>( aMapEntry.iParam1 );
+    core_type_list_c<core_iap_availability_data_s>* iapAvailabilityList = 
+        reinterpret_cast<core_type_list_c<core_iap_availability_data_s>*>( aMapEntry.iParam1 );
 
     /**
      * Go through the IAP list and find IAPs that haven't been found
@@ -5026,14 +5139,14 @@
     RArray<TWlanLimitedIapData> attachedIapList;
     CleanupClosePushL( attachedIapList );
     const RArray<TWlanLimitedIapData>& cachedIapList(
-        iCache->CachedIapDataList() );    
-    core_type_list_iterator_c<u32_t> iter( *iapIdList );
+        iCache->CachedIapDataList() );
+    core_type_list_iterator_c<core_iap_availability_data_s> iter( *iapAvailabilityList );    
     for( TInt idx( 0 ); idx < cachedIapList.Count(); ++idx )
         {
         TBool isFound( EFalse );
-        for( u32_t* item = iter.first(); !isFound && item; item = iter.next() )
+        for( core_iap_availability_data_s* item = iter.first(); !isFound && item; item = iter.next() )
             {
-            if( *item == cachedIapList[idx].iapId )
+            if( item->id == cachedIapList[idx].iapId )
                 {                
                 isFound = ETrue;
                 }
@@ -5080,11 +5193,13 @@
             attachedIapList[idx].iapId,
             *ssidList );
         TBool isMatch( EFalse );
+        TUint rcpi( 0 );
         for( TInt iidx( 0 ); !isMatch && iidx < networkList.Count(); ++iidx )
             {
             if( attachedIapList[idx].networkType == networkList[iidx].networkType &&
                 ssidList->IsInList( networkList[iidx].ssid ) )
                 {
+                rcpi = networkList[iidx].rcpi;
                 isMatch = ETrue;
                 }
             }
@@ -5096,10 +5211,16 @@
             /**
              * A match has been found, mark the IAP as available.
              */
-            u32_t* iapId = new (ELeave) u32_t(
-                attachedIapList[idx].iapId );
-            iapIdList->append(
-                iapId );
+            core_iap_availability_data_s* data = new (ELeave) core_iap_availability_data_s;
+            data->id = attachedIapList[idx].iapId;
+            data->rcpi = rcpi;
+            core_error_e ret = iapAvailabilityList->append(
+                data );
+            if( ret != core_error_ok )
+                {
+                delete data;
+                }
+            data = NULL;
             }
         else
             {