Get destination address of received DHCPv4 packets right in dumpfile.

This commit is contained in:
Simon Kelley
2025-07-27 16:23:59 +01:00
parent fc9f6985ab
commit c91c66ee63

View File

@@ -149,6 +149,7 @@ void dhcp_packet(time_t now, int pxe_fd)
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
struct arpreq arp_req; struct arpreq arp_req;
struct timeval tv; struct timeval tv;
struct in_addr dst_addr;
#endif #endif
union { union {
@@ -174,13 +175,11 @@ void dhcp_packet(time_t now, int pxe_fd)
(sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options)))) (sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options))))
return; return;
#ifdef HAVE_DUMPFILE
dump_packet_udp(DUMP_DHCP, (void *)daemon->dhcp_packet.iov_base, sz, (union mysockaddr *)&dest, NULL, fd);
#endif
#if defined (HAVE_LINUX_NETWORK) #if defined (HAVE_LINUX_NETWORK)
if (ioctl(fd, SIOCGSTAMP, &tv) == 0) if (ioctl(fd, SIOCGSTAMP, &tv) == 0)
recvtime = tv.tv_sec; recvtime = tv.tv_sec;
dst_addr.s_addr = 0;
if (msg.msg_controllen >= sizeof(struct cmsghdr)) if (msg.msg_controllen >= sizeof(struct cmsghdr))
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
@@ -192,7 +191,8 @@ void dhcp_packet(time_t now, int pxe_fd)
} p; } p;
p.c = CMSG_DATA(cmptr); p.c = CMSG_DATA(cmptr);
iface_index = p.p->ipi_ifindex; iface_index = p.p->ipi_ifindex;
if (p.p->ipi_addr.s_addr != INADDR_BROADCAST) dst_addr = p.p->ipi_addr;
if (dst_addr.s_addr != INADDR_BROADCAST)
unicast_dest = 1; unicast_dest = 1;
} }
@@ -222,7 +222,25 @@ void dhcp_packet(time_t now, int pxe_fd)
iface_index = *(p.i); iface_index = *(p.i);
} }
#endif #endif
#ifdef HAVE_DUMPFILE
union mysockaddr *sockp = NULL;
# ifdef HAVE_LINUX_NETWORK
union mysockaddr tosock;
sockp = &tosock;
tosock.in.sin_port = htons(daemon->dhcp_server_port);
tosock.in.sin_addr = dst_addr;
tosock.sa.sa_family = AF_INET;
# ifdef HAVE_SOCKADDR_SA_LEN
tosock.in.sin_len = sizeof(struct sockaddr_in);
# endif
# endif
dump_packet_udp(DUMP_DHCP, (void *)daemon->dhcp_packet.iov_base, sz, (union mysockaddr *)&dest, sockp, -1);
#endif
if (!indextoname(daemon->dhcpfd, iface_index, ifr.ifr_name) || if (!indextoname(daemon->dhcpfd, iface_index, ifr.ifr_name) ||
ioctl(daemon->dhcpfd, SIOCGIFFLAGS, &ifr) != 0) ioctl(daemon->dhcpfd, SIOCGIFFLAGS, &ifr) != 0)
return; return;