xref: /freebsd/contrib/unbound/iterator/iter_delegpt.h (revision 8f76bb7dad48538c6832c2fb466a433d2a3f8cd5)
1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * iterator/iter_delegpt.h - delegation point with NS and address information.
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * This file implements the Delegation Point. It contains a list of name servers
40b7579f77SDag-Erling Smørgrav  * and their addresses if known.
41b7579f77SDag-Erling Smørgrav  */
42b7579f77SDag-Erling Smørgrav 
43b7579f77SDag-Erling Smørgrav #ifndef ITERATOR_ITER_DELEGPT_H
44b7579f77SDag-Erling Smørgrav #define ITERATOR_ITER_DELEGPT_H
45b7579f77SDag-Erling Smørgrav #include "util/log.h"
46b7579f77SDag-Erling Smørgrav struct regional;
47b7579f77SDag-Erling Smørgrav struct delegpt_ns;
48b7579f77SDag-Erling Smørgrav struct delegpt_addr;
49b7579f77SDag-Erling Smørgrav struct dns_msg;
50b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key;
51b7579f77SDag-Erling Smørgrav struct msgreply_entry;
52b7579f77SDag-Erling Smørgrav 
53b7579f77SDag-Erling Smørgrav /**
54b7579f77SDag-Erling Smørgrav  * Delegation Point.
55b7579f77SDag-Erling Smørgrav  * For a domain name, the NS rrset, and the A and AAAA records for those.
56b7579f77SDag-Erling Smørgrav  */
57b7579f77SDag-Erling Smørgrav struct delegpt {
58b7579f77SDag-Erling Smørgrav 	/** the domain name of the delegation point. */
59b7579f77SDag-Erling Smørgrav 	uint8_t* name;
60b7579f77SDag-Erling Smørgrav 	/** length of the delegation point name */
61b7579f77SDag-Erling Smørgrav 	size_t namelen;
62b7579f77SDag-Erling Smørgrav 	/** number of labels in delegation point */
63b7579f77SDag-Erling Smørgrav 	int namelabs;
64b7579f77SDag-Erling Smørgrav 
65b7579f77SDag-Erling Smørgrav 	/** the nameservers, names from the NS RRset rdata. */
66b7579f77SDag-Erling Smørgrav 	struct delegpt_ns* nslist;
67b7579f77SDag-Erling Smørgrav 	/** the target addresses for delegation */
68b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* target_list;
69b7579f77SDag-Erling Smørgrav 	/** the list of usable targets; subset of target_list
70b7579f77SDag-Erling Smørgrav 	 * the items in this list are not part of the result list.  */
71b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* usable_list;
72b7579f77SDag-Erling Smørgrav 	/** the list of returned targets; subset of target_list */
73b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* result_list;
74b7579f77SDag-Erling Smørgrav 
75b7579f77SDag-Erling Smørgrav 	/** if true, the NS RRset was bogus. All info is bad. */
76b7579f77SDag-Erling Smørgrav 	int bogus;
77b7579f77SDag-Erling Smørgrav 	/** if true, the parent-side NS record has been applied:
78b7579f77SDag-Erling Smørgrav 	 * its names have been added and their addresses can follow later.
79b7579f77SDag-Erling Smørgrav 	 * Also true if the delegationpoint was created from a delegation
80b7579f77SDag-Erling Smørgrav 	 * message and thus contains the parent-side-info already. */
81b7579f77SDag-Erling Smørgrav 	uint8_t has_parent_side_NS;
82b7579f77SDag-Erling Smørgrav 	/** for assertions on type of delegpt */
83b7579f77SDag-Erling Smørgrav 	uint8_t dp_type_mlc;
84bc892140SDag-Erling Smørgrav 	/** use SSL for upstream query */
85bc892140SDag-Erling Smørgrav 	uint8_t ssl_upstream;
8624e36522SCy Schubert 	/** use TCP for upstream query */
8724e36522SCy Schubert 	uint8_t tcp_upstream;
8857bddd21SDag-Erling Smørgrav 	/** delegpt from authoritative zone that is locally hosted */
8957bddd21SDag-Erling Smørgrav 	uint8_t auth_dp;
904c75e3aaSDag-Erling Smørgrav 	/*** no cache */
914c75e3aaSDag-Erling Smørgrav 	int no_cache;
92b7579f77SDag-Erling Smørgrav };
93b7579f77SDag-Erling Smørgrav 
94b7579f77SDag-Erling Smørgrav /**
95b7579f77SDag-Erling Smørgrav  * Nameservers for a delegation point.
96b7579f77SDag-Erling Smørgrav  */
97b7579f77SDag-Erling Smørgrav struct delegpt_ns {
98b7579f77SDag-Erling Smørgrav 	/** next in list */
99b7579f77SDag-Erling Smørgrav 	struct delegpt_ns* next;
100b7579f77SDag-Erling Smørgrav 	/** name of nameserver */
101b7579f77SDag-Erling Smørgrav 	uint8_t* name;
102b7579f77SDag-Erling Smørgrav 	/** length of name */
103b7579f77SDag-Erling Smørgrav 	size_t namelen;
1044f5c8956SCy Schubert 	/** number of cache lookups for the name */
1054f5c8956SCy Schubert 	int cache_lookup_count;
106b7579f77SDag-Erling Smørgrav 	/**
107b7579f77SDag-Erling Smørgrav 	 * If the name has been resolved. false if not queried for yet.
108b7579f77SDag-Erling Smørgrav 	 * true if the A, AAAA queries have been generated.
109b7579f77SDag-Erling Smørgrav 	 * marked true if those queries fail.
110b7579f77SDag-Erling Smørgrav 	 * and marked true if got4 and got6 are both true.
111b7579f77SDag-Erling Smørgrav 	 */
112b7579f77SDag-Erling Smørgrav 	int resolved;
113091e9e46SCy Schubert 	/** if the ipv4 address is in the delegpt, 0=not, 1=yes 2=negative,
114091e9e46SCy Schubert 	 * negative means it was done, but no content. */
115b7579f77SDag-Erling Smørgrav 	uint8_t got4;
116091e9e46SCy Schubert 	/** if the ipv6 address is in the delegpt, 0=not, 1=yes 2=negative */
117b7579f77SDag-Erling Smørgrav 	uint8_t got6;
118b7579f77SDag-Erling Smørgrav 	/**
119b7579f77SDag-Erling Smørgrav 	 * If the name is parent-side only and thus dispreferred.
120b7579f77SDag-Erling Smørgrav 	 * Its addresses become dispreferred as well
121b7579f77SDag-Erling Smørgrav 	 */
122b7579f77SDag-Erling Smørgrav 	uint8_t lame;
123b7579f77SDag-Erling Smørgrav 	/** if the parent-side ipv4 address has been looked up (last resort).
124b7579f77SDag-Erling Smørgrav 	 * Also enabled if a parent-side cache entry exists, or a parent-side
125b7579f77SDag-Erling Smørgrav 	 * negative-cache entry exists. */
126b7579f77SDag-Erling Smørgrav 	uint8_t done_pside4;
127b7579f77SDag-Erling Smørgrav 	/** if the parent-side ipv6 address has been looked up (last resort).
128b7579f77SDag-Erling Smørgrav 	 * Also enabled if a parent-side cache entry exists, or a parent-side
129b7579f77SDag-Erling Smørgrav 	 * negative-cache entry exists. */
130b7579f77SDag-Erling Smørgrav 	uint8_t done_pside6;
1319cf5bc93SCy Schubert 	/** the TLS authentication name, (if not NULL) to use. */
1329cf5bc93SCy Schubert 	char* tls_auth_name;
133a39a5a69SCy Schubert 	/** the port to use; it should mostly be the default 53 but configured
1349cf5bc93SCy Schubert 	 *  upstreams can provide nondefault ports. */
1359cf5bc93SCy Schubert 	int port;
136b7579f77SDag-Erling Smørgrav };
137b7579f77SDag-Erling Smørgrav 
138b7579f77SDag-Erling Smørgrav /**
139b7579f77SDag-Erling Smørgrav  * Address of target nameserver in delegation point.
140b7579f77SDag-Erling Smørgrav  */
141b7579f77SDag-Erling Smørgrav struct delegpt_addr {
142b7579f77SDag-Erling Smørgrav 	/** next delegation point in results */
143b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* next_result;
144b7579f77SDag-Erling Smørgrav 	/** next delegation point in usable list */
145b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* next_usable;
146b7579f77SDag-Erling Smørgrav 	/** next delegation point in all targets list */
147b7579f77SDag-Erling Smørgrav 	struct delegpt_addr* next_target;
148b7579f77SDag-Erling Smørgrav 
149b7579f77SDag-Erling Smørgrav 	/** delegation point address */
150b7579f77SDag-Erling Smørgrav 	struct sockaddr_storage addr;
151b7579f77SDag-Erling Smørgrav 	/** length of addr */
152b7579f77SDag-Erling Smørgrav 	socklen_t addrlen;
153b7579f77SDag-Erling Smørgrav 	/** number of attempts for this addr */
154b7579f77SDag-Erling Smørgrav 	int attempts;
155b7579f77SDag-Erling Smørgrav 	/** rtt stored here in the selection algorithm */
156b7579f77SDag-Erling Smørgrav 	int sel_rtt;
157b7579f77SDag-Erling Smørgrav 	/** if true, the A or AAAA RR was bogus, so this address is bad.
158b7579f77SDag-Erling Smørgrav 	 * Also check the dp->bogus to see if everything is bogus. */
15917d15b25SDag-Erling Smørgrav 	uint8_t bogus;
160b7579f77SDag-Erling Smørgrav 	/** if true, this address is dispreferred: it is a lame IP address */
16117d15b25SDag-Erling Smørgrav 	uint8_t lame;
16217d15b25SDag-Erling Smørgrav 	/** if the address is dnsseclame, but this cannot be cached, this
16317d15b25SDag-Erling Smørgrav 	 * option is useful to mark the address dnsseclame.
16417d15b25SDag-Erling Smørgrav 	 * This value is not copied in addr-copy and dp-copy. */
16517d15b25SDag-Erling Smørgrav 	uint8_t dnsseclame;
1660fb34990SDag-Erling Smørgrav 	/** the TLS authentication name, (if not NULL) to use. */
1670fb34990SDag-Erling Smørgrav 	char* tls_auth_name;
168b7579f77SDag-Erling Smørgrav };
169b7579f77SDag-Erling Smørgrav 
170b7579f77SDag-Erling Smørgrav /**
171b7579f77SDag-Erling Smørgrav  * Create new delegation point.
172b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate it.
173b7579f77SDag-Erling Smørgrav  * @return new delegation point or NULL on error.
174b7579f77SDag-Erling Smørgrav  */
175b7579f77SDag-Erling Smørgrav struct delegpt* delegpt_create(struct regional* regional);
176b7579f77SDag-Erling Smørgrav 
177b7579f77SDag-Erling Smørgrav /**
178b7579f77SDag-Erling Smørgrav  * Create a copy of a delegation point.
179b7579f77SDag-Erling Smørgrav  * @param dp: delegation point to copy.
180b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate it.
181b7579f77SDag-Erling Smørgrav  * @return new delegation point or NULL on error.
182b7579f77SDag-Erling Smørgrav  */
183b7579f77SDag-Erling Smørgrav struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* regional);
184b7579f77SDag-Erling Smørgrav 
185b7579f77SDag-Erling Smørgrav /**
186b7579f77SDag-Erling Smørgrav  * Set name of delegation point.
187b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
188b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the name copy.
189b7579f77SDag-Erling Smørgrav  * @param name: name to use.
190b7579f77SDag-Erling Smørgrav  * @return false on error.
191b7579f77SDag-Erling Smørgrav  */
192b7579f77SDag-Erling Smørgrav int delegpt_set_name(struct delegpt* dp, struct regional* regional,
193b7579f77SDag-Erling Smørgrav 	uint8_t* name);
194b7579f77SDag-Erling Smørgrav 
195b7579f77SDag-Erling Smørgrav /**
196b7579f77SDag-Erling Smørgrav  * Add a name to the delegation point.
197b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
198b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
199b7579f77SDag-Erling Smørgrav  * @param name: domain name in wire format.
200b7579f77SDag-Erling Smørgrav  * @param lame: name is lame, disprefer it.
2019cf5bc93SCy Schubert  * @param tls_auth_name: TLS authentication name (or NULL).
2029cf5bc93SCy Schubert  * @param port: port to use for resolved addresses.
203b7579f77SDag-Erling Smørgrav  * @return false on error.
204b7579f77SDag-Erling Smørgrav  */
205b7579f77SDag-Erling Smørgrav int delegpt_add_ns(struct delegpt* dp, struct regional* regional,
2069cf5bc93SCy Schubert 	uint8_t* name, uint8_t lame, char* tls_auth_name, int port);
207b7579f77SDag-Erling Smørgrav 
208b7579f77SDag-Erling Smørgrav /**
209b7579f77SDag-Erling Smørgrav  * Add NS rrset; calls add_ns repeatedly.
210b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
211b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
212b7579f77SDag-Erling Smørgrav  * @param ns_rrset: NS rrset.
213b7579f77SDag-Erling Smørgrav  * @param lame: rrset is lame, disprefer it.
214b7579f77SDag-Erling Smørgrav  * @return 0 on alloc error.
215b7579f77SDag-Erling Smørgrav  */
216b7579f77SDag-Erling Smørgrav int delegpt_rrset_add_ns(struct delegpt* dp, struct regional* regional,
21717d15b25SDag-Erling Smørgrav 	struct ub_packed_rrset_key* ns_rrset, uint8_t lame);
218b7579f77SDag-Erling Smørgrav 
219b7579f77SDag-Erling Smørgrav /**
220b7579f77SDag-Erling Smørgrav  * Add target address to the delegation point.
221b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
222b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
223b7579f77SDag-Erling Smørgrav  * @param name: name for which target was found (must be in nslist).
224b7579f77SDag-Erling Smørgrav  *	This name is marked resolved.
225b7579f77SDag-Erling Smørgrav  * @param namelen: length of name.
226b7579f77SDag-Erling Smørgrav  * @param addr: the address.
227b7579f77SDag-Erling Smørgrav  * @param addrlen: the length of addr.
228b7579f77SDag-Erling Smørgrav  * @param bogus: security status for the address, pass true if bogus.
229b7579f77SDag-Erling Smørgrav  * @param lame: address is lame.
230091e9e46SCy Schubert  * @param additions: will be set to 1 if a new address is added
231b7579f77SDag-Erling Smørgrav  * @return false on error.
232b7579f77SDag-Erling Smørgrav  */
233b7579f77SDag-Erling Smørgrav int delegpt_add_target(struct delegpt* dp, struct regional* regional,
234b7579f77SDag-Erling Smørgrav 	uint8_t* name, size_t namelen, struct sockaddr_storage* addr,
235091e9e46SCy Schubert 	socklen_t addrlen, uint8_t bogus, uint8_t lame, int* additions);
236b7579f77SDag-Erling Smørgrav 
237b7579f77SDag-Erling Smørgrav /**
238b7579f77SDag-Erling Smørgrav  * Add A RRset to delegpt.
239b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
240b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
241b7579f77SDag-Erling Smørgrav  * @param rrset: RRset A to add.
242b7579f77SDag-Erling Smørgrav  * @param lame: rrset is lame, disprefer it.
243091e9e46SCy Schubert  * @param additions: will be set to 1 if a new address is added
244b7579f77SDag-Erling Smørgrav  * @return 0 on alloc error.
245b7579f77SDag-Erling Smørgrav  */
246b7579f77SDag-Erling Smørgrav int delegpt_add_rrset_A(struct delegpt* dp, struct regional* regional,
247091e9e46SCy Schubert 	struct ub_packed_rrset_key* rrset, uint8_t lame, int* additions);
248b7579f77SDag-Erling Smørgrav 
249b7579f77SDag-Erling Smørgrav /**
250b7579f77SDag-Erling Smørgrav  * Add AAAA RRset to delegpt.
251b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
252b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
253b7579f77SDag-Erling Smørgrav  * @param rrset: RRset AAAA to add.
254b7579f77SDag-Erling Smørgrav  * @param lame: rrset is lame, disprefer it.
255091e9e46SCy Schubert  * @param additions: will be set to 1 if a new address is added
256b7579f77SDag-Erling Smørgrav  * @return 0 on alloc error.
257b7579f77SDag-Erling Smørgrav  */
258b7579f77SDag-Erling Smørgrav int delegpt_add_rrset_AAAA(struct delegpt* dp, struct regional* regional,
259091e9e46SCy Schubert 	struct ub_packed_rrset_key* rrset, uint8_t lame, int* additions);
260b7579f77SDag-Erling Smørgrav 
261b7579f77SDag-Erling Smørgrav /**
262b7579f77SDag-Erling Smørgrav  * Add any RRset to delegpt.
263b7579f77SDag-Erling Smørgrav  * Does not check for duplicates added.
264b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
265b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
266b7579f77SDag-Erling Smørgrav  * @param rrset: RRset to add, NS, A, AAAA.
267b7579f77SDag-Erling Smørgrav  * @param lame: rrset is lame, disprefer it.
268091e9e46SCy Schubert  * @param additions: will be set to 1 if a new address is added
269b7579f77SDag-Erling Smørgrav  * @return 0 on alloc error.
270b7579f77SDag-Erling Smørgrav  */
271b7579f77SDag-Erling Smørgrav int delegpt_add_rrset(struct delegpt* dp, struct regional* regional,
272091e9e46SCy Schubert 	struct ub_packed_rrset_key* rrset, uint8_t lame, int* additions);
273b7579f77SDag-Erling Smørgrav 
274b7579f77SDag-Erling Smørgrav /**
275b7579f77SDag-Erling Smørgrav  * Add address to the delegation point. No servername is associated or checked.
276b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
277b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate the info.
278b7579f77SDag-Erling Smørgrav  * @param addr: the address.
279b7579f77SDag-Erling Smørgrav  * @param addrlen: the length of addr.
280b7579f77SDag-Erling Smørgrav  * @param bogus: if address is bogus.
281b7579f77SDag-Erling Smørgrav  * @param lame: if address is lame.
2820fb34990SDag-Erling Smørgrav  * @param tls_auth_name: TLS authentication name (or NULL).
2839cf5bc93SCy Schubert  * @param port: the port to use; if -1 the port is taken from addr.
284091e9e46SCy Schubert  * @param additions: will be set to 1 if a new address is added
285b7579f77SDag-Erling Smørgrav  * @return false on error.
286b7579f77SDag-Erling Smørgrav  */
287b7579f77SDag-Erling Smørgrav int delegpt_add_addr(struct delegpt* dp, struct regional* regional,
28817d15b25SDag-Erling Smørgrav 	struct sockaddr_storage* addr, socklen_t addrlen,
2899cf5bc93SCy Schubert 	uint8_t bogus, uint8_t lame, char* tls_auth_name, int port,
2909cf5bc93SCy Schubert 	int* additions);
291b7579f77SDag-Erling Smørgrav 
292b7579f77SDag-Erling Smørgrav /**
293b7579f77SDag-Erling Smørgrav  * Find NS record in name list of delegation point.
294b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
295b7579f77SDag-Erling Smørgrav  * @param name: name of nameserver to look for, uncompressed wireformat.
296b7579f77SDag-Erling Smørgrav  * @param namelen: length of name.
297b7579f77SDag-Erling Smørgrav  * @return the ns structure or NULL if not found.
298b7579f77SDag-Erling Smørgrav  */
299b7579f77SDag-Erling Smørgrav struct delegpt_ns* delegpt_find_ns(struct delegpt* dp, uint8_t* name,
300b7579f77SDag-Erling Smørgrav 	size_t namelen);
301b7579f77SDag-Erling Smørgrav 
302b7579f77SDag-Erling Smørgrav /**
303b7579f77SDag-Erling Smørgrav  * Find address record in total list of delegation point.
304b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
305b7579f77SDag-Erling Smørgrav  * @param addr: address
306b7579f77SDag-Erling Smørgrav  * @param addrlen: length of addr
307b7579f77SDag-Erling Smørgrav  * @return the addr structure or NULL if not found.
308b7579f77SDag-Erling Smørgrav  */
309b7579f77SDag-Erling Smørgrav struct delegpt_addr* delegpt_find_addr(struct delegpt* dp,
310b7579f77SDag-Erling Smørgrav 	struct sockaddr_storage* addr, socklen_t addrlen);
311b7579f77SDag-Erling Smørgrav 
312b7579f77SDag-Erling Smørgrav /**
313b7579f77SDag-Erling Smørgrav  * Print the delegation point to the log. For debugging.
314b7579f77SDag-Erling Smørgrav  * @param v: verbosity value that is needed to emit to log.
315b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
316b7579f77SDag-Erling Smørgrav  */
317b7579f77SDag-Erling Smørgrav void delegpt_log(enum verbosity_value v, struct delegpt* dp);
318b7579f77SDag-Erling Smørgrav 
319b7579f77SDag-Erling Smørgrav /** count NS and number missing for logging */
320b7579f77SDag-Erling Smørgrav void delegpt_count_ns(struct delegpt* dp, size_t* numns, size_t* missing);
321b7579f77SDag-Erling Smørgrav 
322b7579f77SDag-Erling Smørgrav /** count addresses, and number in result and available lists, for logging */
323b7579f77SDag-Erling Smørgrav void delegpt_count_addr(struct delegpt* dp, size_t* numaddr, size_t* numres,
324b7579f77SDag-Erling Smørgrav 	size_t* numavail);
325b7579f77SDag-Erling Smørgrav 
326b7579f77SDag-Erling Smørgrav /**
327b7579f77SDag-Erling Smørgrav  * Add all usable targets to the result list.
328b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
329b7579f77SDag-Erling Smørgrav  */
330b7579f77SDag-Erling Smørgrav void delegpt_add_unused_targets(struct delegpt* dp);
331b7579f77SDag-Erling Smørgrav 
332b7579f77SDag-Erling Smørgrav /**
333b7579f77SDag-Erling Smørgrav  * Count number of missing targets. These are ns names with no resolved flag.
334b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
3350a92a9fcSCy Schubert  * @param alllame: if set, check if all the missing targets are lame.
336b7579f77SDag-Erling Smørgrav  * @return number of missing targets (or 0).
337b7579f77SDag-Erling Smørgrav  */
3380a92a9fcSCy Schubert size_t delegpt_count_missing_targets(struct delegpt* dp, int* alllame);
339b7579f77SDag-Erling Smørgrav 
340b7579f77SDag-Erling Smørgrav /** count total number of targets in dp */
341b7579f77SDag-Erling Smørgrav size_t delegpt_count_targets(struct delegpt* dp);
342b7579f77SDag-Erling Smørgrav 
343b7579f77SDag-Erling Smørgrav /**
344b7579f77SDag-Erling Smørgrav  * Create new delegation point from a dns message
345b7579f77SDag-Erling Smørgrav  *
346b7579f77SDag-Erling Smørgrav  * Note that this method does not actually test to see if the message is an
347b7579f77SDag-Erling Smørgrav  * actual referral. It really is just checking to see if it can construct a
348b7579f77SDag-Erling Smørgrav  * delegation point, so the message could be of some other type (some ANSWER
349b7579f77SDag-Erling Smørgrav  * messages, some CNAME messages, generally.) Note that the resulting
350b7579f77SDag-Erling Smørgrav  * DelegationPoint will contain targets for all "relevant" glue (i.e.,
351b7579f77SDag-Erling Smørgrav  * address records whose ownernames match the target of one of the NS
352b7579f77SDag-Erling Smørgrav  * records), so if policy dictates that some glue should be discarded beyond
353b7579f77SDag-Erling Smørgrav  * that, discard it before calling this method. Note that this method will
354b7579f77SDag-Erling Smørgrav  * find "glue" in either the ADDITIONAL section or the ANSWER section.
355b7579f77SDag-Erling Smørgrav  *
356b7579f77SDag-Erling Smørgrav  * @param msg: the dns message, referral.
357b7579f77SDag-Erling Smørgrav  * @param regional: where to allocate delegation point.
358b7579f77SDag-Erling Smørgrav  * @return new delegation point or NULL on alloc error, or if the
359b7579f77SDag-Erling Smørgrav  *         message was not appropriate.
360b7579f77SDag-Erling Smørgrav  */
361b7579f77SDag-Erling Smørgrav struct delegpt* delegpt_from_message(struct dns_msg* msg,
362b7579f77SDag-Erling Smørgrav 	struct regional* regional);
363b7579f77SDag-Erling Smørgrav 
364b7579f77SDag-Erling Smørgrav /**
365091e9e46SCy Schubert  * Mark negative return in delegation point for specific nameserver.
366091e9e46SCy Schubert  * sets the got4 or got6 to negative, updates the ns->resolved.
367091e9e46SCy Schubert  * @param ns: the nameserver in the delegpt.
368091e9e46SCy Schubert  * @param qtype: A or AAAA (host order).
369091e9e46SCy Schubert  */
370091e9e46SCy Schubert void delegpt_mark_neg(struct delegpt_ns* ns, uint16_t qtype);
371091e9e46SCy Schubert 
372091e9e46SCy Schubert /**
373b7579f77SDag-Erling Smørgrav  * Add negative message to delegation point.
374b7579f77SDag-Erling Smørgrav  * @param dp: delegation point.
375b7579f77SDag-Erling Smørgrav  * @param msg: the message added, marks off A or AAAA from an NS entry.
376b7579f77SDag-Erling Smørgrav  */
377b7579f77SDag-Erling Smørgrav void delegpt_add_neg_msg(struct delegpt* dp, struct msgreply_entry* msg);
378b7579f77SDag-Erling Smørgrav 
379b7579f77SDag-Erling Smørgrav /**
380b7579f77SDag-Erling Smørgrav  * Register the fact that there is no ipv6 and thus AAAAs are not going
381b7579f77SDag-Erling Smørgrav  * to be queried for or be useful.
382b7579f77SDag-Erling Smørgrav  * @param dp: the delegation point. Updated to reflect no ipv6.
383b7579f77SDag-Erling Smørgrav  */
384b7579f77SDag-Erling Smørgrav void delegpt_no_ipv6(struct delegpt* dp);
385b7579f77SDag-Erling Smørgrav 
386b7579f77SDag-Erling Smørgrav /**
387b7579f77SDag-Erling Smørgrav  * Register the fact that there is no ipv4 and thus As are not going
388b7579f77SDag-Erling Smørgrav  * to be queried for or be useful.
389b7579f77SDag-Erling Smørgrav  * @param dp: the delegation point. Updated to reflect no ipv4.
390b7579f77SDag-Erling Smørgrav  */
391b7579f77SDag-Erling Smørgrav void delegpt_no_ipv4(struct delegpt* dp);
392b7579f77SDag-Erling Smørgrav 
393b7579f77SDag-Erling Smørgrav /**
394b7579f77SDag-Erling Smørgrav  * create malloced delegation point, with the given name
395bc892140SDag-Erling Smørgrav  * @param name: uncompressed wireformat of delegpt name.
396b7579f77SDag-Erling Smørgrav  * @return NULL on alloc failure
397b7579f77SDag-Erling Smørgrav  */
398b7579f77SDag-Erling Smørgrav struct delegpt* delegpt_create_mlc(uint8_t* name);
399b7579f77SDag-Erling Smørgrav 
400b7579f77SDag-Erling Smørgrav /**
401b7579f77SDag-Erling Smørgrav  * free malloced delegation point.
402b7579f77SDag-Erling Smørgrav  * @param dp: must have been created with delegpt_create_mlc, free'd.
403b7579f77SDag-Erling Smørgrav  */
404b7579f77SDag-Erling Smørgrav void delegpt_free_mlc(struct delegpt* dp);
405b7579f77SDag-Erling Smørgrav 
406b7579f77SDag-Erling Smørgrav /**
407b7579f77SDag-Erling Smørgrav  * Set name of delegation point.
408b7579f77SDag-Erling Smørgrav  * @param dp: delegation point. malloced.
409b7579f77SDag-Erling Smørgrav  * @param name: name to use.
410b7579f77SDag-Erling Smørgrav  * @return false on error.
411b7579f77SDag-Erling Smørgrav  */
412b7579f77SDag-Erling Smørgrav int delegpt_set_name_mlc(struct delegpt* dp, uint8_t* name);
413b7579f77SDag-Erling Smørgrav 
414b7579f77SDag-Erling Smørgrav /**
415b7579f77SDag-Erling Smørgrav  * add a name to malloced delegation point.
416b7579f77SDag-Erling Smørgrav  * @param dp: must have been created with delegpt_create_mlc.
417b7579f77SDag-Erling Smørgrav  * @param name: the name to add.
418b7579f77SDag-Erling Smørgrav  * @param lame: the name is lame, disprefer.
4199cf5bc93SCy Schubert  * @param tls_auth_name: TLS authentication name (or NULL).
4209cf5bc93SCy Schubert  * @param port: port to use for resolved addresses.
421b7579f77SDag-Erling Smørgrav  * @return false on error.
422b7579f77SDag-Erling Smørgrav  */
4239cf5bc93SCy Schubert int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, uint8_t lame,
4249cf5bc93SCy Schubert 	char* tls_auth_name, int port);
425b7579f77SDag-Erling Smørgrav 
426b7579f77SDag-Erling Smørgrav /**
427b7579f77SDag-Erling Smørgrav  * add an address to a malloced delegation point.
428b7579f77SDag-Erling Smørgrav  * @param dp: must have been created with delegpt_create_mlc.
429b7579f77SDag-Erling Smørgrav  * @param addr: the address.
430b7579f77SDag-Erling Smørgrav  * @param addrlen: the length of addr.
431b7579f77SDag-Erling Smørgrav  * @param bogus: if address is bogus.
432b7579f77SDag-Erling Smørgrav  * @param lame: if address is lame.
4330fb34990SDag-Erling Smørgrav  * @param tls_auth_name: TLS authentication name (or NULL).
4349cf5bc93SCy Schubert  * @param port: the port to use; if -1 the port is taken from addr.
435b7579f77SDag-Erling Smørgrav  * @return false on error.
436b7579f77SDag-Erling Smørgrav  */
437b7579f77SDag-Erling Smørgrav int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr,
4389cf5bc93SCy Schubert 	socklen_t addrlen, uint8_t bogus, uint8_t lame, char* tls_auth_name,
4399cf5bc93SCy Schubert 	int port);
440b7579f77SDag-Erling Smørgrav 
441b7579f77SDag-Erling Smørgrav /**
442b7579f77SDag-Erling Smørgrav  * Add target address to the delegation point.
443b7579f77SDag-Erling Smørgrav  * @param dp: must have been created with delegpt_create_mlc.
444b7579f77SDag-Erling Smørgrav  * @param name: name for which target was found (must be in nslist).
445b7579f77SDag-Erling Smørgrav  *	This name is marked resolved.
446b7579f77SDag-Erling Smørgrav  * @param namelen: length of name.
447b7579f77SDag-Erling Smørgrav  * @param addr: the address.
448b7579f77SDag-Erling Smørgrav  * @param addrlen: the length of addr.
449b7579f77SDag-Erling Smørgrav  * @param bogus: security status for the address, pass true if bogus.
450b7579f77SDag-Erling Smørgrav  * @param lame: address is lame.
451b7579f77SDag-Erling Smørgrav  * @return false on error.
452b7579f77SDag-Erling Smørgrav  */
453b7579f77SDag-Erling Smørgrav int delegpt_add_target_mlc(struct delegpt* dp, uint8_t* name, size_t namelen,
45417d15b25SDag-Erling Smørgrav 	struct sockaddr_storage* addr, socklen_t addrlen, uint8_t bogus,
45517d15b25SDag-Erling Smørgrav 	uint8_t lame);
456b7579f77SDag-Erling Smørgrav 
457b7579f77SDag-Erling Smørgrav /** get memory in use by dp */
458b7579f77SDag-Erling Smørgrav size_t delegpt_get_mem(struct delegpt* dp);
459b7579f77SDag-Erling Smørgrav 
460*8f76bb7dSCy Schubert /**
461*8f76bb7dSCy Schubert  * See if the addr is on the result list.
462*8f76bb7dSCy Schubert  * @param dp: delegation point.
463*8f76bb7dSCy Schubert  * @param find: the pointer is searched for on the result list.
464*8f76bb7dSCy Schubert  * @return 1 if found, 0 if not found.
465*8f76bb7dSCy Schubert  */
466*8f76bb7dSCy Schubert int delegpt_addr_on_result_list(struct delegpt* dp, struct delegpt_addr* find);
467*8f76bb7dSCy Schubert 
468*8f76bb7dSCy Schubert /**
469*8f76bb7dSCy Schubert  * Remove the addr from the usable list.
470*8f76bb7dSCy Schubert  * @param dp: the delegation point.
471*8f76bb7dSCy Schubert  * @param del: the addr to remove from the list, the pointer is searched for.
472*8f76bb7dSCy Schubert  */
473*8f76bb7dSCy Schubert void delegpt_usable_list_remove_addr(struct delegpt* dp,
474*8f76bb7dSCy Schubert 	struct delegpt_addr* del);
475*8f76bb7dSCy Schubert 
476*8f76bb7dSCy Schubert /**
477*8f76bb7dSCy Schubert  * Add the delegpt_addr back to the result list, if it is not already on
478*8f76bb7dSCy Schubert  * the result list. Also removes it from the usable list.
479*8f76bb7dSCy Schubert  * @param dp: delegation point.
480*8f76bb7dSCy Schubert  * @param a: addr to add, nothing happens if it is already on the result list.
481*8f76bb7dSCy Schubert  *	It is removed from the usable list.
482*8f76bb7dSCy Schubert  */
483*8f76bb7dSCy Schubert void delegpt_add_to_result_list(struct delegpt* dp, struct delegpt_addr* a);
484*8f76bb7dSCy Schubert 
485b7579f77SDag-Erling Smørgrav #endif /* ITERATOR_ITER_DELEGPT_H */
486