From 800b986aa729ef27e256184cc04060cf07830413 Mon Sep 17 00:00:00 2001
From: "Luke T. Shumaker" <lukeshu@lukeshu.com>
Date: Sat, 30 Nov 2024 15:40:12 -0700
Subject: dhcp: Add DEBUG logging

---
 libdhcp/dhcp_client.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

(limited to 'libdhcp/dhcp_client.c')

diff --git a/libdhcp/dhcp_client.c b/libdhcp/dhcp_client.c
index f526190..ea6ed28 100644
--- a/libdhcp/dhcp_client.c
+++ b/libdhcp/dhcp_client.c
@@ -167,6 +167,18 @@ struct dhcp_client {
 
 };
 
+static const char *state_strs[] = {
+	[STATE_INIT]        = "INIT",
+	[STATE_SELECTING]   = "SELECTING",
+	[STATE_REQUESTING]  = "REQUESTING",
+	[STATE_BOUND]       = "BOUND",
+	[STATE_RENEWING]    = "RENEWING",
+	[STATE_REBINDING]   = "REBINDING",
+
+	[STATE_INIT_REBOOT] = "INIT_REBOOT",
+	[STATE_REBOOTING]   = "REBOOTING",
+};
+
 /**
  * For convenience in switch blocks, a list of the states that, when
  * msgtyp==DHCP_MSGTYP_REQUEST, dhcp_client_send() has assert()ed the state is
@@ -449,6 +461,7 @@ static bool dhcp_client_send(struct dhcp_client *client, uint8_t msgtyp, const c
 	/**********************************************************************\
 	 * Send                                                               *
 	\**********************************************************************/
+	debugf("state %s: sending DHCP %s", state_strs[client->state], dhcp_msgtyp_str(msgtyp));
 	ssize_t r = VCALL(client->sock, sendto, scratch_msg, DHCP_MSG_BASE_SIZE + optlen,
 	                  client_broadcasts ? net_ip4_addr_broadcast : client->lease_server_id, DHCP_PORT_SERVER);
 	if (r < 0) {
@@ -692,6 +705,7 @@ static ssize_t dhcp_client_recv(struct dhcp_client *client, struct dhcp_recv_msg
 static bool dhcp_check_conflict(implements_net_packet_conn *sock, struct net_ip4_addr addr) {
 	assert(sock);
 	ssize_t v = VCALL(sock, sendto, "CHECK_IP_CONFLICT", 17, addr, 5000);
+	debugf("check_ip_conflict => %zd", v);
 	return v != -NET_EARP_TIMEOUT;
 }
 
@@ -726,12 +740,17 @@ static void dhcp_client_take_lease(struct dhcp_client *client, struct dhcp_recv_
 	client->lease_time_ns_t2  = (dur_ns_t2  == DHCP_INFINITY * NS_PER_S) ? 0 : client->time_ns_init + dur_ns_t2;
 	client->lease_time_ns_end = (dur_ns_end == DHCP_INFINITY * NS_PER_S) ? 0 : client->time_ns_init + dur_ns_end;
 
-	if (ifup)
+	if (ifup) {
+		infof("applying configuration to "PRI_net_eth_addr, ARG_net_eth_addr(client->self_eth_addr));
+		infof(":: addr         = "PRI_net_ip4_addr, ARG_net_ip4_addr(client->lease_client_addr));
+		infof(":: gateway_addr = "PRI_net_ip4_addr, ARG_net_ip4_addr(client->lease_auxdata.gateway_addr));
+		infof(":: subnet_mask  = "PRI_net_ip4_addr, ARG_net_ip4_addr(client->lease_auxdata.subnet_mask));
 		VCALL(client->iface, ifup, (struct net_iface_config){
 				.addr         = client->lease_client_addr,
 				.gateway_addr = client->lease_auxdata.gateway_addr,
 				.subnet_mask  = client->lease_auxdata.subnet_mask,
 			});
+	}
 }
 
 static void dhcp_client_setstate(struct dhcp_client *client,
@@ -749,6 +768,7 @@ static void dhcp_client_setstate(struct dhcp_client *client,
 
 	/* State transition diagram: https://datatracker.ietf.org/doc/html/rfc2131#page-35 */
 	for (;;) {
+		debugf("loop: state=%s", state_strs[client->state]);
 		switch (client->state) {
 		case STATE_INIT:
 			client->xid = rand_uint63n(UINT32_MAX);
@@ -787,6 +807,8 @@ static void dhcp_client_setstate(struct dhcp_client *client,
 					break;
 				case DHCP_MSGTYP_ACK:
 					if (dhcp_check_conflict(client->sock, client->lease_client_addr)) {
+						debugf("IP "PRI_net_ip4_addr" is already in use",
+						       ARG_net_ip4_addr(client->lease_client_addr));
 						dhcp_client_setstate(client, STATE_INIT, DHCP_MSGTYP_DECLINE, "IP is already in use", scratch_msg);
 					} else {
 						dhcp_client_take_lease(client, scratch_msg, true);
-- 
cgit v1.2.3-2-g168b