]>
git.ipfire.org Git - thirdparty/dhcp.git/blob - server/salloc.c
3 Memory allocation for the DHCP server... */
6 * Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC")
7 * Copyright (c) 1996-2003 by Internet Software Consortium
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.
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.
21 * Internet Systems Consortium, Inc.
23 * Redwood City, CA 94063
25 * https://www.isc.org/
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''.
36 #include <omapip/omapip_p.h>
38 #if defined (COMPACT_LEASES)
39 struct lease
*free_leases
;
41 # if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
42 struct lease
*lease_hunks
;
44 void relinquish_lease_hunks ()
46 struct lease
*c
, *n
, **p
, *f
;
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
++) {
53 for (c
= free_leases
; c
; c
= c
-> next
) {
62 log_info ("lease %s refcnt %d",
63 piaddr (n
[i
].ip_addr
), n
[i
].refcnt
);
64 dump_rc_history (&n
[i
]);
69 for (c
= lease_hunks
; c
; c
= n
) {
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
);
79 /* Free all the rogue leases. */
80 for (c
= free_leases
; c
; c
= n
) {
87 struct lease
*new_leases (n
, file
, line
)
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
));
97 rval
-> next
= lease_hunks
;
101 rval
= dmalloc (n
* sizeof (struct lease
), file
, line
);
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. */
109 isc_result_t
dhcp_lease_free (omapi_object_t
*lo
,
110 const char *file
, int line
)
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
;
119 return ISC_R_SUCCESS
;
122 isc_result_t
dhcp_lease_get (omapi_object_t
**lp
,
123 const char *file
, int line
)
125 struct lease
**lease
= (struct lease
**)lp
;
130 free_leases
= lt
-> next
;
132 return ISC_R_SUCCESS
;
134 return ISC_R_NOMEMORY
;
136 #endif /* COMPACT_LEASES */
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
)
143 #if !defined (NO_HOST_FREES) /* Scary debugging mode - don't enable! */
144 OMAPI_OBJECT_ALLOC (host
, struct host_decl
, dhcp_type_host
)
146 isc_result_t
host_allocate (struct host_decl
**p
, const char *file
, int line
)
148 return omapi_object_allocate ((omapi_object_t
**)p
,
149 dhcp_type_host
, 0, file
, line
);
152 isc_result_t
host_reference (struct host_decl
**pptr
, struct host_decl
*ptr
,
153 const char *file
, int line
)
155 return omapi_object_reference ((omapi_object_t
**)pptr
,
156 (omapi_object_t
*)ptr
, file
, line
);
159 isc_result_t
host_dereference (struct host_decl
**ptr
,
160 const char *file
, int line
)
162 if ((*ptr
) -> refcnt
== 1) {
163 log_error ("host dereferenced with refcnt == 1.");
164 #if defined (DEBUG_RC_HISTORY)
169 return omapi_object_dereference ((omapi_object_t
**)ptr
, file
, line
);
173 struct lease_state
*free_lease_states
;
175 struct lease_state
*new_lease_state (file
, line
)
179 struct lease_state
*rval
;
181 if (free_lease_states
) {
182 rval
= free_lease_states
;
184 (struct lease_state
*)(free_lease_states
-> next
);
185 dmalloc_reuse (rval
, file
, line
, 0);
187 rval
= dmalloc (sizeof (struct lease_state
), file
, line
);
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;
199 void free_lease_state (ptr
, file
, line
)
200 struct lease_state
*ptr
;
205 option_state_dereference (&ptr
-> options
, file
, line
);
207 packet_dereference (&ptr
-> packet
, file
, line
);
208 if (ptr
-> shared_network
)
209 shared_network_dereference (&ptr
-> shared_network
,
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);
220 #if defined (DEBUG_MEMORY_LEAKAGE) || \
221 defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
222 void relinquish_free_lease_states ()
224 struct lease_state
*cs
, *ns
;
226 for (cs
= free_lease_states
; cs
; cs
= ns
) {
230 free_lease_states
= (struct lease_state
*)0;
234 struct permit
*new_permit (file
, line
)
238 struct permit
*permit
= ((struct permit
*)
239 dmalloc (sizeof (struct permit
), file
, line
));
242 memset (permit
, 0, sizeof *permit
);
246 void free_permit (permit
, file
, line
)
247 struct permit
*permit
;
251 if (permit
-> type
== permit_class
)
252 class_dereference (&permit
-> class, MDL
);
253 dfree (permit
, file
, line
);