diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-11-28 21:51:44 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-11-28 21:51:44 +0100 |
commit | 713d241852ec726ad07920476fa18d0f9d455246 (patch) | |
tree | 4093ae9a59273fa349efacd33391984805dc855d | |
parent | 1c31e9e82b12bdceeec4f8e07955984e20ee6b7e (diff) | |
download | busybox-w32-713d241852ec726ad07920476fa18d0f9d455246.tar.gz busybox-w32-713d241852ec726ad07920476fa18d0f9d455246.tar.bz2 busybox-w32-713d241852ec726ad07920476fa18d0f9d455246.zip |
dhcpd: reply with NAK to clients in INIT-REBOOT state w/o existing lease
We were not responding to them at all.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-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: |