public void DeregisterPool(NetworkPrefix prefix) { var addressPoolToRemove = AddressPools.Where(x => x.Pool.Network.Equals(prefix)).FirstOrDefault(); if (addressPoolToRemove == null) { return; } AddressPools.Remove(addressPoolToRemove); Pools.Remove(addressPoolToRemove.Pool); Leases.RemoveAll(x => x.Pool == addressPoolToRemove.Pool); }
public bool ReleaseLease(DHCPPacketView packet, IPEndPoint localEndPoint, IPEndPoint remoteEndPoint) { var pool = GetPoolByIP(packet.ClientIP); if (pool == null) { System.Diagnostics.Debug.WriteLine("Failed to find DHCP pool for lease release -> " + packet.ClientIP.ToString()); return(false); } var addressPool = AddressPools.Where(x => x.Pool == pool).FirstOrDefault(); if (addressPool == null) { System.Diagnostics.Debug.WriteLine("Failed to to find DHCP IP address pool for lease release -> " + packet.ClientIP.ToString()); return(false); } addressPool.SetAvailable(packet.ClientIP); System.Diagnostics.Debug.WriteLine("Returned address " + packet.ClientIP.ToString() + " to the address pool"); var count = Leases .RemoveAll(x => x.ClientId.Equals(packet.ClientId) ); if (count == 0) { System.Diagnostics.Debug.WriteLine("DHCPPools did not have a lease to be released for client id " + packet.ClientId.ToString()); return(false); } System.Diagnostics.Debug.WriteLine("DHCPPools released IP address " + packet.ClientIP.ToString() + " for client id " + packet.ClientId.ToString()); return(true); }
public void ModifyPool( NetworkPrefix network, List <IPAddress> gateways, IPRanges exclusions, string domainName, string bootFile, List <IPAddress> dnsServers, IPAddress tftpServer ) { lock (this) { var addressPool = AddressPools.Where(x => x.Pool.Network.Equals(network)).FirstOrDefault(); if (addressPool == null) { var dhcpPool = GetPoolByPrefix(network); if (dhcpPool == null) { return; } addressPool = new DhcpAddressPool(dhcpPool); AddressPools.Add(addressPool); } var pool = addressPool.Pool; pool.DefaultGateways = gateways .Select(x => x ) .ToList(); var exclusionChanges = new ExclusionChanges(pool.Network, pool.Exclusions, exclusions); var leasesToKill = Leases .Where(x => exclusionChanges.ToExclude.Contains(x.Address) ) .ToList(); foreach (var leaseToKill in leasesToKill) { addressPool.SetAvailable(leaseToKill.Address); Leases.Remove(leaseToKill); } var toExclude = exclusionChanges.ToExclude.Clone(); toExclude.Remove(pool.Network.BaseNetwork.Network); toExclude.Remove(pool.Network.Broadcast); addressPool.UnsetAvailable(toExclude); var toUnexclude = exclusionChanges.ToUnexclude.Clone(); toUnexclude.Remove(pool.Network.BaseNetwork.Network); toUnexclude.Remove(pool.Network.Broadcast); addressPool.SetAvailable(toUnexclude); pool.Exclusions = exclusions.Clone(); pool.PoolOptions.DomainName = domainName; pool.PoolOptions.BootFile = bootFile; pool.PoolOptions.TFTPServers = new List <string> { tftpServer.ToString() }; pool.PoolOptions.DNSServers = dnsServers .Select(x => x ) .ToList(); } }
public Lease ReserveByRelayAddress(IPEndPoint remoteRelay, ClientHardwareAddress clientId, UInt32 transactionId) { var pool = GetPoolByIP(remoteRelay.Address); if (pool == null) { System.Diagnostics.Debug.WriteLine("No DHCP pool exists for a network containing the IP address : " + remoteRelay.ToString()); return(null); } System.Diagnostics.Debug.WriteLine("Selected DHCP pool [" + pool.Network.ToString() + "] for request relayed by [" + remoteRelay.ToString() + "]"); var addressPool = AddressPools.Where(x => x.Pool == pool).FirstOrDefault(); if (addressPool == null) { throw new Exception("There is no available address pool for the given DHCP pool"); } System.Diagnostics.Debug.WriteLine("Cleaning DHCP pool - " + pool.Network.ToString()); CleanPool(pool, addressPool); // TODO : Track a counter for pending reservations instead of running large queries { var leasesFromPool = Leases .Where(x => x.Pool == pool ).OrderBy(x => x.Address.ToUInt32() ).ToList(); var incompleteReservations = leasesFromPool.Where(x => x.Acknowledged == null).Count(); if (incompleteReservations >= pool.MaxIncompleteRequests) { System.Diagnostics.Debug.WriteLine("Warning: There are currently " + incompleteReservations.ToString() + " for the pool " + pool.ToString() + " no reservation will be made. Possible security issue."); return(null); } } var nextAvailableAddress = addressPool.ReserveNextAvailableAddress(); if (nextAvailableAddress == null) { System.Diagnostics.Debug.WriteLine("No IP addresses were available in pool " + pool.Network.ToString()); return(null); } var leaseOptions = new LeaseOptions { BootFile = pool.PoolOptions.BootFile, DNSServers = pool.PoolOptions.DNSServers, TFTPServers = pool.PoolOptions.TFTPServers, Hostname = nextAvailableAddress.ToHexString() }; var now = DateTimeOffset.Now; var newLease = new Lease { Address = nextAvailableAddress, Options = leaseOptions, Pool = pool, Requested = now, Expires = now.Add(pool.LeaseDuration), TimesOut = now.Add(pool.RequestTimeOut), Acknowledged = DateTimeOffset.MinValue, Renewed = DateTimeOffset.MinValue, ClientId = clientId.Clone(), TransactionId = transactionId }; Leases.Add(newLease); return(newLease); }