1 /* 2 * edns-subnet/subnet-whitelist.h - Hosts we actively try to send subnet option 3 * to. 4 * 5 * Copyright (c) 2013, NLnet Labs. All rights reserved. 6 * 7 * This software is open source. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * Redistributions of source code must retain the above copyright notice, 14 * this list of conditions and the following disclaimer. 15 * 16 * Redistributions in binary form must reproduce the above copyright notice, 17 * this list of conditions and the following disclaimer in the documentation 18 * and/or other materials provided with the distribution. 19 * 20 * Neither the name of the NLNET LABS nor the names of its contributors may 21 * be used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 28 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 30 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 31 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 32 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 */ 36 /** 37 * \file 38 * 39 * Keep track of the white listed servers and domain names for subnet option. 40 * Based on acl_list.c|h 41 */ 42 43 #ifndef EDNSSUBNET_WHITELIST_H 44 #define EDNSSUBNET_WHITELIST_H 45 #include "util/storage/dnstree.h" 46 47 struct config_file; 48 struct regional; 49 50 /** 51 * ecs_whitelist structure 52 */ 53 struct ecs_whitelist { 54 /** regional for allocation */ 55 struct regional* region; 56 /** 57 * Tree of the address spans that are whitelisted. 58 * contents of type addr_tree_node. Each node is an address span 59 * Unbound will append subnet option for. 60 */ 61 rbtree_type upstream; 62 /** 63 * Tree of domain names for which Unbound will append an ECS option. 64 * rbtree of struct name_tree_node. 65 */ 66 rbtree_type dname; 67 }; 68 69 /** 70 * Create ecs_whitelist structure 71 * @return new structure or NULL on error. 72 */ 73 struct ecs_whitelist* ecs_whitelist_create(void); 74 75 /** 76 * Delete ecs_whitelist structure. 77 * @param whitelist: to delete. 78 */ 79 void ecs_whitelist_delete(struct ecs_whitelist* whitelist); 80 81 /** 82 * Process ecs_whitelist config. 83 * @param whitelist: where to store. 84 * @param cfg: config options. 85 * @return 0 on error. 86 */ 87 int ecs_whitelist_apply_cfg(struct ecs_whitelist* whitelist, 88 struct config_file* cfg); 89 90 /** 91 * See if an address or domain is whitelisted. 92 * @param whitelist: structure for address storage. 93 * @param addr: address to check 94 * @param addrlen: length of addr. 95 * @param qname: dname in query 96 * @param qname_len: length of dname 97 * @param qclass: class in query 98 * @return: true if the address is whitelisted for subnet option. 99 */ 100 int ecs_is_whitelisted(struct ecs_whitelist* whitelist, 101 struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* qname, 102 size_t qname_len, uint16_t qclass); 103 104 /** 105 * Get memory used by ecs_whitelist structure. 106 * @param whitelist: structure for address storage. 107 * @return bytes in use. 108 */ 109 size_t ecs_whitelist_get_mem(struct ecs_whitelist* whitelist); 110 111 #endif /* EDNSSUBNET_WHITELIST_H */ 112