applying fix for:
[oweals/busybox.git] / networking / udhcp / serverpacket.c
index 937436a116c8f495d2666727e384f4b04291a7fd..75d55bd92343186f1f57d2f00980d962037de3a4 100644 (file)
@@ -1,6 +1,6 @@
 /* serverpacket.c
  *
- * Constuct and send DHCP server packets
+ * Construct and send DHCP server packets
  *
  * Russ Dill <Russ.Dill@asu.edu> July 2001
  *
@@ -29,6 +29,7 @@
 #include "dhcpd.h"
 #include "options.h"
 #include "common.h"
+#include "static_leases.h"
 
 /* send a packet to giaddr using the kernel ip stack */
 static int send_packet_to_relay(struct dhcpMessage *payload)
@@ -113,9 +114,15 @@ int sendOffer(struct dhcpMessage *oldpacket)
        struct option_set *curr;
        struct in_addr addr;
 
+       uint32_t static_lease_ip;
+
        init_packet(&packet, oldpacket, DHCPOFFER);
 
+       static_lease_ip = getIpByMac(server_config.static_leases, oldpacket->chaddr);
+
        /* ADDME: if static, short circuit */
+       if(!static_lease_ip)
+       {
        /* the client is in our lease/offered table */
        if ((lease = find_lease_by_chaddr(oldpacket->chaddr))) {
                if (!lease_expired(lease))
@@ -132,15 +139,17 @@ int sendOffer(struct dhcpMessage *oldpacket)
                   ntohl(req_align) >= ntohl(server_config.start) &&
                   ntohl(req_align) <= ntohl(server_config.end) &&
                
-                  /* and its not already taken/offered */ /* ADDME: check that its not a static lease */
+                       !static_lease_ip &&  /* Check that its not a static lease */
+                       /* and is not already taken/offered */
                   ((!(lease = find_lease_by_yiaddr(req_align)) ||
                
                   /* or its taken, but expired */ /* ADDME: or maybe in here */
                   lease_expired(lease)))) {
                                packet.yiaddr = req_align; /* FIXME: oh my, is there a host using this IP? */
 
-       /* otherwise, find a free IP */ /*ADDME: is it a static lease? */
+                       /* otherwise, find a free IP */
        } else {
+                       /* Is it a static lease? (No, because find_address skips static lease) */
                packet.yiaddr = find_address(0);
 
                /* try for an expired lease */
@@ -167,7 +176,14 @@ int sendOffer(struct dhcpMessage *oldpacket)
        /* Make sure we aren't just using the lease time from the previous offer */
        if (lease_time_align < server_config.min_lease)
                lease_time_align = server_config.lease;
+       }
        /* ADDME: end of short circuit */
+       else
+       {
+               /* It is a static lease... use it */
+               packet.yiaddr = static_lease_ip;
+       }
+
        add_simple_option(packet.options, DHCP_LEASE_TIME, htonl(lease_time_align));
 
        curr = server_config.options;