#include <stddef.h>
#include <stdlib.h>
#include <resolv.h>
+#include <limits.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/ip.h>
static void handle_dhcpv4(void *addr, void *data, size_t len,
- struct interface *iface);
+ struct interface *iface, void *dest_addr);
static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
const char *hostname);
// Simple DHCPv6-server for information requests
static void handle_dhcpv4(void *addr, void *data, size_t len,
- struct interface *iface)
+ struct interface *iface, _unused void *dest_addr)
{
if (!iface->dhcpv4)
return;
return;
} else if (reqmsg == DHCPV4_MSG_DISCOVER) {
msg = DHCPV4_MSG_OFFER;
+ } else if (reqmsg == DHCPV4_MSG_REQUEST && reqaddr.s_addr &&
+ reqaddr.s_addr != htonl(lease->addr)) {
+ msg = DHCPV4_MSG_NAK;
+ lease = NULL;
}
if (reqmsg == DHCPV4_MSG_DECLINE || reqmsg == DHCPV4_MSG_RELEASE)
dest.sin_addr = req->ciaddr;
dest.sin_port = htons(DHCPV4_CLIENT_PORT);
} else if ((ntohs(req->flags) & DHCPV4_FLAG_BROADCAST) ||
- req->hlen != reply.hlen) {
+ req->hlen != reply.hlen || !reply.yiaddr.s_addr) {
dest.sin_addr.s_addr = INADDR_BROADCAST;
dest.sin_port = htons(DHCPV4_CLIENT_PORT);
} else {