Пример #1
0
        internal DHCPv4Packet HandleDiscover(DHCPv4Packet packet)
        {
            DHCPv4ScopeAddressProperties addressProperties = GetAddressProperties();

            IPv4Address leaseAddress   = IPv4Address.Empty;
            Boolean     newLeaseNeeded = true;

            DHCPv4ClientIdentifier clientIdentifier = packet.GetClientIdentifier();
            DHCPv4Lease            currentLease     = Leases.GetLeaseByClientIdentifier(clientIdentifier);

            IPv4Address excludeFromLease = IPv4Address.Empty;

            if (currentLease != DHCPv4Lease.Empty)
            {
                if (addressProperties.ReuseAddressIfPossible == true)
                {
                    LeaseTimeValues timers = GetLeaseTimers(addressProperties);
                    currentLease.Renew(timers.Lifespan, timers.RenewTime, timers.ReboundTime, true);
                    newLeaseNeeded = false;

                    leaseAddress = IPv4Address.FromAddress(currentLease.Address);
                }
                else
                {
                    excludeFromLease = IPv4Address.FromByteArray(currentLease.Address.GetBytes());
                    Leases.Revoke(currentLease);
                }
            }
            else
            {
                if (Resolver.HasUniqueIdentifier == true)
                {
                    currentLease = Leases.GetLeaseByUniqueIdentifier(Resolver.GetUniqueIdentifier(packet));
                    if (currentLease != DHCPv4Lease.Empty)
                    {
                        Leases.Revoke(currentLease);
                        excludeFromLease = IPv4Address.FromAddress(currentLease.Address);

                        if (addressProperties.ReuseAddressIfPossible == true)
                        {
                            leaseAddress = IPv4Address.FromAddress(currentLease.Address);
                        }
                    }
                }
            }

            if (leaseAddress == IPv4Address.Empty)
            {
                leaseAddress = GetLeaseAddress(addressProperties, excludeFromLease);

                if (leaseAddress == IPv4Address.Empty)
                {
                    base.Apply(new DHCPv4ScopeAddressesAreExhaustedEvent(Id));
                    base.Apply(new DHCPv4DiscoverHandledEvent(this.Id, packet, DHCPv4DiscoverHandledEvent.DisoverErros.NoAddressesLeft));
                    return(DHCPv4Packet.Empty);
                }
            }

            if (newLeaseNeeded == true)
            {
                currentLease = AddLease(packet, addressProperties, leaseAddress, clientIdentifier);
            }

            DHCPv4ScopeProperties scopeProperties = GetScopeProperties();

            DHCPv4Packet response = DHCPv4Packet.AsDiscoverResponse(
                packet,
                currentLease,
                addressProperties,
                scopeProperties.Properties
                );

            base.Apply(new DHCPv4DiscoverHandledEvent(this.Id, packet, response));
            return(response);
        }
Пример #2
0
        internal DHCPv4Packet HandleRequest(DHCPv4Packet packet)
        {
            DHCPv4PacketRequestType      requestType       = packet.GetRequestType();
            DHCPv4ScopeAddressProperties addressProperties = GetAddressProperties();
            DHCPv4ScopeProperties        scopeProperties   = GetScopeProperties();

            DHCPv4ClientIdentifier identifier = packet.GetClientIdentifier();
            DHCPv4Lease            lease      = Leases.GetLeaseByClientIdentifier(identifier);

            Boolean      newLeaseNeeded = false;
            IPv4Address  leaseAddress   = IPv4Address.Empty;
            DHCPv4Packet answer         = DHCPv4Packet.Empty;
            var          requestError   = DHCPv4RequestHandledEvent.RequestErros.NoError;

            IPv4Address excludedAddressForNewAddress = IPv4Address.Empty;

            if (requestType == DHCPv4PacketRequestType.AnswerToOffer)
            {
                if (lease == DHCPv4Lease.Empty)
                {
                    answer       = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no lease found");
                    requestError = DHCPv4RequestHandledEvent.RequestErros.LeaseNotFound;
                }
                else
                {
                    if (lease.IsPending() == false)
                    {
                        answer       = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "the requested lease is in use");
                        requestError = DHCPv4RequestHandledEvent.RequestErros.LeaseNotPending;
                    }
                    else
                    {
                        lease.RemovePendingState();
                        leaseAddress = lease.Address;
                    }
                }
            }
            else if (requestType == DHCPv4PacketRequestType.Renewing ||
                     requestType == DHCPv4PacketRequestType.Rebinding
                     )
            {
                if (
                    (requestType == DHCPv4PacketRequestType.Renewing &&
                     addressProperties.SupportDirectUnicast == true) ||
                    requestType == DHCPv4PacketRequestType.Rebinding)
                {
                    if (lease == DHCPv4Lease.Empty)
                    {
                        requestError = DHCPv4RequestHandledEvent.RequestErros.LeaseNotFound;

                        if (requestType == DHCPv4PacketRequestType.Renewing)
                        {
                            answer = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no lease found");
                        }
                    }
                    else
                    {
                        if (lease.IsActive() == false)
                        {
                            answer       = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "lease not active anymore");
                            requestError = DHCPv4RequestHandledEvent.RequestErros.LeaseNotActive;
                        }
                        else
                        {
                            if (addressProperties.ReuseAddressIfPossible == true)
                            {
                                LeaseTimeValues timers = GetLeaseTimers(addressProperties);
                                lease.Renew(timers.Lifespan, timers.RenewTime, timers.ReboundTime, false);
                                leaseAddress = lease.Address;
                            }
                            else
                            {
                                answer = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no extentions possible");
                                Leases.Revoke(lease);
                            }
                        }
                    }
                }
                else
                {
                    answer       = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "the renewing of an ip address is not allowed");
                    requestError = DHCPv4RequestHandledEvent.RequestErros.RenewingNotAllowed;
                }
            }
            else if (requestType == DHCPv4PacketRequestType.Initializing)
            {
                if (lease == DHCPv4Lease.Empty)
                {
                    requestError = DHCPv4RequestHandledEvent.RequestErros.LeaseNotFound;
                    //answer = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no lease found");
                }
                else
                {
                    if (lease.IsActive() == true)
                    {
                        if (addressProperties.ReuseAddressIfPossible == true)
                        {
                            LeaseTimeValues timers = GetLeaseTimers(addressProperties);
                            lease.Renew(timers.Lifespan, timers.RenewTime, timers.ReboundTime, false);
                            leaseAddress = lease.Address;
                        }
                        else
                        {
                            Leases.Revoke(lease);
                            answer = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no extention possible");
                        }
                    }
                    else
                    {
                        if (addressProperties.ReuseAddressIfPossible == true)
                        {
                            if (Leases.IsAddressActive(lease.Address) == true)
                            {
                                newLeaseNeeded = true;
                            }
                            else
                            {
                                lease.Reactived(addressProperties.LeaseTime.Value, addressProperties.RenewalTime.Value, addressProperties.PreferredLifetime.Value);
                                leaseAddress = lease.Address;
                            }
                        }
                        else
                        {
                            newLeaseNeeded = true;
                        }
                    }
                }
            }

            if (requestError == DHCPv4RequestHandledEvent.RequestErros.NoError)
            {
                if (leaseAddress == IPv4Address.Empty)
                {
                    leaseAddress = GetLeaseAddress(addressProperties, excludedAddressForNewAddress);

                    if (leaseAddress == IPv4Address.Empty)
                    {
                        base.Apply(new DHCPv4ScopeAddressesAreExhaustedEvent(Id));
                        answer       = DHCPv4Packet.AsNonAcknowledgeResponse(packet, "no addresses left");
                        requestError = DHCPv4RequestHandledEvent.RequestErros.NoAddressAvaiable;
                    }
                }
                if (answer == DHCPv4Packet.Empty)
                {
                    if (newLeaseNeeded == true)
                    {
                        var freshLease = AddLease(packet, addressProperties, leaseAddress, identifier);
                        freshLease.RemovePendingState();
                        lease = freshLease;
                    }

                    answer = DHCPv4Packet.AsRequestResponse(
                        packet,
                        lease,
                        addressProperties,
                        scopeProperties.Properties
                        );
                }
            }

            base.Apply(new DHCPv4RequestHandledEvent(this.Id, packet, answer, requestError));
            return(answer);
        }