summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@nokia.com>2011-02-10 17:52:18 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2011-02-11 12:26:55 +0100
commit4f134cac4d2338ee5da7a628db9cf56e83f5d629 (patch)
treeb19c278df685a7cef182cf11ded849ff3d88f22f /src
parent13c581fa10b354a09a14ee0a25abc1be7fc13773 (diff)
downloadconnman-4f134cac4d2338ee5da7a628db9cf56e83f5d629.tar.gz
connman-4f134cac4d2338ee5da7a628db9cf56e83f5d629.tar.bz2
connman-4f134cac4d2338ee5da7a628db9cf56e83f5d629.zip
service: Check service state properly if user changes method
Diffstat (limited to 'src')
-rw-r--r--src/service.c63
1 files changed, 47 insertions, 16 deletions
diff --git a/src/service.c b/src/service.c
index 1b8e42a7..07fa7f6e 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2012,6 +2012,49 @@ error:
return -EINVAL;
}
+static int set_ipconfig(struct connman_service *service,
+ struct connman_ipconfig *ipconfig,
+ DBusMessageIter *array,
+ enum connman_service_state state,
+ enum connman_service_state *new_state)
+{
+ enum connman_ipconfig_method old_method;
+ enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
+ enum connman_ipconfig_type type;
+ int err;
+
+ old_method = __connman_ipconfig_get_method(ipconfig);
+
+ if (is_connecting_state(service, state) ||
+ is_connected_state(service, state))
+ __connman_network_clear_ipconfig(service->network, ipconfig);
+
+ err = __connman_ipconfig_set_config(ipconfig, array);
+ method = __connman_ipconfig_get_method(ipconfig);
+ type = __connman_ipconfig_get_config_type(ipconfig);
+
+ if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
+ if (err == 0 && old_method == CONNMAN_IPCONFIG_METHOD_OFF &&
+ method == CONNMAN_IPCONFIG_METHOD_DHCP) {
+ *new_state = service->state_ipv4 =
+ CONNMAN_SERVICE_STATE_CONFIGURATION;
+ __connman_ipconfig_enable(ipconfig);
+ }
+
+ } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
+ if (err == 0 && old_method == CONNMAN_IPCONFIG_METHOD_OFF &&
+ method == CONNMAN_IPCONFIG_METHOD_AUTO) {
+ *new_state = service->state_ipv6;
+ __connman_ipconfig_enable(ipconfig);
+ }
+ }
+
+ DBG("err %d ipconfig %p type %d method %d state %s", err, ipconfig,
+ type, method, state2string(*new_state));
+
+ return err;
+}
+
static DBusMessage *set_property(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
@@ -2242,26 +2285,14 @@ static DBusMessage *set_property(DBusConnection *conn,
return __connman_error_invalid_property(msg);
if (g_str_equal(name, "IPv4.Configuration") == TRUE) {
- state = service->state_ipv4;
- if (is_connecting_state(service, state) ||
- is_connected_state(service, state))
- __connman_network_clear_ipconfig(
- service->network,
- service->ipconfig_ipv4);
-
ipv4 = service->ipconfig_ipv4;
- err = __connman_ipconfig_set_config(ipv4, &value);
+ err = set_ipconfig(service, ipv4, &value,
+ service->state_ipv4, &state);
} else if (g_str_equal(name, "IPv6.Configuration") == TRUE) {
- state = service->state_ipv6;
- if (is_connecting_state(service, state) ||
- is_connected_state(service, state))
- __connman_network_clear_ipconfig(
- service->network,
- service->ipconfig_ipv6);
-
ipv6 = service->ipconfig_ipv6;
- err = __connman_ipconfig_set_config(ipv6, &value);
+ err = set_ipconfig(service, ipv6, &value,
+ service->state_ipv6, &state);
}
if (err < 0) {