<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>DHCPD stopping, my fix... for 4.1.0</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">   >From reading the archive I see a number of reports of what we</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">’</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">ve been seeing.  It</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">’</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">s triggered by a workstation with a valid dynamic lease on a remote network, configured to unicast its DHCPRequest to the server that granted its lease.</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri"> This bypasses the relay.  On the server side, the client gets assigned a fixed-address</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">...</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> while the dynamic lease remains active.  When the</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> client requests a lease extension, the server goes to send a NAK... and stops.   It may very well be a DLPI issue</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">, that</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">’</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">s beyond my scope</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">.</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">  I copied some code from the routine that ACKs to the one that NAKs.</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri"> M</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">y server now correctly sends the NAK and the workstation</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">DISCOVERs its</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">fixed</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">-address.</FONT></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">  </FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">I made the following changes to the</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">‘</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">nak_lease</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">’</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> routin</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">e</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> in</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">‘</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">server/dhcp.c</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">’</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> to fix my particular problem</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">...  output of a</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">“</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">diff</FONT></SPAN><SPAN LANG="en-ca"> <FONT FACE="Calibri">–</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">u</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">”</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">:</FONT></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN><SPAN LANG="en-ca"><FONT FACE="Consolas">--- server/dhcp.c.ORIGINAL      Thu Jan  7 15:01:33 2010</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+++ server/dhcp.c       Tue Jan 12 11:46:13 2010</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">@@ -1381,6 +1381,7 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        if (packet->interface->address_count)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                raw.siaddr = packet->interface->addresses[0];</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.giaddr = packet -> raw -> giaddr;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       raw.ciaddr = packet -> raw -> ciaddr;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        memcpy (raw.chaddr, packet -> raw -> chaddr, sizeof raw.chaddr);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.hlen = packet -> raw -> hlen;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.htype = packet -> raw -> htype;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">@@ -1387,7 +1388,7 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas"> </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.xid = packet -> raw -> xid;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.secs = packet -> raw -> secs;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">-       raw.flags = packet -> raw -> flags | htons (BOOTP_BROADCAST);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       raw.flags = packet -> raw -> flags;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.hops = packet -> raw -> hops;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        raw.op = BOOTREPLY;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas"> </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">@@ -1428,10 +1429,10 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        if (outgoing.packet_length < BOOTP_MIN_LEN)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                outgoing.packet_length = BOOTP_MIN_LEN;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas"> </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">-       /* If this was gatewayed, send it back to the gateway.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">-          Otherwise, broadcast it on the local network. */</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       /* If this was gatewayed, send it back to the gateway. */</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        if (raw.giaddr.s_addr) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                to.sin_addr = raw.giaddr;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+               raw.flags |= htons (BOOTP_BROADCAST);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                        to.sin_port = local_port;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                else</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">@@ -1444,13 +1445,27 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                                              from, &to, &hto);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                        return;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+          /* If it comes from a client that already knows its address</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+             and is not requesting a broadcast response, and we can</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+             unicast to a client without using the ARP protocol, sent it</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+             directly to that client. */</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       } else if (raw.ciaddr.s_addr &&</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+                       can_unicast_without_arp (packet -> interface)) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+             to.sin_addr = raw.ciaddr;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+             to.sin_port = remote_port;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       /* Otherwise, broadcast it on the local network. */</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        } else {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+               raw.flags |= htons (BOOTP_BROADCAST);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                to.sin_addr = limited_broadcast;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                to.sin_port = remote_port;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas"> </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">        errno = 0;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">-       result = send_packet (packet -> interface,</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+       result = send_packet ((fallback_interface</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">+                               ? fallback_interface : packet -> interface),</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                              packet, &raw, outgoing.packet_length,</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas">                              from, &to, (struct hardware *)0);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Consolas"> }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">    My supervisor hopes that the unicast NAK can make it into production code, so we can avoid having to work this fix in with each release we upgrade to.</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">  The DHCPRequest packet</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri"> this services looks like:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: ----- Dynamic Host Configuration Protocol -----</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Hardware address type (htype) =  1 (Ethernet (10Mb))</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Hardware address length (hlen) = 6 octets</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Relay agent hops = 0</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Transaction ID = 0x6d8fc30</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Time since boot = 0 seconds</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Flags = 0x0000</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Client address (ciaddr) = 1</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">9</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">2.</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">168</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">.213.114</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Your client address (yiaddr) = 0.0.0.0</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Next server address (siaddr) = 0.0.0.0</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Relay agent address (giaddr) = 0.0.0.0</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Client hardware address (chaddr) = 00:03:47:CC:E3:3D</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: ----- (Options) field options -----</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Message type = DHCPREQUEST</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Client Identifier =       0x01 0x00 0x03 0x47 0xCC 0xE3 0x3D (unprintable)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Client Hostname = Fungus</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Client Class Identifier = "MSFT 5.0"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP: Requested Options:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:    1 (Subnet Mask)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   15 (DNS Domain Name)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:    3 (Router)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:    6 (DNS Servers)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   44 (NetBIOS RFC 1001/1002 Name Servers)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   46 (NetBIOS Node Type)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   47 (NetBIOS Scope)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   31 (Perform Router Discovery Flag)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   33 (Static Routes)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">DHCP:   43 (Vendor Specific Options)</FONT></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">   We are running 4.1.0.  I looked in 4.1.1rc1</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">, and see the same problem with nak_lease not supporting a unicast NAK to a remote network.</FONT></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><FONT FACE="Calibri">P.S.  This is my first post to a list, and I hope I have not infringed on any etiquette</FONT></SPAN><SPAN LANG="en-ca"><FONT FACE="Calibri">.</FONT></SPAN><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"><B></B></SPAN><SPAN LANG="en-ca"><B></B></SPAN><B><SPAN LANG="en-us"></SPAN></B><B><SPAN LANG="en-us"><FONT COLOR="#008080" SIZE=2 FACE="Arial">Don Friesen</FONT></SPAN></B><SPAN LANG="en-ca"></SPAN><SPAN LANG="en-us"><BR>
</SPAN><SPAN LANG="en-ca"></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-ca"></SPAN></P>

</BODY>
</HTML>