diff options
-rw-r--r-- | networking/udhcp/dhcpd.c | 18 |
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) | |||
448 | /* Get SERVER_ID if present */ | 448 | /* Get SERVER_ID if present */ |
449 | server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID); | 449 | server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID); |
450 | if (server_id_opt) { | 450 | if (server_id_opt) { |
451 | uint32_t server_id_net; | 451 | uint32_t server_id_network_order; |
452 | move_from_unaligned32(server_id_net, server_id_opt); | 452 | move_from_unaligned32(server_id_network_order, server_id_opt); |
453 | if (server_id_net != server_config.server_nip) { | 453 | if (server_id_network_order != server_config.server_nip) { |
454 | /* client talks to somebody else */ | 454 | /* client talks to somebody else */ |
455 | log1("server ID doesn't match, ignoring"); | 455 | log1("server ID doesn't match, ignoring"); |
456 | continue; | 456 | continue; |
@@ -584,11 +584,15 @@ o DHCPREQUEST generated during REBINDING state: | |||
584 | send_ACK(&packet, lease->lease_nip); | 584 | send_ACK(&packet, lease->lease_nip); |
585 | break; | 585 | break; |
586 | } | 586 | } |
587 | if (server_id_opt) { | 587 | /* No lease for this MAC, or lease IP != requested IP */ |
588 | /* client was talking specifically to us. | 588 | |
589 | * "No, we don't have this IP for you". */ | 589 | if (server_id_opt /* client is in SELECTING state */ |
590 | || requested_ip_opt /* client is in INIT-REBOOT state */ | ||
591 | ) { | ||
592 | /* "No, we don't have this IP for you" */ | ||
590 | send_NAK(&packet); | 593 | send_NAK(&packet); |
591 | } | 594 | } /* else: client is in RENEWING or REBINDING, do not answer */ |
595 | |||
592 | break; | 596 | break; |
593 | 597 | ||
594 | case DHCPDECLINE: | 598 | case DHCPDECLINE: |