#include <config.h>
#endif
+#include <arpa/inet.h>
+
#include <glib.h>
#include "connman.h"
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;
}
{
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;
}