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>