dhcpd: reply with NAK to clients in INIT-REBOOT state w/o existing lease
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 28 Nov 2010 20:51:44 +0000 (21:51 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 28 Nov 2010 20:51:44 +0000 (21:51 +0100)
We were not responding to them at all.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/udhcp/dhcpd.c

index ac77b511d4e80a9d2eb0d2b8143cb295b5c0dd0f..6fb48a19a9e8509a38edbf199f7c04420f706b05 100644 (file)
@@ -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: