}
/* If the address the client asked for is ours, but it wasn't
- available for the client, NAK it. */
+ available for the client, NAK it. */
if (!lease && ours) {
log_info ("%s: lease %s unavailable.", msgbuf, piaddr (cip));
nak_lease (packet, &cip);
/* DHCPRELEASE must not specify address in requested-address
- option, but old protocol specs weren't explicit about this,
- so let it go. */
+ option, but old protocol specs weren't explicit about this,
+ so let it go. */
if ((oc = lookup_option (&dhcp_universe, packet -> options,
DHO_DHCP_REQUESTED_ADDRESS))) {
log_info ("DHCPRELEASE from %s specified requested-address.",
if (i == packet -> class_count)
unbill_class (lease, lease -> billing_class);
}
-
+
/* If we don't have an active billing, see if we need
one, and if we do, try to do so. */
- if (!lease -> billing_class) {
- for (i = 0; i < packet -> class_count; i++) {
- if (packet -> classes [i] -> lease_limit)
- break;
- }
- if (i != packet -> class_count) {
- for (i = 0; i < packet -> class_count; i++)
- if ((packet ->
- classes [i] -> lease_limit) &&
- bill_class (lease,
- packet -> classes [i]))
+ if (lease->billing_class == NULL) {
+ int bill = 0;
+ for (i = 0; i < packet->class_count; i++) {
+ if (packet->classes[i]->lease_limit) {
+ bill++;
+ if (bill_class(lease,
+ packet->classes[i]))
break;
- if (i == packet -> class_count) {
- log_info ("%s: no available billing",
- msg);
- free_lease_state (state, MDL);
- if (host)
- host_dereference (&host, MDL);
- /* XXX possibly not necessary: */
- return;
}
}
+ if (bill != 0 && i == packet->class_count) {
+ log_info("%s: no available billing: lease "
+ "limit reached in all matching "
+ "classes", msg);
+ free_lease_state(state, MDL);
+ if (host)
+ host_dereference(&host, MDL);
+ return;
+ }
/* If this is an offer, undo the billing. We go
* through all the steps above to bill a class so
}
/* Now, if appropriate, put in DHCP-specific options that
- override those. */
+ override those. */
if (state -> offer) {
i = DHO_DHCP_MESSAGE_TYPE;
oc = (struct option_cache *)0;
a lease at all. */
int allocate_lease (struct lease **lp, struct packet *packet,
- struct pool *pool, int *peer_has_leases)
+ struct pool *pool, int *peer_has_leases)
{
struct lease *lease = (struct lease *)0;
struct lease *candl = (struct lease *)0;