1 /* rrl.h - Response Rate Limiting for NSD.
2  * By W.C.A. Wijngaards
3  * Copyright 2012, NLnet Labs.
4  * BSD, see LICENSE.
5  */
6 #ifndef RRL_H
7 #define RRL_H
8 #include "query.h"
9 
10 /** the classification types for the rrl */
11 enum rrl_type {
12 	/* classification types */
13 	rrl_type_nxdomain	= 0x01,
14 	rrl_type_error		= 0x02,
15 	rrl_type_referral	= 0x04,
16 	rrl_type_any		= 0x08,
17 	rrl_type_wildcard	= 0x10,
18 	rrl_type_nodata		= 0x20,
19 	rrl_type_dnskey		= 0x40,
20 	rrl_type_positive	= 0x80,
21 	rrl_type_rrsig		= 0x100,
22 
23 	/* all classification types */
24 	rrl_type_all		= 0x1ff,
25 	/* to distinguish between ip4 and ip6 netblocks, used in code */
26 	rrl_ip6			= 0x8000
27 };
28 
29 /** Number of buckets */
30 #define RRL_BUCKETS 1000000
31 /** default rrl limit, in 2x qps , the default is 200 qps */
32 #define RRL_LIMIT 400
33 /** default slip */
34 #define RRL_SLIP 2
35 /** default prefix lengths */
36 #define RRL_IPV4_PREFIX_LENGTH 24
37 #define RRL_IPV6_PREFIX_LENGTH 64
38 /** default whitelist rrl limit, in 2x qps, default is thus 2000 qps */
39 #define RRL_WLIST_LIMIT 4000
40 
41 /**
42  * Initialize for n children (optional, otherwise no mmaps used)
43  * ratelimits lm and wlm are in qps (this routines x2s them for internal use).
44  * plf and pls are in prefix lengths.
45  */
46 void rrl_mmap_init(int numch, size_t numbuck, size_t lm, size_t wlm, size_t sm,
47 	size_t plf, size_t pls);
48 
49 /**
50  * Initialize rate limiting (for this child server process)
51  */
52 void rrl_init(size_t ch);
53 
54 /** deinit (for this child server processs) */
55 void rrl_deinit(size_t ch);
56 
57 /** deinit mmaps for n children */
58 void rrl_mmap_deinit(void);
59 /** frees memory but keeps mmap in place (for other processes) */
60 void rrl_mmap_deinit_keep_mmap(void);
61 
62 /**
63  * Process query that happens, the query structure contains the
64  * information about the query and the answer.
65  * returns true if the query is ratelimited.
66  */
67 int rrl_process_query(query_type* query);
68 
69 /**
70  * Deny the query, with slip.
71  * Returns DISCARD or PROCESSED(with TC flag).
72  */
73 query_state_type rrl_slip(query_type* query);
74 
75 /** convert classification type to string */
76 const char* rrltype2str(enum rrl_type c);
77 /** convert string to classification type */
78 enum rrl_type rrlstr2type(const char* s);
79 
80 /** for unit test, update rrl bucket; return rate */
81 uint32_t rrl_update(query_type* query, uint32_t hash, uint64_t source,
82 	uint16_t flags, int32_t now, uint32_t lm);
83 /** set the rate limit counters, pass variables in qps */
84 void rrl_set_limit(size_t lm, size_t wlm, size_t sm);
85 
86 #endif /* RRL_H */
87