X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv4.c;h=9b9b528d852cffceb9855310b9703ac440e012df;hp=7fe5bd8d4eb6971cfe5f6f354d9c4bca5723e6e2;hb=479cd9f6a5b6c68285004aa30bacfb284121ac8e;hpb=85e370673ef76fa1ce461a4ac3d995f376522fd1;ds=sidebyside diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 7fe5bd8..9b9b528 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -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; - 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", @@ -412,8 +421,11 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, 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)