If the ipconfig method is off, ensure that the resulting state will also be idle so that wrong actions are not taken. Print out a warning if the IP configuration state and method do not match. --- src/service.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-)
diff --git a/src/service.c b/src/service.c index 5d25618..2d8245e 100644 --- a/src/service.c +++ b/src/service.c @@ -5681,6 +5681,26 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, if (!ipconfig) return -EINVAL; + method = __connman_ipconfig_get_method(ipconfig); + + switch (method) { + case CONNMAN_IPCONFIG_METHOD_UNKNOWN: + case CONNMAN_IPCONFIG_METHOD_OFF: + if (new_state != CONNMAN_SERVICE_STATE_IDLE) + connman_warn("ipconfig state %d ipconfig method %d", + new_state, method); + + new_state = CONNMAN_SERVICE_STATE_IDLE; + break; + + case CONNMAN_IPCONFIG_METHOD_FIXED: + case CONNMAN_IPCONFIG_METHOD_MANUAL: + case CONNMAN_IPCONFIG_METHOD_DHCP: + case CONNMAN_IPCONFIG_METHOD_AUTO: + break; + + } + /* Any change? */ if (old_state == new_state) return -EALREADY; @@ -5722,25 +5742,6 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, break; } - /* Keep that state, but 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. - */ - method = __connman_ipconfig_get_method(ipconfig); - switch (method) { - case CONNMAN_IPCONFIG_METHOD_UNKNOWN: - case CONNMAN_IPCONFIG_METHOD_OFF: - new_state = CONNMAN_SERVICE_STATE_IDLE; - break; - - case CONNMAN_IPCONFIG_METHOD_FIXED: - case CONNMAN_IPCONFIG_METHOD_MANUAL: - case CONNMAN_IPCONFIG_METHOD_DHCP: - case CONNMAN_IPCONFIG_METHOD_AUTO: - break; - - } - if (is_connected_state(service, old_state) && !is_connected_state(service, new_state)) nameserver_remove_all(service, type); -- 2.1.4 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman