Revision: 201009 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 15 Mar 2010 12:42:11 +0200
branchRCL_3
changeset 13 68f0c7cd80ec
parent 12 ea6e024ea6f9
child 15 4dc3bb0099b0
Revision: 201009 Kit: 201010
apengine/apeng/src/APSelect.cpp
bearermanagement/S60MCPR/inc/s60mcpractivities.h
bearermanagement/S60MCPR/inc/s60mcprstates.h
bearermanagement/S60MCPR/inc/s60mpmrequests.h
bearermanagement/S60MCPR/src/s60mcpr.cpp
bearermanagement/S60MCPR/src/s60mcpractivities.cpp
bearermanagement/S60MCPR/src/s60mcprmobilityactivity.cpp
bearermanagement/S60MCPR/src/s60mcprstates.cpp
bearermanagement/S60MCPR/src/s60mpmrequests.cpp
bearermanagement/mpm/inc/mpmlauncher.h
bearermanagement/mpm/src/mpmiapselection.cpp
bearermanagement/mpm/src/mpmlauncher.cpp
cmmanager/cmmgr/Framework/Src/cmdesticondialog.cpp
dbcreator/commsdatcreator/Src/cdcprocessorglobal.cpp
dbcreator/commsdatcreator/Src/cdcwlandevicesettings.cpp
dbcreator/conf/commsdatcreator.confml
ipcm_pub/access_point_engine_api/inc/APSelect.h
ipcm_pub/connection_settings_api/inc/cmgenconnsettings.h
--- a/apengine/apeng/src/APSelect.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/apengine/apeng/src/APSelect.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -70,7 +70,7 @@
 
 
 // LOCAL CONSTANTS AND MACROS
-
+#define VPN_SERVICE_SNAP    _S("HomeSNAP")
 
 // LOCAL FUNCTION PROTOTYPES
 
@@ -856,9 +856,39 @@
                     CApUtils* util = CApUtils::NewLC( *iDb );
                     for ( i = 0; i < count; i++ )
                         {
-                        // get home wap id first
-                        pos = PosInArray( ipiapid, 
-                                          vpnArray->At( i ).iHomeIapId );
+                        if ( vpnArray->At( i ).iHomeIapId != 0 )
+                            {
+                            // get home wap id first
+                            pos = PosInArray( ipiapid, 
+                                             vpnArray->At( i ).iHomeIapId );
+                            
+                            }
+                        else if ( vpnArray->At( i ).iHomeSnapId != 0 )
+                            {
+                            // VPN IAP points to a SNAP. Just mark it available.
+                            pos = PosInArray( iapArrays[KVPN][1], vpnArray->At( i ).iVpnIapId );
+                            if ( pos != KErrNotFound )
+                                { // now get VPN IAP ID
+                                TUint32 tempvpniapid = iapArrays[KVPN][0]->At( pos );
+                                TUint32 tempvpnwapid ( 0 );
+                                TRAP( err, tempvpnwapid = 
+                                        util->WapIdFromIapIdL( 
+                                                tempvpniapid ) );
+                                                    
+                                item = CApListItem::NewLC
+                                    (
+                                    EIspTypeInternetAndWAP,
+                                    tempvpnwapid,
+                                    *vpnArray->At( i ).iName,                                   
+                                    EApBearerTypeAllBearers
+                                    );
+                                item->SetVpnFlag( ETrue );
+                                iApList->AppendL( item );
+                                CleanupStack::Pop( item );
+                                continue;
+                                }                                                          
+                            }                                                                                                              
+                        
                         TInt foundpos( KErrNotFound );
                         if ( pos!= KErrNotFound )
                             { // now we have the index in the
@@ -2216,7 +2246,8 @@
         if ( err != KErrNotFound )
             {
             TUint32 tempvpn( 0 );
-            TUint32 temphome( 0 );
+            TUint32 temphomeiap( 0 );
+            TUint32 temphomesnap( 0 );
             HBufC*  tempname = NULL;
             TVpnData data;
             TBool goon( ETrue );
@@ -2226,10 +2257,20 @@
                                             tempvpn );
                 if ( ( err == KErrNone ) && ( tempvpn ) )
                     {
+                    // First try to check if VPN IAP uses another IAP directly
                     err = ApCommons::ReadUintL( aTable, 
-                                                TPtrC(VPN_SERVICE_IAP),
-                                                temphome );
-                    if ( ( err == KErrNone ) && ( temphome ) )
+                                                TPtrC(VPN_SERVICE_IAP),                                                
+                                                temphomeiap );
+                    
+                    if ( (err != KErrNone ) || ( !tempvpn ) )
+                        {
+                        // IAP field was empty. VPN IAP must point to SNAP.
+                        err = ApCommons::ReadUintL( aTable, 
+                                TPtrC(VPN_SERVICE_SNAP),                                                
+                                temphomesnap );                                                         
+                        }
+                    
+                    if ( ( err == KErrNone ) && ( temphomeiap || temphomesnap ) )
                         {
                         // now get the name
 
@@ -2238,7 +2279,16 @@
                                                           TPtrC(COMMDB_NAME) );
                         
                         // everything is O.K., we can add the item
-                        data.iHomeIapId = temphome;
+                        if ( temphomesnap )
+                            {
+                            data.iHomeSnapId = temphomesnap;
+                            data.iHomeIapId = 0;
+                            }
+                        else
+                            {
+                            data.iHomeSnapId = 0;
+                            data.iHomeIapId = temphomeiap;                            
+                            }                       
                         data.iVpnIapId = tempvpn;
                         data.iName = tempname;
                         aVpnArray->AppendL( data ); // array owns it...
--- a/bearermanagement/S60MCPR/inc/s60mcpractivities.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/inc/s60mcpractivities.h	Mon Mar 15 12:42:11 2010 +0200
@@ -611,6 +611,21 @@
     DECLARE_SMELEMENT_FOOTER( TNoTagOrInformMigrationAvailableBackwardsOrErrorOrCancel )
 
     /**
+     * FORK/DECISION: 
+     * 1. Inform that the migration complete or go to error
+     * 2. Error
+     * @return
+     */
+    DECLARE_SMELEMENT_HEADER( TInformMigrationCompletedOrError, 
+                              MeshMachine::TStateFork<TContext>, 
+                              NetStateMachine::MStateFork, 
+                              TContext )
+    virtual TInt TransitionTag();
+    DECLARE_SMELEMENT_FOOTER( TInformMigrationCompletedOrError )
+
+        
+    
+    /**
      * Class that is responsible for managing mobility on MCPR side.
      * CS60MobilityActivity is the S60 version of the CMobilityActivity -class
      */
@@ -789,6 +804,21 @@
             DECLARE_SMELEMENT_FOOTER( TNoTagOrApplicationRejectedMigrationOrCancel )
 
             /**
+             * FORK/DECISION: 
+             * 1. Proceed to reconnection
+             * 2. Re-establish connection to the same IAP, inform data client that migration is complete
+             * 3. Error
+             * @return
+             */
+            DECLARE_SMELEMENT_HEADER( TNoTagOrRequestReConnectToCurrentSPOrErrorTag, 
+                                      MeshMachine::TStateFork<TContext>, 
+                                      NetStateMachine::MStateFork, 
+                                      TContext )
+            virtual TInt TransitionTag();
+            DECLARE_SMELEMENT_FOOTER( TNoTagOrRequestReConnectToCurrentSPOrErrorTag )
+            
+            
+            /**
              * Mutex protected TRANSITION.
              * Mopility scenario should wait until the connection recovery finishes.
              */
--- a/bearermanagement/S60MCPR/inc/s60mcprstates.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/inc/s60mcprstates.h	Mon Mar 15 12:42:11 2010 +0200
@@ -56,6 +56,9 @@
     const TInt KInformMigrationAvailable = 11052;
     const TInt KSendInitialApplicationReject = 11053; 
     const TInt KConsumeRejectedMsg = 11054;
+    const TInt KInformMigrationCompleted = 11055;
+    const TInt KRequestReConnectToCurrentSP = 11056;
+    
     /**
      * Execution context
      */
@@ -105,6 +108,17 @@
     DECLARE_SMELEMENT_FOOTER( TRequestReConnect )
 
     /**
+     * TRANSITION/ACTION: Starts ReConnect -activity to current service provider
+     */
+    DECLARE_SMELEMENT_HEADER( TRequestReConnectToCurrentSP, 
+                              MeshMachine::TStateTransition<TContext>, 
+                              NetStateMachine::MStateTransition, 
+                              TContext )
+    virtual void DoL();
+    DECLARE_SMELEMENT_FOOTER( TRequestReConnectToCurrentSP )
+    
+    
+    /**
      * TRANSITION/ACTION: Requests Policy Server to process the error.
      * The error is taken from the error context or activity error in that order.
      */
--- a/bearermanagement/S60MCPR/inc/s60mpmrequests.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/inc/s60mpmrequests.h	Mon Mar 15 12:42:11 2010 +0200
@@ -38,6 +38,12 @@
 // Forward declaration
 class CMPMPolicyNotifications;
 
+// Initial reconnect timeout is 100 000 microseconds (0.1 sec), 
+// which is doubled upon issuing the first timer request
+const TInt KMPMReconnectTimeoutMultiplier = 2;
+const TInt KMPMInitialReconnectTimeout = 100000 / KMPMReconnectTimeoutMultiplier;
+const TInt KMPMMaxReconnectTimeout = 800000;
+
 /**
 *  S60 NetMCPR MPM interface management Class inherits from CActive
 */
@@ -257,7 +263,7 @@
         * @since 5.2
         */
         void IssueDeleteRequest();
-
+        
     private:
         // policy request list
         RArray<PolicyRequest>       iPolicyRequests;
@@ -269,6 +275,11 @@
         TBool                       iCommitedToDeleteItself;
         CMPMPolicyNotifications*    iPolicyNotifications;
         MMPMPolicyNotificationUser* iPolicyNotificationsUser;
+        
+        // Reconnect timer related variables
+        RTimer                      iReconnectTimer;
+        TBool                       iReconnectTimerRunning;
+        TInt                        iReconnectTimeout;
     };
 
 #endif // S60MPMREQUESTS_H
--- a/bearermanagement/S60MCPR/src/s60mcpr.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/src/s60mcpr.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -300,31 +300,21 @@
 
             //HandlePreferredIAPAvailable( const_cast<TMpmNotificationPrefIAPAvailable&>( notification ) );
 
-            // Check if the TPrefIAPNotifInfo contains new or old IAP. 
-            //
-            if ( ServiceProvider() &&
-                 ((RMetaServiceProviderInterface*)ServiceProvider())->ProviderInfo().APId() != notification.iNewIapId )
-                {
-                S60MCPRLOGSTRING2("S60MCPR<%x>::PolicyNotification() EMPMPreferredIAPAvailable IAP %d",(TInt*)this,notification.iNewIapId);
+            S60MCPRLOGSTRING2("S60MCPR<%x>::PolicyNotification() EMPMPreferredIAPAvailable IAP %d",(TInt*)this,notification.iNewIapId);
+
 
-                // Store PolicyNotification
-                // This could happen if PolicyServer sends notification too early.
-                //
-                StorePolicyNotification( aNotification );
-                
-                // Send preferred carrier message into meshmachine.
-                //
-                RNodeInterface ni;
-                ni.OpenPostMessageClose( NodeId(), 
-                                         NodeId(), 
-                                         TCFS60MCPRMessage::TMPMPreferredCarrierAvailableMsg( (TAny*)&notification ).CRef() );
-                }
-#ifdef _DEBUG
-            else
-                {
-                S60MCPRLOGSTRING2("S60MCPR<%x>::PolicyNotification() EMPMPreferredIAPAvailable SAME IAP %d",(TInt*)this,notification.iNewIapId );
-                }
-#endif
+            // Store PolicyNotification
+            // This could happen if PolicyServer sends notification too early.
+            //
+            StorePolicyNotification( aNotification );
+            
+            // Send preferred carrier message into meshmachine.
+            //
+            RNodeInterface ni;
+            ni.OpenPostMessageClose( NodeId(), 
+                                     NodeId(), 
+                                     TCFS60MCPRMessage::TMPMPreferredCarrierAvailableMsg( (TAny*)&notification ).CRef() );
+
             break;
             }
         case EMPMMobilityErrorNotification:
--- a/bearermanagement/S60MCPR/src/s60mcpractivities.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/src/s60mcpractivities.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -289,34 +289,31 @@
                         S60MCprMobilityActivity::TDoNothingOrReSendPendingNotification,
                         CS60MobilityActivity::TAwaitingPreferredCarrierOrStartIAPNotificationOrErrorNotificationOrCancel, // Ok. Error is fatal
                         S60MCprMobilityActivity::TNoTagOrInformMigrationAvailableBackwardsOrErrorOrCancel )
+    
     // Select the next layer MCPR.
     NODEACTIVITY_ENTRY( KNoTag, 
                         MCprStates::TSelectNextLayer,
                         MCprStates::TAwaitingSelectNextLayerCompleted, // Ok. Error is fatal.
-                        MeshMachine::TNoTagOrErrorTag )
-                        //S60MCprStates::TAwaitingSelectNextLayerCompletedOrError, // Not required Error is fatal. MPM should only give valid IAPs.
-                        //MeshMachine::TNoTagOrErrorTag )// Not required Error is fatal. MPM should only give valid IAPs.
+                        CS60MobilityActivity::TNoTagOrRequestReConnectToCurrentSPOrErrorTag )              
+                        
     // For the moment it is sufficient to use the re-connect activity, in the future we may want to
     // customise the behavior, for example start the new layer before rebinding it, etc.
     NODEACTIVITY_ENTRY( KNoTag, 
                         S60MCprStates::TRequestReConnect,
                         MCprStates::TAwaitingReConnectCompleteOrError,  // Ok. Error is fatal.
-                        MeshMachine::TNoTagOrErrorTag ) //Own error handling MPM must be informed when error happens.
-    // Select or activation failed, Ask MPM to decide if it it possible/sensible to ignore the error and continue.
-    // EDoReselect return will fall into EIgnoreError branch. MPM shouldn't return Reselect in this case.
-    // And if it does, then the use of startiapnotification in mobility scenarios should be
-    // removed and only reselect should be used.
-    /* Not required. PolicyServer should only give valid IAPs.
-    NODEACTIVITY_ENTRY( KErrorTag,
-                        S60MCprStates::TProcessError,
-                        S60MCprStates::TAwaitingProcessErrorCompleteOrError,  
-                        S60MCprMobilityActivity::TWaitPolicyServerResponseBackwardOrErrorTag )
-                        */
+                        S60MCprMobilityActivity::TInformMigrationCompletedOrError ) //Own error handling MPM must be informed when error happens.
+
+    NODEACTIVITY_ENTRY( S60MCprStates::KRequestReConnectToCurrentSP,
+                        S60MCprStates::TRequestReConnectToCurrentSP,
+                        MCprStates::TAwaitingReConnectCompleteOrError,
+                        S60MCprMobilityActivity::TInformMigrationCompletedOrError )
+                        
     // If the migration was acepted we loop again waiting for a new, preferred one
-    NODEACTIVITY_ENTRY( KNoTag, 
+    NODEACTIVITY_ENTRY( S60MCprStates::KInformMigrationCompleted, 
                         CS60MobilityActivity::TInformMigrationCompleted, 
                         S60MCprMobilityActivity::TAwaitingMigrationAcceptedOrRejectedOrStartupErrorIgnoredOrCancel,
                         S60MCprMobilityActivity::TNoTagOrErrorTagOrApplicationRejectedOrConsumeRejected )
+
     // Informs policy server that application has accepted the carrier
     THROUGH_NODEACTIVITY_ENTRY( KNoTag,
                                 CS60MobilityActivity::TSendApplicationAccept,
--- a/bearermanagement/S60MCPR/src/s60mcprmobilityactivity.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/src/s60mcprmobilityactivity.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -194,12 +194,29 @@
             {
             S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrInformMigrationAvailableBackwardsOrErrorOrCancel::TransitionTag() TMPMPreferredCarrierAvailableMsg",(TInt*)&iContext.Node())    
             return S60MCprStates::KInformMigrationAvailable | NetStateMachine::EBackward;
-            }
+            }            
         // else cancel
         return KCancelTag | NetStateMachine::EForward;
         }
 
-
+    // -----------------------------------------------------------------------------
+    // S60MCprMobilityActivity::TInformMigrationCompletedOrError::TransitionTag
+    // -----------------------------------------------------------------------------
+    //
+    DEFINE_SMELEMENT( TInformMigrationCompletedOrError, NetStateMachine::MStateFork, TContext )
+    TBool TInformMigrationCompletedOrError::TransitionTag()
+        {    
+        // Error notification falls into the error -case.
+        if ( iContext.iNodeActivity->Error() ) 
+            {   
+            return MeshMachine::KErrorTag | NetStateMachine::EForward;
+            }
+        else
+            {
+            return S60MCprStates::KInformMigrationCompleted;
+            }
+        }
+        
     // -----------------------------------------------------------------------------
     // S60MCprMobilityActivity::TStartMobilityHandshakeBackwardsOrError::TransitionTag
     // -----------------------------------------------------------------------------
@@ -488,7 +505,7 @@
 			TClientType(TCFClientType::EData, TCFClientType::ELeaving));
 		iContext.iNodeActivity->PostRequestTo(*dc, TCFDataClient::TStop(iContext.iNodeActivity->Error()).CRef());
 		}
-	
+    
     // -----------------------------------------------------------------------------
     // CS60MobilityActivity::TAwaitingPreferredCarrierOrCancelOrRejectedOrErrorNotification::Accept
     // -----------------------------------------------------------------------------
@@ -666,29 +683,40 @@
 
             return MeshMachine::KCancelTag | NetStateMachine::EForward;
             }
-/*        else
-            {
-            S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrErrorTagOrApplicationRejectedMigrationOrCancel::TransitionTag() Generating ApplicationIgnoredTheCarrier", (TInt*)&iContext.Node() );
-
-            // Need to put MPM in consistent state and continue.
-            CS60MetaConnectionProvider& node = (CS60MetaConnectionProvider&)iContext.Node();
-            CS60MobilityActivity& activity = static_cast<CS60MobilityActivity&>(*iContext.iNodeActivity);
-            TRAP_IGNORE( node.Policy()->ApplicationIgnoredTheCarrierL( activity.iPreferredAPId ) );
-            
-            if ( iContext.iNodeActivity->Error() == KErrNone )
-                {
-                ASSERT(EFalse); // should not happend
-                iContext.iNodeActivity->SetError( KErrGeneral ); // doesn't have effect if already set.
-                return MeshMachine::KErrorTag | NetStateMachine::EForward;
-                }
-            
-            return MeshMachine::KErrorTag | NetStateMachine::EForward;
-            }*/
         S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrApplicationRejectedMigrationOrCancel::TransitionTag() KErrorTag ESock_IP Panic",(TInt*)&iContext.Node())
         ASSERT(EFalse); // error, IPCPR should not send TError in this case.
         return MeshMachine::KErrorTag | NetStateMachine::EForward;
         }
 
+    // -----------------------------------------------------------------------------
+    // CS60MobilityActivity::TNoTagOrRequestReConnectToCurrentSPOrErrorTag::DoL
+    // -----------------------------------------------------------------------------
+    //
+    DEFINE_SMELEMENT( CS60MobilityActivity::TNoTagOrRequestReConnectToCurrentSPOrErrorTag, 
+                      NetStateMachine::MStateFork, CS60MobilityActivity::TContext )
+    TInt CS60MobilityActivity::TNoTagOrRequestReConnectToCurrentSPOrErrorTag::TransitionTag()
+        {
+        CS60MetaConnectionProvider& node = (CS60MetaConnectionProvider&)iContext.Node();
+        RMetaServiceProviderInterface* sp = (RMetaServiceProviderInterface*)node.ServiceProvider();
+
+        if ( iContext.iNodeActivity->Error() )
+            {
+            S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrBearerPresentOrError::TransitionTag() KErrorTag",(TInt*)&iContext.Node())
+            return MeshMachine::KErrorTag | NetStateMachine::EForward;
+            }
+            // Check whether we're bound to a provider for the given IAP ID already
+        else if (sp && sp->ProviderInfo().APId() == node.PolicyPrefs().IapId())
+            {
+            // Restart the whole layer
+            S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrBearerPresentOrError::TransitionTag() Re-establishment",(TInt*)&iContext.Node());
+            return S60MCprStates::KRequestReConnectToCurrentSP | NetStateMachine::EForward;
+            }
+        else
+            {
+            S60MCPRLOGSTRING1("S60MCPR<%x>::TNoTagOrBearerPresentOrError::TransitionTag() KNoTag",(TInt*)&iContext.Node())
+            return MeshMachine::KNoTag | NetStateMachine::EForward;
+            }
+        }    
     
     // -----------------------------------------------------------------------------
     // CS60MobilityActivity::ClearHandshakingFlag
--- a/bearermanagement/S60MCPR/src/s60mcprstates.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/src/s60mcprstates.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -180,7 +180,28 @@
                                                                 startingSP->RecipientId()).CRef() );
     }
 
+// -----------------------------------------------------------------------------
+// TRequestReConnectToCurrentSP::DoL
+// -----------------------------------------------------------------------------
+//
+DEFINE_SMELEMENT( TRequestReConnectToCurrentSP, NetStateMachine::MStateTransition, TContext )
+void TRequestReConnectToCurrentSP::DoL() // codescanner::leave
+    {
+    __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KS60MCprPanic, KPanicNoActivity));
+    S60MCPRLOGSTRING1("S60MCPR<%x>::TRequestReConnectToCurrentSP::DoL()",(TInt*)&iContext.Node())
+    RNodeInterface* currentSP = iContext.Node().ServiceProvider();
 
+    // There MUST be a service provider
+    __ASSERT_DEBUG( currentSP != NULL, User::Panic(KS60MCprPanic, KPanicNoServiceProvider));
+    
+    // Diagnostic - there must be a data client or we cannot be here
+    __ASSERT_DEBUG(iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData)),
+                   User::Panic(KS60MCprPanic, KPanicNoDataClient));    
+    
+    iContext.iNodeActivity->PostRequestTo( iContext.NodeId(),
+                                           TCFMcpr::TReConnect( currentSP->RecipientId(), 
+                                                                currentSP->RecipientId()).CRef() );
+    }
 // -----------------------------------------------------------------------------
 // TProcessError::DoL
 // -----------------------------------------------------------------------------
--- a/bearermanagement/S60MCPR/src/s60mpmrequests.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/S60MCPR/src/s60mpmrequests.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -86,7 +86,9 @@
 //
 CMPMPolicyRequests::CMPMPolicyRequests() :
                                     CActive( EPriorityStandard ),
-                                    iCommitedToDeleteItself( EFalse )
+                                    iCommitedToDeleteItself( EFalse ),
+                                    iReconnectTimerRunning( EFalse ),
+                                    iReconnectTimeout( KMPMInitialReconnectTimeout )
     {
     S60MCPRLOGSTRING1( "S60MCPR::CMPMPolicyRequests<%x>::CMPMPolicyRequests()", this )
     CActiveScheduler::Add( this );
@@ -129,6 +131,12 @@
         S60MCPRLOGSTRING1( "S60MCPR::CMPMPolicyRequests<%x>::~CMPMPolicyRequests() closing MPM session", this )
         iMpm.Close();
         }
+    
+    if ( iReconnectTimerRunning )
+        {
+        Cancel();
+        iReconnectTimer.Close();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -458,8 +466,6 @@
 //
 void CMPMPolicyRequests::IssueRequest()
     {
-    //__ASSERT_ALWAYS(IsActive() || iPolicyRequests.Count() > 0,User::Panic(KNetMCprPanic, KPanicInvalidCActiveUsage));
-
     // If we have a pending request, back off.
     //
     if ( IsActive() || iPolicyRequests.Count() == 0 )
@@ -621,10 +627,22 @@
     {
     S60MCPRLOGSTRING2( "S60MCPR::CMPMPolicyRequests<%x>::RunL() iStatus %d", this, iStatus.Int() )
 
-    // If there's a request waiting and is now completed
-    //
-    if ( iPolicyRequests.Count() > 0 && !iCommitedToDeleteItself)
+    // At first, check if this is a timer activity
+    if ( iReconnectTimerRunning )
         {
+        // iMpm.Connect() failed at least once. Timeout has expired, try again.
+#ifdef _DEBUG    
+        TBool isConnected = iMpm.Connected();
+        __ASSERT_DEBUG( !isConnected,  User::Panic( KS60MCprPanic, KErrGeneral ) );
+#endif
+        iReconnectTimerRunning = EFalse;
+        iReconnectTimer.Close();
+        iMpm.Connect( iStatus );
+        SetActive();
+        } 
+    else if ( iPolicyRequests.Count() > 0 && !iCommitedToDeleteItself)
+        {
+        // there's a request waiting and is now completed
         S60MCPRLOGSTRING1( "S60MCPR::CMPMPolicyRequests<%x>::RunL() Standard processing", this )
         PolicyRequest& policydata = iPolicyRequests[0];
         // Process the response
@@ -635,9 +653,9 @@
                 {
                 if ( iStatus.Int() != KErrNone )
                     {
-                    //-jl- MPM connection failed, set MPM connection required again.
+                    // MPM connection failed, set MPM connection required again.
                     iMpm.Close();
-                    //-jl- Go to RunError
+                    // Go to RunError
                     User::Leave( iStatus.Int() );
                     }
                 else
@@ -755,9 +773,16 @@
 //
 void CMPMPolicyRequests::DoCancel()
     {
-    // Not allowed! Cancel() may cause deadlock!
     _LIT( KPanicMsg, "CMPMPolicyRequests::DoCancel" );
-    User::Panic( KPanicMsg, KErrNotSupported );
+    if ( iReconnectTimerRunning )
+        {
+        iReconnectTimer.Cancel();
+        }
+    else
+        {
+        // Not allowed! Cancel() may cause deadlock!
+        User::Panic( KPanicMsg, KErrNotSupported );
+        }
     }
 
 
@@ -769,20 +794,33 @@
     {
     S60MCPRLOGSTRING1( "S60MCPR::CMPMPolicyRequests<%x>::RunError()", this )
     // Connect has failed, cleanup and deliver errors
-    TInt count = iPolicyRequests.Count();
-    for ( TInt i = 0; i < count; i++ )
+    if ( aError != KErrServerBusy || iReconnectTimeout >= KMPMMaxReconnectTimeout )
         {
-        if ( iPolicyRequests[i].iUser )
+        TInt count = iPolicyRequests.Count();
+        for ( TInt i = 0; i < count; i++ )
             {
-            S60MCPRLOGSTRING2( "S60MCPR::CMPMPolicyRequests<%x>::RunError() Sending error %d in PolicyResponse", this, aError )
-            iPolicyRequests[i].iStatus = aError;
-            iPolicyRequests[i].iUser->PolicyResponse( iPolicyRequests[i] );
+            if ( iPolicyRequests[i].iUser )
+                {
+                S60MCPRLOGSTRING2( "S60MCPR::CMPMPolicyRequests<%x>::RunError() Sending error %d in PolicyResponse", this, aError )
+                iPolicyRequests[i].iStatus = aError;
+                iPolicyRequests[i].iUser->PolicyResponse( iPolicyRequests[i] );
+                }
+            
+            // Delete prefs
+            iPolicyRequests[i].Cleanup();
             }
-        
-        // Delete prefs
-        iPolicyRequests[i].Cleanup();
+        iPolicyRequests.Reset();
         }
-    iPolicyRequests.Reset();
+    else
+        {
+        // KErrServerBusy received, try reconnecting after a brief pause
+        iReconnectTimeout *= KMPMReconnectTimeoutMultiplier;
+        TTimeIntervalMicroSeconds32 timeout( iReconnectTimeout );
+        iReconnectTimer.CreateLocal();
+        iReconnectTimer.After( iStatus, timeout );
+        iReconnectTimerRunning = ETrue;
+        SetActive();
+        }
 
     return KErrNone;
     }
@@ -885,5 +923,4 @@
     IssueRequest();
     }
 
-
 // End of file
--- a/bearermanagement/mpm/inc/mpmlauncher.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/mpm/inc/mpmlauncher.h	Mon Mar 15 12:42:11 2010 +0200
@@ -26,6 +26,9 @@
 //  INCLUDES
 #include <e32std.h>
 
+// CONSTANTS
+_LIT( KMPMLauncherSemaphore, "MPMLauncherSemaphore" );
+
 // CLASS DECLARATION
 /**
 *  Mobility Policy Manager server laucher for client.
--- a/bearermanagement/mpm/src/mpmiapselection.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/mpm/src/mpmiapselection.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -154,6 +154,17 @@
             return;
             }
         }
+    
+    if  ( iChooseIapPref.ConnSelectionDialog() )
+        {
+        // Complete selection with error code if wlan only was set and bearer set as cellular 
+        if ( wlanOnly && 
+             iChooseIapPref.BearerSet() == TExtendedConnPref::EExtendedConnBearerCellular ) 
+            {            
+            ChooseIapComplete( KErrPermissionDenied, NULL );
+            return;
+            }
+        }
         
     MPMLOGSTRING2( "CMPMIapSelection::ChooseIapL:\
  connection type %d", iChooseIapPref.ConnType() )
--- a/bearermanagement/mpm/src/mpmlauncher.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/mpm/src/mpmlauncher.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -40,18 +40,26 @@
     {
     MPMLOGSTRING("MPMLauncher::LaunchServer")
     const TUidType serverUid(KNullUid,aServerUid2,aServerUid3);
+    RSemaphore semaphore;
+    TInt err( KErrNone );
 
-    // We just create a new server process. Simultaneous
-    // launching of two such processes should be detected when the second one
-    // attempts to create the server object, failing with KErrAlreadyExists.
-    //
+    err = semaphore.CreateGlobal( KMPMLauncherSemaphore, 0 );
+    if ( err != KErrNone )
+        {
+        // Creating semaphore failed, which means some other thread is
+        // creating the server right. Propagate error KErrServerBusy
+        // to inform the client it should try connecting again.
+        return KErrServerBusy;
+        }
+    
     MPMLOGSTRING("Create a new server process")
     RProcess server;
     TInt r=server.Create(aServerFileName,KNullDesC,serverUid);
-
+    
     if ( r != KErrNone )
         {
         MPMLOGSTRING2("Server process creation returned error: %d", r)
+        semaphore.Close();
         return r;
         }
     TRequestStatus stat;
@@ -70,6 +78,7 @@
     // from KErrNone
     r = ( server.ExitType() == EExitPanic ) ? KErrGeneral : stat.Int();
     server.Close();
+    semaphore.Close();
     return r;
     }
 
--- a/cmmanager/cmmgr/Framework/Src/cmdesticondialog.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/cmmanager/cmmgr/Framework/Src/cmdesticondialog.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -166,7 +166,13 @@
                 keyEvent.iScanCode = aKeyEvent.iScanCode;
                 keyEvent.iModifiers = aKeyEvent.iModifiers;
                 keyEvent.iRepeats = aKeyEvent.iRepeats;
-                return CEikDialog::OfferKeyEventL( keyEvent, aModifiers );
+
+                TKeyResponse res( CEikDialog::OfferKeyEventL( keyEvent, aModifiers ) );
+                // It seems Avkon doesn't continue to call OkToExitL after this OfferKeyEventL.
+                // So, we may have to positively exit by calling TryExitL so that user's selected
+                // Icon will be return back to caller (i.e., CDestDlg).
+                TryExitL( EAknSoftkeyOk );
+                return res;
                 }
                 
             default:
--- a/dbcreator/commsdatcreator/Src/cdcprocessorglobal.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/dbcreator/commsdatcreator/Src/cdcprocessorglobal.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -801,10 +801,9 @@
 	    // Convert the input parameter to integer
     	TLex lex( *aValue );
 		
-		TUint value( 0 );
-		
-		User::LeaveIfError( lex.Val( value, EDecimal) );
-		
+    	TInt value( 0 );
+        User::LeaveIfError( lex.Val( value ) );
+        
 		// Set the paramter value
 	    
 	    if ( aField == EWlanBGScanInterval )
--- a/dbcreator/commsdatcreator/Src/cdcwlandevicesettings.cpp	Fri Mar 12 15:44:18 2010 +0200
+++ b/dbcreator/commsdatcreator/Src/cdcwlandevicesettings.cpp	Mon Mar 15 12:42:11 2010 +0200
@@ -32,8 +32,8 @@
 
 // CONSTANTS
 // WLAN Device Settings table - default settings
-const TUint32 KDefaultBGScanInterval    = -1;   // Automatic scan
-const TBool   KDefaultUseDefSettings    = EFalse;
+const TUint32 KDefaultBGScanInterval    = 0xFFFFFFFF;   // Automatic scan
+const TBool   KDefaultUseDefSettings    = ETrue;
 const TUint32 KDefaultLongRetry         = 4;
 const TUint32 KDefaultShortRetry        = 7;
 const TUint32 KDefaultRTS               = 2347;
Binary file dbcreator/conf/commsdatcreator.confml has changed
--- a/ipcm_pub/access_point_engine_api/inc/APSelect.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/ipcm_pub/access_point_engine_api/inc/APSelect.h	Mon Mar 15 12:42:11 2010 +0200
@@ -65,6 +65,7 @@
     {
     TUint32     iVpnIapId;
     TUint32     iHomeIapId;
+    TUint32     iHomeSnapId;
     HBufC *     iName;
     }TVpnData;
 
--- a/ipcm_pub/connection_settings_api/inc/cmgenconnsettings.h	Fri Mar 12 15:44:18 2010 +0200
+++ b/ipcm_pub/connection_settings_api/inc/cmgenconnsettings.h	Mon Mar 15 12:42:11 2010 +0200
@@ -44,18 +44,6 @@
     ECmCellularDataUsageDisabled
     };
 
-// DEPRECATED enumeration which will be removed within few weeks.
-// DO NOT USE THESE VALUES.
-// Functionality related to these values is broken although it compiles.
-enum TCmSeamlessnessValue
-        {
-        ECmSeamlessnessNotRoamedTo,   // DO NOT USE
-        ECmSeamlessnessConfirmFirst,  // DO NOT USE
-        ECmSeamlessnessShowprogress,  // DO NOT USE
-        ECmSeamlessnessFullySeamless, // DO NOT USE
-        ECmSeamlessnessDisabled       // DO NOT USE
-        };
-
 // Table for connection settings other than default connection
 struct TCmGenConnSettings
     {
@@ -65,16 +53,6 @@
     TCmCellularDataUsage   iCellularDataUsageHome;
     // Cellular data usage abroad.
     TCmCellularDataUsage   iCellularDataUsageVisitor;
-
-    // DEPRECATED variable that will be removed within few weeks.
-    // DO NOT USE THESE VARIABLES.
-    // Functionality related to this variable is broken although it compiles.
-    TCmSeamlessnessValue   iSeamlessnessHome;
-    // DEPRECATED variable that will be removed within few weeks.
-    // DO NOT USE THESE VARIABLES.
-    // Functionality related to this variable is broken although it compiles.
-    TCmSeamlessnessValue   iSeamlessnessVisitor;
     };
 
 #endif
-