void ni_dhcp4_device_free(ni_dhcp4_device_t *dev) { ni_dhcp4_device_t **pos; ni_assert(dev->users == 0); ni_debug_dhcp("%s: Deleting dhcp4 device with index %u", dev->ifname, dev->link.ifindex); ni_dhcp4_device_drop_buffer(dev); ni_dhcp4_device_drop_lease(dev); ni_dhcp4_device_drop_best_offer(dev); ni_dhcp4_device_close(dev); ni_string_free(&dev->system.ifname); ni_string_free(&dev->ifname); /* Drop existing config and request */ ni_dhcp4_device_set_config(dev, NULL); ni_dhcp4_device_set_request(dev, NULL); for (pos = &ni_dhcp4_active; *pos; pos = &(*pos)->next) { if (*pos == dev) { *pos = dev->next; break; } } free(dev); }
int __ni_dhcp4_fsm_discover(ni_dhcp4_device_t *dev, int scan_offers) { ni_addrconf_lease_t *lease; int rv; ni_info("%s: Initiating DHCPv4 discovery (ifindex %d)", dev->ifname, dev->link.ifindex); /* If we already have a lease, try asking for the same. * If not, create a dummy lease with NULL fields. * Note: if DISCOVER for the old lease times out, * we should fall back to asking for anything. */ if ((lease = dev->lease) == NULL) lease = ni_addrconf_lease_new(NI_ADDRCONF_DHCP, AF_INET); lease->uuid = dev->config->uuid; dev->fsm.state = NI_DHCP4_STATE_SELECTING; rv = ni_dhcp4_device_send_message(dev, DHCP4_DISCOVER, lease); dev->dhcp4.accept_any_offer = 1; ni_debug_dhcp("valid lease: %d; have prefs: %d", ni_addrconf_lease_is_valid(dev->lease), ni_dhcp4_config_have_server_preference()); if (ni_addrconf_lease_is_valid(dev->lease) || (scan_offers && ni_dhcp4_config_have_server_preference())) { ni_dhcp4_fsm_set_timeout(dev, dev->config->initial_discovery_timeout); dev->dhcp4.accept_any_offer = 0; } else { ni_dhcp4_fsm_set_timeout(dev, dev->config->request_timeout); } ni_dhcp4_device_drop_best_offer(dev); if (lease != dev->lease) ni_addrconf_lease_free(lease); return rv; }