? dhcpd ? ktrace.out Index: dhcp.c =================================================================== RCS file: /cvs/src/usr.sbin/dhcpd/dhcp.c,v retrieving revision 1.43 diff -u -p -r1.43 dhcp.c --- dhcp.c 20 Aug 2015 22:39:29 -0000 1.43 +++ dhcp.c 26 Oct 2015 00:41:08 -0000 @@ -513,17 +513,9 @@ dhcpinform(struct packet *packet) * not all clients are standards compliant. */ cip.len = 4; - if (packet->raw->ciaddr.s_addr) { - if (memcmp(&packet->raw->ciaddr.s_addr, - packet->client_addr.iabuf, 4) != 0) { - note("DHCPINFORM from %s but ciaddr %s is not " - "consistent with actual address", - piaddr(packet->client_addr), - inet_ntoa(packet->raw->ciaddr)); - return; - } + if (packet->raw->ciaddr.s_addr) memcpy(cip.iabuf, &packet->raw->ciaddr.s_addr, 4); - } else + else memcpy(cip.iabuf, &packet->client_addr.iabuf, 4); note("DHCPINFORM from %s", piaddr(cip)); Index: options.c =================================================================== RCS file: /cvs/src/usr.sbin/dhcpd/options.c,v retrieving revision 1.29 diff -u -p -r1.29 options.c --- options.c 27 Jun 2015 14:29:39 -0000 1.29 +++ options.c 26 Oct 2015 00:41:08 -0000 @@ -536,7 +536,7 @@ do_packet(struct interface_info *interfa tp.options[DHO_DHCP_MESSAGE_TYPE].data) tp.packet_type = tp.options[DHO_DHCP_MESSAGE_TYPE].data[0]; - if (interface->is_udpsock) { + if (0 && interface->is_udpsock) { if (tp.packet_type != DHCPINFORM) { note("Unable to handle a DHCP message type=%d on UDP " "socket", tp.packet_type); Index: udpsock.c =================================================================== RCS file: /cvs/src/usr.sbin/dhcpd/udpsock.c,v retrieving revision 1.2 diff -u -p -r1.2 udpsock.c --- udpsock.c 16 Jan 2015 06:40:16 -0000 1.2 +++ udpsock.c 26 Oct 2015 00:41:08 -0000 @@ -34,6 +34,7 @@ ssize_t udpsock_send_packet(struct inte size_t, struct in_addr, struct sockaddr_in *, struct hardware *); struct udpsock { + struct in_addr addr; int sock; }; @@ -64,11 +65,12 @@ udpsock_startup(struct in_addr bindaddr) if (bind(sock, (struct sockaddr *)&sin4, sizeof(sin4)) != 0) error("bind failed for udp: %s", strerror(errno)); + udpsock->addr = bindaddr; + udpsock->sock = sock; + add_protocol("udp", sock, udpsock_handler, (void *)(intptr_t)udpsock); note("Listening on %s:%d/udp.", inet_ntoa(sin4.sin_addr), ntohs(server_port)); - - udpsock->sock = sock; } void @@ -152,7 +154,10 @@ udpsock_handler(struct protocol *protoco strlcpy(iface.name, ifname, sizeof(iface.name)); addr.len = 4; - memcpy(&addr.iabuf, &iface.primary_address, addr.len); + if (udpsock->addr.s_addr == htonl(INADDR_BROADCAST)) + memcpy(&addr.iabuf, &iface.primary_address, addr.len); + else + memcpy(&addr.iabuf, &sin4->sin_addr, addr.len); if ((subnet = find_subnet(addr)) == NULL) return;