{"record":{"id":"a89374c2f94f19c6","repo":"TechnitiumSoftware/DnsServer","slug":"no-dynamic-lease-was-found-for-hardware-address","errorCode":null,"errorMessage":"No dynamic lease was found for hardware address: {hardwareAddress}","messagePattern":"No dynamic lease was found for hardware address: (.+?)","errorType":"exception","errorClass":"DhcpServerException","httpStatus":null,"severity":"warning","filePath":"DnsServerCore/Dhcp/Scope.cs","lineNumber":1564,"sourceCode":"            return removedLease;\n        }\n\n        public void ConvertToReservedLease(string hardwareAddress)\n        {\n            byte[] hardwareAddressBytes = Lease.ParseHardwareAddress(hardwareAddress);\n\n            foreach (KeyValuePair<ClientIdentifierOption, Lease> entry in _leases)\n            {\n                Lease lease = entry.Value;\n\n                if ((lease.Type == LeaseType.Dynamic) && lease.HardwareAddress.SequenceEqual(hardwareAddressBytes))\n                {\n                    ConvertToReservedLease(lease);\n                    return;\n                }\n            }\n\n            throw new DhcpServerException(\"No dynamic lease was found for hardware address: \" + hardwareAddress);\n        }\n\n        public void ConvertToReservedLease(ClientIdentifierOption clientIdentifier)\n        {\n            if (!_leases.TryGetValue(clientIdentifier, out Lease lease) || (lease.Type != LeaseType.Dynamic))\n                throw new DhcpServerException(\"No dynamic lease was found for client identifier: \" + clientIdentifier.ToString());\n\n            ConvertToReservedLease(lease);\n        }\n\n        public void ConvertToDynamicLease(string hardwareAddress)\n        {\n            byte[] hardwareAddressBytes = Lease.ParseHardwareAddress(hardwareAddress);\n\n            foreach (KeyValuePair<ClientIdentifierOption, Lease> entry in _leases)\n            {\n                Lease lease = entry.Value;\n","sourceCodeStart":1546,"sourceCodeEnd":1582,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dhcp/Scope.cs#L1546-L1582","documentation":"Thrown by Scope.ConvertToReservedLease(string hardwareAddress) when no DYNAMIC lease matches the hardware address. Only a currently-dynamic lease can be promoted to reserved; reserved or absent leases cause this error.","triggerScenarios":"Calling scope.ConvertToReservedLease(mac) where the matching lease is Reserved (already reserved), Static, or does not exist at all. The loop only converts when lease.Type == LeaseType.Dynamic and the MAC matches.","commonSituations":"Promoting a client that was never given a dynamic lease, re-promoting an already-reserved lease, or passing a MAC whose stored lease is not Dynamic.","solutions":["Confirm a dynamic lease exists for the MAC on this scope before promoting.","If the lease is already Reserved, no conversion is needed.","Register a reservation directly instead of converting if no dynamic lease exists.","Verify MAC format matches the stored HardwareAddress."],"exampleFix":"// before\nscope.ConvertToReservedLease(mac); // throws if not dynamic\n\n// after\nvar lease = scope.Leases.FirstOrDefault(l => l.Type == LeaseType.Dynamic && l.HardwareAddress.SequenceEqual(Lease.ParseHardwareAddress(mac)));\nif (lease != null) scope.ConvertToReservedLease(mac);\nelse scope.AddReservedLease(...); // create reservation directly","handlingStrategy":"validation","validationCode":"byte[] mac = Lease.ParseHardwareAddress(macString);\nbool convertible = scope.Leases.Any(l => l.Type == LeaseType.Dynamic && l.HardwareAddress.SequenceEqual(mac));\nif (!convertible) { /* add reservation directly instead */ }","typeGuard":"static bool HasDynamicLeaseForHardware(Scope scope, string mac){\n    var bytes = Lease.ParseHardwareAddress(mac);\n    return scope.Leases.Any(l => l.Type == LeaseType.Dynamic && l.HardwareAddress.SequenceEqual(bytes));\n}","tryCatchPattern":"try { scope.ConvertToReservedLease(macString); }\ncatch (DhcpServerException ex) when (ex.Message.Contains(\"No dynamic lease\"))\n{ /* fall back to creating a reservation explicitly */ }","preventionTips":["Only convert leases you know are currently Dynamic.","If unsure of lease type, add a reservation directly.","Refresh lease state before exposing convert actions in a UI."],"tags":["dhcp","lease","runtime-state","scope","reservation"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}