service: Keep only a single connected technology if configured
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 17 Oct 2012 10:34:41 +0000 (13:34 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Thu, 18 Oct 2012 10:27:10 +0000 (13:27 +0300)
If SingleConnectedTechnology is enabled in main.conf, disconnect any
previously connected services when the new service enters ready state.

src/service.c

index b85e604..8857a47 100644 (file)
@@ -4943,6 +4943,35 @@ static int service_update_preferred_order(struct connman_service *default_servic
        return -EALREADY;
 }
 
+static void single_connected_tech(struct connman_service *allowed)
+{
+       GSList *services = NULL;
+       GSequenceIter *iter;
+       GSList *list;
+
+       iter = g_sequence_get_begin_iter(service_list);
+
+       while (g_sequence_iter_is_end(iter) == FALSE) {
+               struct connman_service *service = g_sequence_get(iter);
+
+               if (service != allowed && is_connected(service))
+                       services = g_slist_prepend(services, service);
+
+               iter = g_sequence_iter_next(iter);
+       }
+
+       DBG("keeping %p %s", allowed, allowed->path);
+
+       for (list = services; list != NULL; list = list->next) {
+               struct connman_service *service = list->data;
+
+               DBG("disconnecting %p %s", service, service->path);
+               __connman_service_disconnect(service);
+       }
+
+       g_slist_free(services);
+}
+
 static int service_indicate_state(struct connman_service *service)
 {
        enum connman_service_state old_state, new_state;
@@ -5068,6 +5097,10 @@ static int service_indicate_state(struct connman_service *service)
                        __connman_ipconfig_disable_ipv6(
                                                service->ipconfig_ipv6);
 
+               if (connman_setting_get_bool("SingleConnectedTechnology")
+                               == TRUE)
+                       single_connected_tech(service);
+
        } else if (new_state == CONNMAN_SERVICE_STATE_DISCONNECT) {
                def_service = __connman_service_get_default();