aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/dhcpd.c')
-rw-r--r--networking/udhcp/dhcpd.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index ac77b511d..6fb48a19a 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -448,9 +448,9 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
/* Get SERVER_ID if present */
server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID);
if (server_id_opt) {
- uint32_t server_id_net;
- move_from_unaligned32(server_id_net, server_id_opt);
- if (server_id_net != server_config.server_nip) {
+ uint32_t server_id_network_order;
+ move_from_unaligned32(server_id_network_order, server_id_opt);
+ if (server_id_network_order != server_config.server_nip) {
/* client talks to somebody else */
log1("server ID doesn't match, ignoring");
continue;
@@ -584,11 +584,15 @@ o DHCPREQUEST generated during REBINDING state:
send_ACK(&packet, lease->lease_nip);
break;
}
- if (server_id_opt) {
- /* client was talking specifically to us.
- * "No, we don't have this IP for you". */
+ /* No lease for this MAC, or lease IP != requested IP */
+
+ if (server_id_opt /* client is in SELECTING state */
+ || requested_ip_opt /* client is in INIT-REBOOT state */
+ ) {
+ /* "No, we don't have this IP for you" */
send_NAK(&packet);
- }
+ } /* else: client is in RENEWING or REBINDING, do not answer */
+
break;
case DHCPDECLINE: