provider: Remove IPv4 element registration
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Fri, 25 Feb 2011 13:37:34 +0000 (14:37 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 25 Feb 2011 13:37:34 +0000 (14:37 +0100)
plugins/openconnect.c
plugins/openvpn.c
src/provider.c

index 795a5f6..45c78fe 100644 (file)
@@ -26,6 +26,7 @@
 #include <string.h>
 #include <errno.h>
 #include <unistd.h>
+#include <net/if.h>
 
 #include <glib.h>
 
@@ -34,6 +35,7 @@
 #include <connman/provider.h>
 #include <connman/log.h>
 #include <connman/task.h>
+#include <connman/ipconfig.h>
 
 #include "vpn.h"
 
@@ -42,6 +44,8 @@ static int oc_notify(DBusMessage *msg, struct connman_provider *provider)
        DBusMessageIter iter, dict;
        const char *reason, *key, *value;
        const char *domain = NULL;
+       char *address = NULL, *netmask = NULL, *gateway = NULL;
+       struct connman_ipaddress *ipaddress;
 
        dbus_message_iter_init(msg, &iter);
 
@@ -72,19 +76,19 @@ static int oc_notify(DBusMessage *msg, struct connman_provider *provider)
                        DBG("%s = %s", key, value);
 
                if (!strcmp(key, "VPNGATEWAY"))
-                       connman_provider_set_string(provider, "Gateway", value);
+                       gateway = g_strdup(value);
 
                if (!strcmp(key, "INTERNAL_IP4_ADDRESS"))
-                       connman_provider_set_string(provider, "Address", value);
+                       address = g_strdup(value);
 
                if (!strcmp(key, "INTERNAL_IP4_NETMASK"))
-                       connman_provider_set_string(provider, "Netmask", value);
+                       netmask = g_strdup(value);
 
                if (!strcmp(key, "INTERNAL_IP4_DNS"))
-                       connman_provider_set_string(provider, "DNS", value);
+                       connman_provider_set_nameservers(provider, value);
 
                if (!strcmp(key, "CISCO_PROXY_PAC"))
-                       connman_provider_set_string(provider, "PAC", value);
+                       connman_provider_set_pac(provider, value);
 
                if (domain == NULL && !strcmp(key, "CISCO_DEF_DOMAIN"))
                        domain = value;
@@ -96,7 +100,23 @@ static int oc_notify(DBusMessage *msg, struct connman_provider *provider)
                dbus_message_iter_next(&dict);
        }
 
-       connman_provider_set_string(provider, "Domain", domain);
+       ipaddress = connman_ipaddress_alloc(AF_INET);
+       if (ipaddress == NULL) {
+               g_free(address);
+               g_free(netmask);
+               g_free(gateway);
+
+               return VPN_STATE_FAILURE;
+       }
+
+       connman_ipaddress_set_ipv4(ipaddress, address, netmask, gateway);
+       connman_provider_set_ipaddress(provider, ipaddress);
+       connman_provider_set_domain(provider, domain);
+
+       g_free(address);
+       g_free(netmask);
+       g_free(gateway);
+       connman_ipaddress_free(ipaddress);
 
        return VPN_STATE_CONNECT;
 }
index 60e75dc..b1cad60 100644 (file)
@@ -37,6 +37,7 @@
 #include <connman/log.h>
 #include <connman/task.h>
 #include <connman/dbus.h>
+#include <connman/ipconfig.h>
 
 #include "vpn.h"
 
@@ -97,7 +98,9 @@ static int ov_notify(DBusMessage *msg, struct connman_provider *provider)
        DBusMessageIter iter, dict;
        const char *reason, *key, *value;
        const char *domain = NULL;
-       char *dns_entries = NULL;
+       char *nameservers = NULL;
+       char *address = NULL, *gateway = NULL, *peer = NULL;
+       struct connman_ipaddress *ipaddress;
 
        dbus_message_iter_init(msg, &iter);
 
@@ -126,28 +129,51 @@ static int ov_notify(DBusMessage *msg, struct connman_provider *provider)
 
                DBG("%s = %s", key, value);
 
-               if (!strcmp(key, "trusted_ip"))
+               if (!strcmp(key, "trusted_ip")) {
                        connman_provider_set_string(provider, "Gateway", value);
+                       gateway = g_strdup(value);
+               }
 
-               if (!strcmp(key, "ifconfig_local"))
+               if (!strcmp(key, "ifconfig_local")) {
                        connman_provider_set_string(provider, "Address", value);
+                       address = g_strdup(value);
+               }
 
-               if (!strcmp(key, "ifconfig_remote"))
+               if (!strcmp(key, "ifconfig_remote")) {
                        connman_provider_set_string(provider, "Peer", value);
+                       peer = g_strdup(value);
+               }
 
                if (g_str_has_prefix(key, "route_") == TRUE)
                        connman_provider_append_route(provider, key, value);
 
-               ov_append_dns_entries(key, value, &dns_entries);
+               ov_append_dns_entries(key, value, &nameservers);
 
                dbus_message_iter_next(&dict);
        }
 
-       if (dns_entries != NULL) {
-               connman_provider_set_string(provider, "DNS", dns_entries);
-               g_free(dns_entries);
+       ipaddress = connman_ipaddress_alloc(AF_INET);
+       if (ipaddress == NULL) {
+               g_free(nameservers);
+               g_free(address);
+               g_free(gateway);
+               g_free(peer);
+
+               return VPN_STATE_FAILURE;
        }
 
+       connman_ipaddress_set_ipv4(ipaddress, address, NULL, gateway);
+       connman_ipaddress_set_peer(ipaddress, peer);
+       connman_provider_set_ipaddress(provider, ipaddress);
+
+       connman_provider_set_nameservers(provider, nameservers);
+
+       g_free(nameservers);
+       g_free(address);
+       g_free(gateway);
+       g_free(peer);
+       connman_ipaddress_free(ipaddress);
+
        return VPN_STATE_CONNECT;
 }
 
index 4061af0..816ad3d 100644 (file)
@@ -50,7 +50,6 @@ struct connman_provider {
        char *name;
        char *type;
        char *host;
-       char *dns;
        char *domain;
        GHashTable *routes;
        struct connman_provider_driver *driver;
@@ -82,35 +81,6 @@ static struct connman_provider *connman_provider_lookup(const char *identifier)
        return provider;
 }
 
-static int connman_provider_setup_vpn_ipv4(struct connman_provider *provider,
-                                               struct connman_element *element)
-{
-       if (element == NULL || provider == NULL)
-               return -EINVAL;
-
-       DBG("set vpn type %d", element->type);
-
-       g_free(element->ipv4.address);
-       element->ipv4.address = g_strdup(provider->element.ipv4.address);
-
-       g_free(element->ipv4.peer);
-       element->ipv4.peer = g_strdup(provider->element.ipv4.peer);
-
-       g_free(element->ipv4.netmask);
-       element->ipv4.netmask = g_strdup(provider->element.ipv4.netmask);
-
-       g_free(element->ipv4.gateway);
-       element->ipv4.gateway = g_strdup(provider->element.ipv4.gateway);
-
-       g_free(element->ipv4.broadcast);
-       element->ipv4.broadcast = g_strdup(provider->element.ipv4.broadcast);
-
-       g_free(element->ipv4.pac);
-       element->ipv4.pac = g_strdup(provider->element.ipv4.pac);
-
-       return connman_element_register(element, &provider->element);
-}
-
 struct connman_provider *connman_provider_ref(struct connman_provider *provider)
 {
        DBG("provider %p", provider);
@@ -197,20 +167,6 @@ int __connman_provider_connect(struct connman_provider *provider)
 
        DBG("provider %p", provider);
 
-       g_free(provider->element.ipv4.address);
-       g_free(provider->element.ipv4.peer);
-       g_free(provider->element.ipv4.netmask);
-       g_free(provider->element.ipv4.gateway);
-       g_free(provider->element.ipv4.broadcast);
-       g_free(provider->element.ipv4.pac);
-
-       provider->element.ipv4.address = NULL;
-       provider->element.ipv4.peer = NULL;
-       provider->element.ipv4.netmask = NULL;
-       provider->element.ipv4.gateway = NULL;
-       provider->element.ipv4.broadcast = NULL;
-       provider->element.ipv4.pac = NULL;
-
        if (provider->driver != NULL && provider->driver->connect != NULL)
                err = provider->driver->connect(provider);
        else
@@ -278,98 +234,51 @@ static void provider_append_routes(gpointer key, gpointer value,
        }
 }
 
-static void provider_set_nameservers(struct connman_provider *provider)
-{
-       struct connman_service *service = provider->vpn_service;
-
-       char *nameservers = NULL, *name = NULL;
-       const char *value;
-       char *second_ns;
-
-       if (service == NULL)
-               return;
-
-       if (provider->dns == NULL)
-               return;
-
-       name = connman_inet_ifname(provider->element.index);
-
-       nameservers = g_strdup(provider->dns);
-       value = nameservers;
-       second_ns = strchr(value, ' ');
-       if (second_ns)
-               *(second_ns++) = 0;
-       __connman_service_nameserver_append(service, value);
-       value = second_ns;
-
-       while (value) {
-               char *next = strchr(value, ' ');
-               if (next)
-                       *(next++) = 0;
-
-               connman_resolver_append(name, provider->domain, value);
-               value = next;
-       }
-
-       g_free(nameservers);
-       g_free(name);
-}
-
 static int set_connected(struct connman_provider *provider,
                                        connman_bool_t connected)
 {
+       int err;
        struct connman_service *service = provider->vpn_service;
+       struct connman_ipconfig *ipconfig;
 
        if (service == NULL)
                return -ENODEV;
 
        if (connected == TRUE) {
-               enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
-               struct connman_element *element;
-               int err;
-
-               __connman_service_indicate_state(provider->vpn_service,
-                                       CONNMAN_SERVICE_STATE_CONFIGURATION,
-                                       CONNMAN_IPCONFIG_TYPE_IPV4);
-
-               type = CONNMAN_ELEMENT_TYPE_IPV4;
-
-               element = connman_element_create(NULL);
-               if (element == NULL)
-                       return -ENOMEM;
-
-               element->type  = type;
-               element->index = provider->element.index;
-
-               err = connman_provider_setup_vpn_ipv4(provider, element);
-               if (err < 0) {
-                       connman_element_unref(element);
-
-                       __connman_service_indicate_state(service,
-                                               CONNMAN_SERVICE_STATE_FAILURE,
-                                               CONNMAN_IPCONFIG_TYPE_IPV4);
-
-                       return err;
+               ipconfig = __connman_service_get_ip4config(service);
+               if (ipconfig == NULL) {
+                       err = -EIO;
+                       goto err;
                }
 
+               __connman_ipconfig_address_add(ipconfig);
+               __connman_ipconfig_gateway_add(ipconfig);
+
                __connman_service_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_READY,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
 
-               __connman_service_set_domainname(service, provider->domain);
-
-               provider_set_nameservers(provider);
-
                g_hash_table_foreach(provider->routes, provider_append_routes,
                                        provider);
+
        } else {
-               connman_element_unregister_children(&provider->element);
+               ipconfig = __connman_service_get_ip4config(service);
+               if (ipconfig != NULL)
+                       __connman_ipconfig_gateway_remove(ipconfig);
+
                __connman_service_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_IDLE,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
        }
 
        return 0;
+
+err:
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_FAILURE,
+                                       CONNMAN_IPCONFIG_TYPE_IPV4);
+
+       return err;
 }
 
 int connman_provider_set_state(struct connman_provider *provider,
@@ -450,7 +359,6 @@ static void provider_destruct(struct connman_element *element)
        g_free(provider->type);
        g_free(provider->domain);
        g_free(provider->identifier);
-       g_free(provider->dns);
        g_hash_table_destroy(provider->routes);
 }
 
@@ -473,15 +381,8 @@ static void provider_initialize(struct connman_provider *provider)
        provider->element.private = provider;
        provider->element.destruct = provider_destruct;
 
-       provider->element.ipv4.address = NULL;
-       provider->element.ipv4.netmask = NULL;
-       provider->element.ipv4.gateway = NULL;
-       provider->element.ipv4.broadcast = NULL;
-       provider->element.ipv4.pac = NULL;
-
        provider->name = NULL;
        provider->type = NULL;
-       provider->dns = NULL;
        provider->domain = NULL;
        provider->identifier = NULL;
        provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
@@ -699,29 +600,6 @@ int connman_provider_set_string(struct connman_provider *provider,
        } else if (g_str_equal(key, "Name") == TRUE) {
                g_free(provider->name);
                provider->name = g_strdup(value);
-       } else if (g_str_equal(key, "Gateway") == TRUE) {
-               g_free(provider->element.ipv4.gateway);
-               provider->element.ipv4.gateway = g_strdup(value);
-       } else if (g_str_equal(key, "Address") == TRUE) {
-               g_free(provider->element.ipv4.address);
-               provider->element.ipv4.address = g_strdup(value);
-       } else if (g_str_equal(key, "Peer") == TRUE) {
-               g_free(provider->element.ipv4.peer);
-               provider->element.ipv4.peer = g_strdup(value);
-       } else if (g_str_equal(key, "Netmask") == TRUE) {
-               g_free(provider->element.ipv4.netmask);
-               provider->element.ipv4.netmask = g_strdup(value);
-       } else if (g_str_equal(key, "PAC") == TRUE) {
-               g_free(provider->element.ipv4.pac);
-               provider->element.ipv4.pac = g_strdup(value);
-               __connman_service_set_proxy_autoconfig(provider->vpn_service,
-                                                                       value);
-       } else if (g_str_equal(key, "DNS") == TRUE) {
-               g_free(provider->dns);
-               provider->dns = g_strdup(value);
-       } else if (g_str_equal(key, "Domain") == TRUE) {
-               g_free(provider->domain);
-               provider->domain = g_strdup(value);
        }
 
        return connman_element_set_string(&provider->element, key, value);