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
, strerror(errno
));
48 log_memstats(LOG_WARNING
);
52 /* Memory allocation. */
54 zmalloc (int type
, size_t size
)
58 memory
= malloc (size
);
61 zerror ("malloc", type
, size
);
68 /* Memory allocation with num * size with cleared. */
70 zcalloc (int type
, size_t size
)
74 memory
= calloc (1, size
);
77 zerror ("calloc", type
, size
);
84 /* Memory reallocation. */
86 zrealloc (int type
, void *ptr
, size_t size
)
90 memory
= realloc (ptr
, size
);
92 zerror ("realloc", type
, size
);
98 zfree (int type
, void *ptr
)
104 /* String duplication. */
106 zstrdup (int type
, const char *str
)
112 zerror ("strdup", type
, strlen (str
));
122 unsigned long t_malloc
;
123 unsigned long c_malloc
;
124 unsigned long t_calloc
;
125 unsigned long c_calloc
;
126 unsigned long t_realloc
;
127 unsigned long t_free
;
128 unsigned long c_strdup
;
132 mtype_log (char *func
, void *memory
, const char *file
, int line
, int type
)
134 zlog_info ("%s: %s %p %s %d", func
, lookup (mstr
, type
), memory
, file
, line
);
138 mtype_zmalloc (const char *file
, int line
, int type
, size_t size
)
142 mstat
[type
].c_malloc
++;
143 mstat
[type
].t_malloc
++;
145 memory
= zmalloc (type
, size
);
146 mtype_log ("zmalloc", memory
, file
, line
, type
);
152 mtype_zcalloc (const char *file
, int line
, int type
, size_t size
)
156 mstat
[type
].c_calloc
++;
157 mstat
[type
].t_calloc
++;
159 memory
= zcalloc (type
, size
);
160 mtype_log ("xcalloc", memory
, file
, line
, type
);
166 mtype_zrealloc (const char *file
, int line
, int type
, void *ptr
, size_t size
)
170 /* Realloc need before allocated pointer. */
171 mstat
[type
].t_realloc
++;
173 memory
= zrealloc (type
, ptr
, size
);
175 mtype_log ("xrealloc", memory
, file
, line
, type
);
180 /* Important function. */
182 mtype_zfree (const char *file
, int line
, int type
, void *ptr
)
184 mstat
[type
].t_free
++;
186 mtype_log ("xfree", ptr
, file
, line
, type
);
192 mtype_zstrdup (const char *file
, int line
, int type
, const char *str
)
196 mstat
[type
].c_strdup
++;
198 memory
= zstrdup (type
, str
);
200 mtype_log ("xstrdup", memory
, file
, line
, type
);
210 #endif /* MTPYE_LOG */
212 /* Increment allocation counter. */
219 /* Decrement allocation counter. */
226 /* Looking up memory status from vty interface. */
231 /* For pretty printng of memory allocate information. */
238 static struct memory_list memory_list_lib
[] =
240 { MTYPE_TMP
, "Temporary memory" },
241 { MTYPE_ROUTE_TABLE
, "Route table " },
242 { MTYPE_ROUTE_NODE
, "Route node " },
243 { MTYPE_RIB
, "RIB " },
244 { MTYPE_DISTRIBUTE
, "Distribute list " },
245 { MTYPE_DISTRIBUTE_IFNAME
, "Dist-list ifname" },
246 { MTYPE_NEXTHOP
, "Nexthop " },
247 { MTYPE_LINK_LIST
, "Link List " },
248 { MTYPE_LINK_NODE
, "Link Node " },
249 { MTYPE_HASH
, "Hash " },
250 { MTYPE_HASH_BACKET
, "Hash Bucket " },
251 { MTYPE_ACCESS_LIST
, "Access List " },
252 { MTYPE_ACCESS_LIST_STR
, "Access List Str " },
253 { MTYPE_ACCESS_FILTER
, "Access Filter " },
254 { MTYPE_PREFIX_LIST
, "Prefix List " },
255 { MTYPE_PREFIX_LIST_STR
, "Prefix List Str " },
256 { MTYPE_PREFIX_LIST_ENTRY
, "Prefix List Entry "},
257 { MTYPE_ROUTE_MAP
, "Route map " },
258 { MTYPE_ROUTE_MAP_NAME
, "Route map name " },
259 { MTYPE_ROUTE_MAP_INDEX
, "Route map index " },
260 { MTYPE_ROUTE_MAP_RULE
, "Route map rule " },
261 { MTYPE_ROUTE_MAP_RULE_STR
, "Route map rule str" },
262 { MTYPE_ROUTE_MAP_COMPILED
, "Route map compiled" },
263 { MTYPE_DESC
, "Command desc " },
264 { MTYPE_BUFFER
, "Buffer " },
265 { MTYPE_BUFFER_DATA
, "Buffer data " },
266 { MTYPE_STREAM
, "Stream " },
267 { MTYPE_KEYCHAIN
, "Key chain " },
268 { MTYPE_KEY
, "Key " },
269 { MTYPE_VTY
, "VTY " },
273 static struct memory_list memory_list_bgp
[] =
275 { MTYPE_BGP_PEER
, "BGP peer" },
276 { MTYPE_ATTR
, "BGP attribute" },
277 { MTYPE_AS_PATH
, "BGP aspath" },
278 { MTYPE_AS_SEG
, "BGP aspath seg" },
279 { MTYPE_AS_STR
, "BGP aspath str" },
281 { MTYPE_BGP_TABLE
, "BGP table" },
282 { MTYPE_BGP_NODE
, "BGP node" },
283 { MTYPE_BGP_ADVERTISE_ATTR
, "BGP adv attr" },
284 { MTYPE_BGP_ADVERTISE
, "BGP adv" },
285 { MTYPE_BGP_ADJ_IN
, "BGP adj in" },
286 { MTYPE_BGP_ADJ_OUT
, "BGP adj out" },
288 { MTYPE_AS_LIST
, "BGP AS list" },
289 { MTYPE_AS_FILTER
, "BGP AS filter" },
290 { MTYPE_AS_FILTER_STR
, "BGP AS filter str" },
292 { MTYPE_COMMUNITY
, "community" },
293 { MTYPE_COMMUNITY_VAL
, "community val" },
294 { MTYPE_COMMUNITY_STR
, "community str" },
296 { MTYPE_ECOMMUNITY
, "extcommunity" },
297 { MTYPE_ECOMMUNITY_VAL
, "extcommunity val" },
298 { MTYPE_ECOMMUNITY_STR
, "extcommunity str" },
300 { MTYPE_COMMUNITY_LIST
, "community-list" },
301 { MTYPE_COMMUNITY_LIST_NAME
, "community-list name" },
302 { MTYPE_COMMUNITY_LIST_ENTRY
, "community-list entry" },
303 { MTYPE_COMMUNITY_LIST_CONFIG
, "community-list config" },
305 { MTYPE_CLUSTER
, "Cluster list" },
306 { MTYPE_CLUSTER_VAL
, "Cluster list val" },
308 { MTYPE_TRANSIT
, "BGP transit attr" },
309 { MTYPE_TRANSIT_VAL
, "BGP transit val" },
311 { MTYPE_BGP_DISTANCE
, "BGP distance" },
312 { MTYPE_BGP_NEXTHOP_CACHE
, "BGP nexthop" },
313 { MTYPE_BGP_CONFED_LIST
, "BGP confed list" },
314 { MTYPE_PEER_UPDATE_SOURCE
, "peer update if" },
315 { MTYPE_BGP_DAMP_INFO
, "Dampening info" },
316 { MTYPE_BGP_REGEXP
, "BGP regexp" },
320 static struct memory_list memory_list_rip
[] =
322 { MTYPE_RIP
, "RIP structure " },
323 { MTYPE_RIP_INFO
, "RIP route info " },
324 { MTYPE_RIP_INTERFACE
, "RIP interface " },
325 { MTYPE_RIP_PEER
, "RIP peer " },
326 { MTYPE_RIP_OFFSET_LIST
, "RIP offset list " },
327 { MTYPE_RIP_DISTANCE
, "RIP distance " },
331 static struct memory_list memory_list_ripng
[] =
333 { MTYPE_RIPNG
, "RIPng structure " },
334 { MTYPE_RIPNG_ROUTE
, "RIPng route info" },
335 { MTYPE_RIPNG_AGGREGATE
, "RIPng aggregate " },
336 { MTYPE_RIPNG_PEER
, "RIPng peer " },
337 { MTYPE_RIPNG_OFFSET_LIST
, "RIPng offset lst" },
338 { MTYPE_RIPNG_RTE_DATA
, "RIPng rte data " },
342 static struct memory_list memory_list_ospf
[] =
344 { MTYPE_OSPF_TOP
, "OSPF top " },
345 { MTYPE_OSPF_AREA
, "OSPF area " },
346 { MTYPE_OSPF_AREA_RANGE
, "OSPF area range " },
347 { MTYPE_OSPF_NETWORK
, "OSPF network " },
349 { MTYPE_OSPF_NEIGHBOR_STATIC
,"OSPF static nbr " },
350 #endif /* NBMA_ENABLE */
351 { MTYPE_OSPF_IF
, "OSPF interface " },
352 { MTYPE_OSPF_NEIGHBOR
, "OSPF neighbor " },
353 { MTYPE_OSPF_ROUTE
, "OSPF route " },
354 { MTYPE_OSPF_TMP
, "OSPF tmp mem " },
355 { MTYPE_OSPF_LSA
, "OSPF LSA " },
356 { MTYPE_OSPF_LSA_DATA
, "OSPF LSA data " },
357 { MTYPE_OSPF_LSDB
, "OSPF LSDB " },
358 { MTYPE_OSPF_PACKET
, "OSPF packet " },
359 { MTYPE_OSPF_FIFO
, "OSPF FIFO queue " },
360 { MTYPE_OSPF_VERTEX
, "OSPF vertex " },
361 { MTYPE_OSPF_NEXTHOP
, "OSPF nexthop " },
362 { MTYPE_OSPF_PATH
, "OSPF path " },
363 { MTYPE_OSPF_VL_DATA
, "OSPF VL data " },
364 { MTYPE_OSPF_CRYPT_KEY
, "OSPF crypt key " },
365 { MTYPE_OSPF_EXTERNAL_INFO
, "OSPF ext. info " },
366 { MTYPE_OSPF_DISTANCE
, "OSPF distance " },
367 { MTYPE_OSPF_IF_INFO
, "OSPF if info " },
368 { MTYPE_OSPF_IF_PARAMS
, "OSPF if params " },
372 static struct memory_list memory_list_ospf6
[] =
374 { MTYPE_OSPF6_TOP
, "OSPF6 top " },
375 { MTYPE_OSPF6_AREA
, "OSPF6 area " },
376 { MTYPE_OSPF6_IF
, "OSPF6 interface " },
377 { MTYPE_OSPF6_NEIGHBOR
, "OSPF6 neighbor " },
378 { MTYPE_OSPF6_ROUTE
, "OSPF6 route " },
379 { MTYPE_OSPF6_PREFIX
, "OSPF6 prefix " },
380 { MTYPE_OSPF6_MESSAGE
, "OSPF6 message " },
381 { MTYPE_OSPF6_LSA
, "OSPF6 LSA " },
382 { MTYPE_OSPF6_LSA_SUMMARY
, "OSPF6 LSA summary " },
383 { MTYPE_OSPF6_LSDB
, "OSPF6 LSA database" },
384 { MTYPE_OSPF6_VERTEX
, "OSPF6 vertex " },
385 { MTYPE_OSPF6_SPFTREE
, "OSPF6 SPF tree " },
386 { MTYPE_OSPF6_NEXTHOP
, "OSPF6 nexthop " },
387 { MTYPE_OSPF6_EXTERNAL_INFO
,"OSPF6 ext. info " },
388 { MTYPE_OSPF6_OTHER
, "OSPF6 other " },
392 static struct memory_list memory_list_isis
[] =
394 { MTYPE_ISIS
, "ISIS " },
395 { MTYPE_ISIS_TMP
, "ISIS TMP " },
396 { MTYPE_ISIS_CIRCUIT
, "ISIS circuit " },
397 { MTYPE_ISIS_LSP
, "ISIS LSP " },
398 { MTYPE_ISIS_ADJACENCY
, "ISIS adjacency " },
399 { MTYPE_ISIS_AREA
, "ISIS area " },
400 { MTYPE_ISIS_AREA_ADDR
, "ISIS area address " },
401 { MTYPE_ISIS_TLV
, "ISIS TLV " },
402 { MTYPE_ISIS_DYNHN
, "ISIS dyn hostname " },
403 { MTYPE_ISIS_SPFTREE
, "ISIS SPFtree " },
404 { MTYPE_ISIS_VERTEX
, "ISIS vertex " },
405 { MTYPE_ISIS_ROUTE_INFO
, "ISIS route info " },
406 { MTYPE_ISIS_NEXTHOP
, "ISIS nexthop " },
407 { MTYPE_ISIS_NEXTHOP6
, "ISIS nexthop6 " },
411 static struct mlist
{
412 struct memory_list
*list
;
415 { memory_list_lib
, "LIB"},
416 { memory_list_rip
, "RIP"},
417 { memory_list_ripng
, "RIPNG"},
418 { memory_list_ospf
, "OSPF"},
419 { memory_list_ospf6
, "OSPF6"},
420 { memory_list_isis
, "ISIS"},
421 { memory_list_bgp
, "BGP"},
426 log_memstats(int pri
)
430 for (ml
= mlists
; ml
->list
; ml
++)
432 struct memory_list
*m
;
434 zlog (NULL
, pri
, "Memory utilization in module %s:", ml
->name
);
435 for (m
= ml
->list
; m
->index
>= 0; m
++)
436 if (m
->index
&& mstat
[m
->index
].alloc
)
437 zlog (NULL
, pri
, " %-22s: %5ld", m
->format
, mstat
[m
->index
].alloc
);
441 static struct memory_list memory_list_separator
[] =
448 show_memory_vty (struct vty
*vty
, struct memory_list
*list
)
450 struct memory_list
*m
;
452 for (m
= list
; m
->index
>= 0; m
++)
454 vty_out (vty
, "-----------------------------\r\n");
456 vty_out (vty
, "%-22s: %5ld\r\n", m
->format
, mstat
[m
->index
].alloc
);
459 DEFUN (show_memory_all
,
462 "Show running system information\n"
463 "Memory statistics\n"
464 "All memory statistics\n")
468 for (ml
= mlists
; ml
->list
; ml
++)
471 show_memory_vty (vty
, memory_list_separator
);
472 show_memory_vty (vty
, ml
->list
);
478 ALIAS (show_memory_all
,
481 "Show running system information\n"
482 "Memory statistics\n")
484 DEFUN (show_memory_lib
,
488 "Memory statistics\n"
491 show_memory_vty (vty
, memory_list_lib
);
495 DEFUN (show_memory_rip
,
499 "Memory statistics\n"
502 show_memory_vty (vty
, memory_list_rip
);
506 DEFUN (show_memory_ripng
,
507 show_memory_ripng_cmd
,
510 "Memory statistics\n"
513 show_memory_vty (vty
, memory_list_ripng
);
517 DEFUN (show_memory_bgp
,
521 "Memory statistics\n"
524 show_memory_vty (vty
, memory_list_bgp
);
528 DEFUN (show_memory_ospf
,
529 show_memory_ospf_cmd
,
532 "Memory statistics\n"
535 show_memory_vty (vty
, memory_list_ospf
);
539 DEFUN (show_memory_ospf6
,
540 show_memory_ospf6_cmd
,
543 "Memory statistics\n"
546 show_memory_vty (vty
, memory_list_ospf6
);
550 DEFUN (show_memory_isis
,
551 show_memory_isis_cmd
,
554 "Memory statistics\n"
557 show_memory_vty (vty
, memory_list_isis
);
564 install_element (VIEW_NODE
, &show_memory_cmd
);
565 install_element (VIEW_NODE
, &show_memory_all_cmd
);
566 install_element (VIEW_NODE
, &show_memory_lib_cmd
);
567 install_element (VIEW_NODE
, &show_memory_rip_cmd
);
568 install_element (VIEW_NODE
, &show_memory_ripng_cmd
);
569 install_element (VIEW_NODE
, &show_memory_bgp_cmd
);
570 install_element (VIEW_NODE
, &show_memory_ospf_cmd
);
571 install_element (VIEW_NODE
, &show_memory_ospf6_cmd
);
572 install_element (VIEW_NODE
, &show_memory_isis_cmd
);
574 install_element (ENABLE_NODE
, &show_memory_cmd
);
575 install_element (ENABLE_NODE
, &show_memory_all_cmd
);
576 install_element (ENABLE_NODE
, &show_memory_lib_cmd
);
577 install_element (ENABLE_NODE
, &show_memory_rip_cmd
);
578 install_element (ENABLE_NODE
, &show_memory_ripng_cmd
);
579 install_element (ENABLE_NODE
, &show_memory_bgp_cmd
);
580 install_element (ENABLE_NODE
, &show_memory_ospf_cmd
);
581 install_element (ENABLE_NODE
, &show_memory_ospf6_cmd
);
582 install_element (ENABLE_NODE
, &show_memory_isis_cmd
);