1/* Memory management routine
2   Copyright (C) 1998 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING.  If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA.  */
20
21#ifndef _ZEBRA_MEMORY_H
22#define _ZEBRA_MEMORY_H
23
24/* #define MEMORY_LOG */
25
26/* For tagging memory, below is the type of the memory. */
27enum
28{
29  MTYPE_TMP = 1,
30  MTYPE_STRVEC,
31  MTYPE_VECTOR,
32  MTYPE_VECTOR_INDEX,
33  MTYPE_LINK_LIST,
34  MTYPE_LINK_NODE,
35  MTYPE_THREAD,
36  MTYPE_THREAD_MASTER,
37  MTYPE_VTY,
38  MTYPE_VTY_HIST,
39  MTYPE_VTY_OUT_BUF,
40  MTYPE_IF,
41  MTYPE_CONNECTED,
42  MTYPE_AS_SEG,
43  MTYPE_AS_STR,
44  MTYPE_AS_PATH,
45  MTYPE_CLUSTER,
46  MTYPE_CLUSTER_VAL,
47  MTYPE_ATTR,
48  MTYPE_TRANSIT,
49  MTYPE_TRANSIT_VAL,
50  MTYPE_BUFFER,
51  MTYPE_BUFFER_DATA,
52  MTYPE_STREAM,
53  MTYPE_STREAM_DATA,
54  MTYPE_STREAM_FIFO,
55  MTYPE_PREFIX,
56  MTYPE_PREFIX_IPV4,
57  MTYPE_PREFIX_IPV6,
58  MTYPE_HASH,
59  MTYPE_HASH_INDEX,
60  MTYPE_HASH_BACKET,
61  MTYPE_RIPNG_ROUTE,
62  MTYPE_RIPNG_AGGREGATE,
63  MTYPE_ROUTE_TABLE,
64  MTYPE_ROUTE_NODE,
65  MTYPE_ACCESS_LIST,
66  MTYPE_ACCESS_LIST_STR,
67  MTYPE_ACCESS_FILTER,
68  MTYPE_PREFIX_LIST,
69  MTYPE_PREFIX_LIST_STR,
70  MTYPE_PREFIX_LIST_ENTRY,
71  MTYPE_ROUTE_MAP,
72  MTYPE_ROUTE_MAP_NAME,
73  MTYPE_ROUTE_MAP_INDEX,
74  MTYPE_ROUTE_MAP_RULE,
75  MTYPE_ROUTE_MAP_RULE_STR,
76  MTYPE_ROUTE_MAP_COMPILED,
77
78  MTYPE_RIB,
79  MTYPE_DISTRIBUTE,
80  MTYPE_ZLOG,
81  MTYPE_ZCLIENT,
82  MTYPE_NEXTHOP,
83  MTYPE_RTADV_PREFIX,
84  MTYPE_IF_RMAP,
85  MTYPE_SOCKUNION,
86  MTYPE_STATIC_IPV4,
87  MTYPE_STATIC_IPV6,
88
89  MTYPE_DESC,
90  MTYPE_OSPF_TOP,
91  MTYPE_OSPF_AREA,
92  MTYPE_OSPF_AREA_RANGE,
93  MTYPE_OSPF_NETWORK,
94  MTYPE_OSPF_NEIGHBOR_STATIC,
95  MTYPE_OSPF_IF,
96  MTYPE_OSPF_NEIGHBOR,
97  MTYPE_OSPF_ROUTE,
98  MTYPE_OSPF_TMP,
99  MTYPE_OSPF_LSA,
100  MTYPE_OSPF_LSA_DATA,
101  MTYPE_OSPF_LSDB,
102  MTYPE_OSPF_PACKET,
103  MTYPE_OSPF_FIFO,
104  MTYPE_OSPF_VERTEX,
105  MTYPE_OSPF_NEXTHOP,
106  MTYPE_OSPF_PATH,
107  MTYPE_OSPF_VL_DATA,
108  MTYPE_OSPF_CRYPT_KEY,
109  MTYPE_OSPF_EXTERNAL_INFO,
110  MTYPE_OSPF_MESSAGE,
111  MTYPE_OSPF_DISTANCE,
112  MTYPE_OSPF_IF_INFO,
113  MTYPE_OSPF_IF_PARAMS,
114
115  MTYPE_OSPF6_TOP,
116  MTYPE_OSPF6_AREA,
117  MTYPE_OSPF6_IF,
118  MTYPE_OSPF6_NEIGHBOR,
119  MTYPE_OSPF6_ROUTE,
120  MTYPE_OSPF6_PREFIX,
121  MTYPE_OSPF6_MESSAGE,
122  MTYPE_OSPF6_LSA,
123  MTYPE_OSPF6_LSA_SUMMARY,
124  MTYPE_OSPF6_LSDB,
125  MTYPE_OSPF6_VERTEX,
126  MTYPE_OSPF6_SPFTREE,
127  MTYPE_OSPF6_NEXTHOP,
128  MTYPE_OSPF6_EXTERNAL_INFO,
129  MTYPE_OSPF6_OTHER,
130
131  MTYPE_BGP,
132  MTYPE_BGP_PEER,
133  MTYPE_PEER_GROUP,
134  MTYPE_PEER_DESC,
135  MTYPE_PEER_UPDATE_SOURCE,
136  MTYPE_BGP_STATIC,
137  MTYPE_BGP_AGGREGATE,
138  MTYPE_BGP_CONFED_LIST,
139  MTYPE_BGP_NEXTHOP_CACHE,
140  MTYPE_BGP_DAMP_INFO,
141  MTYPE_BGP_DAMP_ARRAY,
142  MTYPE_BGP_ANNOUNCE,
143  MTYPE_BGP_ATTR_QUEUE,
144  MTYPE_BGP_ROUTE_QUEUE,
145  MTYPE_BGP_DISTANCE,
146  MTYPE_BGP_ROUTE,
147  MTYPE_BGP_TABLE,
148  MTYPE_BGP_NODE,
149  MTYPE_BGP_ADVERTISE_ATTR,
150  MTYPE_BGP_ADVERTISE,
151  MTYPE_BGP_ADJ_IN,
152  MTYPE_BGP_ADJ_OUT,
153  MTYPE_BGP_REGEXP,
154  MTYPE_AS_FILTER,
155  MTYPE_AS_FILTER_STR,
156  MTYPE_AS_LIST,
157
158  MTYPE_COMMUNITY,
159  MTYPE_COMMUNITY_VAL,
160  MTYPE_COMMUNITY_STR,
161
162  MTYPE_ECOMMUNITY,
163  MTYPE_ECOMMUNITY_VAL,
164  MTYPE_ECOMMUNITY_STR,
165
166  /* community-list and extcommunity-list.  */
167  MTYPE_COMMUNITY_LIST_HANDLER,
168  MTYPE_COMMUNITY_LIST,
169  MTYPE_COMMUNITY_LIST_NAME,
170  MTYPE_COMMUNITY_LIST_ENTRY,
171  MTYPE_COMMUNITY_LIST_CONFIG,
172
173  MTYPE_RIP,
174  MTYPE_RIP_INTERFACE,
175  MTYPE_RIP_DISTANCE,
176  MTYPE_RIP_OFFSET_LIST,
177  MTYPE_RIP_INFO,
178  MTYPE_RIP_PEER,
179  MTYPE_KEYCHAIN,
180  MTYPE_KEY,
181
182  MTYPE_VTYSH_CONFIG,
183  MTYPE_VTYSH_CONFIG_LINE,
184
185  MTYPE_MAX
186};
187
188#ifdef MEMORY_LOG
189#define XMALLOC(mtype, size) \
190  mtype_zmalloc (__FILE__, __LINE__, (mtype), (size))
191#define XCALLOC(mtype, size) \
192  mtype_zcalloc (__FILE__, __LINE__, (mtype), (size))
193#define XREALLOC(mtype, ptr, size)  \
194  mtype_zrealloc (__FILE__, __LINE__, (mtype), (ptr), (size))
195#define XFREE(mtype, ptr) \
196  mtype_zfree (__FILE__, __LINE__, (mtype), (ptr))
197#define XSTRDUP(mtype, str) \
198  mtype_zstrdup (__FILE__, __LINE__, (mtype), (str))
199#else
200#define XMALLOC(mtype, size)       zmalloc ((mtype), (size))
201#define XCALLOC(mtype, size)       zcalloc ((mtype), (size))
202#define XREALLOC(mtype, ptr, size) zrealloc ((mtype), (ptr), (size))
203#define XFREE(mtype, ptr)          zfree ((mtype), (ptr))
204#define XSTRDUP(mtype, str)        zstrdup ((mtype), (str))
205#endif /* MEMORY_LOG */
206
207/* Prototypes of memory function. */
208void *zmalloc (int type, size_t size);
209void *zcalloc (int type, size_t size);
210void *zrealloc (int type, void *ptr, size_t size);
211void  zfree (int type, void *ptr);
212char *zstrdup (int type, char *str);
213
214void *mtype_zmalloc (const char *file,
215		     int line,
216		     int type,
217		     size_t size);
218
219void *mtype_zcalloc (const char *file,
220		     int line,
221		     int type,
222		     size_t num,
223		     size_t size);
224
225void *mtype_zrealloc (const char *file,
226		     int line,
227		     int type,
228		     void *ptr,
229		     size_t size);
230
231void mtype_zfree (const char *file,
232		  int line,
233		  int type,
234		  void *ptr);
235
236char *mtype_zstrdup (const char *file,
237		     int line,
238		     int type,
239		     char *str);
240void memory_init ();
241
242#endif /* _ZEBRA_MEMORY_H */
243