Update state machine handling for wireless networks
[platform/upstream/connman.git] / src / dhcp.c
index 5a6e5c9..3b6ba63 100644 (file)
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#include <arpa/inet.h>
+
 #include <glib.h>
 
 #include "connman.h"
@@ -45,12 +47,42 @@ void connman_dhcp_unregister(struct connman_dhcp_driver *driver)
        drivers = g_slist_remove(drivers, driver);
 }
 
+int connman_dhcp_update(struct connman_iface *iface,
+                               enum connman_dhcp_state state,
+                                       struct connman_ipv4 *ipv4)
+{
+       DBG("iface %p state %d", iface, state);
+
+       if (state == CONNMAN_DHCP_STATE_BOUND) {
+               DBG("address %s", inet_ntoa(ipv4->address));
+               DBG("netmask %s", inet_ntoa(ipv4->netmask));
+               DBG("gateway %s", inet_ntoa(ipv4->gateway));
+               DBG("network %s", inet_ntoa(ipv4->network));
+               DBG("broadcast %s", inet_ntoa(ipv4->broadcast));
+               DBG("nameserver %s", inet_ntoa(ipv4->nameserver));
+
+               ipv4->method = CONNMAN_IPV4_METHOD_DHCP;
+
+               connman_iface_set_ipv4(iface, ipv4);
+               iface->ipv4 = *ipv4;
+
+               connman_iface_indicate_configured(iface);
+       }
+
+       return 0;
+}
+
 int __connman_dhcp_request(struct connman_iface *iface)
 {
        struct connman_dhcp_driver *driver = g_slist_nth_data(drivers, 0);
 
-       if (driver && driver->request)
+       if (iface->flags & CONNMAN_IFACE_FLAG_DHCP)
+               return -1;
+
+       if (driver && driver->request) {
+               iface->flags |= CONNMAN_IFACE_FLAG_DHCP;
                return driver->request(iface);
+       }
 
        return -1;
 }
@@ -59,8 +91,13 @@ int __connman_dhcp_release(struct connman_iface *iface)
 {
        struct connman_dhcp_driver *driver = g_slist_nth_data(drivers, 0);
 
-       if (driver && driver->release)
+       if (!(iface->flags & CONNMAN_IFACE_FLAG_DHCP))
+               return -1;
+
+       if (driver && driver->release) {
+               iface->flags &= ~CONNMAN_IFACE_FLAG_DHCP;
                return driver->release(iface);
+       }
 
        return -1;
 }