Hi Patrik,
On ke, 2015-02-11 at 13:54 +0200, Patrik Flykt wrote:
> Configure IPv4 and IPv6 configurations only once in
> __connman_network_enable_ipconfig() and use this function when setting
> the network connected. Remove obsolete function and rework the rest
> to centralise configuration state and error reporting.
>
> The variable network->connecting is true as long as the IPv4 or IPv6
> address configuration phase is ongoing.
> ---
>
>
> Hi,
>
> This is a fairly large patch that removes duplicate code in set_connected()
> in favor of using the one in __connman_network_set_ipconfig(). There is
> no change in functionality in this patch.
>
> v2 fixes a glitch with variable naming wrt rebasing
>
>
> Please test,
>
> Patrik
>
>
> src/connman.h | 5 +-
> src/network.c | 218
> +++++++++++++++++-----------------------------------------
> src/service.c | 21 +++---
> 3 files changed, 80 insertions(+), 164 deletions(-)
>
> diff --git a/src/connman.h b/src/connman.h
> index 8d4a692..d4765cc 100644
> --- a/src/connman.h
> +++ b/src/connman.h
> @@ -587,9 +587,8 @@ int __connman_network_connect(struct connman_network
> *network);
> int __connman_network_disconnect(struct connman_network *network);
> int __connman_network_clear_ipconfig(struct connman_network *network,
> struct connman_ipconfig *ipconfig);
> -int __connman_network_set_ipconfig(struct connman_network *network,
> - struct connman_ipconfig *ipconfig_ipv4,
> - struct connman_ipconfig *ipconfig_ipv6);
> +int __connman_network_enable_ipconfig(struct connman_network *network,
> + struct connman_ipconfig *ipconfig);
>
> const char *__connman_network_get_type(struct connman_network *network);
> const char *__connman_network_get_group(struct connman_network *network);
> diff --git a/src/network.c b/src/network.c
> index 0cef220..253966e 100644
> --- a/src/network.c
> +++ b/src/network.c
> @@ -153,10 +153,6 @@ static void dhcp_success(struct connman_network *network)
> if (!service)
> goto err;
>
> - connman_network_set_associating(network, false);
> -
> - network->connecting = false;
> -
> ipconfig_ipv4 = __connman_service_get_ip4config(service);
>
> DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
> @@ -188,9 +184,6 @@ static void dhcp_failure(struct connman_network *network)
> if (!service)
> return;
>
> - connman_network_set_associating(network, false);
> - network->connecting = false;
> -
> ipconfig_ipv4 = __connman_service_get_ip4config(service);
>
> DBG("lease lost for ipconfig %p", ipconfig_ipv4);
> @@ -206,55 +199,24 @@ static void dhcp_callback(struct connman_ipconfig
> *ipconfig,
> struct connman_network *network,
> bool success, gpointer data)
> {
> + network->connecting = false;
> +
> if (success)
> dhcp_success(network);
> else
> dhcp_failure(network);
> }
>
> -static int set_connected_fixed(struct connman_network *network)
> -{
> - struct connman_service *service;
> - struct connman_ipconfig *ipconfig_ipv4;
> - int err;
> -
> - DBG("");
> -
> - service = connman_service_lookup_from_network(network);
> -
> - ipconfig_ipv4 = __connman_service_get_ip4config(service);
> -
> - set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
> -
> - network->connecting = false;
> -
> - connman_network_set_associating(network, false);
> -
> - err = __connman_ipconfig_address_add(ipconfig_ipv4);
> - if (err < 0)
> - goto err;
> -
> - err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
> - if (err < 0)
> - goto err;
> -
> - return 0;
> -
> -err:
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
> -
> - return err;
> -}
> -
> -static void set_connected_manual(struct connman_network *network)
> +static int set_connected_manual(struct connman_network *network)
> {
> + int err = 0;
> struct connman_service *service;
> struct connman_ipconfig *ipconfig;
> - int err;
>
> DBG("network %p", network);
>
> + network->connecting = false;
> +
> service = connman_service_lookup_from_network(network);
>
> ipconfig = __connman_service_get_ip4config(service);
> @@ -262,8 +224,6 @@ static void set_connected_manual(struct connman_network
> *network)
> if (!__connman_ipconfig_get_local(ipconfig))
> __connman_service_read_ip4config(service);
>
> - set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
> -
> err = __connman_ipconfig_address_add(ipconfig);
> if (err < 0)
> goto err;
> @@ -272,16 +232,8 @@ static void set_connected_manual(struct connman_network
> *network)
> if (err < 0)
> goto err;
>
> - network->connecting = false;
> -
> - connman_network_set_associating(network, false);
> -
> - return;
> -
> err:
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
> - return;
> + return err;
> }
>
> static int set_connected_dhcp(struct connman_network *network)
> @@ -292,8 +244,6 @@ static int set_connected_dhcp(struct connman_network
> *network)
>
> DBG("network %p", network);
>
> - set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
> -
> service = connman_service_lookup_from_network(network);
> ipconfig_ipv4 = __connman_service_get_ip4config(service);
>
> @@ -351,6 +301,8 @@ static int manual_ipv6_set(struct connman_network
> *network,
>
> static void stop_dhcpv6(struct connman_network *network)
> {
> + network->connecting = false;
> +
> __connman_dhcpv6_stop(network);
> }
>
> @@ -632,13 +584,13 @@ static void autoconf_ipv6_set(struct connman_network
> *network)
> static void set_connected(struct connman_network *network)
> {
> struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
> - enum connman_ipconfig_method ipv4_method, ipv6_method;
> struct connman_service *service;
> - int ret;
>
> if (network->connected)
> return;
>
> + connman_network_set_associating(network, false);
> +
> network->connected = true;
>
> service = connman_service_lookup_from_network(network);
> @@ -649,57 +601,8 @@ static void set_connected(struct connman_network
> *network)
> DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
> ipconfig_ipv6);
>
> - ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
> - ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
> -
> - DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
> -
> - switch (ipv6_method) {
> - case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
> - break;
> - case CONNMAN_IPCONFIG_METHOD_OFF:
> - __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
> - case CONNMAN_IPCONFIG_METHOD_DHCP:
> - case CONNMAN_IPCONFIG_METHOD_AUTO:
> - autoconf_ipv6_set(network);
> - break;
> - case CONNMAN_IPCONFIG_METHOD_FIXED:
> - case CONNMAN_IPCONFIG_METHOD_MANUAL:
> - ret = manual_ipv6_set(network, ipconfig_ipv6);
> - if (ret != 0) {
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
> - return;
> - }
> - break;
> - }
> -
> - switch (ipv4_method) {
> - case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
> - case CONNMAN_IPCONFIG_METHOD_OFF:
> - case CONNMAN_IPCONFIG_METHOD_AUTO:
> - return;
> - case CONNMAN_IPCONFIG_METHOD_FIXED:
> - if (set_connected_fixed(network) < 0) {
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
> - return;
> - }
> - return;
> - case CONNMAN_IPCONFIG_METHOD_MANUAL:
> - set_connected_manual(network);
> - return;
> - case CONNMAN_IPCONFIG_METHOD_DHCP:
> - if (set_connected_dhcp(network) < 0) {
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
> - return;
> - }
> - }
> -
> - network->connecting = false;
> -
> - connman_network_set_associating(network, false);
> + __connman_network_enable_ipconfig(network, ipconfig_ipv4);
> + __connman_network_enable_ipconfig(network, ipconfig_ipv6);
> }
>
> static void set_disconnected(struct connman_network *network)
> @@ -1608,26 +1511,6 @@ int __connman_network_disconnect(struct
> connman_network *network)
> return err;
> }
>
> -static int manual_ipv4_set(struct connman_network *network,
> - struct connman_ipconfig *ipconfig)
> -{
> - struct connman_service *service;
> - int err;
> -
> - service = connman_service_lookup_from_network(network);
> - if (!service)
> - return -EINVAL;
> -
> - err = __connman_ipconfig_address_add(ipconfig);
> - if (err < 0) {
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
> - return err;
> - }
> -
> - return __connman_ipconfig_gateway_add(ipconfig);
> -}
> -
> int __connman_network_clear_ipconfig(struct connman_network *network,
> struct connman_ipconfig *ipconfig)
> {
> @@ -1672,59 +1555,88 @@ int __connman_network_clear_ipconfig(struct
> connman_network *network,
> return 0;
> }
>
> -int __connman_network_set_ipconfig(struct connman_network *network,
> - struct connman_ipconfig *ipconfig_ipv4,
> - struct connman_ipconfig *ipconfig_ipv6)
> +int __connman_network_enable_ipconfig(struct connman_network *network,
> + struct connman_ipconfig *ipconfig)
> {
> + int r = 0;
> + enum connman_ipconfig_type type;
> enum connman_ipconfig_method method;
> - int ret;
>
> - if (!network)
> + if (!network || !ipconfig)
> return -EINVAL;
>
> - if (ipconfig_ipv6) {
> - method = __connman_ipconfig_get_method(ipconfig_ipv6);
> + type = __connman_ipconfig_get_config_type(ipconfig);
> +
> + switch (type) {
> + case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
> + case CONNMAN_IPCONFIG_TYPE_ALL:
> + return -ENOSYS;
> +
> + case CONNMAN_IPCONFIG_TYPE_IPV6:
> + set_configuration(network, type);
> +
> + method = __connman_ipconfig_get_method(ipconfig);
> +
> + DBG("ipv4 ipconfig method %d", method);
Prints above and few lines below should be swapped. This print is for
ipv6 ipconfig method.
>
> switch (method) {
> case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
> break;
> +
> case CONNMAN_IPCONFIG_METHOD_OFF:
> - __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
> + __connman_ipconfig_disable_ipv6(ipconfig);
> + break;
> +
> case CONNMAN_IPCONFIG_METHOD_AUTO:
> autoconf_ipv6_set(network);
> break;
> +
> case CONNMAN_IPCONFIG_METHOD_FIXED:
> case CONNMAN_IPCONFIG_METHOD_MANUAL:
> - ret = manual_ipv6_set(network, ipconfig_ipv6);
> - if (ret != 0) {
> - connman_network_set_error(network,
> - CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
> - return ret;
> - }
> + r = manual_ipv6_set(network, ipconfig);
> break;
> +
> case CONNMAN_IPCONFIG_METHOD_DHCP:
> + r = -ENOSYS;
> break;
> }
> - }
>
> - if (ipconfig_ipv4) {
> - method = __connman_ipconfig_get_method(ipconfig_ipv4);
> + break;
> +
> + case CONNMAN_IPCONFIG_TYPE_IPV4:
> + set_configuration(network, type);
> +
> + method = __connman_ipconfig_get_method(ipconfig);
> +
> + DBG("ipv6 ipconfig method %d", method);
Ditto.
>
> switch (method) {
> case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
> case CONNMAN_IPCONFIG_METHOD_OFF:
> - case CONNMAN_IPCONFIG_METHOD_FIXED:
> + break;
> +
> case CONNMAN_IPCONFIG_METHOD_AUTO:
> - return -EINVAL;
> + r = -ENOSYS;
> + break;
> +
> + case CONNMAN_IPCONFIG_METHOD_FIXED:
> case CONNMAN_IPCONFIG_METHOD_MANUAL:
> - return manual_ipv4_set(network, ipconfig_ipv4);
> + r = set_connected_manual(network);
> + break;
> +
> case CONNMAN_IPCONFIG_METHOD_DHCP:
> - return __connman_dhcp_start(ipconfig_ipv4,
> - network, dhcp_callback, NULL);
> + r = set_connected_dhcp(network);
> + break;
> }
> +
> + break;
> }
>
> - return 0;
> + if (r < 0)
> + connman_network_set_error(network,
> + CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
> +
> + return r;
> }
>
> int connman_network_set_ipaddress(struct connman_network *network,
> diff --git a/src/service.c b/src/service.c
> index f5fb868..3ed98ed 100644
> --- a/src/service.c
> +++ b/src/service.c
> @@ -3412,10 +3412,13 @@ static DBusMessage *set_property(DBusConnection *conn,
>
> if (err < 0) {
> if (is_connected_state(service, state) ||
> - is_connecting_state(service, state))
> - __connman_network_set_ipconfig(service->network,
> - service->ipconfig_ipv4,
> - service->ipconfig_ipv6);
> + is_connecting_state(service, state)) {
> +
> __connman_network_enable_ipconfig(service->network,
> + service->ipconfig_ipv4);
> +
> __connman_network_enable_ipconfig(service->network,
> + service->ipconfig_ipv6);
> + }
> +
> return __connman_error_failed(msg, -err);
> }
>
> @@ -3424,10 +3427,12 @@ static DBusMessage *set_property(DBusConnection *conn,
> else
> ipv6_configuration_changed(service);
>
> - if (is_connecting(service) || is_connected(service))
> - __connman_network_set_ipconfig(service->network,
> - service->ipconfig_ipv4,
> - service->ipconfig_ipv6);
> + if (is_connecting(service) || is_connected(service)) {
> + __connman_network_enable_ipconfig(service->network,
> + service->ipconfig_ipv4);
> + __connman_network_enable_ipconfig(service->network,
> + service->ipconfig_ipv6);
> + }
>
> service_save(service);
> } else
The daemon worked just fine in live environment and valgrind also did
not report any errors, so ACK with minor actions from me.
Cheers,
Jukka
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman