--- src/service.c | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/src/service.c b/src/service.c index 9319323..34dbc79 100644 --- a/src/service.c +++ b/src/service.c @@ -3642,6 +3642,7 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, { struct connman_ipconfig *ipconfig = NULL; enum connman_service_state old_state; + int ret; if (service == NULL) return -EINVAL; @@ -3699,7 +3700,32 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) service->state_ipv6 = new_state; - return service_indicate_state(service); + ret = service_indicate_state(service); + + /* + * If the ipconfig method is OFF, then we set the state to IDLE + * so that it will not affect the combined state in the future. + */ + if (type == CONNMAN_IPCONFIG_TYPE_IPV4) { + enum connman_ipconfig_method method; + method = __connman_ipconfig_get_method(service->ipconfig_ipv4); + if (method == CONNMAN_IPCONFIG_METHOD_OFF || + method == CONNMAN_IPCONFIG_METHOD_UNKNOWN) { + service->state_ipv4 = CONNMAN_SERVICE_STATE_IDLE; + ret = service_indicate_state(service); + } + + } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) { + enum connman_ipconfig_method method; + method = __connman_ipconfig_get_method(service->ipconfig_ipv6); + if (method == CONNMAN_IPCONFIG_METHOD_OFF || + method == CONNMAN_IPCONFIG_METHOD_UNKNOWN) { + service->state_ipv6 = CONNMAN_SERVICE_STATE_IDLE; + ret = service_indicate_state(service); + } + } + + return ret; } int __connman_service_request_login(struct connman_service *service) -- 1.7.1 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman