<div>Hello All,</div><div><br></div><div>I have been working on a way to force a running DHCP client to question the lease provided by the server. In this way, a DHCP client could (within some obvious constraints) test for server-side configuration changes.  To this extent, I have created (and attached) a patch that will, I belive, achieve these intentions.  However, I would greatly appreciate any critique, as I am sure I may have overlooked some details.</div>
<div><br></div><div>An example use-case:</div><div>Boot a client into a dynamic-pool. Use your mechanism of choice (RPC, etc) to obtain that client's MAC address(es).  Re-write a new static lease for that client, changing the address. Ask the client to "hang up" (RPC, etc). Client sends SIGHUP to the dhclient, which kicks off my new release-reboot mechanism, picking up the new address... but most importantly, releasing the old IP back into the dynamic pool.</div>
<div><br></div><div>Anyway, please let me know what you think.</div><div><br></div><div>Thank you,</div><div><br></div><div> - Jeremiah D. Jinno</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>
<div>--- dhcp-4.0.1-original/client/dhclient.c       2008-10-24 11:11:59.000000000 -0700</div><div>+++ dhcp-4.0.1-hupclient/client/dhclient.c      2011-11-06 17:11:06.000000000 -0800</div><div>@@ -79,6 +79,7 @@ char *mockup_relay = NULL;</div>
<div> static void usage PROTO ((void));</div><div><br></div><div> static isc_result_t write_duid(struct data_string *duid);</div><div>+void sighup_handler(int sig);</div><div><br></div><div> int</div><div> main(int argc, char **argv) {</div>
<div>@@ -103,6 +104,9 @@ main(int argc, char **argv) {</div><div> #endif /* DHCPv6 */</div><div>        char *s;</div><div><br></div><div>+        /* Setup signal handler */</div><div>+        signal(SIGHUP, sighup_handler);</div>
<div>+</div><div>        /* Initialize client globals. */</div><div>        memset(&default_duid, 0, sizeof(default_duid));</div><div><br></div><div>@@ -550,6 +554,27 @@ main(int argc, char **argv) {</div><div>        return 0;</div>
<div> }</div><div><br></div><div>+void</div><div>+sighup_handler(int sig)</div><div>+{</div><div>+    struct interface_info *ip;</div><div>+    struct client_state *client;</div><div>+</div><div>+    log_info ("SIGHUP received. Starting release + renew process");</div>
<div>+</div><div>+    for (ip = interfaces ; ip ; ip = ip->next) {</div><div>+        ip->flags |= INTERFACE_RUNNING;</div><div>+        for (client = ip->client ; client ; client = client->next) {</div><div>+                do_release(client);</div>
<div>+                client->state = S_INIT;</div><div>+                add_timeout(cur_time + random() % 5,</div><div>+                            state_reboot, client, 0, 0);</div><div>+</div><div>+        }</div><div>
+    }</div><div>+</div><div>+}</div><div>+</div><div> static void usage ()</div><div> {</div><div>        log_info ("%s %s", message, PACKAGE_VERSION);</div>