Factor out ipconfig disconnection so that the functionality will be
in one place only and one ipconfig can be disconnected independent of
the other one in a service.
---
src/network.c | 106 +++++++++++++++++++++++++++++----------------------------
1 file changed, 54 insertions(+), 52 deletions(-)
diff --git a/src/network.c b/src/network.c
index 6a926cb..3fd34c7 100644
--- a/src/network.c
+++ b/src/network.c
@@ -639,60 +639,47 @@ static void set_connected(struct connman_network *network)
connman_network_set_associating(network, FALSE);
}
-static void set_disconnected(struct connman_network *network)
+static int set_ipconfig_disconnected(struct connman_network *network,
+ struct connman_ipconfig *ipconfig)
{
- struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
- enum connman_ipconfig_method ipv4_method, ipv6_method;
- enum connman_service_state state;
struct connman_service *service;
-
- if (network->connected == FALSE)
- return;
-
- network->connected = FALSE;
+ enum connman_service_state state;
+ enum connman_ipconfig_type type;
+ enum connman_ipconfig_method method;
service = connman_service_lookup_from_network(network);
+ type = __connman_ipconfig_get_config_type(ipconfig);
+ method = __connman_ipconfig_get_method(ipconfig);
- ipconfig_ipv4 = __connman_service_get_ip4config(service);
- ipconfig_ipv6 = __connman_service_get_ip6config(service);
-
- DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
- ipconfig_ipv6);
+ DBG("service %p ipconfig %p method %d", service, ipconfig, method);
- 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);
+ if (service == NULL)
+ return -EINVAL;
/*
* Resetting solicit count here will prevent the RS resend loop
* from sending packets in check_dhcpv6()
*/
- network->router_solicit_count = 0;
-
- __connman_device_set_network(network->device, NULL);
+ if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
+ network->router_solicit_count = 0;
- switch (ipv6_method) {
+ switch (method) {
case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
case CONNMAN_IPCONFIG_METHOD_OFF:
case CONNMAN_IPCONFIG_METHOD_FIXED:
case CONNMAN_IPCONFIG_METHOD_MANUAL:
break;
+
case CONNMAN_IPCONFIG_METHOD_DHCP:
- case CONNMAN_IPCONFIG_METHOD_AUTO:
- release_dhcpv6(network);
+ if (type != CONNMAN_IPCONFIG_TYPE_IPV4)
+ return -EINVAL;
+ __connman_dhcp_stop(network);
break;
- }
- switch (ipv4_method) {
- case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
- case CONNMAN_IPCONFIG_METHOD_OFF:
case CONNMAN_IPCONFIG_METHOD_AUTO:
- case CONNMAN_IPCONFIG_METHOD_FIXED:
- case CONNMAN_IPCONFIG_METHOD_MANUAL:
- break;
- case CONNMAN_IPCONFIG_METHOD_DHCP:
- __connman_dhcp_stop(network);
+ if (type != CONNMAN_IPCONFIG_TYPE_IPV6)
+ return -EINVAL;
+ release_dhcpv6(network);
break;
}
@@ -701,27 +688,16 @@ static void set_disconnected(struct connman_network
*network)
* or in failure. It does not make sense to go to disconnect
* state if we were not connected.
*/
- state = __connman_service_ipconfig_get_state(service,
- CONNMAN_IPCONFIG_TYPE_IPV4);
- if (state != CONNMAN_SERVICE_STATE_IDLE &&
- state != CONNMAN_SERVICE_STATE_FAILURE)
- __connman_service_ipconfig_indicate_state(service,
- CONNMAN_SERVICE_STATE_DISCONNECT,
- CONNMAN_IPCONFIG_TYPE_IPV4);
+ state = __connman_service_ipconfig_get_state(service, type);
- state = __connman_service_ipconfig_get_state(service,
- CONNMAN_IPCONFIG_TYPE_IPV6);
if (state != CONNMAN_SERVICE_STATE_IDLE &&
- state != CONNMAN_SERVICE_STATE_FAILURE)
+ state != CONNMAN_SERVICE_STATE_FAILURE)
__connman_service_ipconfig_indicate_state(service,
CONNMAN_SERVICE_STATE_DISCONNECT,
- CONNMAN_IPCONFIG_TYPE_IPV6);
-
- __connman_connection_gateway_remove(service,
- CONNMAN_IPCONFIG_TYPE_ALL);
+ type);
- __connman_ipconfig_address_unset(ipconfig_ipv4);
- __connman_ipconfig_address_unset(ipconfig_ipv6);
+ __connman_connection_gateway_remove(service, type);
+ __connman_ipconfig_address_unset(ipconfig);
/*
* Special handling for IPv6 autoconfigured address.
@@ -729,11 +705,37 @@ static void set_disconnected(struct connman_network
*network)
* disable IPv6 temporarily so that kernel will do the cleanup
* automagically.
*/
- if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
- __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
- __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
+ if (method == CONNMAN_IPCONFIG_METHOD_AUTO) {
+ __connman_ipconfig_disable_ipv6(ipconfig);
+ __connman_ipconfig_enable_ipv6(ipconfig);
}
+ return 0;
+}
+
+static void set_disconnected(struct connman_network *network)
+{
+ struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
+ struct connman_service *service;
+
+ if (network->connected == FALSE)
+ return;
+
+ network->connected = FALSE;
+
+ service = connman_service_lookup_from_network(network);
+
+ ipconfig_ipv4 = __connman_service_get_ip4config(service);
+ ipconfig_ipv6 = __connman_service_get_ip6config(service);
+
+ DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
+ ipconfig_ipv6);
+
+ __connman_device_set_network(network->device, NULL);
+
+ set_ipconfig_disconnected(network, ipconfig_ipv4);
+ set_ipconfig_disconnected(network, ipconfig_ipv6);
+
__connman_service_ipconfig_indicate_state(service,
CONNMAN_SERVICE_STATE_IDLE,
CONNMAN_IPCONFIG_TYPE_IPV4);
--
1.7.10.4
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman