Disconnect VPNs when no physical services are left
authorSamuel Ortiz <sameo@linux.intel.com>
Fri, 20 Aug 2010 22:51:26 +0000 (00:51 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 20 Aug 2010 22:51:26 +0000 (00:51 +0200)
This was previously handled by the provider notifier code, but with the
VPNs being moved to the service list top, it has to be handled from the
service layer directly.

src/provider.c
src/service.c

index 984f57c..705f911 100644 (file)
@@ -699,20 +699,8 @@ static void provider_offline_mode(connman_bool_t enabled)
 
 }
 
-static void provider_default_changed(struct connman_service *service)
-{
-       DBG("service %p", service);
-
-       if (service == NULL) {
-               /* When no services are active, then disconnect all VPNs */
-               provider_offline_mode(TRUE);
-               return;
-       }
-}
-
 static struct connman_notifier provider_notifier = {
        .name                   = "provider",
-       .default_changed        = provider_default_changed,
        .offline_mode           = provider_offline_mode,
 };
 
index 33c8006..eb467a0 100644 (file)
@@ -2597,6 +2597,15 @@ int __connman_service_indicate_state(struct connman_service *service,
        if (service->state == CONNMAN_SERVICE_STATE_ONLINE)
                default_changed();
 
+       if (service->state == CONNMAN_SERVICE_STATE_DISCONNECT) {
+               struct connman_service *def_service = get_default();
+
+               if (__connman_notifier_count_connected() == 0 &&
+                       def_service != NULL &&
+                               def_service->provider != NULL)
+                       __connman_provider_disconnect(def_service->provider);
+       }
+
        if (service->state == CONNMAN_SERVICE_STATE_IDLE ||
                        service->state == CONNMAN_SERVICE_STATE_FAILURE)
                __connman_element_request_scan(CONNMAN_ELEMENT_TYPE_UNKNOWN);