1/*
2 * Copyright (C) 2004-2009, 2012  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2000, 2001  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* $Id$ */
19
20#ifndef DNS_STATS_H
21#define DNS_STATS_H 1
22
23/*! \file dns/stats.h */
24
25#include <dns/types.h>
26
27/*%
28 * Statistics counters.  Used as isc_statscounter_t values.
29 */
30enum {
31	/*%
32	 * Resolver statistics counters.
33	 */
34	dns_resstatscounter_queryv4 = 0,
35	dns_resstatscounter_queryv6 = 1,
36	dns_resstatscounter_responsev4 = 2,
37	dns_resstatscounter_responsev6 = 3,
38	dns_resstatscounter_nxdomain = 4,
39	dns_resstatscounter_servfail = 5,
40	dns_resstatscounter_formerr = 6,
41	dns_resstatscounter_othererror = 7,
42	dns_resstatscounter_edns0fail = 8,
43	dns_resstatscounter_mismatch = 9,
44	dns_resstatscounter_truncated = 10,
45	dns_resstatscounter_lame = 11,
46	dns_resstatscounter_retry = 12,
47	dns_resstatscounter_gluefetchv4 = 13,
48	dns_resstatscounter_gluefetchv6 = 14,
49	dns_resstatscounter_gluefetchv4fail = 15,
50	dns_resstatscounter_gluefetchv6fail = 16,
51	dns_resstatscounter_val = 17,
52	dns_resstatscounter_valsuccess = 18,
53	dns_resstatscounter_valnegsuccess = 19,
54	dns_resstatscounter_valfail = 20,
55	dns_resstatscounter_dispabort = 21,
56	dns_resstatscounter_dispsockfail = 22,
57	dns_resstatscounter_querytimeout = 23,
58	dns_resstatscounter_queryrtt0 = 24,
59	dns_resstatscounter_queryrtt1 = 25,
60	dns_resstatscounter_queryrtt2 = 26,
61	dns_resstatscounter_queryrtt3 = 27,
62	dns_resstatscounter_queryrtt4 = 28,
63	dns_resstatscounter_queryrtt5 = 29,
64
65	dns_resstatscounter_max = 30,
66
67	/*
68	 * DNSSEC stats.
69	 */
70	dns_dnssecstats_asis = 0,
71	dns_dnssecstats_downcase = 1,
72	dns_dnssecstats_wildcard = 2,
73	dns_dnssecstats_fail = 3,
74
75	dns_dnssecstats_max = 4,
76
77	/*%
78	 * Zone statistics counters.
79	 */
80	dns_zonestatscounter_notifyoutv4 = 0,
81	dns_zonestatscounter_notifyoutv6 = 1,
82	dns_zonestatscounter_notifyinv4 = 2,
83	dns_zonestatscounter_notifyinv6 = 3,
84	dns_zonestatscounter_notifyrej = 4,
85	dns_zonestatscounter_soaoutv4 = 5,
86	dns_zonestatscounter_soaoutv6 = 6,
87	dns_zonestatscounter_axfrreqv4 = 7,
88	dns_zonestatscounter_axfrreqv6 = 8,
89	dns_zonestatscounter_ixfrreqv4 = 9,
90	dns_zonestatscounter_ixfrreqv6 = 10,
91	dns_zonestatscounter_xfrsuccess = 11,
92	dns_zonestatscounter_xfrfail = 12,
93
94	dns_zonestatscounter_max = 13,
95
96	/*%
97	* Query statistics counters (obsolete).
98	*/
99	dns_statscounter_success = 0,    /*%< Successful lookup */
100	dns_statscounter_referral = 1,   /*%< Referral result */
101	dns_statscounter_nxrrset = 2,    /*%< NXRRSET result */
102	dns_statscounter_nxdomain = 3,   /*%< NXDOMAIN result */
103	dns_statscounter_recursion = 4,  /*%< Recursion was used */
104	dns_statscounter_failure = 5,    /*%< Some other failure */
105	dns_statscounter_duplicate = 6,  /*%< Duplicate query */
106	dns_statscounter_dropped = 7	 /*%< Duplicate query (dropped) */
107};
108
109#define DNS_STATS_NCOUNTERS 8
110
111#if 0
112/*%<
113 * Flag(s) for dns_xxxstats_dump().  DNS_STATSDUMP_VERBOSE is obsolete.
114 * ISC_STATSDUMP_VERBOSE should be used instead.  These two values are
115 * intentionally defined to be the same value to ensure binary compatibility.
116 */
117#define DNS_STATSDUMP_VERBOSE	0x00000001 /*%< dump 0-value counters */
118#endif
119
120/*%<
121 * (Obsoleted)
122 */
123LIBDNS_EXTERNAL_DATA extern const char *dns_statscounter_names[];
124
125/*%
126 * Attributes for statistics counters of RRset and Rdatatype types.
127 *
128 * _OTHERTYPE
129 *	The rdata type is not explicitly supported and the corresponding counter
130 *	is counted for other such types, too.  When this attribute is set,
131 *	the base type is of no use.
132 *
133 * _NXRRSET
134 * 	RRset type counters only.  Indicates the RRset is non existent.
135 *
136 * _NXDOMAIN
137 *	RRset type counters only.  Indicates a non existent name.  When this
138 *	attribute is set, the base type is of no use.
139 */
140#define DNS_RDATASTATSTYPE_ATTR_OTHERTYPE	0x0001
141#define DNS_RDATASTATSTYPE_ATTR_NXRRSET		0x0002
142#define DNS_RDATASTATSTYPE_ATTR_NXDOMAIN	0x0004
143
144/*%<
145 * Conversion macros among dns_rdatatype_t, attributes and isc_statscounter_t.
146 */
147#define DNS_RDATASTATSTYPE_BASE(type)	((dns_rdatatype_t)((type) & 0xFFFF))
148#define DNS_RDATASTATSTYPE_ATTR(type)	((type) >> 16)
149#define DNS_RDATASTATSTYPE_VALUE(b, a)	(((a) << 16) | (b))
150
151/*%<
152 * Types of dump callbacks.
153 */
154typedef void (*dns_generalstats_dumper_t)(isc_statscounter_t, isc_uint64_t,
155					  void *);
156typedef void (*dns_rdatatypestats_dumper_t)(dns_rdatastatstype_t, isc_uint64_t,
157					    void *);
158typedef void (*dns_opcodestats_dumper_t)(dns_opcode_t, isc_uint64_t, void *);
159
160ISC_LANG_BEGINDECLS
161
162isc_result_t
163dns_generalstats_create(isc_mem_t *mctx, dns_stats_t **statsp, int ncounters);
164/*%<
165 * Create a statistics counter structure of general type.  It counts a general
166 * set of counters indexed by an ID between 0 and ncounters -1.
167 * This function is obsolete.  A more general function, isc_stats_create(),
168 * should be used.
169 *
170 * Requires:
171 *\li	'mctx' must be a valid memory context.
172 *
173 *\li	'statsp' != NULL && '*statsp' == NULL.
174 *
175 * Returns:
176 *\li	ISC_R_SUCCESS	-- all ok
177 *
178 *\li	anything else	-- failure
179 */
180
181isc_result_t
182dns_rdatatypestats_create(isc_mem_t *mctx, dns_stats_t **statsp);
183/*%<
184 * Create a statistics counter structure per rdatatype.
185 *
186 * Requires:
187 *\li	'mctx' must be a valid memory context.
188 *
189 *\li	'statsp' != NULL && '*statsp' == NULL.
190 *
191 * Returns:
192 *\li	ISC_R_SUCCESS	-- all ok
193 *
194 *\li	anything else	-- failure
195 */
196
197isc_result_t
198dns_rdatasetstats_create(isc_mem_t *mctx, dns_stats_t **statsp);
199/*%<
200 * Create a statistics counter structure per RRset.
201 *
202 * Requires:
203 *\li	'mctx' must be a valid memory context.
204 *
205 *\li	'statsp' != NULL && '*statsp' == NULL.
206 *
207 * Returns:
208 *\li	ISC_R_SUCCESS	-- all ok
209 *
210 *\li	anything else	-- failure
211 */
212
213isc_result_t
214dns_opcodestats_create(isc_mem_t *mctx, dns_stats_t **statsp);
215/*%<
216 * Create a statistics counter structure per opcode.
217 *
218 * Requires:
219 *\li	'mctx' must be a valid memory context.
220 *
221 *\li	'statsp' != NULL && '*statsp' == NULL.
222 *
223 * Returns:
224 *\li	ISC_R_SUCCESS	-- all ok
225 *
226 *\li	anything else	-- failure
227 */
228
229void
230dns_stats_attach(dns_stats_t *stats, dns_stats_t **statsp);
231/*%<
232 * Attach to a statistics set.
233 *
234 * Requires:
235 *\li	'stats' is a valid dns_stats_t.
236 *
237 *\li	'statsp' != NULL && '*statsp' == NULL
238 */
239
240void
241dns_stats_detach(dns_stats_t **statsp);
242/*%<
243 * Detaches from the statistics set.
244 *
245 * Requires:
246 *\li	'statsp' != NULL and '*statsp' is a valid dns_stats_t.
247 */
248
249void
250dns_generalstats_increment(dns_stats_t *stats, isc_statscounter_t counter);
251/*%<
252 * Increment the counter-th counter of stats.  This function is obsolete.
253 * A more general function, isc_stats_increment(), should be used.
254 *
255 * Requires:
256 *\li	'stats' is a valid dns_stats_t created by dns_generalstats_create().
257 *
258 *\li	counter is less than the maximum available ID for the stats specified
259 *	on creation.
260 */
261
262void
263dns_rdatatypestats_increment(dns_stats_t *stats, dns_rdatatype_t type);
264/*%<
265 * Increment the statistics counter for 'type'.
266 *
267 * Requires:
268 *\li	'stats' is a valid dns_stats_t created by dns_rdatatypestats_create().
269 */
270
271void
272dns_rdatasetstats_increment(dns_stats_t *stats, dns_rdatastatstype_t rrsettype);
273/*%<
274 * Increment the statistics counter for 'rrsettype'.
275 *
276 * Requires:
277 *\li	'stats' is a valid dns_stats_t created by dns_rdatasetstats_create().
278 */
279
280void
281dns_rdatasetstats_decrement(dns_stats_t *stats, dns_rdatastatstype_t rrsettype);
282/*%<
283 * Decrement the statistics counter for 'rrsettype'.
284 *
285 * Requires:
286 *\li	'stats' is a valid dns_stats_t created by dns_rdatasetstats_create().
287 */
288
289void
290dns_opcodestats_increment(dns_stats_t *stats, dns_opcode_t code);
291/*%<
292 * Increment the statistics counter for 'code'.
293 *
294 * Requires:
295 *\li	'stats' is a valid dns_stats_t created by dns_opcodestats_create().
296 */
297
298void
299dns_generalstats_dump(dns_stats_t *stats, dns_generalstats_dumper_t dump_fn,
300		      void *arg, unsigned int options);
301/*%<
302 * Dump the current statistics counters in a specified way.  For each counter
303 * in stats, dump_fn is called with its current value and the given argument
304 * arg.  By default counters that have a value of 0 is skipped; if options has
305 * the ISC_STATSDUMP_VERBOSE flag, even such counters are dumped.
306 *
307 * This function is obsolete.  A more general function, isc_stats_dump(),
308 * should be used.
309 *
310 * Requires:
311 *\li	'stats' is a valid dns_stats_t created by dns_generalstats_create().
312 */
313
314void
315dns_rdatatypestats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn,
316			void *arg, unsigned int options);
317/*%<
318 * Dump the current statistics counters in a specified way.  For each counter
319 * in stats, dump_fn is called with the corresponding type in the form of
320 * dns_rdatastatstype_t, the current counter value and the given argument
321 * arg.  By default counters that have a value of 0 is skipped; if options has
322 * the ISC_STATSDUMP_VERBOSE flag, even such counters are dumped.
323 *
324 * Requires:
325 *\li	'stats' is a valid dns_stats_t created by dns_generalstats_create().
326 */
327
328void
329dns_rdatasetstats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn,
330		       void *arg, unsigned int options);
331/*%<
332 * Dump the current statistics counters in a specified way.  For each counter
333 * in stats, dump_fn is called with the corresponding type in the form of
334 * dns_rdatastatstype_t, the current counter value and the given argument
335 * arg.  By default counters that have a value of 0 is skipped; if options has
336 * the ISC_STATSDUMP_VERBOSE flag, even such counters are dumped.
337 *
338 * Requires:
339 *\li	'stats' is a valid dns_stats_t created by dns_generalstats_create().
340 */
341
342void
343dns_opcodestats_dump(dns_stats_t *stats, dns_opcodestats_dumper_t dump_fn,
344		     void *arg, unsigned int options);
345/*%<
346 * Dump the current statistics counters in a specified way.  For each counter
347 * in stats, dump_fn is called with the corresponding opcode, the current
348 * counter value and the given argument arg.  By default counters that have a
349 * value of 0 is skipped; if options has the ISC_STATSDUMP_VERBOSE flag, even
350 * such counters are dumped.
351 *
352 * Requires:
353 *\li	'stats' is a valid dns_stats_t created by dns_generalstats_create().
354 */
355
356isc_result_t
357dns_stats_alloccounters(isc_mem_t *mctx, isc_uint64_t **ctrp);
358/*%<
359 * Allocate an array of query statistics counters from the memory
360 * context 'mctx'.
361 *
362 * This function is obsoleted.  Use dns_xxxstats_create() instead.
363 */
364
365void
366dns_stats_freecounters(isc_mem_t *mctx, isc_uint64_t **ctrp);
367/*%<
368 * Free an array of query statistics counters allocated from the memory
369 * context 'mctx'.
370 *
371 * This function is obsoleted.  Use dns_stats_destroy() instead.
372 */
373
374ISC_LANG_ENDDECLS
375
376#endif /* DNS_STATS_H */
377