From 31cecf3b4d11b9605e98b82eb62de33690aa869f Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 23 Jan 2022 16:58:03 +0530 Subject: [PATCH] Scope: fixed client id comparison issue in IsAddressAlreadyAllocated() and updated GetReservedLease(). --- DnsServerCore/Dhcp/Scope.cs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/DnsServerCore/Dhcp/Scope.cs b/DnsServerCore/Dhcp/Scope.cs index 9fd6fec4..7b741352 100644 --- a/DnsServerCore/Dhcp/Scope.cs +++ b/DnsServerCore/Dhcp/Scope.cs @@ -1,6 +1,6 @@ /* Technitium DNS Server -Copyright (C) 2021 Shreyas Zare (shreyas@technitium.com) +Copyright (C) 2022 Shreyas Zare (shreyas@technitium.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; +using TechnitiumLibrary; using TechnitiumLibrary.IO; using TechnitiumLibrary.Net; using TechnitiumLibrary.Net.Dns; @@ -389,18 +390,18 @@ namespace DnsServerCore.Dhcp return AddressStatus.TRUE; } - private bool IsAddressAlreadyAllocated(Lease reservedLease) + private bool IsAddressAlreadyAllocated(IPAddress address, ClientIdentifierOption clientIdentifier) { foreach (KeyValuePair lease in _leases) { - if (reservedLease.Address.Equals(lease.Value.Address)) - return !lease.Key.Equals(reservedLease.ClientIdentifier); + if (address.Equals(lease.Value.Address)) + return !lease.Key.Equals(clientIdentifier); } foreach (KeyValuePair offer in _offers) { - if (reservedLease.Address.Equals(offer.Value.Address)) - return !offer.Key.Equals(reservedLease.ClientIdentifier); + if (address.Equals(offer.Value.Address)) + return !offer.Key.Equals(clientIdentifier); } return false; @@ -653,20 +654,15 @@ namespace DnsServerCore.Dhcp internal Lease GetReservedLease(DhcpMessage request) { - return GetReservedLease(new ClientIdentifierOption((byte)request.HardwareAddressType, request.ClientHardwareAddress)); + return GetReservedLease(new ClientIdentifierOption((byte)request.HardwareAddressType, request.ClientHardwareAddress), request.ClientIdentifier); } - internal Lease GetReservedLease(DhcpMessageHardwareAddressType hardwareAddressType, byte[] identifier) + private Lease GetReservedLease(ClientIdentifierOption reservedLeasesClientIdentifier, ClientIdentifierOption clientIdentifier) { - return GetReservedLease(new ClientIdentifierOption((byte)hardwareAddressType, identifier)); - } - - private Lease GetReservedLease(ClientIdentifierOption clientIdentifier) - { - if (_reservedLeases.TryGetValue(clientIdentifier, out Lease reservedLease)) + if (_reservedLeases.TryGetValue(reservedLeasesClientIdentifier, out Lease reservedLease)) { //reserved address exists - if (IsAddressAlreadyAllocated(reservedLease)) + if (IsAddressAlreadyAllocated(reservedLease.Address, clientIdentifier)) return null; //reserved lease address is already allocated so ignore reserved lease return reservedLease;