+ origin = ipconfig->origin ? ipconfig->origin : ipconfig;
+
+ connman_ipaddress_copy(origin->address, ipaddress);
+
+ connman_inet_set_address(origin->index, origin->address);
+}
+
+/* FIXME: The element soulution should be removed in the future */
+int __connman_ipconfig_set_gateway(struct connman_ipconfig *ipconfig,
+ struct connman_element *parent)
+{
+ struct connman_element *connection;
+
+ connection = connman_element_create(NULL);
+
+ connection->type = CONNMAN_ELEMENT_TYPE_CONNECTION;
+ connection->index = ipconfig->index;
+ connection->ipv4.gateway = ipconfig->address->gateway;
+
+ if (connman_element_register(connection, parent) < 0)
+ connman_element_unref(connection);
+
+ return 0;
+}
+
+int __connman_ipconfig_set_address(struct connman_ipconfig *ipconfig)
+{
+ DBG("");
+
+ switch (ipconfig->method) {
+ case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+ case CONNMAN_IPCONFIG_METHOD_OFF:
+ case CONNMAN_IPCONFIG_METHOD_FIXED:
+ case CONNMAN_IPCONFIG_METHOD_DHCP:
+ break;
+ case CONNMAN_IPCONFIG_METHOD_MANUAL:
+ return connman_inet_set_address(ipconfig->index,
+ ipconfig->address);
+ }
+
+ return 0;
+}
+
+int __connman_ipconfig_clear_address(struct connman_ipconfig *ipconfig)
+{
+ DBG("");
+
+ if (ipconfig == NULL)
+ return 0;
+
+ DBG("method %d", ipconfig->method);
+
+ switch (ipconfig->method) {
+ case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+ case CONNMAN_IPCONFIG_METHOD_OFF:
+ case CONNMAN_IPCONFIG_METHOD_FIXED:
+ case CONNMAN_IPCONFIG_METHOD_DHCP:
+ break;
+ case CONNMAN_IPCONFIG_METHOD_MANUAL:
+ return connman_inet_clear_address(ipconfig->index);
+ }
+
+ return 0;
+
+}
+
+int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
+{
+ struct connman_ipdevice *ipdevice;
+
+ DBG("ipconfig %p", ipconfig);
+
+ if (ipconfig == NULL || ipconfig->index < 0)
+ return -ENODEV;
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ return -ENXIO;
+
+ if (ipdevice->config == ipconfig)
+ return -EALREADY;
+
+ if (ipdevice->config != NULL) {
+ ipconfig_list = g_list_remove(ipconfig_list, ipconfig);
+
+ connman_ipaddress_clear(ipdevice->config->system);
+
+ connman_ipconfig_unref(ipdevice->config);
+ }
+
+ ipdevice->config = connman_ipconfig_ref(ipconfig);
+
+ ipconfig_list = g_list_append(ipconfig_list, ipconfig);
+
+ return 0;
+}
+
+int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig)
+{
+ struct connman_ipdevice *ipdevice;
+
+ DBG("ipconfig %p", ipconfig);
+
+ if (ipconfig == NULL || ipconfig->index < 0)
+ return -ENODEV;
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ return -ENXIO;
+
+ if (ipdevice->config == NULL || ipdevice->config != ipconfig)
+ return -EINVAL;
+
+ ipconfig_list = g_list_remove(ipconfig_list, ipconfig);
+
+ connman_ipaddress_clear(ipdevice->config->system);
+
+ connman_ipconfig_unref(ipdevice->config);
+ ipdevice->config = NULL;
+
+ return 0;