Hi,
landry@ sees many log messages 'DHCPINFORM from xx but ciaddr yy is
not consistent with actual address' in a setup where dhcpd runs behind
dhcrelay.
The code in dhcpd's dhcpinform() seems wrong - it assumes that ciaddr
(the client IP) is identical to the packet source address and it
doesn't consider a relay, indicated by giaddr (gateway).
I looked at isc-dhcpd code and, omg my eyes are bleeding, it seems to
handle DHCPINFORM from relayed clients with giaddr set.
So it seems that dhcpd never accepted DHCPINFORM from clients behind a
relay, and the diff below changes it and stops the log spam. But it
also changes behavior, so it needs some testing and maybe feedback
from DHCP experts (prodding krw).
Comments?
Reyk
Index: usr.sbin/dhcpd/dhcp.c
===================================================================
RCS file: /cvs/src/usr.sbin/dhcpd/dhcp.c,v
retrieving revision 1.56
diff -u -p -u -1 -1 -p -r1.56 dhcp.c
--- usr.sbin/dhcpd/dhcp.c 24 Apr 2017 14:58:36 -0000 1.56
+++ usr.sbin/dhcpd/dhcp.c 5 Jul 2017 14:23:12 -0000
@@ -519,23 +519,23 @@ void
dhcpinform(struct packet *packet)
{
struct lease lease;
struct iaddr cip;
struct subnet *subnet;
/*
* ciaddr should be set to client's IP address but
* not all clients are standards compliant.
*/
cip.len = 4;
- if (packet->raw->ciaddr.s_addr) {
+ if (packet->raw->ciaddr.s_addr && !packet->raw->giaddr.s_addr) {
if (memcmp(&packet->raw->ciaddr.s_addr,
packet->client_addr.iabuf, 4) != 0) {
log_info("DHCPINFORM from %s but ciaddr %s is not "
"consistent with actual address",
piaddr(packet->client_addr),
inet_ntoa(packet->raw->ciaddr));
return;
}
memcpy(cip.iabuf, &packet->raw->ciaddr.s_addr, 4);
} else
memcpy(cip.iabuf, &packet->client_addr.iabuf, 4);