const IOAddress& candidate = ctx.host_ ?
ctx.host_->getIPv4Reservation() : ctx.requested_address_;
- // Once we picked an address we want to allocate, we have to check
- // if this address is available.
- existing = LeaseMgrFactory::instance().getLease4(candidate);
- if (!existing) {
- // The candidate address is currently unused. Let's create a
- // lease for it.
- Lease4Ptr lease = createLease4(subnet, clientid, hwaddr,
- candidate, fwd_dns_update,
- rev_dns_update,
- hostname, callout_handle,
- fake_allocation);
-
- // If we have allocated the lease let's return it. Also,
- // always return when tried to allocate reserved address,
- // regardless if allocation was successful or not. If it
- // was not successful, we will return a NULL pointer which
- // indicates to the server that it should send NAK to the
- // client.
- if (lease || ctx.host_) {
- return (lease);
- }
-
- // There is a lease for this address in the lease database but
- // it is possible that the lease has expired, in which case
- // we will be able to reuse it.
- } else {
- if (existing->expired()) {
- // Save the old lease, before reusing it.
- old_lease.reset(new Lease4(*existing));
- return (reuseExpiredLease(existing, ctx));
-
- // The existing lease is not expired (is in use by some
- // other client). If we are trying to get this lease because
- // the address has been reserved for the client we have no
- // choice but to return a NULL lease to indicate that the
- // allocation has failed.
- } else if (ctx.host_) {
- return (Lease4Ptr());
+ if (ctx.host_ ||
+ (!ctx.host_ && !HostMgr::instance().get4(ctx.subnet_->getID(),
+ candidate))) {
+ // Once we picked an address we want to allocate, we have to check
+ // if this address is available.
+ existing = LeaseMgrFactory::instance().getLease4(candidate);
+ if (!existing) {
+ // The candidate address is currently unused. Let's create a
+ // lease for it.
+ Lease4Ptr lease = createLease4(subnet, clientid, hwaddr,
+ candidate, fwd_dns_update,
+ rev_dns_update,
+ hostname, callout_handle,
+ fake_allocation);
+
+ // If we have allocated the lease let's return it. Also,
+ // always return when tried to allocate reserved address,
+ // regardless if allocation was successful or not. If it
+ // was not successful, we will return a NULL pointer which
+ // indicates to the server that it should send NAK to the
+ // client.
+ if (lease || ctx.host_) {
+ return (lease);
+ }
+
+ // There is a lease for this address in the lease database but
+ // it is possible that the lease has expired, in which case
+ // we will be able to reuse it.
+ } else {
+ if (existing->expired()) {
+ // Save the old lease, before reusing it.
+ old_lease.reset(new Lease4(*existing));
+ return (reuseExpiredLease(existing, ctx));
+
+ // The existing lease is not expired (is in use by some
+ // other client). If we are trying to get this lease because
+ // the address has been reserved for the client we have no
+ // choice but to return a NULL lease to indicate that the
+ // allocation has failed.
+ } else if (ctx.host_) {
+ return (Lease4Ptr());
+
+ }
}
-
}
}