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); }
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); }