Skip to content

Commit

Permalink
dhcp4: adopt to use reference counted lease utils
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Oct 5, 2022
1 parent 0cbb9cf commit bcf4f7f
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 52 deletions.
43 changes: 17 additions & 26 deletions src/dhcp4/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,45 +202,32 @@ ni_dhcp4_device_uptime(const ni_dhcp4_device_t *dev, unsigned int clamp)
void
ni_dhcp4_device_set_lease(ni_dhcp4_device_t *dev, ni_addrconf_lease_t *lease)
{
if (dev->lease != lease) {
if (dev->lease)
ni_addrconf_lease_free(dev->lease);
dev->lease = lease;
if (dev->config && lease)
lease->uuid = dev->config->uuid;
}
ni_addrconf_lease_hold(&dev->lease, lease);
if (dev->config && lease)
lease->uuid = dev->config->uuid;
}

void
ni_dhcp4_device_drop_lease(ni_dhcp4_device_t *dev)
{
ni_addrconf_lease_t *lease;

if ((lease = dev->lease) != NULL) {
dev->lease = NULL;
ni_addrconf_lease_free(lease);
}
ni_addrconf_lease_drop(&dev->lease);
}

void
ni_dhcp4_device_set_best_offer(ni_dhcp4_device_t *dev, ni_addrconf_lease_t *lease,
ni_dhcp4_device_set_best_offer(ni_dhcp4_device_t *dev, ni_addrconf_lease_t **lease,
int weight)
{
if (dev->best_offer.lease && dev->best_offer.lease != lease)
ni_addrconf_lease_free(dev->best_offer.lease);
dev->best_offer.lease = lease;
ni_addrconf_lease_move(&dev->best_offer.lease, lease);
dev->best_offer.weight = weight;
if (dev->config && lease)
lease->uuid = dev->config->uuid;
if (dev->config && dev->best_offer.lease)
dev->best_offer.lease->uuid = dev->config->uuid;
}

void
ni_dhcp4_device_drop_best_offer(ni_dhcp4_device_t *dev)
{
dev->best_offer.weight = -1;
if (dev->best_offer.lease)
ni_addrconf_lease_free(dev->best_offer.lease);
dev->best_offer.lease = NULL;
ni_addrconf_lease_drop(&dev->best_offer.lease);
}

/*
Expand Down Expand Up @@ -705,13 +692,13 @@ ni_dhcp4_device_prepare_message(void *data)
}

int
ni_dhcp4_device_send_message(ni_dhcp4_device_t *dev, unsigned int msg_code, const ni_addrconf_lease_t *lease)
ni_dhcp4_device_send_message_broadcast(ni_dhcp4_device_t *dev, unsigned int msg_code, ni_addrconf_lease_t *lease)
{
ni_timeout_param_t timeout;
int rv;

dev->transmit.msg_code = msg_code;
dev->transmit.lease = lease;
ni_addrconf_lease_hold(&dev->transmit.lease, lease);

if (ni_dhcp4_socket_open(dev) < 0) {
ni_error("%s: unable to open capture socket", dev->ifname);
Expand Down Expand Up @@ -764,13 +751,13 @@ ni_dhcp4_device_send_message(ni_dhcp4_device_t *dev, unsigned int msg_code, cons
}

int
ni_dhcp4_device_send_message_unicast(ni_dhcp4_device_t *dev, unsigned int msg_code, const ni_addrconf_lease_t *lease)
ni_dhcp4_device_send_message_unicast(ni_dhcp4_device_t *dev, unsigned int msg_code, ni_addrconf_lease_t *lease)
{
ni_sockaddr_t addr;

ni_sockaddr_set_ipv4(&addr, lease->dhcp4.server_id, DHCP4_SERVER_PORT);
dev->transmit.msg_code = msg_code;
dev->transmit.lease = lease;
ni_addrconf_lease_hold(&dev->transmit.lease, lease);

if (ni_dhcp4_socket_open(dev) < 0) {
ni_error("%s: unable to open capture socket", dev->ifname);
Expand All @@ -781,6 +768,7 @@ ni_dhcp4_device_send_message_unicast(ni_dhcp4_device_t *dev, unsigned int msg_co

if (ni_dhcp4_device_prepare_message(dev) < 0)
return -1;

if (sendto(dev->listen_fd, ni_buffer_head(&dev->message), ni_buffer_count(&dev->message), 0,
&addr.sa, sizeof(addr.sin)) < 0)
ni_error("%s: sendto failed: %m", dev->ifname);
Expand All @@ -790,6 +778,9 @@ ni_dhcp4_device_send_message_unicast(ni_dhcp4_device_t *dev, unsigned int msg_co
void
ni_dhcp4_device_disarm_retransmit(ni_dhcp4_device_t *dev)
{
dev->transmit.msg_code = 0;
ni_addrconf_lease_drop(&dev->transmit.lease);

/* Clear retransmit timer */
if (dev->capture)
ni_capture_disarm_retransmit(dev->capture);
Expand Down
11 changes: 6 additions & 5 deletions src/dhcp4/dhcp4.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ typedef struct ni_dhcp4_device {
notify : 1;

struct {
unsigned int msg_code;
const ni_addrconf_lease_t *lease;
unsigned int msg_code;
ni_addrconf_lease_t * lease;
} transmit;

struct {
Expand Down Expand Up @@ -270,9 +270,10 @@ extern void ni_dhcp4_device_set_lease(ni_dhcp4_device_t *, ni_addrconf_lease_t
extern void ni_dhcp4_device_drop_lease(ni_dhcp4_device_t *);
extern void ni_dhcp4_device_alloc_buffer(ni_dhcp4_device_t *);
extern void ni_dhcp4_device_drop_buffer(ni_dhcp4_device_t *);
extern int ni_dhcp4_device_send_message(ni_dhcp4_device_t *, unsigned int, const ni_addrconf_lease_t *);
extern int ni_dhcp4_device_send_message_broadcast(ni_dhcp4_device_t *,
unsigned int, ni_addrconf_lease_t *);
extern int ni_dhcp4_device_send_message_unicast(ni_dhcp4_device_t *,
unsigned int, const ni_addrconf_lease_t *);
unsigned int, ni_addrconf_lease_t *);
extern void ni_dhcp4_device_arm_retransmit(ni_dhcp4_device_t *dev);
extern void ni_dhcp4_device_disarm_retransmit(ni_dhcp4_device_t *dev);
extern void ni_dhcp4_device_retransmit(ni_dhcp4_device_t *);
Expand All @@ -281,7 +282,7 @@ extern void ni_dhcp4_device_arp_close(ni_dhcp4_device_t *);
extern ni_bool_t ni_dhcp4_parse_client_id(ni_opaque_t *, unsigned short, const char *);
extern ni_bool_t ni_dhcp4_set_config_client_id(ni_opaque_t *, const ni_dhcp4_device_t *, unsigned int);
extern void ni_dhcp4_new_xid(ni_dhcp4_device_t *);
extern void ni_dhcp4_device_set_best_offer(ni_dhcp4_device_t *, ni_addrconf_lease_t *, int);
extern void ni_dhcp4_device_set_best_offer(ni_dhcp4_device_t *, ni_addrconf_lease_t **, int);
extern void ni_dhcp4_device_drop_best_offer(ni_dhcp4_device_t *);

extern int ni_dhcp4_xml_from_lease(const ni_addrconf_lease_t *, xml_node_t *);
Expand Down
38 changes: 17 additions & 21 deletions src/dhcp4/fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ static int ni_dhcp4_process_nak(ni_dhcp4_device_t *);
static void ni_dhcp4_fsm_process_arp_packet(ni_arp_socket_t *, const ni_arp_packet_t *, void *);
static void ni_dhcp4_fsm_fail_lease(ni_dhcp4_device_t *);
static int ni_dhcp4_fsm_validate_lease(ni_dhcp4_device_t *, ni_addrconf_lease_t *);

static void ni_dhcp4_send_event(enum ni_dhcp4_event, ni_dhcp4_device_t *, ni_addrconf_lease_t *);
static void __ni_dhcp4_fsm_timeout(void *, const ni_timer_t *);

Expand Down Expand Up @@ -231,18 +232,16 @@ ni_dhcp4_fsm_process_dhcp4_packet(ni_dhcp4_device_t *dev, ni_buffer_t *msgbuf, n
/* weight between 0 and 100 means maybe. */
if (weight < 100) {
if (dev->best_offer.weight < weight) {
ni_dhcp4_device_set_best_offer(dev, lease, weight);
ni_dhcp4_device_set_best_offer(dev, &lease, weight);
return 0;
}
/* OK, but it is better than previous */
} else {
/* If the weight has maximum value, just accept this offer. */
ni_dhcp4_device_set_best_offer(dev, lease, weight);
lease = NULL;
ni_dhcp4_device_set_best_offer(dev, &lease, weight);
}
} else {
ni_dhcp4_device_set_best_offer(dev, lease, weight);
lease = NULL;
ni_dhcp4_device_set_best_offer(dev, &lease, weight);
}
}

Expand Down Expand Up @@ -289,7 +288,6 @@ ni_dhcp4_fsm_process_dhcp4_packet(ni_dhcp4_device_t *dev, ni_buffer_t *msgbuf, n
case NI_DHCP4_STATE_REBINDING:
case NI_DHCP4_STATE_REBOOT:
ni_dhcp4_process_ack(dev, lease);
lease = NULL;
break;
case NI_DHCP4_STATE_SELECTING:
case NI_DHCP4_STATE_VALIDATING:
Expand Down Expand Up @@ -326,8 +324,7 @@ ni_dhcp4_fsm_process_dhcp4_packet(ni_dhcp4_device_t *dev, ni_buffer_t *msgbuf, n
}

out:
if (lease && dev->lease != lease)
ni_addrconf_lease_free(lease);
ni_addrconf_lease_free(lease);

/* If we received a message other than NAK, reset the NAK
* backoff timer. */
Expand Down Expand Up @@ -396,7 +393,7 @@ __ni_dhcp4_fsm_discover(ni_dhcp4_device_t *dev, int scan_offers)
* Note: if DISCOVER for the old lease times out,
* we should fall back to asking for anything.
*/
if ((lease = dev->lease) == NULL)
if (!(lease = ni_addrconf_lease_ref(dev->lease)))
lease = ni_addrconf_lease_new(NI_ADDRCONF_DHCP, AF_INET);
lease->uuid = dev->config->uuid;
lease->fqdn.enabled = NI_TRISTATE_DEFAULT;
Expand All @@ -419,12 +416,11 @@ __ni_dhcp4_fsm_discover(ni_dhcp4_device_t *dev, int scan_offers)
dev->config->capture_timeout = dev->config->acquire_timeout - dev->config->elapsed_timeout;

ni_dhcp4_fsm_set_timeout_sec(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_DISCOVER, lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_DISCOVER, lease);

ni_dhcp4_device_drop_best_offer(dev);

if (lease != dev->lease)
ni_addrconf_lease_free(lease);
ni_addrconf_lease_free(lease);
}

static void
Expand All @@ -439,7 +435,7 @@ ni_dhcp4_fsm_discover_init(ni_dhcp4_device_t *dev)
}

static void
ni_dhcp4_fsm_request(ni_dhcp4_device_t *dev, const ni_addrconf_lease_t *lease)
ni_dhcp4_fsm_request(ni_dhcp4_device_t *dev, ni_addrconf_lease_t *lease)
{
dev->fsm.state = NI_DHCP4_STATE_REQUESTING;

Expand All @@ -448,7 +444,7 @@ ni_dhcp4_fsm_request(ni_dhcp4_device_t *dev, const ni_addrconf_lease_t *lease)
dev->config->capture_timeout = dev->config->acquire_timeout - dev->config->elapsed_timeout;

ni_dhcp4_fsm_set_timeout_sec(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_REQUEST, lease);
}

static ni_bool_t
Expand Down Expand Up @@ -505,7 +501,7 @@ ni_dhcp4_fsm_rebind(ni_dhcp4_device_t *dev, ni_bool_t oneshot)
dev->config->capture_timeout = deadline.tv_sec;

ni_dhcp4_fsm_set_timeout_sec(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, dev->lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_REQUEST, dev->lease);
if (!oneshot)
retry = TRUE;
}
Expand Down Expand Up @@ -550,7 +546,7 @@ ni_dhcp4_fsm_reboot(ni_dhcp4_device_t *dev)
ni_string_free(&dev->lease->hostname);

ni_dhcp4_fsm_set_timeout_sec(dev, dev->config->capture_timeout);
ni_dhcp4_device_send_message(dev, DHCP4_REQUEST, dev->lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_REQUEST, dev->lease);
}

static void
Expand All @@ -562,7 +558,7 @@ ni_dhcp4_fsm_decline(ni_dhcp4_device_t *dev)
dev->fsm.state = NI_DHCP4_STATE_INIT;

ni_timer_get_time(&dev->start_time);
ni_dhcp4_device_send_message(dev, DHCP4_DECLINE, dev->lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_DECLINE, dev->lease);

/* FIXME: we should record the bad lease, and ignore it
* when the server offers it again. */
Expand All @@ -579,7 +575,7 @@ ni_dhcp4_fsm_release(ni_dhcp4_device_t *dev)
return;
if (dev->config->release_lease) {
ni_debug_dhcp("%s: releasing lease", dev->ifname);
ni_dhcp4_device_send_message(dev, DHCP4_RELEASE, dev->lease);
ni_dhcp4_device_send_message_broadcast(dev, DHCP4_RELEASE, dev->lease);
ni_dhcp4_fsm_commit_lease(dev, NULL);
} else {
ni_dhcp4_send_event(NI_DHCP4_EVENT_RELEASED, dev, dev->lease);
Expand Down Expand Up @@ -652,13 +648,13 @@ ni_dhcp4_fsm_timeout(ni_dhcp4_device_t *dev)
/* fallthrough */

case NI_DHCP4_STATE_REQUESTING:
if (conf->acquire_timeout && conf->elapsed_timeout < conf->acquire_timeout) {
if (conf->acquire_timeout && conf->elapsed_timeout < conf->acquire_timeout && dev->transmit.lease) {
ni_debug_dhcp("%s: discovery got no (valid) reply, retrying. %u seconds left until timeout.",
dev->ifname, conf->acquire_timeout - conf->elapsed_timeout);
ni_dhcp4_fsm_request(dev, dev->transmit.lease);
return;
}
ni_error("%s: DHCP4 discovery failed", dev->ifname);
ni_error("%s: DHCP4 request failed", dev->ifname);
ni_dhcp4_fsm_fail_lease(dev);
ni_dhcp4_fsm_restart(dev);

Expand Down Expand Up @@ -1008,7 +1004,7 @@ ni_dhcp4_fsm_fail_lease(ni_dhcp4_device_t *dev)
ni_capture_free(dev->capture);
dev->capture = NULL;

ni_dhcp4_device_set_lease(dev, NULL);
ni_dhcp4_device_drop_lease(dev);
dev->notify = 1;
dev->failed = 1;
}
Expand Down

0 comments on commit bcf4f7f

Please sign in to comment.