From 2c0a9857811e9236866193427622d0480c3351ae Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 25 Feb 2011 14:37:34 +0100 Subject: provider: Remove IPv4 element registration --- plugins/openconnect.c | 32 ++++++++-- plugins/openvpn.c | 42 ++++++++++--- src/provider.c | 164 +++++++------------------------------------------- 3 files changed, 81 insertions(+), 157 deletions(-) diff --git a/plugins/openconnect.c b/plugins/openconnect.c index 795a5f61..45c78fe5 100644 --- a/plugins/openconnect.c +++ b/plugins/openconnect.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -34,6 +35,7 @@ #include #include #include +#include #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; } diff --git a/plugins/openvpn.c b/plugins/openvpn.c index 60e75dc0..b1cad607 100644 --- a/plugins/openvpn.c +++ b/plugins/openvpn.c @@ -37,6 +37,7 @@ #include #include #include +#include #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; } diff --git a/src/provider.c b/src/provider.c index 4061af08..816ad3d6 100644 --- a/src/provider.c +++ b/src/provider.c @@ -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); -- cgit v1.2.3