From 2afc18b5b49bfc1e3f21f62b458c367bc6e87bfb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Nov 2013 23:02:02 +0100 Subject: bail on small networks, serve complete range and exclude self --- dhcpd.conf | 6 ++++++ dyndhcpd.c | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dhcpd.conf b/dhcpd.conf index 6ec2a13..e0e295a 100644 --- a/dhcpd.conf +++ b/dhcpd.conf @@ -18,6 +18,12 @@ subnet __NETADDRESS__ netmask __NETMASK__ { option time-servers __ADDRESS__; range dynamic-bootp __MINHOST__ __MAXHOST__; + + # make sure we do not serve our own address + host localhost { + hardware ethernet de:ad:00:be:ef:00; + fixed-address __ADDRESS__; + } } class "PXEClient" { diff --git a/dyndhcpd.c b/dyndhcpd.c index d6743f1..883349d 100644 --- a/dyndhcpd.c +++ b/dyndhcpd.c @@ -154,14 +154,14 @@ int main(int argc, char ** argv) { s_broadcast.s_addr = v_host->s_addr |~ v_mask->s_addr; s_netaddress.s_addr = v_host->s_addr & v_mask->s_addr; - if (ntohl(s_broadcast.s_addr) - ntohl(v_host->s_addr) < ntohl(v_host->s_addr) - ntohl(s_netaddress.s_addr)) { - s_minhost.s_addr = htonl(ntohl(s_netaddress.s_addr) + 1); - s_maxhost.s_addr = htonl(ntohl(v_host->s_addr) - 1); - } else { - s_minhost.s_addr = htonl(ntohl(v_host->s_addr) + 1); - s_maxhost.s_addr = htonl(ntohl(s_broadcast.s_addr) - 1); + if (ntohl(s_broadcast.s_addr) - ntohl(s_netaddress.s_addr) < 2) { + fprintf(stderr, "We do not have addresses to serve, need a netmask with 28 bit minimum.\n"); + return EXIT_FAILURE; } + s_minhost.s_addr = htonl(ntohl(s_netaddress.s_addr) + 1); + s_maxhost.s_addr = htonl(ntohl(s_broadcast.s_addr) - 1); + if (inet_ntop(AF_INET, &s_broadcast, c_broadcast, INET_ADDRSTRLEN) != NULL && inet_ntop(AF_INET, &s_netaddress, c_netaddress, INET_ADDRSTRLEN) != NULL && inet_ntop(AF_INET, &s_minhost, c_minhost, INET_ADDRSTRLEN) != NULL && -- cgit v1.2.3-54-g00ecf