From 03cbc012afd80dbdd75f1293ab2ada6b25044944 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 21 Jan 2009 17:01:25 +0100 Subject: [PATCH] Add support for static IPv4 settings --- src/connection.c | 29 ++-------------- src/connman.h | 5 +++ src/device.c | 30 ++++++++++++++++- src/element.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 28 deletions(-) diff --git a/src/connection.c b/src/connection.c index f617dde..f011b0c 100644 --- a/src/connection.c +++ b/src/connection.c @@ -207,8 +207,7 @@ static DBusMessage *get_properties(DBusConnection *conn, DBusMessageIter array, dict; connman_uint8_t strength = 0; const char *device, *network; - const char *type = NULL, *method = NULL; - const char *address = NULL, *netmask = NULL, *gateway = NULL; + const char *type = NULL; DBG("conn %p", conn); @@ -255,31 +254,7 @@ static DBusMessage *get_properties(DBusConnection *conn, connman_dbus_dict_append_variant(&dict, "Network", DBUS_TYPE_OBJECT_PATH, &network); - connman_element_get_value(element, - CONNMAN_PROPERTY_ID_IPV4_METHOD, &method); - - connman_element_get_value(element, - CONNMAN_PROPERTY_ID_IPV4_ADDRESS, &address); - connman_element_get_value(element, - CONNMAN_PROPERTY_ID_IPV4_NETMASK, &netmask); - connman_element_get_value(element, - CONNMAN_PROPERTY_ID_IPV4_GATEWAY, &gateway); - - if (method != NULL) - connman_dbus_dict_append_variant(&dict, "IPv4.Method", - DBUS_TYPE_STRING, &method); - - if (address != NULL) - connman_dbus_dict_append_variant(&dict, "IPv4.Address", - DBUS_TYPE_STRING, &address); - - if (netmask != NULL) - connman_dbus_dict_append_variant(&dict, "IPv4.Netmask", - DBUS_TYPE_STRING, &netmask); - - if (gateway != NULL) - connman_dbus_dict_append_variant(&dict, "IPv4.Gateway", - DBUS_TYPE_STRING, &gateway); + __connman_element_append_ipv4(element, &dict); dbus_message_iter_close_container(&array, &dict); diff --git a/src/connman.h b/src/connman.h index 6da4c7a..58f57ff 100644 --- a/src/connman.h +++ b/src/connman.h @@ -132,6 +132,11 @@ static inline void __connman_element_unlock(struct connman_element *element) { } +int __connman_element_append_ipv4(struct connman_element *element, + DBusMessageIter *dict); +int __connman_element_set_ipv4(struct connman_element *element, + const char *name, DBusMessageIter *value); + int __connman_detect_init(void); void __connman_detect_cleanup(void); diff --git a/src/device.c b/src/device.c index 9c31c72..054e1aa 100644 --- a/src/device.c +++ b/src/device.c @@ -296,7 +296,9 @@ static DBusMessage *get_properties(DBusConnection *conn, switch (device->mode) { case CONNMAN_DEVICE_MODE_UNKNOWN: + break; case CONNMAN_DEVICE_MODE_TRANSPORT_IP: + __connman_element_append_ipv4(&device->element, &dict); break; case CONNMAN_DEVICE_MODE_NETWORK_SINGLE: case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE: @@ -375,6 +377,17 @@ static DBusMessage *set_property(DBusConnection *conn, dbus_message_iter_get_basic(&value, &priority); device->priority = priority; + } else if (g_str_has_prefix(name, "IPv4") == TRUE) { + switch (device->mode) { + case CONNMAN_DEVICE_MODE_UNKNOWN: + case CONNMAN_DEVICE_MODE_NETWORK_SINGLE: + case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE: + return __connman_error_invalid_arguments(msg); + case CONNMAN_DEVICE_MODE_TRANSPORT_IP: + __connman_element_set_ipv4(&device->element, + name, &value); + break; + } } __connman_storage_save_device(device); @@ -736,6 +749,8 @@ struct connman_device *connman_device_create(const char *node, connman_element_add_static_property(&device->element, "Type", DBUS_TYPE_STRING, &str); + device->element.ipv4.method = CONNMAN_IPV4_METHOD_DHCP; + device->type = type; device->mode = CONNMAN_DEVICE_MODE_UNKNOWN; device->policy = CONNMAN_DEVICE_POLICY_AUTO; @@ -980,11 +995,24 @@ int connman_device_set_carrier(struct connman_device *device, device->carrier = carrier; if (carrier == TRUE) { + enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; struct connman_element *element; + switch (device->element.ipv4.method) { + case CONNMAN_IPV4_METHOD_UNKNOWN: + case CONNMAN_IPV4_METHOD_OFF: + return 0; + case CONNMAN_IPV4_METHOD_STATIC: + type = CONNMAN_ELEMENT_TYPE_IPV4; + break; + case CONNMAN_IPV4_METHOD_DHCP: + type = CONNMAN_ELEMENT_TYPE_DHCP; + break; + } + element = connman_element_create(NULL); if (element != NULL) { - element->type = CONNMAN_ELEMENT_TYPE_DHCP; + element->type = type; element->index = device->element.index; if (connman_element_register(element, diff --git a/src/element.c b/src/element.c index 858ac76..f6742f2 100644 --- a/src/element.c +++ b/src/element.c @@ -818,6 +818,107 @@ gboolean connman_element_match_static_property(struct connman_element *element, return result; } +int __connman_element_append_ipv4(struct connman_element *element, + DBusMessageIter *dict) +{ + const char *method = NULL; + const char *address = NULL, *netmask = NULL, *gateway = NULL; + + connman_element_get_value(element, + CONNMAN_PROPERTY_ID_IPV4_METHOD, &method); + + connman_element_get_value(element, + CONNMAN_PROPERTY_ID_IPV4_ADDRESS, &address); + connman_element_get_value(element, + CONNMAN_PROPERTY_ID_IPV4_NETMASK, &netmask); + connman_element_get_value(element, + CONNMAN_PROPERTY_ID_IPV4_GATEWAY, &gateway); + + if (method != NULL) + connman_dbus_dict_append_variant(dict, "IPv4.Method", + DBUS_TYPE_STRING, &method); + + if (address != NULL) + connman_dbus_dict_append_variant(dict, "IPv4.Address", + DBUS_TYPE_STRING, &address); + + if (netmask != NULL) + connman_dbus_dict_append_variant(dict, "IPv4.Netmask", + DBUS_TYPE_STRING, &netmask); + + if (gateway != NULL) + connman_dbus_dict_append_variant(dict, "IPv4.Gateway", + DBUS_TYPE_STRING, &gateway); + + return 0; +} + +int __connman_element_set_ipv4(struct connman_element *element, + const char *name, DBusMessageIter *value) +{ + int type; + + type = dbus_message_iter_get_arg_type(value); + + if (g_str_equal(name, "IPv4.Method") == TRUE) { + enum connman_ipv4_method method; + const char *str; + + if (type != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(value, &str); + method = __connman_ipv4_string2method(str); + if (method == CONNMAN_IPV4_METHOD_UNKNOWN) + return -EINVAL; + + if (method == element->ipv4.method) + return -EALREADY; + + element->ipv4.method = method; + + connman_element_update(element); + } else if (g_str_equal(name, "IPv4.Address") == TRUE) { + const char *address; + + if (type != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(value, &address); + + g_free(element->ipv4.address); + element->ipv4.address = g_strdup(address); + + connman_element_update(element); + } else if (g_str_equal(name, "IPv4.Netmask") == TRUE) { + const char *netmask; + + if (type != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(value, &netmask); + + g_free(element->ipv4.netmask); + element->ipv4.netmask = g_strdup(netmask); + + connman_element_update(element); + } else if (g_str_equal(name, "IPv4.Gateway") == TRUE) { + const char *gateway; + + if (type != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(value, &gateway); + + g_free(element->ipv4.gateway); + element->ipv4.gateway = g_strdup(gateway); + + connman_element_update(element); + } + + return 0; +} + static void append_connections(DBusMessageIter *entry) { DBusMessageIter value, iter; -- 2.7.4