aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-11-28 21:51:44 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-11-28 21:51:44 +0100
commit713d241852ec726ad07920476fa18d0f9d455246 (patch)
tree4093ae9a59273fa349efacd33391984805dc855d
parent1c31e9e82b12bdceeec4f8e07955984e20ee6b7e (diff)
downloadbusybox-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.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)
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: