*** From dhcp-server -- To unsubscribe, see the end of this message. ***

Can you try the following patch and see if it solves your problem?

                               _MelloN_

Index: dhcp.c
===================================================================
RCS file: /proj/src/isc/cvs-1/DHCP/server/dhcp.c,v
retrieving revision 1.57.2.21
diff -c -r1.57.2.21 dhcp.c
*** dhcp.c      1999/03/05 16:10:56     1.57.2.21
--- dhcp.c      1999/03/18 17:44:54
***************
*** 1186,1220 ****
                        result = send_packet (fallback_interface,
                                              (struct packet *)0,
                                              &raw, packet_length,
!                                             raw.siaddr, &to, &hto);
  
                        free_lease_state (state, "dhcp_reply fallback 1");
                        lease -> state = (struct lease_state *)0;
                        return;
                }
  
!       /* If it comes from a client that already knows its address and
!          is not requesting a broadcast response, sent it directly to
!          that client. */
!       } else if (raw.ciaddr.s_addr && state -> offer == DHCPACK &&
!                  !(raw.flags & htons (BOOTP_BROADCAST)) &&
!                  can_unicast_without_arp ()) {
!               to.sin_addr = state -> ciaddr;
!               to.sin_port = remote_port; /* XXX */
  
                if (fallback_interface) {
                        result = send_packet (fallback_interface,
                                              (struct packet *)0,
                                              &raw, packet_length,
!                                             raw.siaddr, &to, &hto);
!                       free_lease_state (state, "dhcp_reply fallback 1");
                        lease -> state = (struct lease_state *)0;
                        return;
                }
        } else {
-               /* Otherwise, broadcast it on the local network. */
                to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
!               to.sin_port = remote_port; /* XXX */
        }
  
        memcpy (&from, state -> from.iabuf, sizeof from);
--- 1186,1230 ----
                        result = send_packet (fallback_interface,
                                              (struct packet *)0,
                                              &raw, packet_length,
!                                             raw.siaddr,
!                                             &to, (struct hardware *)0);
  
                        free_lease_state (state, "dhcp_reply fallback 1");
                        lease -> state = (struct lease_state *)0;
                        return;
                }
  
!       /* If the client is RENEWING, unicast to the client using the
!          regular IP stack. */
!       } else if (raw.ciaddr.s_addr && state -> offer == DHCPACK) {
!               to.sin_addr = raw.ciaddr;
!               to.sin_port = remote_port;
  
                if (fallback_interface) {
                        result = send_packet (fallback_interface,
                                              (struct packet *)0,
                                              &raw, packet_length,
!                                             raw.siaddr, &to,
!                                             (struct hardware *)0);
!                       free_lease_state (state,
!                                         "dhcp_reply fallback 2");
                        lease -> state = (struct lease_state *)0;
                        return;
                }
+ 
+       /* If it comes from a client that already knows its address
+          and is not requesting a broadcast response, and we can
+          unicast to a client without using the ARP protocol, sent it
+          directly to that client. */
+       } else if (!(raw.flags & htons (BOOTP_BROADCAST)) &&
+                  can_unicast_without_arp ()) {
+               to.sin_addr = raw.yiaddr;
+               to.sin_port = remote_port;
+ 
+       /* Otherwise, broadcast it on the local network. */
        } else {
                to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
!               to.sin_port = remote_port;
        }
  
        memcpy (&from, state -> from.iabuf, sizeof from);


------------------------------------------------------------------------------
To unsubscribe from this list, please visit http://www.fugue.com/dhcp/lists
If you are without web access, or if you are having trouble with the web page,
please send mail to [EMAIL PROTECTED]   Please try to use the web
page first - it will take a long time for your request to be processed by hand.
------------------------------------------------------------------------------

Reply via email to