Hi All, There's a FIXME in udhcpd which describes a small corner case when saved leases are read and honoured even if the IP or MAC of that lease overlaps a static_lease from the config file. I found that because of this, after updating config and restarting udhcpd, a client which already had a lease can continue to renew that lease instead of either getting the IP specified in a new 'static_lease' config item, or being nak'd and assigned a new free IP.
Following is a small patch which removes the FIXME and adds a check to discard saved lease records if they would conflict with a static_lease from the config file. In my configuration, this added 48 bytes to the stripped executable. I tested it by defining a /24 subnet and adding static_lease records for all but 1 on the available IP addresses, and then moving that 1 available IP around while reconnecting a single client. After the patch, verbose logging and Wireshark show NAK and then offering of the single free address, with the client having it's IP updated each time ipconfig /renew is issued. Please consider for inclusion to busybox. Kind Regards, Mike Signed-off-by: Michael McTernan <[email protected]> diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 6840f3c..7da0522 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -189,12 +189,20 @@ void FAST_FUNC read_leases(const char *file) goto ret; while (full_read(fd, &lease, sizeof(lease)) == sizeof(lease)) { -//FIXME: what if it matches some static lease? uint32_t y = ntohl(lease.lease_nip); if (y >= server_config.start_ip && y <= server_config.end_ip) { signed_leasetime_t expires = ntohl(lease.expires) - (signed_leasetime_t)time_passed; + uint32_t slnip; + if (expires <= 0) continue; + + // Check if there is a different static lease for this IP or MAC + slnip = get_static_nip_by_mac(server_config.static_leases, lease.lease_mac); + if ((slnip != 0 && slnip != lease.lease_nip) + || (slnip == 0 && is_nip_reserved(server_config.static_leases, lease.lease_nip))) + continue; + /* NB: add_lease takes "relative time", IOW, * lease duration, not lease deadline. */ if (add_lease(lease.lease_mac, lease.lease_nip, _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
