1b7579f77SDag-Erling Smørgrav /* 2b7579f77SDag-Erling Smørgrav * services/localzone.h - local zones authority service. 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 contains functions to enable local zone authority service. 40b7579f77SDag-Erling Smørgrav */ 41b7579f77SDag-Erling Smørgrav 42b7579f77SDag-Erling Smørgrav #ifndef SERVICES_LOCALZONE_H 43b7579f77SDag-Erling Smørgrav #define SERVICES_LOCALZONE_H 44b7579f77SDag-Erling Smørgrav #include "util/rbtree.h" 45b7579f77SDag-Erling Smørgrav #include "util/locks.h" 46b5663de9SDag-Erling Smørgrav #include "util/storage/dnstree.h" 47bc892140SDag-Erling Smørgrav #include "util/module.h" 48bc892140SDag-Erling Smørgrav #include "services/view.h" 49091e9e46SCy Schubert #include "sldns/sbuffer.h" 5065b390aaSDag-Erling Smørgrav struct packed_rrset_data; 51b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key; 52b7579f77SDag-Erling Smørgrav struct regional; 53b7579f77SDag-Erling Smørgrav struct config_file; 54b7579f77SDag-Erling Smørgrav struct edns_data; 55b7579f77SDag-Erling Smørgrav struct query_info; 5617d15b25SDag-Erling Smørgrav struct sldns_buffer; 576480faa8SDag-Erling Smørgrav struct comm_reply; 58b5663de9SDag-Erling Smørgrav struct config_strlist; 59b7579f77SDag-Erling Smørgrav 60b7579f77SDag-Erling Smørgrav /** 61b7579f77SDag-Erling Smørgrav * Local zone type 62b7579f77SDag-Erling Smørgrav * This type determines processing for queries that did not match 63b7579f77SDag-Erling Smørgrav * local-data directly. 64b7579f77SDag-Erling Smørgrav */ 65b7579f77SDag-Erling Smørgrav enum localzone_type { 66bc892140SDag-Erling Smørgrav /** unset type, used for unset tag_action elements */ 67bc892140SDag-Erling Smørgrav local_zone_unset = 0, 68b7579f77SDag-Erling Smørgrav /** drop query */ 69bc892140SDag-Erling Smørgrav local_zone_deny, 70b7579f77SDag-Erling Smørgrav /** answer with error */ 71b7579f77SDag-Erling Smørgrav local_zone_refuse, 72b7579f77SDag-Erling Smørgrav /** answer nxdomain or nodata */ 73b7579f77SDag-Erling Smørgrav local_zone_static, 74b7579f77SDag-Erling Smørgrav /** resolve normally */ 75b7579f77SDag-Erling Smørgrav local_zone_transparent, 76b7579f77SDag-Erling Smørgrav /** do not block types at localdata names */ 77b7579f77SDag-Erling Smørgrav local_zone_typetransparent, 78b7579f77SDag-Erling Smørgrav /** answer with data at zone apex */ 79b7579f77SDag-Erling Smørgrav local_zone_redirect, 80b7579f77SDag-Erling Smørgrav /** remove default AS112 blocking contents for zone 81b7579f77SDag-Erling Smørgrav * nodefault is used in config not during service. */ 826480faa8SDag-Erling Smørgrav local_zone_nodefault, 836480faa8SDag-Erling Smørgrav /** log client address, but no block (transparent) */ 8409a3aaf3SDag-Erling Smørgrav local_zone_inform, 8509a3aaf3SDag-Erling Smørgrav /** log client address, and block (drop) */ 86b5663de9SDag-Erling Smørgrav local_zone_inform_deny, 87e86b9096SDag-Erling Smørgrav /** log client address, and direct */ 88e86b9096SDag-Erling Smørgrav local_zone_inform_redirect, 89b5663de9SDag-Erling Smørgrav /** resolve normally, even when there is local data */ 90b5663de9SDag-Erling Smørgrav local_zone_always_transparent, 918f76bb7dSCy Schubert /** resolve normally, even when there is local data but return NODATA for A queries */ 928f76bb7dSCy Schubert local_zone_block_a, 93b5663de9SDag-Erling Smørgrav /** answer with error, even when there is local data */ 94b5663de9SDag-Erling Smørgrav local_zone_always_refuse, 95b5663de9SDag-Erling Smørgrav /** answer with nxdomain, even when there is local data */ 9657bddd21SDag-Erling Smørgrav local_zone_always_nxdomain, 97091e9e46SCy Schubert /** answer with noerror/nodata, even when there is local data */ 98091e9e46SCy Schubert local_zone_always_nodata, 99091e9e46SCy Schubert /** drop query, even when there is local data */ 100091e9e46SCy Schubert local_zone_always_deny, 101f44e67d1SCy Schubert /** answer with 0.0.0.0 or ::0 or noerror/nodata, even when there is 102f44e67d1SCy Schubert * local data */ 103f44e67d1SCy Schubert local_zone_always_null, 10457bddd21SDag-Erling Smørgrav /** answer not from the view, but global or no-answer */ 105091e9e46SCy Schubert local_zone_noview, 10624e36522SCy Schubert /** truncate the response; client should retry via tcp */ 10724e36522SCy Schubert local_zone_truncate, 108091e9e46SCy Schubert /** Invalid type, cannot be used to generate answer */ 109091e9e46SCy Schubert local_zone_invalid 110b7579f77SDag-Erling Smørgrav }; 111b7579f77SDag-Erling Smørgrav 112b7579f77SDag-Erling Smørgrav /** 113b7579f77SDag-Erling Smørgrav * Authoritative local zones storage, shared. 114b7579f77SDag-Erling Smørgrav */ 115b7579f77SDag-Erling Smørgrav struct local_zones { 116b7579f77SDag-Erling Smørgrav /** lock on the localzone tree */ 1173005e0a3SDag-Erling Smørgrav lock_rw_type lock; 118b7579f77SDag-Erling Smørgrav /** rbtree of struct local_zone */ 1193005e0a3SDag-Erling Smørgrav rbtree_type ztree; 120b7579f77SDag-Erling Smørgrav }; 121b7579f77SDag-Erling Smørgrav 122b7579f77SDag-Erling Smørgrav /** 123b7579f77SDag-Erling Smørgrav * Local zone. A locally served authoritative zone. 124b7579f77SDag-Erling Smørgrav */ 125b7579f77SDag-Erling Smørgrav struct local_zone { 126b7579f77SDag-Erling Smørgrav /** rbtree node, key is name and class */ 1273005e0a3SDag-Erling Smørgrav rbnode_type node; 128b7579f77SDag-Erling Smørgrav /** parent zone, if any. */ 129b7579f77SDag-Erling Smørgrav struct local_zone* parent; 130b7579f77SDag-Erling Smørgrav 131b7579f77SDag-Erling Smørgrav /** zone name, in uncompressed wireformat */ 132b7579f77SDag-Erling Smørgrav uint8_t* name; 133b7579f77SDag-Erling Smørgrav /** length of zone name */ 134b7579f77SDag-Erling Smørgrav size_t namelen; 135b7579f77SDag-Erling Smørgrav /** number of labels in zone name */ 136b7579f77SDag-Erling Smørgrav int namelabs; 137b7579f77SDag-Erling Smørgrav /** the class of this zone. 138b7579f77SDag-Erling Smørgrav * uses 'dclass' to not conflict with c++ keyword class. */ 139b7579f77SDag-Erling Smørgrav uint16_t dclass; 140b7579f77SDag-Erling Smørgrav 141b7579f77SDag-Erling Smørgrav /** lock on the data in the structure 142b7579f77SDag-Erling Smørgrav * For the node, parent, name, namelen, namelabs, dclass, you 143b7579f77SDag-Erling Smørgrav * need to also hold the zones_tree lock to change them (or to 144b7579f77SDag-Erling Smørgrav * delete this zone) */ 1453005e0a3SDag-Erling Smørgrav lock_rw_type lock; 146b7579f77SDag-Erling Smørgrav 147b7579f77SDag-Erling Smørgrav /** how to process zone */ 148b7579f77SDag-Erling Smørgrav enum localzone_type type; 149e2d15004SDag-Erling Smørgrav /** tag bitlist */ 150e2d15004SDag-Erling Smørgrav uint8_t* taglist; 151e2d15004SDag-Erling Smørgrav /** length of the taglist (in bytes) */ 152e2d15004SDag-Erling Smørgrav size_t taglen; 153b5663de9SDag-Erling Smørgrav /** netblock addr_tree with struct local_zone_override information 154b5663de9SDag-Erling Smørgrav * or NULL if there are no override elements */ 1553005e0a3SDag-Erling Smørgrav struct rbtree_type* override_tree; 156b7579f77SDag-Erling Smørgrav 157b7579f77SDag-Erling Smørgrav /** in this region the zone's data is allocated. 158b7579f77SDag-Erling Smørgrav * the struct local_zone itself is malloced. */ 159b7579f77SDag-Erling Smørgrav struct regional* region; 160b7579f77SDag-Erling Smørgrav /** local data for this zone 161b7579f77SDag-Erling Smørgrav * rbtree of struct local_data */ 1623005e0a3SDag-Erling Smørgrav rbtree_type data; 163b7579f77SDag-Erling Smørgrav /** if data contains zone apex SOA data, this is a ptr to it. */ 164b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key* soa; 1655469a995SCy Schubert /** if data contains zone apex SOA data, this is a ptr to an 166f44e67d1SCy Schubert * artificial negative SOA rrset (TTL is the minimum of the TTL and the 167f44e67d1SCy Schubert * SOA.MINIMUM). */ 168f44e67d1SCy Schubert struct ub_packed_rrset_key* soa_negative; 169b7579f77SDag-Erling Smørgrav }; 170b7579f77SDag-Erling Smørgrav 171b7579f77SDag-Erling Smørgrav /** 172b7579f77SDag-Erling Smørgrav * Local data. One domain name, and the RRs to go with it. 173b7579f77SDag-Erling Smørgrav */ 174b7579f77SDag-Erling Smørgrav struct local_data { 175b7579f77SDag-Erling Smørgrav /** rbtree node, key is name only */ 1763005e0a3SDag-Erling Smørgrav rbnode_type node; 177b7579f77SDag-Erling Smørgrav /** domain name */ 178b7579f77SDag-Erling Smørgrav uint8_t* name; 179b7579f77SDag-Erling Smørgrav /** length of name */ 180b7579f77SDag-Erling Smørgrav size_t namelen; 181b7579f77SDag-Erling Smørgrav /** number of labels in name */ 182b7579f77SDag-Erling Smørgrav int namelabs; 183b7579f77SDag-Erling Smørgrav /** the data rrsets, with different types, linked list. 184b7579f77SDag-Erling Smørgrav * If this list is NULL, the node is an empty non-terminal. */ 185b7579f77SDag-Erling Smørgrav struct local_rrset* rrsets; 186b7579f77SDag-Erling Smørgrav }; 187b7579f77SDag-Erling Smørgrav 188b7579f77SDag-Erling Smørgrav /** 189b7579f77SDag-Erling Smørgrav * A local data RRset 190b7579f77SDag-Erling Smørgrav */ 191b7579f77SDag-Erling Smørgrav struct local_rrset { 192b7579f77SDag-Erling Smørgrav /** next in list */ 193b7579f77SDag-Erling Smørgrav struct local_rrset* next; 194b7579f77SDag-Erling Smørgrav /** RRset data item */ 195b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key* rrset; 196b7579f77SDag-Erling Smørgrav }; 197b7579f77SDag-Erling Smørgrav 198b7579f77SDag-Erling Smørgrav /** 199b5663de9SDag-Erling Smørgrav * Local zone override information 200b5663de9SDag-Erling Smørgrav */ 201b5663de9SDag-Erling Smørgrav struct local_zone_override { 202b5663de9SDag-Erling Smørgrav /** node in addrtree */ 203b5663de9SDag-Erling Smørgrav struct addr_tree_node node; 204b5663de9SDag-Erling Smørgrav /** override for local zone type */ 205b5663de9SDag-Erling Smørgrav enum localzone_type type; 206b5663de9SDag-Erling Smørgrav }; 207b5663de9SDag-Erling Smørgrav 208b5663de9SDag-Erling Smørgrav /** 209b7579f77SDag-Erling Smørgrav * Create local zones storage 210b7579f77SDag-Erling Smørgrav * @return new struct or NULL on error. 211b7579f77SDag-Erling Smørgrav */ 212b7579f77SDag-Erling Smørgrav struct local_zones* local_zones_create(void); 213b7579f77SDag-Erling Smørgrav 214b7579f77SDag-Erling Smørgrav /** 215b7579f77SDag-Erling Smørgrav * Delete local zones storage 216b7579f77SDag-Erling Smørgrav * @param zones: to delete. 217b7579f77SDag-Erling Smørgrav */ 218b7579f77SDag-Erling Smørgrav void local_zones_delete(struct local_zones* zones); 219b7579f77SDag-Erling Smørgrav 220b7579f77SDag-Erling Smørgrav /** 221b7579f77SDag-Erling Smørgrav * Apply config settings; setup the local authoritative data. 222b7579f77SDag-Erling Smørgrav * Takes care of locking. 223b7579f77SDag-Erling Smørgrav * @param zones: is set up. 224b7579f77SDag-Erling Smørgrav * @param cfg: config data. 225b7579f77SDag-Erling Smørgrav * @return false on error. 226b7579f77SDag-Erling Smørgrav */ 227b7579f77SDag-Erling Smørgrav int local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg); 228b7579f77SDag-Erling Smørgrav 229b7579f77SDag-Erling Smørgrav /** 230b7579f77SDag-Erling Smørgrav * Compare two local_zone entries in rbtree. Sort hierarchical but not 231b7579f77SDag-Erling Smørgrav * canonical 232b7579f77SDag-Erling Smørgrav * @param z1: zone 1 233b7579f77SDag-Erling Smørgrav * @param z2: zone 2 234b7579f77SDag-Erling Smørgrav * @return: -1, 0, +1 comparison value. 235b7579f77SDag-Erling Smørgrav */ 236b7579f77SDag-Erling Smørgrav int local_zone_cmp(const void* z1, const void* z2); 237b7579f77SDag-Erling Smørgrav 238b7579f77SDag-Erling Smørgrav /** 239b7579f77SDag-Erling Smørgrav * Compare two local_data entries in rbtree. Sort canonical. 240b7579f77SDag-Erling Smørgrav * @param d1: data 1 241b7579f77SDag-Erling Smørgrav * @param d2: data 2 242b7579f77SDag-Erling Smørgrav * @return: -1, 0, +1 comparison value. 243b7579f77SDag-Erling Smørgrav */ 244b7579f77SDag-Erling Smørgrav int local_data_cmp(const void* d1, const void* d2); 245b7579f77SDag-Erling Smørgrav 246b7579f77SDag-Erling Smørgrav /** 247b7579f77SDag-Erling Smørgrav * Delete one zone 248b7579f77SDag-Erling Smørgrav * @param z: to delete. 249b7579f77SDag-Erling Smørgrav */ 250b7579f77SDag-Erling Smørgrav void local_zone_delete(struct local_zone* z); 251b7579f77SDag-Erling Smørgrav 252b7579f77SDag-Erling Smørgrav /** 253b5663de9SDag-Erling Smørgrav * Lookup zone that contains the given name, class and taglist. 254b5663de9SDag-Erling Smørgrav * User must lock the tree or result zone. 255b5663de9SDag-Erling Smørgrav * @param zones: the zones tree 256b5663de9SDag-Erling Smørgrav * @param name: dname to lookup 257b5663de9SDag-Erling Smørgrav * @param len: length of name. 258b5663de9SDag-Erling Smørgrav * @param labs: labelcount of name. 259b5663de9SDag-Erling Smørgrav * @param dclass: class to lookup. 260971980c3SDag-Erling Smørgrav * @param dtype: type to lookup, if type DS a zone higher is used for zonecuts. 261b5663de9SDag-Erling Smørgrav * @param taglist: taglist to lookup. 26224e36522SCy Schubert * @param taglen: length of taglist. 263b5663de9SDag-Erling Smørgrav * @param ignoretags: lookup zone by name and class, regardless the 264b5663de9SDag-Erling Smørgrav * local-zone's tags. 265b5663de9SDag-Erling Smørgrav * @return closest local_zone or NULL if no covering zone is found. 266b5663de9SDag-Erling Smørgrav */ 267b5663de9SDag-Erling Smørgrav struct local_zone* local_zones_tags_lookup(struct local_zones* zones, 268971980c3SDag-Erling Smørgrav uint8_t* name, size_t len, int labs, uint16_t dclass, uint16_t dtype, 269b5663de9SDag-Erling Smørgrav uint8_t* taglist, size_t taglen, int ignoretags); 270b5663de9SDag-Erling Smørgrav 271b5663de9SDag-Erling Smørgrav /** 272b7579f77SDag-Erling Smørgrav * Lookup zone that contains the given name, class. 273b7579f77SDag-Erling Smørgrav * User must lock the tree or result zone. 274b7579f77SDag-Erling Smørgrav * @param zones: the zones tree 275b7579f77SDag-Erling Smørgrav * @param name: dname to lookup 276b7579f77SDag-Erling Smørgrav * @param len: length of name. 277b7579f77SDag-Erling Smørgrav * @param labs: labelcount of name. 278b7579f77SDag-Erling Smørgrav * @param dclass: class to lookup. 279971980c3SDag-Erling Smørgrav * @param dtype: type of the record, if type DS then a zone higher up is found 280971980c3SDag-Erling Smørgrav * pass 0 to just plain find a zone for a name. 281b7579f77SDag-Erling Smørgrav * @return closest local_zone or NULL if no covering zone is found. 282b7579f77SDag-Erling Smørgrav */ 283b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_lookup(struct local_zones* zones, 284971980c3SDag-Erling Smørgrav uint8_t* name, size_t len, int labs, uint16_t dclass, uint16_t dtype); 285b7579f77SDag-Erling Smørgrav 286b7579f77SDag-Erling Smørgrav /** 287b7579f77SDag-Erling Smørgrav * Debug helper. Print all zones 288b7579f77SDag-Erling Smørgrav * Takes care of locking. 289b7579f77SDag-Erling Smørgrav * @param zones: the zones tree 290b7579f77SDag-Erling Smørgrav */ 291b7579f77SDag-Erling Smørgrav void local_zones_print(struct local_zones* zones); 292b7579f77SDag-Erling Smørgrav 293b7579f77SDag-Erling Smørgrav /** 294b7579f77SDag-Erling Smørgrav * Answer authoritatively for local zones. 295b7579f77SDag-Erling Smørgrav * Takes care of locking. 296b7579f77SDag-Erling Smørgrav * @param zones: the stored zones (shared, read only). 297bc892140SDag-Erling Smørgrav * @param env: the module environment. 298b7579f77SDag-Erling Smørgrav * @param qinfo: query info (parsed). 299b7579f77SDag-Erling Smørgrav * @param edns: edns info (parsed). 300b7579f77SDag-Erling Smørgrav * @param buf: buffer with query ID and flags, also for reply. 301b7579f77SDag-Erling Smørgrav * @param temp: temporary storage region. 3026480faa8SDag-Erling Smørgrav * @param repinfo: source address for checks. may be NULL. 303b5663de9SDag-Erling Smørgrav * @param taglist: taglist for checks. May be NULL. 304b5663de9SDag-Erling Smørgrav * @param taglen: length of the taglist. 305b5663de9SDag-Erling Smørgrav * @param tagactions: local zone actions for tags. May be NULL. 306b5663de9SDag-Erling Smørgrav * @param tagactionssize: length of the tagactions. 307b5663de9SDag-Erling Smørgrav * @param tag_datas: array per tag of strlist with rdata strings. or NULL. 308b5663de9SDag-Erling Smørgrav * @param tag_datas_size: size of tag_datas array. 309b5663de9SDag-Erling Smørgrav * @param tagname: array of tag name strings (for debug output). 310b5663de9SDag-Erling Smørgrav * @param num_tags: number of items in tagname array. 311bc892140SDag-Erling Smørgrav * @param view: answer using this view. May be NULL. 312b7579f77SDag-Erling Smørgrav * @return true if answer is in buffer. false if query is not answered 313b7579f77SDag-Erling Smørgrav * by authority data. If the reply should be dropped altogether, the return 314b7579f77SDag-Erling Smørgrav * value is true, but the buffer is cleared (empty). 315bc892140SDag-Erling Smørgrav * It can also return true if a non-exact alias answer is found. In this 316bc892140SDag-Erling Smørgrav * case qinfo->local_alias points to the corresponding alias RRset but the 317bc892140SDag-Erling Smørgrav * answer is NOT encoded in buffer. It's the caller's responsibility to 318bc892140SDag-Erling Smørgrav * complete the alias chain (if needed) and encode the final set of answer. 319bc892140SDag-Erling Smørgrav * Data pointed to by qinfo->local_alias is allocated in 'temp' or refers to 320bc892140SDag-Erling Smørgrav * configuration data. So the caller will need to make a deep copy of it 321bc892140SDag-Erling Smørgrav * if it needs to keep it beyond the lifetime of 'temp' or a dynamic update 322bc892140SDag-Erling Smørgrav * to local zone data. 323b7579f77SDag-Erling Smørgrav */ 324bc892140SDag-Erling Smørgrav int local_zones_answer(struct local_zones* zones, struct module_env* env, 325bc892140SDag-Erling Smørgrav struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf, 326bc892140SDag-Erling Smørgrav struct regional* temp, struct comm_reply* repinfo, uint8_t* taglist, 327bc892140SDag-Erling Smørgrav size_t taglen, uint8_t* tagactions, size_t tagactionssize, 328b5663de9SDag-Erling Smørgrav struct config_strlist** tag_datas, size_t tag_datas_size, 329bc892140SDag-Erling Smørgrav char** tagname, int num_tags, struct view* view); 330b7579f77SDag-Erling Smørgrav 331b7579f77SDag-Erling Smørgrav /** 332091e9e46SCy Schubert * Answer using the local zone only (not local data used). 333091e9e46SCy Schubert * @param z: zone for query. 334091e9e46SCy Schubert * @param env: module environment. 335091e9e46SCy Schubert * @param qinfo: query. 336091e9e46SCy Schubert * @param edns: edns from query. 337091e9e46SCy Schubert * @param repinfo: source address for checks. may be NULL. 338091e9e46SCy Schubert * @param buf: buffer for answer. 339091e9e46SCy Schubert * @param temp: temp region for encoding. 340091e9e46SCy Schubert * @param ld: local data, if NULL, no such name exists in localdata. 341091e9e46SCy Schubert * @param lz_type: type of the local zone. 342091e9e46SCy Schubert * @return 1 if a reply is to be sent, 0 if not. 343091e9e46SCy Schubert */ 344091e9e46SCy Schubert int 345091e9e46SCy Schubert local_zones_zone_answer(struct local_zone* z, struct module_env* env, 346091e9e46SCy Schubert struct query_info* qinfo, struct edns_data* edns, 347091e9e46SCy Schubert struct comm_reply* repinfo, sldns_buffer* buf, struct regional* temp, 348091e9e46SCy Schubert struct local_data* ld, enum localzone_type lz_type); 349091e9e46SCy Schubert 350091e9e46SCy Schubert /** 351b7579f77SDag-Erling Smørgrav * Parse the string into localzone type. 352b7579f77SDag-Erling Smørgrav * 353b7579f77SDag-Erling Smørgrav * @param str: string to parse 354b7579f77SDag-Erling Smørgrav * @param t: local zone type returned here. 355b7579f77SDag-Erling Smørgrav * @return 0 on parse error. 356b7579f77SDag-Erling Smørgrav */ 357b7579f77SDag-Erling Smørgrav int local_zone_str2type(const char* str, enum localzone_type* t); 358b7579f77SDag-Erling Smørgrav 359b7579f77SDag-Erling Smørgrav /** 360b7579f77SDag-Erling Smørgrav * Print localzone type to a string. Pointer to a constant string. 361b7579f77SDag-Erling Smørgrav * 362b7579f77SDag-Erling Smørgrav * @param t: local zone type. 363b7579f77SDag-Erling Smørgrav * @return constant string that describes type. 364b7579f77SDag-Erling Smørgrav */ 365b7579f77SDag-Erling Smørgrav const char* local_zone_type2str(enum localzone_type t); 366b7579f77SDag-Erling Smørgrav 367b7579f77SDag-Erling Smørgrav /** 368b7579f77SDag-Erling Smørgrav * Find zone that with exactly given name, class. 369b7579f77SDag-Erling Smørgrav * User must lock the tree or result zone. 370b7579f77SDag-Erling Smørgrav * @param zones: the zones tree 371b7579f77SDag-Erling Smørgrav * @param name: dname to lookup 372b7579f77SDag-Erling Smørgrav * @param len: length of name. 373b7579f77SDag-Erling Smørgrav * @param labs: labelcount of name. 374b7579f77SDag-Erling Smørgrav * @param dclass: class to lookup. 375b7579f77SDag-Erling Smørgrav * @return the exact local_zone or NULL. 376b7579f77SDag-Erling Smørgrav */ 377b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_find(struct local_zones* zones, 378b7579f77SDag-Erling Smørgrav uint8_t* name, size_t len, int labs, uint16_t dclass); 379b7579f77SDag-Erling Smørgrav 380b7579f77SDag-Erling Smørgrav /** 381091e9e46SCy Schubert * Find zone that with exactly or smaller name/class 382091e9e46SCy Schubert * User must lock the tree or result zone. 383091e9e46SCy Schubert * @param zones: the zones tree 384091e9e46SCy Schubert * @param name: dname to lookup 385091e9e46SCy Schubert * @param len: length of name. 386091e9e46SCy Schubert * @param labs: labelcount of name. 387091e9e46SCy Schubert * @param dclass: class to lookup. 388091e9e46SCy Schubert * @param exact: 1 on return is this is an exact match. 389091e9e46SCy Schubert * @return the exact or smaller local_zone or NULL. 390091e9e46SCy Schubert */ 391091e9e46SCy Schubert struct local_zone* 392091e9e46SCy Schubert local_zones_find_le(struct local_zones* zones, 393091e9e46SCy Schubert uint8_t* name, size_t len, int labs, uint16_t dclass, 394091e9e46SCy Schubert int* exact); 395091e9e46SCy Schubert 396091e9e46SCy Schubert /** 397b7579f77SDag-Erling Smørgrav * Add a new zone. Caller must hold the zones lock. 398b7579f77SDag-Erling Smørgrav * Adjusts the other zones as well (parent pointers) after insertion. 399b7579f77SDag-Erling Smørgrav * The zone must NOT exist (returns NULL and logs error). 400b7579f77SDag-Erling Smørgrav * @param zones: the zones tree 401b7579f77SDag-Erling Smørgrav * @param name: dname to add 402b7579f77SDag-Erling Smørgrav * @param len: length of name. 403b7579f77SDag-Erling Smørgrav * @param labs: labelcount of name. 404b7579f77SDag-Erling Smørgrav * @param dclass: class to add. 405b7579f77SDag-Erling Smørgrav * @param tp: type. 406b7579f77SDag-Erling Smørgrav * @return local_zone or NULL on error, caller must printout memory error. 407b7579f77SDag-Erling Smørgrav */ 408b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_add_zone(struct local_zones* zones, 409b7579f77SDag-Erling Smørgrav uint8_t* name, size_t len, int labs, uint16_t dclass, 410b7579f77SDag-Erling Smørgrav enum localzone_type tp); 411b7579f77SDag-Erling Smørgrav 412b7579f77SDag-Erling Smørgrav /** 413b7579f77SDag-Erling Smørgrav * Delete a zone. Caller must hold the zones lock. 414b7579f77SDag-Erling Smørgrav * Adjusts the other zones as well (parent pointers) after insertion. 415b7579f77SDag-Erling Smørgrav * @param zones: the zones tree 416b7579f77SDag-Erling Smørgrav * @param zone: the zone to delete from tree. Also deletes zone from memory. 417b7579f77SDag-Erling Smørgrav */ 418b7579f77SDag-Erling Smørgrav void local_zones_del_zone(struct local_zones* zones, struct local_zone* zone); 419b7579f77SDag-Erling Smørgrav 420b7579f77SDag-Erling Smørgrav /** 421b7579f77SDag-Erling Smørgrav * Add RR data into the localzone data. 422b7579f77SDag-Erling Smørgrav * Looks up the zone, if no covering zone, a transparent zone with the 423b7579f77SDag-Erling Smørgrav * name of the RR is created. 424b7579f77SDag-Erling Smørgrav * @param zones: the zones tree. Not locked by caller. 425b7579f77SDag-Erling Smørgrav * @param rr: string with on RR. 426b7579f77SDag-Erling Smørgrav * @return false on failure. 427b7579f77SDag-Erling Smørgrav */ 42817d15b25SDag-Erling Smørgrav int local_zones_add_RR(struct local_zones* zones, const char* rr); 429b7579f77SDag-Erling Smørgrav 430b7579f77SDag-Erling Smørgrav /** 431b7579f77SDag-Erling Smørgrav * Remove data from domain name in the tree. 432b7579f77SDag-Erling Smørgrav * All types are removed. No effect if zone or name does not exist. 433b7579f77SDag-Erling Smørgrav * @param zones: zones tree. 434b7579f77SDag-Erling Smørgrav * @param name: dname to remove 435b7579f77SDag-Erling Smørgrav * @param len: length of name. 436b7579f77SDag-Erling Smørgrav * @param labs: labelcount of name. 437b7579f77SDag-Erling Smørgrav * @param dclass: class to remove. 438b7579f77SDag-Erling Smørgrav */ 439b7579f77SDag-Erling Smørgrav void local_zones_del_data(struct local_zones* zones, 440b7579f77SDag-Erling Smørgrav uint8_t* name, size_t len, int labs, uint16_t dclass); 441b7579f77SDag-Erling Smørgrav 442b7579f77SDag-Erling Smørgrav 443b7579f77SDag-Erling Smørgrav /** 444b7579f77SDag-Erling Smørgrav * Form wireformat from text format domain name. 445b7579f77SDag-Erling Smørgrav * @param str: the domain name in text "www.example.com" 446b7579f77SDag-Erling Smørgrav * @param res: resulting wireformat is stored here with malloc. 447b7579f77SDag-Erling Smørgrav * @param len: length of resulting wireformat. 448b7579f77SDag-Erling Smørgrav * @param labs: number of labels in resulting wireformat. 449b7579f77SDag-Erling Smørgrav * @return false on error, syntax or memory. Also logged. 450b7579f77SDag-Erling Smørgrav */ 451b7579f77SDag-Erling Smørgrav int parse_dname(const char* str, uint8_t** res, size_t* len, int* labs); 452b7579f77SDag-Erling Smørgrav 45365b390aaSDag-Erling Smørgrav /** 45465b390aaSDag-Erling Smørgrav * Find local data tag string match for the given type (in qinfo) in the list. 45565b390aaSDag-Erling Smørgrav * If found, 'r' will be filled with corresponding rrset information. 45665b390aaSDag-Erling Smørgrav * @param qinfo: contains name, type, and class for the data 45765b390aaSDag-Erling Smørgrav * @param list: stores local tag data to be searched 45865b390aaSDag-Erling Smørgrav * @param r: rrset key to be filled for matched data 45965b390aaSDag-Erling Smørgrav * @param temp: region to allocate rrset in 'r' 46065b390aaSDag-Erling Smørgrav * @return 1 if a match is found and rrset is built; otherwise 0 including 46165b390aaSDag-Erling Smørgrav * errors. 46265b390aaSDag-Erling Smørgrav */ 46365b390aaSDag-Erling Smørgrav int local_data_find_tag_datas(const struct query_info* qinfo, 46465b390aaSDag-Erling Smørgrav struct config_strlist* list, struct ub_packed_rrset_key* r, 46565b390aaSDag-Erling Smørgrav struct regional* temp); 46665b390aaSDag-Erling Smørgrav 46765b390aaSDag-Erling Smørgrav /** 46865b390aaSDag-Erling Smørgrav * See if two sets of tag lists (in the form of bitmap) have the same tag that 46965b390aaSDag-Erling Smørgrav * has an action. If so, '*tag' will be set to the found tag index, and the 47065b390aaSDag-Erling Smørgrav * corresponding action will be returned in the form of local zone type. 47165b390aaSDag-Erling Smørgrav * Otherwise the passed type (lzt) will be returned as the default action. 47265b390aaSDag-Erling Smørgrav * Pointers except tagactions must not be NULL. 47365b390aaSDag-Erling Smørgrav * @param taglist: 1st list of tags 47465b390aaSDag-Erling Smørgrav * @param taglen: size of taglist in bytes 47565b390aaSDag-Erling Smørgrav * @param taglist2: 2nd list of tags 47665b390aaSDag-Erling Smørgrav * @param taglen2: size of taglist2 in bytes 47765b390aaSDag-Erling Smørgrav * @param tagactions: local data actions for tags. May be NULL. 47865b390aaSDag-Erling Smørgrav * @param tagactionssize: length of the tagactions. 47965b390aaSDag-Erling Smørgrav * @param lzt: default action (local zone type) if no tag action is found. 48065b390aaSDag-Erling Smørgrav * @param tag: see above. 48165b390aaSDag-Erling Smørgrav * @param tagname: array of tag name strings (for debug output). 48265b390aaSDag-Erling Smørgrav * @param num_tags: number of items in tagname array. 48365b390aaSDag-Erling Smørgrav * @return found tag action or the default action. 48465b390aaSDag-Erling Smørgrav */ 48565b390aaSDag-Erling Smørgrav enum localzone_type local_data_find_tag_action(const uint8_t* taglist, 48665b390aaSDag-Erling Smørgrav size_t taglen, const uint8_t* taglist2, size_t taglen2, 48765b390aaSDag-Erling Smørgrav const uint8_t* tagactions, size_t tagactionssize, 48865b390aaSDag-Erling Smørgrav enum localzone_type lzt, int* tag, char* const* tagname, int num_tags); 48965b390aaSDag-Erling Smørgrav 49065b390aaSDag-Erling Smørgrav /** 491c7f4d7adSDag-Erling Smørgrav * Enter defaults to local zone. 492c7f4d7adSDag-Erling Smørgrav * @param zones: to add defaults to 493c7f4d7adSDag-Erling Smørgrav * @param cfg: containing list of zones to exclude from default set. 494c7f4d7adSDag-Erling Smørgrav * @return 1 on success; 0 otherwise. 495c7f4d7adSDag-Erling Smørgrav */ 496c7f4d7adSDag-Erling Smørgrav int local_zone_enter_defaults(struct local_zones* zones, 497c7f4d7adSDag-Erling Smørgrav struct config_file* cfg); 498c7f4d7adSDag-Erling Smørgrav 499c7f4d7adSDag-Erling Smørgrav /** 50065b390aaSDag-Erling Smørgrav * Parses resource record string into wire format, also returning its field values. 50165b390aaSDag-Erling Smørgrav * @param str: input resource record 50265b390aaSDag-Erling Smørgrav * @param nm: domain name field 50365b390aaSDag-Erling Smørgrav * @param type: record type field 50465b390aaSDag-Erling Smørgrav * @param dclass: record class field 50565b390aaSDag-Erling Smørgrav * @param ttl: ttl field 50665b390aaSDag-Erling Smørgrav * @param rr: buffer for the parsed rr in wire format 50765b390aaSDag-Erling Smørgrav * @param len: buffer length 50865b390aaSDag-Erling Smørgrav * @param rdata: rdata field 50965b390aaSDag-Erling Smørgrav * @param rdata_len: rdata field length 51065b390aaSDag-Erling Smørgrav * @return 1 on success; 0 otherwise. 51165b390aaSDag-Erling Smørgrav */ 51265b390aaSDag-Erling Smørgrav int rrstr_get_rr_content(const char* str, uint8_t** nm, uint16_t* type, 51365b390aaSDag-Erling Smørgrav uint16_t* dclass, time_t* ttl, uint8_t* rr, size_t len, 51465b390aaSDag-Erling Smørgrav uint8_t** rdata, size_t* rdata_len); 51565b390aaSDag-Erling Smørgrav 51665b390aaSDag-Erling Smørgrav /** 51765b390aaSDag-Erling Smørgrav * Insert specified rdata into the specified resource record. 51865b390aaSDag-Erling Smørgrav * @param region: allocator 51965b390aaSDag-Erling Smørgrav * @param pd: data portion of the destination resource record 52065b390aaSDag-Erling Smørgrav * @param rdata: source rdata 52165b390aaSDag-Erling Smørgrav * @param rdata_len: source rdata length 52265b390aaSDag-Erling Smørgrav * @param ttl: time to live 52365b390aaSDag-Erling Smørgrav * @param rrstr: resource record in text form (for logging) 52465b390aaSDag-Erling Smørgrav * @return 1 on success; 0 otherwise. 52565b390aaSDag-Erling Smørgrav */ 52665b390aaSDag-Erling Smørgrav int rrset_insert_rr(struct regional* region, struct packed_rrset_data* pd, 52765b390aaSDag-Erling Smørgrav uint8_t* rdata, size_t rdata_len, time_t ttl, const char* rrstr); 52865b390aaSDag-Erling Smørgrav 52965b390aaSDag-Erling Smørgrav /** 530091e9e46SCy Schubert * Remove RR from rrset that is created using localzone's rrset_insert_rr. 531091e9e46SCy Schubert * @param pd: the RRset containing the RR to remove 532091e9e46SCy Schubert * @param index: index of RR to remove 533091e9e46SCy Schubert * @return: 1 on success; 0 otherwise. 534091e9e46SCy Schubert */ 535091e9e46SCy Schubert int 536091e9e46SCy Schubert local_rrset_remove_rr(struct packed_rrset_data* pd, size_t index); 537091e9e46SCy Schubert 538091e9e46SCy Schubert /** 53965b390aaSDag-Erling Smørgrav * Valid response ip actions for the IP-response-driven-action feature; 54065b390aaSDag-Erling Smørgrav * defined here instead of in the respip module to enable sharing of enum 54165b390aaSDag-Erling Smørgrav * values with the localzone_type enum. 54265b390aaSDag-Erling Smørgrav * Note that these values except 'none' are the same as localzone types of 54365b390aaSDag-Erling Smørgrav * the 'same semantics'. It's intentional as we use these values via 54465b390aaSDag-Erling Smørgrav * access-control-tags, which can be shared for both response ip actions and 54565b390aaSDag-Erling Smørgrav * local zones. 54665b390aaSDag-Erling Smørgrav */ 54765b390aaSDag-Erling Smørgrav enum respip_action { 54865b390aaSDag-Erling Smørgrav /** no respip action */ 54965b390aaSDag-Erling Smørgrav respip_none = local_zone_unset, 55065b390aaSDag-Erling Smørgrav /** don't answer */ 55165b390aaSDag-Erling Smørgrav respip_deny = local_zone_deny, 55265b390aaSDag-Erling Smørgrav /** redirect as per provided data */ 55365b390aaSDag-Erling Smørgrav respip_redirect = local_zone_redirect, 55465b390aaSDag-Erling Smørgrav /** log query source and answer query */ 55565b390aaSDag-Erling Smørgrav respip_inform = local_zone_inform, 55665b390aaSDag-Erling Smørgrav /** log query source and don't answer query */ 55765b390aaSDag-Erling Smørgrav respip_inform_deny = local_zone_inform_deny, 558e86b9096SDag-Erling Smørgrav /** log query source and redirect */ 559e86b9096SDag-Erling Smørgrav respip_inform_redirect = local_zone_inform_redirect, 56065b390aaSDag-Erling Smørgrav /** resolve normally, even when there is response-ip data */ 56165b390aaSDag-Erling Smørgrav respip_always_transparent = local_zone_always_transparent, 56265b390aaSDag-Erling Smørgrav /** answer with 'refused' response */ 56365b390aaSDag-Erling Smørgrav respip_always_refuse = local_zone_always_refuse, 56465b390aaSDag-Erling Smørgrav /** answer with 'no such domain' response */ 56565b390aaSDag-Erling Smørgrav respip_always_nxdomain = local_zone_always_nxdomain, 566091e9e46SCy Schubert /** answer with nodata response */ 567091e9e46SCy Schubert respip_always_nodata = local_zone_always_nodata, 568091e9e46SCy Schubert /** answer with nodata response */ 569091e9e46SCy Schubert respip_always_deny = local_zone_always_deny, 57024e36522SCy Schubert /** RPZ: truncate answer in order to force switch to tcp */ 57124e36522SCy Schubert respip_truncate = local_zone_truncate, 57265b390aaSDag-Erling Smørgrav 57365b390aaSDag-Erling Smørgrav /* The rest of the values are only possible as 57465b390aaSDag-Erling Smørgrav * access-control-tag-action */ 57565b390aaSDag-Erling Smørgrav 57665b390aaSDag-Erling Smørgrav /** serves response data (if any), else, drops queries. */ 57765b390aaSDag-Erling Smørgrav respip_refuse = local_zone_refuse, 57865b390aaSDag-Erling Smørgrav /** serves response data, else, nodata answer. */ 57965b390aaSDag-Erling Smørgrav respip_static = local_zone_static, 58065b390aaSDag-Erling Smørgrav /** gives response data (if any), else nodata answer. */ 58165b390aaSDag-Erling Smørgrav respip_transparent = local_zone_transparent, 58265b390aaSDag-Erling Smørgrav /** gives response data (if any), else nodata answer. */ 58365b390aaSDag-Erling Smørgrav respip_typetransparent = local_zone_typetransparent, 584091e9e46SCy Schubert /** type invalid */ 585091e9e46SCy Schubert respip_invalid = local_zone_invalid, 58665b390aaSDag-Erling Smørgrav }; 58765b390aaSDag-Erling Smørgrav 588091e9e46SCy Schubert /** 589091e9e46SCy Schubert * Get local data from local zone and encode answer. 590091e9e46SCy Schubert * @param z: local zone to use 591091e9e46SCy Schubert * @param env: module env 592091e9e46SCy Schubert * @param qinfo: qinfo 593091e9e46SCy Schubert * @param edns: edns data, for message encoding 594091e9e46SCy Schubert * @param repinfo: reply info, for message encoding 595091e9e46SCy Schubert * @param buf: commpoint buffer 596091e9e46SCy Schubert * @param temp: scratchpad region 597091e9e46SCy Schubert * @param labs: number of labels in qname 598091e9e46SCy Schubert * @param ldp: where to store local data 599091e9e46SCy Schubert * @param lz_type: type of local zone 600091e9e46SCy Schubert * @param tag: matching tag index 601091e9e46SCy Schubert * @param tag_datas: alc specific tag data list 602091e9e46SCy Schubert * @param tag_datas_size: size of tag_datas 603091e9e46SCy Schubert * @param tagname: list of names of tags, for logging purpose 604091e9e46SCy Schubert * @param num_tags: number of tags 605091e9e46SCy Schubert * @return 1 on success 606091e9e46SCy Schubert */ 607091e9e46SCy Schubert int 608091e9e46SCy Schubert local_data_answer(struct local_zone* z, struct module_env* env, 609091e9e46SCy Schubert struct query_info* qinfo, struct edns_data* edns, 610091e9e46SCy Schubert struct comm_reply* repinfo, sldns_buffer* buf, 611091e9e46SCy Schubert struct regional* temp, int labs, struct local_data** ldp, 612091e9e46SCy Schubert enum localzone_type lz_type, int tag, struct config_strlist** tag_datas, 613091e9e46SCy Schubert size_t tag_datas_size, char** tagname, int num_tags); 614091e9e46SCy Schubert 615091e9e46SCy Schubert /** 616091e9e46SCy Schubert * Add RR to local zone. 617091e9e46SCy Schubert * @param z: local zone to add RR to 618091e9e46SCy Schubert * @param nm: dname of RR 619091e9e46SCy Schubert * @param nmlen: length of nm 620091e9e46SCy Schubert * @param nmlabs: number of labels of nm 621091e9e46SCy Schubert * @param rrtype: RR type 622091e9e46SCy Schubert * @param rrclass: RR class 623091e9e46SCy Schubert * @param ttl: TTL of RR to add 624091e9e46SCy Schubert * @param rdata: RDATA of RR to add 625091e9e46SCy Schubert * @param rdata_len: length of rdata 626091e9e46SCy Schubert * @param rrstr: RR in string format, for logging 627091e9e46SCy Schubert * @return: 1 on success 628091e9e46SCy Schubert */ 629091e9e46SCy Schubert int 630091e9e46SCy Schubert local_zone_enter_rr(struct local_zone* z, uint8_t* nm, size_t nmlen, 631091e9e46SCy Schubert int nmlabs, uint16_t rrtype, uint16_t rrclass, time_t ttl, 632091e9e46SCy Schubert uint8_t* rdata, size_t rdata_len, const char* rrstr); 633091e9e46SCy Schubert 634091e9e46SCy Schubert /** 635091e9e46SCy Schubert * Find a data node by exact name for a local zone 636091e9e46SCy Schubert * @param z: local_zone containing data tree 637091e9e46SCy Schubert * @param nm: name of local-data element to find 638091e9e46SCy Schubert * @param nmlen: length of nm 639091e9e46SCy Schubert * @param nmlabs: labs of nm 640091e9e46SCy Schubert * @return local_data on exact match, NULL otherwise. 641091e9e46SCy Schubert */ 642091e9e46SCy Schubert struct local_data* 643091e9e46SCy Schubert local_zone_find_data(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs); 64456850988SCy Schubert 645*be771a7bSCy Schubert /** Get memory usage for local_zones tree. The routine locks and unlocks 646*be771a7bSCy Schubert * the tree for reading. */ 647*be771a7bSCy Schubert size_t local_zones_get_mem(struct local_zones* zones); 648*be771a7bSCy Schubert 649*be771a7bSCy Schubert /** 650*be771a7bSCy Schubert * Swap internal tree with preallocated entries. Caller should manage 651*be771a7bSCy Schubert * the locks. 652*be771a7bSCy Schubert * @param zones: the local zones structure. 653*be771a7bSCy Schubert * @param data: the data structure used to take elements from. This contains 654*be771a7bSCy Schubert * the old elements on return. 655*be771a7bSCy Schubert */ 656*be771a7bSCy Schubert void local_zones_swap_tree(struct local_zones* zones, 657*be771a7bSCy Schubert struct local_zones* data); 658*be771a7bSCy Schubert 65956850988SCy Schubert /** Enter a new zone; returns with WRlock 66056850988SCy Schubert * Made public for unit testing 66156850988SCy Schubert * @param zones: the local zones tree 66256850988SCy Schubert * @param name: name of the zone 66356850988SCy Schubert * @param type: type of the zone 66456850988SCy Schubert * @param dclass: class of the zone 66556850988SCy Schubert * @return local_zone (or duplicate), NULL on parse and malloc failures 66656850988SCy Schubert */ 66756850988SCy Schubert struct local_zone* 66856850988SCy Schubert lz_enter_zone(struct local_zones* zones, const char* name, const char* type, 66956850988SCy Schubert uint16_t dclass); 67056850988SCy Schubert 67156850988SCy Schubert /** Setup parent pointers, so that a lookup can be done for closest match 67256850988SCy Schubert * Made public for unit testing 67356850988SCy Schubert * @param zones: the local zones tree 67456850988SCy Schubert */ 67556850988SCy Schubert void 67656850988SCy Schubert lz_init_parents(struct local_zones* zones); 677b7579f77SDag-Erling Smørgrav #endif /* SERVICES_LOCALZONE_H */ 678