summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2010-11-28 21:51:44 +0100
committerDenys Vlasenko2010-11-28 21:51:44 +0100
commit713d241852ec726ad07920476fa18d0f9d455246 (patch)
tree4093ae9a59273fa349efacd33391984805dc855d
parent1c31e9e82b12bdceeec4f8e07955984e20ee6b7e (diff)
downloadbusybox-713d241852ec726ad07920476fa18d0f9d455246.zip
busybox-713d241852ec726ad07920476fa18d0f9d455246.tar.gz
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 ac77b51..6fb48a1 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: