It should be possible to move down an online service to ready and the one
which goes up might come up online after recomputing its state.
---
 src/connection.c |    2 --
 src/service.c    |   29 ++++++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index 477cf84..54f2b74 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -766,8 +766,6 @@ gboolean __connman_connection_update_gateway(void)
                        unset_default_gateway(active_gateway,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
 
-               __connman_service_downgrade_state(active_gateway->service);
-
                if (default_gateway) {
                        if (default_gateway->ipv4_gateway)
                                set_default_gateway(default_gateway,
diff --git a/src/service.c b/src/service.c
index 479bb62..b92227c 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3285,6 +3285,19 @@ static gboolean check_suitable_state(enum 
connman_service_state a,
        return a == b;
 }
 
+static void apply_relevant_default_downgrade(struct connman_service *service)
+{
+       struct connman_service *def_service;
+
+       def_service = get_default();
+       if (def_service == NULL)
+               return;
+
+       if (def_service == service &&
+                       def_service->state == CONNMAN_SERVICE_STATE_ONLINE)
+               def_service->state = CONNMAN_SERVICE_STATE_READY;
+}
+
 static DBusMessage *move_service(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data,
                                                                gboolean before)
@@ -3364,7 +3377,21 @@ static DBusMessage *move_service(DBusConnection *conn,
        src = g_hash_table_lookup(service_hash, service->identifier);
        dst = g_hash_table_lookup(service_hash, target->identifier);
 
-       before ? g_sequence_move(src, dst) : g_sequence_move(dst, src);
+       /*
+        * If the service which goes down is the default service and is
+        * online, we downgrade directly its state to ready so:
+        * the service which goes up, needs to recompute its state which
+        * is triggered via downgrading it - if relevant - to state ready.
+        */
+       if (before == TRUE) {
+               apply_relevant_default_downgrade(target);
+               g_sequence_move(src, dst);
+               __connman_service_downgrade_state(service);
+       } else {
+               apply_relevant_default_downgrade(service);
+               g_sequence_move(dst, src);
+               __connman_service_downgrade_state(target);
+       }
 
        services_changed(FALSE);
 
-- 
1.7.8.rc3

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to