2 * edns-subnet/subnetmod.h - edns subnet module. Must be called before validator
5 * Copyright (c) 2013, NLnet Labs. All rights reserved.
7 * This software is open source.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
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.
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.
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.
38 * subnet module for unbound.
43 #include "util/module.h"
44 #include "services/outbound_list.h"
45 #include "util/alloc.h"
46 #include "util/net_help.h"
47 #include "util/storage/slabhash.h"
48 #include "edns-subnet/addrtree.h"
49 #include "edns-subnet/edns-subnet.h"
52 * Global state for the subnet module.
55 /** shared message cache
56 * key: struct query_info*
57 * data: struct subnet_msg_cache_data* */
58 struct slabhash* subnet_msg_cache;
59 /** access control, which upstream servers we send client address */
60 struct ednssubnet_upstream* edns_subnet_upstreams;
61 /** allocation service */
62 struct alloc_cache alloc;
66 struct subnet_msg_cache_data {
67 struct addrtree* tree4;
68 struct addrtree* tree6;
71 struct subnet_qstate {
72 /** We need the hash for both cache lookup and insert */
73 hashvalue_type qinfo_hash;
74 /** ecs_data for client communication */
75 struct ecs_data ecs_client_in;
76 struct ecs_data ecs_client_out;
77 /** ecss data for server communication */
78 struct ecs_data ecs_server_in;
79 struct ecs_data ecs_server_out;
80 int subnet_downstream;
84 void subnet_data_delete(void* d, void* ATTR_UNUSED(arg));
85 size_t msg_cache_sizefunc(void* k, void* d);
88 * Get the module function block.
89 * @return: function block with function pointers to module methods.
91 struct module_func_block* subnetmod_get_funcblock(void);
93 /** subnet module init */
94 int subnetmod_init(struct module_env* env, int id);
96 /** subnet module deinit */
97 void subnetmod_deinit(struct module_env* env, int id);
99 /** subnet module operate on a query */
100 void subnetmod_operate(struct module_qstate* qstate, enum module_ev event,
101 int id, struct outbound_entry* outbound);
104 void subnetmod_inform_super(struct module_qstate* qstate, int id,
105 struct module_qstate* super);
107 /** subnet module cleanup query state */
108 void subnetmod_clear(struct module_qstate* qstate, int id);
110 /** subnet module alloc size routine */
111 size_t subnetmod_get_mem(struct module_env* env, int id);
113 /** Wrappers for static functions to unit test */
114 size_t unittest_wrapper_subnetmod_sizefunc(void *elemptr);
116 /** Whitelist check, called just before query is sent upstream. */
117 int ecs_whitelist_check(struct query_info* qinfo, uint16_t flags,
118 struct module_qstate* qstate, struct sockaddr_storage* addr,
119 socklen_t addrlen, uint8_t* zone, size_t zonelen,
120 struct regional* region, int id, void* cbargs);
122 /** Check whether reponse from server contains ECS record, if so, skip cache
123 * store. Called just after parsing EDNS data from server. */
124 int ecs_edns_back_parsed(struct module_qstate* qstate, int id, void* cbargs);
126 /** Remove ECS record from back_out when query resulted in REFUSED response. */
127 int ecs_query_response(struct module_qstate* qstate, struct dns_msg* response,
128 int id, void* cbargs);
130 #endif /* SUBNETMOD_H */