summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-08-21 00:51:26 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-08-21 00:51:26 +0200
commit166ef127b4ea769c27811ede5f010d67de759051 (patch)
treee305310de100d03b2c3e33d7e379bbefa30beb4b
parent166f685e6444389176a10496875ab8ee67dcb1a9 (diff)
downloadconnman-166ef127b4ea769c27811ede5f010d67de759051.tar.gz
connman-166ef127b4ea769c27811ede5f010d67de759051.tar.bz2
connman-166ef127b4ea769c27811ede5f010d67de759051.zip
Disconnect VPNs when no physical services are left
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.
-rw-r--r--src/provider.c12
-rw-r--r--src/service.c9
2 files changed, 9 insertions, 12 deletions
diff --git a/src/provider.c b/src/provider.c
index 984f57c0..705f911d 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -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,
};
diff --git a/src/service.c b/src/service.c
index 33c80063..eb467a04 100644
--- a/src/service.c
+++ b/src/service.c
@@ -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);