2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-29 13:28:14 +00:00

Fix DHCPRELEASE handling to conform to spec

This commit is contained in:
Ted Lemon 1997-11-29 07:57:02 +00:00
parent f79741e803
commit 2ba8b7cdaf

View File

@ -42,7 +42,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: dhcp.c,v 1.52 1997/10/20 22:28:18 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n"; "$Id: dhcp.c,v 1.53 1997/11/29 07:57:02 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@ -297,26 +297,44 @@ void dhcprelease (packet)
{ {
struct lease *lease; struct lease *lease;
struct iaddr cip; struct iaddr cip;
int i;
/* DHCPRELEASEmust specify address. */ /* DHCPRELEASE must not specify address in requested-address
if (!packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) { option, but old protocol specs weren't explicit about this,
return; so let it go. */
if (packet -> options [DHO_DHCP_REQUESTED_ADDRESS].len) {
note ("DHCPRELEASE from %s specified requested-address.",
print_hw_addr (packet -> raw -> htype,
packet -> raw -> hlen,
packet -> raw -> chaddr));
} }
cip.len = 4; i = DHO_DHCP_CLIENT_IDENTIFIER;
memcpy (cip.iabuf, if (packet -> options [i].len) {
packet -> options [DHO_DHCP_REQUESTED_ADDRESS].data, 4); lease = find_lease_by_uid (packet -> options [i].data,
lease = find_lease_by_ip_addr (cip); packet -> options [i].len);
} else
lease = (struct lease *)0;
note ("DHCPRELEASE of %s from %s via %s", /* The client is supposed to pass a valid client-identifier,
but the spec on this has changed historically, so try the
IP address in ciaddr if the client-identifier fails. */
if (!lease) {
cip.len = 4;
memcpy (cip.iabuf, &packet -> raw -> ciaddr, 4);
lease = find_lease_by_ip_addr (cip);
}
note ("DHCPRELEASE of %s from %s via %s (%sfound)",
inet_ntoa (packet -> raw -> ciaddr), inet_ntoa (packet -> raw -> ciaddr),
print_hw_addr (packet -> raw -> htype, print_hw_addr (packet -> raw -> htype,
packet -> raw -> hlen, packet -> raw -> hlen,
packet -> raw -> chaddr), packet -> raw -> chaddr),
packet -> raw -> giaddr.s_addr packet -> raw -> giaddr.s_addr
? inet_ntoa (packet -> raw -> giaddr) ? inet_ntoa (packet -> raw -> giaddr)
: packet -> interface -> name); : packet -> interface -> name,
lease ? "" : "not ");
/* If we found a lease, release it. */ /* If we found a lease, release it. */
if (lease) { if (lease) {