示例#1
0
        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);
        }
示例#2
0
        public bool RegisterPool(DhcpPool pool)
        {
            var conflictingPool = GetPoolByPrefix(pool.Network);

            if (conflictingPool != null)
            {
                return(false);
            }

            Pools.Add(pool);
            AddressPools.Add(new DhcpAddressPool(pool));

            return(true);
        }
示例#3
0
        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);
        }
示例#4
0
        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();
            }
        }
示例#5
0
        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);
        }