Merge pull request #22 from mehlis/log-dhcp4-events
[project/odhcpd.git] / src / dhcpv4.c
index 7fe5bd8..9b9b528 100644 (file)
@@ -357,7 +357,16 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
        } else if (reqmsg == DHCPV4_MSG_REQUEST && reqaddr.s_addr &&
                        reqaddr.s_addr != htonl(lease->addr)) {
                msg = DHCPV4_MSG_NAK;
        } else if (reqmsg == DHCPV4_MSG_REQUEST && reqaddr.s_addr &&
                        reqaddr.s_addr != htonl(lease->addr)) {
                msg = DHCPV4_MSG_NAK;
-               lease = NULL;
+               /*
+                * DHCP client requested an IP which we can't offer to him. Probably the
+                * client changed the network. The reply type is set to DHCPV4_MSG_NAK,
+                * because the client should not use that IP.
+                *
+                * For modern devices we build an answer that includes a valid IP, like
+                * a DHCPV4_MSG_ACK. The client will use that IP and doesn't need to
+                * perform additional DHCP round trips.
+                *
+                */
        }
 
        syslog(LOG_WARNING, "received %s from %x:%x:%x:%x:%x:%x",
        }
 
        syslog(LOG_WARNING, "received %s from %x:%x:%x:%x:%x:%x",
@@ -412,8 +421,11 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
                                        len, search_buf);
        }
 
                                        len, search_buf);
        }
 
-       dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4, &ifaddr.sin_addr);
-
+       if (iface->dhcpv4_router_cnt == 0)
+               dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4, &ifaddr.sin_addr);
+       else
+               dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER,
+                               4 * iface->dhcpv4_router_cnt, iface->dhcpv4_router);
 
 
        if (iface->dhcpv4_dns_cnt == 0)
 
 
        if (iface->dhcpv4_dns_cnt == 0)