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:
parent
f79741e803
commit
2ba8b7cdaf
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user