From 48ea4ac893b7c481b5a08b38f52e100fae9b0b9c Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 24 Oct 2020 17:37:44 +0530 Subject: [PATCH] DhcpServer: strictly enforcing exclusion lists for lease renewals. --- DnsServerCore/Dhcp/DhcpServer.cs | 50 +++++++++++++++++++------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/DnsServerCore/Dhcp/DhcpServer.cs b/DnsServerCore/Dhcp/DhcpServer.cs index 8618326f..69626265 100644 --- a/DnsServerCore/Dhcp/DhcpServer.cs +++ b/DnsServerCore/Dhcp/DhcpServer.cs @@ -353,26 +353,6 @@ namespace DnsServerCore.Dhcp //send nak return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); } - - Lease reservedLease = scope.GetReservedLease(request); - if (reservedLease == null) - { - if (leaseOffer.Type == LeaseType.Reserved) - { - //client's reserved has been removed so release the current lease and send NAK to allow it to get new allocation - scope.ReleaseLease(leaseOffer); - return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); - } - } - else - { - if (!reservedLease.Address.Equals(leaseOffer.Address)) - { - //client has a new reserved lease so release the current lease and send NAK to allow it to get new allocation - scope.ReleaseLease(leaseOffer); - return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); - } - } } else { @@ -393,6 +373,36 @@ namespace DnsServerCore.Dhcp return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); } } + + if ((leaseOffer.Type == LeaseType.Dynamic) && scope.IsAddressExcluded(leaseOffer.Address)) + { + //client ip is excluded for dynamic allocations + scope.ReleaseLease(leaseOffer); + //send nak + return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); + } + + Lease reservedLease = scope.GetReservedLease(request); + if (reservedLease == null) + { + if (leaseOffer.Type == LeaseType.Reserved) + { + //client's reserved has been removed so release the current lease and send NAK to allow it to get new allocation + scope.ReleaseLease(leaseOffer); + //send nak + return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); + } + } + else + { + if (!reservedLease.Address.Equals(leaseOffer.Address)) + { + //client has a new reserved lease so release the current lease and send NAK to allow it to get new allocation + scope.ReleaseLease(leaseOffer); + //send nak + return DhcpMessage.CreateReply(request, IPAddress.Any, IPAddress.Any, null, null, new DhcpOption[] { new DhcpMessageTypeOption(DhcpMessageType.Nak), new ServerIdentifierOption(scope.InterfaceAddress), DhcpOption.CreateEndOption() }); + } + } } else {