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