X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=networking%2Fudhcp%2Fserverpacket.c;h=75d55bd92343186f1f57d2f00980d962037de3a4;hb=01f67987e0aa4a4890a02d1a7445d878d3436d26;hp=937436a116c8f495d2666727e384f4b04291a7fd;hpb=c7bda1ce659294d6e22c06e087f6f265983c7578;p=oweals%2Fbusybox.git diff --git a/networking/udhcp/serverpacket.c b/networking/udhcp/serverpacket.c index 937436a11..75d55bd92 100644 --- a/networking/udhcp/serverpacket.c +++ b/networking/udhcp/serverpacket.c @@ -1,6 +1,6 @@ /* serverpacket.c * - * Constuct and send DHCP server packets + * Construct and send DHCP server packets * * Russ Dill 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;