I have done some change according to your suggestion and think of Ethernet case.
Please review the patch:
diff --git a/include/network.h b/include/network.h
index 78e5c0e..15409bd 100644
--- a/include/network.h
+++ b/include/network.h
@@ -80,6 +80,8 @@ extern connman_bool_t connman_network_get_remember(struct 
connman_network *netwo
 
 extern int connman_network_connect(struct connman_network *network);
 
+extern int connman_network_disconnect(struct connman_network *network);
+
 extern int connman_network_set_string(struct connman_network *network,
                                        const char *key, const char *value);
 extern const char *connman_network_get_string(struct connman_network *network,
diff --git a/plugins/dhclient.c b/plugins/dhclient.c
index 7e5e6d0..323e49e 100644
--- a/plugins/dhclient.c
+++ b/plugins/dhclient.c
@@ -44,6 +44,7 @@ struct dhclient_task {
        GPid pid;
        int ifindex;
        gchar *ifname;
+       struct connman_network *network;
        struct connman_element *element;
 };
 
@@ -147,6 +148,10 @@ static int dhclient_probe(struct connman_element *element)
        task->ifindex = element->index;
        task->ifname = inet_index2name(element->index);
        task->element = element;
+       if(element->parent->type == CONNMAN_ELEMENT_TYPE_NETWORK)
+               task->network = element->parent->network;
+       else
+               task->network = NULL;
 
        if (task->ifname == NULL) {
                g_free(task);
@@ -306,7 +311,9 @@ static DBusHandlerResult dhclient_filter(DBusConnection 
*conn,
        } else if (g_ascii_strcasecmp(text, "RENEW") == 0 ||
                                g_ascii_strcasecmp(text, "REBIND") == 0) {
                connman_element_update(task->element);
-       } else {
+       }else if (g_ascii_strcasecmp(text, "FAIL") == 0) {
+               if (task->network)
+                       connman_network_disconnect(task->network);
        }
 
        return DBUS_HANDLER_RESULT_HANDLED;
diff --git a/src/network.c b/src/network.c
index 8cda558..104177e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -825,6 +825,24 @@ int __connman_network_disconnect(struct connman_network 
*network)
        return 0;
 }
 
+int connman_network_disconnect(struct connman_network *network)
+{
+       DBG("network %x", network);
+       if (network->connected == FALSE)
+               return -ENOTCONN;
+
+       connman_element_unregister_children(&network->element);
+
+       connman_device_set_disconnected(network->device, TRUE);
+
+       if (network->driver && network->driver->disconnect)
+               return network->driver->disconnect(network);
+       
+       network->connected = FALSE;
+       
+       return 0; 
+}
+
 /**
  * connman_network_set_string:
  * @network: network structure
_______________________________________________
connman mailing list
[email protected]
https://lists.moblin.org/mailman/listinfo/connman

Reply via email to