Annotation of embedaddon/dhcp/server/salloc.c, revision 1.1
1.1 ! misho 1: /* salloc.c
! 2:
! 3: Memory allocation for the DHCP server... */
! 4:
! 5: /*
! 6: * Copyright (c) 2004-2007,2009 by Internet Systems Consortium, Inc. ("ISC")
! 7: * Copyright (c) 1996-2003 by Internet Software Consortium
! 8: *
! 9: * Permission to use, copy, modify, and distribute this software for any
! 10: * purpose with or without fee is hereby granted, provided that the above
! 11: * copyright notice and this permission notice appear in all copies.
! 12: *
! 13: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
! 14: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 15: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
! 16: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 17: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 18: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 19: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 20: *
! 21: * Internet Systems Consortium, Inc.
! 22: * 950 Charter Street
! 23: * Redwood City, CA 94063
! 24: * <info@isc.org>
! 25: * https://www.isc.org/
! 26: *
! 27: * This software has been written for Internet Systems Consortium
! 28: * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
! 29: * To learn more about Internet Systems Consortium, see
! 30: * ``https://www.isc.org/''. To learn more about Vixie Enterprises,
! 31: * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
! 32: * ``http://www.nominum.com''.
! 33: */
! 34:
! 35: #include "dhcpd.h"
! 36: #include <omapip/omapip_p.h>
! 37:
! 38: #if defined (COMPACT_LEASES)
! 39: struct lease *free_leases;
! 40:
! 41: # if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
! 42: struct lease *lease_hunks;
! 43:
! 44: void relinquish_lease_hunks ()
! 45: {
! 46: struct lease *c, *n, **p, *f;
! 47: int i;
! 48:
! 49: /* Account for all the leases on the free list. */
! 50: for (n = lease_hunks; n; n = n -> next) {
! 51: for (i = 1; i < n -> starts + 1; i++) {
! 52: p = &free_leases;
! 53: for (c = free_leases; c; c = c -> next) {
! 54: if (c == &n [i]) {
! 55: *p = c -> next;
! 56: n -> ends++;
! 57: break;
! 58: }
! 59: p = &c -> next;
! 60: }
! 61: if (!c) {
! 62: log_info ("lease %s refcnt %d",
! 63: piaddr (n [i].ip_addr), n [i].refcnt);
! 64: dump_rc_history (&n [i]);
! 65: }
! 66: }
! 67: }
! 68:
! 69: for (c = lease_hunks; c; c = n) {
! 70: n = c -> next;
! 71: if (c -> ends != c -> starts) {
! 72: log_info ("lease hunk %lx leases %ld free %ld",
! 73: (unsigned long)c, (unsigned long)c -> starts,
! 74: (unsigned long)c -> ends);
! 75: }
! 76: dfree (c, MDL);
! 77: }
! 78:
! 79: /* Free all the rogue leases. */
! 80: for (c = free_leases; c; c = n) {
! 81: n = c -> next;
! 82: dfree (c, MDL);
! 83: }
! 84: }
! 85: #endif
! 86:
! 87: struct lease *new_leases (n, file, line)
! 88: unsigned n;
! 89: const char *file;
! 90: int line;
! 91: {
! 92: struct lease *rval;
! 93: #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
! 94: rval = dmalloc ((n + 1) * sizeof (struct lease), file, line);
! 95: memset (rval, 0, sizeof (struct lease));
! 96: rval -> starts = n;
! 97: rval -> next = lease_hunks;
! 98: lease_hunks = rval;
! 99: rval++;
! 100: #else
! 101: rval = dmalloc (n * sizeof (struct lease), file, line);
! 102: #endif
! 103: return rval;
! 104: }
! 105:
! 106: /* If we are allocating leases in aggregations, there's really no way
! 107: to free one, although perhaps we can maintain a free list. */
! 108:
! 109: isc_result_t dhcp_lease_free (omapi_object_t *lo,
! 110: const char *file, int line)
! 111: {
! 112: struct lease *lease;
! 113: if (lo -> type != dhcp_type_lease)
! 114: return ISC_R_INVALIDARG;
! 115: lease = (struct lease *)lo;
! 116: memset (lease, 0, sizeof (struct lease));
! 117: lease -> next = free_leases;
! 118: free_leases = lease;
! 119: return ISC_R_SUCCESS;
! 120: }
! 121:
! 122: isc_result_t dhcp_lease_get (omapi_object_t **lp,
! 123: const char *file, int line)
! 124: {
! 125: struct lease **lease = (struct lease **)lp;
! 126: struct lease *lt;
! 127:
! 128: if (free_leases) {
! 129: lt = free_leases;
! 130: free_leases = lt -> next;
! 131: *lease = lt;
! 132: return ISC_R_SUCCESS;
! 133: }
! 134: return ISC_R_NOMEMORY;
! 135: }
! 136: #endif /* COMPACT_LEASES */
! 137:
! 138: OMAPI_OBJECT_ALLOC (lease, struct lease, dhcp_type_lease)
! 139: OMAPI_OBJECT_ALLOC (class, struct class, dhcp_type_class)
! 140: OMAPI_OBJECT_ALLOC (subclass, struct class, dhcp_type_subclass)
! 141: OMAPI_OBJECT_ALLOC (pool, struct pool, dhcp_type_pool)
! 142:
! 143: #if !defined (NO_HOST_FREES) /* Scary debugging mode - don't enable! */
! 144: OMAPI_OBJECT_ALLOC (host, struct host_decl, dhcp_type_host)
! 145: #else
! 146: isc_result_t host_allocate (struct host_decl **p, const char *file, int line)
! 147: {
! 148: return omapi_object_allocate ((omapi_object_t **)p,
! 149: dhcp_type_host, 0, file, line);
! 150: }
! 151:
! 152: isc_result_t host_reference (struct host_decl **pptr, struct host_decl *ptr,
! 153: const char *file, int line)
! 154: {
! 155: return omapi_object_reference ((omapi_object_t **)pptr,
! 156: (omapi_object_t *)ptr, file, line);
! 157: }
! 158:
! 159: isc_result_t host_dereference (struct host_decl **ptr,
! 160: const char *file, int line)
! 161: {
! 162: if ((*ptr) -> refcnt == 1) {
! 163: log_error ("host dereferenced with refcnt == 1.");
! 164: #if defined (DEBUG_RC_HISTORY)
! 165: dump_rc_history ();
! 166: #endif
! 167: abort ();
! 168: }
! 169: return omapi_object_dereference ((omapi_object_t **)ptr, file, line);
! 170: }
! 171: #endif
! 172:
! 173: struct lease_state *free_lease_states;
! 174:
! 175: struct lease_state *new_lease_state (file, line)
! 176: const char *file;
! 177: int line;
! 178: {
! 179: struct lease_state *rval;
! 180:
! 181: if (free_lease_states) {
! 182: rval = free_lease_states;
! 183: free_lease_states =
! 184: (struct lease_state *)(free_lease_states -> next);
! 185: dmalloc_reuse (rval, file, line, 0);
! 186: } else {
! 187: rval = dmalloc (sizeof (struct lease_state), file, line);
! 188: if (!rval)
! 189: return rval;
! 190: }
! 191: memset (rval, 0, sizeof *rval);
! 192: if (!option_state_allocate (&rval -> options, file, line)) {
! 193: free_lease_state (rval, file, line);
! 194: return (struct lease_state *)0;
! 195: }
! 196: return rval;
! 197: }
! 198:
! 199: void free_lease_state (ptr, file, line)
! 200: struct lease_state *ptr;
! 201: const char *file;
! 202: int line;
! 203: {
! 204: if (ptr -> options)
! 205: option_state_dereference (&ptr -> options, file, line);
! 206: if (ptr -> packet)
! 207: packet_dereference (&ptr -> packet, file, line);
! 208: if (ptr -> shared_network)
! 209: shared_network_dereference (&ptr -> shared_network,
! 210: file, line);
! 211:
! 212: data_string_forget (&ptr -> parameter_request_list, file, line);
! 213: data_string_forget (&ptr -> filename, file, line);
! 214: data_string_forget (&ptr -> server_name, file, line);
! 215: ptr -> next = free_lease_states;
! 216: free_lease_states = ptr;
! 217: dmalloc_reuse (free_lease_states, (char *)0, 0, 0);
! 218: }
! 219:
! 220: #if defined (DEBUG_MEMORY_LEAKAGE) || \
! 221: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
! 222: void relinquish_free_lease_states ()
! 223: {
! 224: struct lease_state *cs, *ns;
! 225:
! 226: for (cs = free_lease_states; cs; cs = ns) {
! 227: ns = cs -> next;
! 228: dfree (cs, MDL);
! 229: }
! 230: free_lease_states = (struct lease_state *)0;
! 231: }
! 232: #endif
! 233:
! 234: struct permit *new_permit (file, line)
! 235: const char *file;
! 236: int line;
! 237: {
! 238: struct permit *permit = ((struct permit *)
! 239: dmalloc (sizeof (struct permit), file, line));
! 240: if (!permit)
! 241: return permit;
! 242: memset (permit, 0, sizeof *permit);
! 243: return permit;
! 244: }
! 245:
! 246: void free_permit (permit, file, line)
! 247: struct permit *permit;
! 248: const char *file;
! 249: int line;
! 250: {
! 251: if (permit -> type == permit_class)
! 252: class_dereference (&permit -> class, MDL);
! 253: dfree (permit, file, line);
! 254: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>