2 * Memory management routine
3 * Copyright (C) 1998 Kunihiro Ishiguro
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
28 static void alloc_inc (int);
29 static void alloc_dec (int);
30 static void log_memstats(int log_priority
);
32 static struct message mstr
[] =
34 { MTYPE_THREAD
, "thread" },
35 { MTYPE_THREAD_MASTER
, "thread_master" },
36 { MTYPE_VECTOR
, "vector" },
37 { MTYPE_VECTOR_INDEX
, "vector_index" },
38 { MTYPE_IF
, "interface" },
42 /* Fatal memory allocation error occured. */
44 zerror (const char *fname
, int type
, size_t size
)
46 zlog_err ("%s : can't allocate memory for `%s' size %d: %s\n",
47 fname
, lookup (mstr
, type
), (int) size
, safe_strerror(errno
));
48 log_memstats(LOG_WARNING
);
49 /* N.B. It might be preferable to call zlog_backtrace_sigsafe here, since
50 that function should definitely be safe in an OOM condition. But
51 unfortunately zlog_backtrace_sigsafe does not support syslog logging at
53 zlog_backtrace(LOG_WARNING
);
57 /* Memory allocation. */
59 zmalloc (int type
, size_t size
)
63 memory
= malloc (size
);
66 zerror ("malloc", type
, size
);
73 /* Memory allocation with num * size with cleared. */
75 zcalloc (int type
, size_t size
)
79 memory
= calloc (1, size
);
82 zerror ("calloc", type
, size
);
89 /* Memory reallocation. */
91 zrealloc (int type
, void *ptr
, size_t size
)
95 memory
= realloc (ptr
, size
);
97 zerror ("realloc", type
, size
);
103 zfree (int type
, void *ptr
)
109 /* String duplication. */
111 zstrdup (int type
, const char *str
)
117 zerror ("strdup", type
, strlen (str
));
127 unsigned long t_malloc
;
128 unsigned long c_malloc
;
129 unsigned long t_calloc
;
130 unsigned long c_calloc
;
131 unsigned long t_realloc
;
132 unsigned long t_free
;
133 unsigned long c_strdup
;
137 mtype_log (char *func
, void *memory
, const char *file
, int line
, int type
)
139 zlog_debug ("%s: %s %p %s %d", func
, lookup (mstr
, type
), memory
, file
, line
);
143 mtype_zmalloc (const char *file
, int line
, int type
, size_t size
)
147 mstat
[type
].c_malloc
++;
148 mstat
[type
].t_malloc
++;
150 memory
= zmalloc (type
, size
);
151 mtype_log ("zmalloc", memory
, file
, line
, type
);
157 mtype_zcalloc (const char *file
, int line
, int type
, size_t size
)
161 mstat
[type
].c_calloc
++;
162 mstat
[type
].t_calloc
++;
164 memory
= zcalloc (type
, size
);
165 mtype_log ("xcalloc", memory
, file
, line
, type
);
171 mtype_zrealloc (const char *file
, int line
, int type
, void *ptr
, size_t size
)
175 /* Realloc need before allocated pointer. */
176 mstat
[type
].t_realloc
++;
178 memory
= zrealloc (type
, ptr
, size
);
180 mtype_log ("xrealloc", memory
, file
, line
, type
);
185 /* Important function. */
187 mtype_zfree (const char *file
, int line
, int type
, void *ptr
)
189 mstat
[type
].t_free
++;
191 mtype_log ("xfree", ptr
, file
, line
, type
);
197 mtype_zstrdup (const char *file
, int line
, int type
, const char *str
)
201 mstat
[type
].c_strdup
++;
203 memory
= zstrdup (type
, str
);
205 mtype_log ("xstrdup", memory
, file
, line
, type
);
215 #endif /* MTPYE_LOG */
217 /* Increment allocation counter. */
224 /* Decrement allocation counter. */
231 /* Looking up memory status from vty interface. */
236 /* For pretty printng of memory allocate information. */
243 static struct memory_list memory_list_lib
[] =
245 { MTYPE_TMP
, "Temporary memory" },
246 { MTYPE_ROUTE_TABLE
, "Route table " },
247 { MTYPE_ROUTE_NODE
, "Route node " },
248 { MTYPE_RIB
, "RIB " },
249 { MTYPE_DISTRIBUTE
, "Distribute list " },
250 { MTYPE_DISTRIBUTE_IFNAME
, "Dist-list ifname" },
251 { MTYPE_NEXTHOP
, "Nexthop " },
252 { MTYPE_LINK_LIST
, "Link List " },
253 { MTYPE_LINK_NODE
, "Link Node " },
254 { MTYPE_HASH
, "Hash " },
255 { MTYPE_HASH_BACKET
, "Hash Bucket " },
256 { MTYPE_ACCESS_LIST
, "Access List " },
257 { MTYPE_ACCESS_LIST_STR
, "Access List Str " },
258 { MTYPE_ACCESS_FILTER
, "Access Filter " },
259 { MTYPE_PREFIX_LIST
, "Prefix List " },
260 { MTYPE_PREFIX_LIST_STR
, "Prefix List Str " },
261 { MTYPE_PREFIX_LIST_ENTRY
, "Prefix List Entry "},
262 { MTYPE_ROUTE_MAP
, "Route map " },
263 { MTYPE_ROUTE_MAP_NAME
, "Route map name " },
264 { MTYPE_ROUTE_MAP_INDEX
, "Route map index " },
265 { MTYPE_ROUTE_MAP_RULE
, "Route map rule " },
266 { MTYPE_ROUTE_MAP_RULE_STR
, "Route map rule str" },
267 { MTYPE_ROUTE_MAP_COMPILED
, "Route map compiled" },
268 { MTYPE_DESC
, "Command desc " },
269 { MTYPE_BUFFER
, "Buffer " },
270 { MTYPE_BUFFER_DATA
, "Buffer data " },
271 { MTYPE_STREAM
, "Stream " },
272 { MTYPE_KEYCHAIN
, "Key chain " },
273 { MTYPE_KEY
, "Key " },
274 { MTYPE_VTY
, "VTY " },
278 static struct memory_list memory_list_bgp
[] =
280 { MTYPE_BGP_PEER
, "BGP peer" },
281 { MTYPE_ATTR
, "BGP attribute" },
282 { MTYPE_AS_PATH
, "BGP aspath" },
283 { MTYPE_AS_SEG
, "BGP aspath seg" },
284 { MTYPE_AS_STR
, "BGP aspath str" },
286 { MTYPE_BGP_TABLE
, "BGP table" },
287 { MTYPE_BGP_NODE
, "BGP node" },
288 { MTYPE_BGP_ADVERTISE_ATTR
, "BGP adv attr" },
289 { MTYPE_BGP_ADVERTISE
, "BGP adv" },
290 { MTYPE_BGP_ADJ_IN
, "BGP adj in" },
291 { MTYPE_BGP_ADJ_OUT
, "BGP adj out" },
293 { MTYPE_AS_LIST
, "BGP AS list" },
294 { MTYPE_AS_FILTER
, "BGP AS filter" },
295 { MTYPE_AS_FILTER_STR
, "BGP AS filter str" },
297 { MTYPE_COMMUNITY
, "community" },
298 { MTYPE_COMMUNITY_VAL
, "community val" },
299 { MTYPE_COMMUNITY_STR
, "community str" },
301 { MTYPE_ECOMMUNITY
, "extcommunity" },
302 { MTYPE_ECOMMUNITY_VAL
, "extcommunity val" },
303 { MTYPE_ECOMMUNITY_STR
, "extcommunity str" },
305 { MTYPE_COMMUNITY_LIST
, "community-list" },
306 { MTYPE_COMMUNITY_LIST_NAME
, "community-list name" },
307 { MTYPE_COMMUNITY_LIST_ENTRY
, "community-list entry" },
308 { MTYPE_COMMUNITY_LIST_CONFIG
, "community-list config" },
310 { MTYPE_CLUSTER
, "Cluster list" },
311 { MTYPE_CLUSTER_VAL
, "Cluster list val" },
313 { MTYPE_TRANSIT
, "BGP transit attr" },
314 { MTYPE_TRANSIT_VAL
, "BGP transit val" },
316 { MTYPE_BGP_DISTANCE
, "BGP distance" },
317 { MTYPE_BGP_NEXTHOP_CACHE
, "BGP nexthop" },
318 { MTYPE_BGP_CONFED_LIST
, "BGP confed list" },
319 { MTYPE_PEER_UPDATE_SOURCE
, "peer update if" },
320 { MTYPE_BGP_DAMP_INFO
, "Dampening info" },
321 { MTYPE_BGP_REGEXP
, "BGP regexp" },
325 static struct memory_list memory_list_rip
[] =
327 { MTYPE_RIP
, "RIP structure " },
328 { MTYPE_RIP_INFO
, "RIP route info " },
329 { MTYPE_RIP_INTERFACE
, "RIP interface " },
330 { MTYPE_RIP_PEER
, "RIP peer " },
331 { MTYPE_RIP_OFFSET_LIST
, "RIP offset list " },
332 { MTYPE_RIP_DISTANCE
, "RIP distance " },
336 static struct memory_list memory_list_ripng
[] =
338 { MTYPE_RIPNG
, "RIPng structure " },
339 { MTYPE_RIPNG_ROUTE
, "RIPng route info" },
340 { MTYPE_RIPNG_AGGREGATE
, "RIPng aggregate " },
341 { MTYPE_RIPNG_PEER
, "RIPng peer " },
342 { MTYPE_RIPNG_OFFSET_LIST
, "RIPng offset lst" },
343 { MTYPE_RIPNG_RTE_DATA
, "RIPng rte data " },
347 static struct memory_list memory_list_ospf
[] =
349 { MTYPE_OSPF_TOP
, "OSPF top " },
350 { MTYPE_OSPF_AREA
, "OSPF area " },
351 { MTYPE_OSPF_AREA_RANGE
, "OSPF area range " },
352 { MTYPE_OSPF_NETWORK
, "OSPF network " },
354 { MTYPE_OSPF_NEIGHBOR_STATIC
,"OSPF static nbr " },
355 #endif /* NBMA_ENABLE */
356 { MTYPE_OSPF_IF
, "OSPF interface " },
357 { MTYPE_OSPF_NEIGHBOR
, "OSPF neighbor " },
358 { MTYPE_OSPF_ROUTE
, "OSPF route " },
359 { MTYPE_OSPF_TMP
, "OSPF tmp mem " },
360 { MTYPE_OSPF_LSA
, "OSPF LSA " },
361 { MTYPE_OSPF_LSA_DATA
, "OSPF LSA data " },
362 { MTYPE_OSPF_LSDB
, "OSPF LSDB " },
363 { MTYPE_OSPF_PACKET
, "OSPF packet " },
364 { MTYPE_OSPF_FIFO
, "OSPF FIFO queue " },
365 { MTYPE_OSPF_VERTEX
, "OSPF vertex " },
366 { MTYPE_OSPF_NEXTHOP
, "OSPF nexthop " },
367 { MTYPE_OSPF_PATH
, "OSPF path " },
368 { MTYPE_OSPF_VL_DATA
, "OSPF VL data " },
369 { MTYPE_OSPF_CRYPT_KEY
, "OSPF crypt key " },
370 { MTYPE_OSPF_EXTERNAL_INFO
, "OSPF ext. info " },
371 { MTYPE_OSPF_DISTANCE
, "OSPF distance " },
372 { MTYPE_OSPF_IF_INFO
, "OSPF if info " },
373 { MTYPE_OSPF_IF_PARAMS
, "OSPF if params " },
377 static struct memory_list memory_list_ospf6
[] =
379 { MTYPE_OSPF6_TOP
, "OSPF6 top " },
380 { MTYPE_OSPF6_AREA
, "OSPF6 area " },
381 { MTYPE_OSPF6_IF
, "OSPF6 interface " },
382 { MTYPE_OSPF6_NEIGHBOR
, "OSPF6 neighbor " },
383 { MTYPE_OSPF6_ROUTE
, "OSPF6 route " },
384 { MTYPE_OSPF6_PREFIX
, "OSPF6 prefix " },
385 { MTYPE_OSPF6_MESSAGE
, "OSPF6 message " },
386 { MTYPE_OSPF6_LSA
, "OSPF6 LSA " },
387 { MTYPE_OSPF6_LSA_SUMMARY
, "OSPF6 LSA summary " },
388 { MTYPE_OSPF6_LSDB
, "OSPF6 LSA database" },
389 { MTYPE_OSPF6_VERTEX
, "OSPF6 vertex " },
390 { MTYPE_OSPF6_SPFTREE
, "OSPF6 SPF tree " },
391 { MTYPE_OSPF6_NEXTHOP
, "OSPF6 nexthop " },
392 { MTYPE_OSPF6_EXTERNAL_INFO
,"OSPF6 ext. info " },
393 { MTYPE_OSPF6_OTHER
, "OSPF6 other " },
397 static struct memory_list memory_list_isis
[] =
399 { MTYPE_ISIS
, "ISIS " },
400 { MTYPE_ISIS_TMP
, "ISIS TMP " },
401 { MTYPE_ISIS_CIRCUIT
, "ISIS circuit " },
402 { MTYPE_ISIS_LSP
, "ISIS LSP " },
403 { MTYPE_ISIS_ADJACENCY
, "ISIS adjacency " },
404 { MTYPE_ISIS_AREA
, "ISIS area " },
405 { MTYPE_ISIS_AREA_ADDR
, "ISIS area address " },
406 { MTYPE_ISIS_TLV
, "ISIS TLV " },
407 { MTYPE_ISIS_DYNHN
, "ISIS dyn hostname " },
408 { MTYPE_ISIS_SPFTREE
, "ISIS SPFtree " },
409 { MTYPE_ISIS_VERTEX
, "ISIS vertex " },
410 { MTYPE_ISIS_ROUTE_INFO
, "ISIS route info " },
411 { MTYPE_ISIS_NEXTHOP
, "ISIS nexthop " },
412 { MTYPE_ISIS_NEXTHOP6
, "ISIS nexthop6 " },
416 static struct mlist
{
417 struct memory_list
*list
;
420 { memory_list_lib
, "LIB"},
421 { memory_list_rip
, "RIP"},
422 { memory_list_ripng
, "RIPNG"},
423 { memory_list_ospf
, "OSPF"},
424 { memory_list_ospf6
, "OSPF6"},
425 { memory_list_isis
, "ISIS"},
426 { memory_list_bgp
, "BGP"},
431 log_memstats(int pri
)
435 for (ml
= mlists
; ml
->list
; ml
++)
437 struct memory_list
*m
;
439 zlog (NULL
, pri
, "Memory utilization in module %s:", ml
->name
);
440 for (m
= ml
->list
; m
->index
>= 0; m
++)
441 if (m
->index
&& mstat
[m
->index
].alloc
)
442 zlog (NULL
, pri
, " %-22s: %5ld", m
->format
, mstat
[m
->index
].alloc
);
446 static struct memory_list memory_list_separator
[] =
453 show_memory_vty (struct vty
*vty
, struct memory_list
*list
)
455 struct memory_list
*m
;
457 for (m
= list
; m
->index
>= 0; m
++)
459 vty_out (vty
, "-----------------------------\r\n");
461 vty_out (vty
, "%-22s: %5ld\r\n", m
->format
, mstat
[m
->index
].alloc
);
464 DEFUN (show_memory_all
,
467 "Show running system information\n"
468 "Memory statistics\n"
469 "All memory statistics\n")
473 for (ml
= mlists
; ml
->list
; ml
++)
476 show_memory_vty (vty
, memory_list_separator
);
477 show_memory_vty (vty
, ml
->list
);
483 ALIAS (show_memory_all
,
486 "Show running system information\n"
487 "Memory statistics\n")
489 DEFUN (show_memory_lib
,
493 "Memory statistics\n"
496 show_memory_vty (vty
, memory_list_lib
);
500 DEFUN (show_memory_rip
,
504 "Memory statistics\n"
507 show_memory_vty (vty
, memory_list_rip
);
511 DEFUN (show_memory_ripng
,
512 show_memory_ripng_cmd
,
515 "Memory statistics\n"
518 show_memory_vty (vty
, memory_list_ripng
);
522 DEFUN (show_memory_bgp
,
526 "Memory statistics\n"
529 show_memory_vty (vty
, memory_list_bgp
);
533 DEFUN (show_memory_ospf
,
534 show_memory_ospf_cmd
,
537 "Memory statistics\n"
540 show_memory_vty (vty
, memory_list_ospf
);
544 DEFUN (show_memory_ospf6
,
545 show_memory_ospf6_cmd
,
548 "Memory statistics\n"
551 show_memory_vty (vty
, memory_list_ospf6
);
555 DEFUN (show_memory_isis
,
556 show_memory_isis_cmd
,
559 "Memory statistics\n"
562 show_memory_vty (vty
, memory_list_isis
);
569 install_element (VIEW_NODE
, &show_memory_cmd
);
570 install_element (VIEW_NODE
, &show_memory_all_cmd
);
571 install_element (VIEW_NODE
, &show_memory_lib_cmd
);
572 install_element (VIEW_NODE
, &show_memory_rip_cmd
);
573 install_element (VIEW_NODE
, &show_memory_ripng_cmd
);
574 install_element (VIEW_NODE
, &show_memory_bgp_cmd
);
575 install_element (VIEW_NODE
, &show_memory_ospf_cmd
);
576 install_element (VIEW_NODE
, &show_memory_ospf6_cmd
);
577 install_element (VIEW_NODE
, &show_memory_isis_cmd
);
579 install_element (ENABLE_NODE
, &show_memory_cmd
);
580 install_element (ENABLE_NODE
, &show_memory_all_cmd
);
581 install_element (ENABLE_NODE
, &show_memory_lib_cmd
);
582 install_element (ENABLE_NODE
, &show_memory_rip_cmd
);
583 install_element (ENABLE_NODE
, &show_memory_ripng_cmd
);
584 install_element (ENABLE_NODE
, &show_memory_bgp_cmd
);
585 install_element (ENABLE_NODE
, &show_memory_ospf_cmd
);
586 install_element (ENABLE_NODE
, &show_memory_ospf6_cmd
);
587 install_element (ENABLE_NODE
, &show_memory_isis_cmd
);