1 /* 2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 3 * 4 * SPDX-License-Identifier: MPL-2.0 5 * 6 * This Source Code Form is subject to the terms of the Mozilla Public 7 * License, v. 2.0. If a copy of the MPL was not distributed with this 8 * file, you can obtain one at https://mozilla.org/MPL/2.0/. 9 * 10 * See the COPYRIGHT file distributed with this work for additional 11 * information regarding copyright ownership. 12 */ 13 14 #ifndef DNS_PEER_H 15 #define DNS_PEER_H 1 16 17 /***** 18 ***** Module Info 19 *****/ 20 21 /*! \file dns/peer.h 22 * \brief 23 * Data structures for peers (e.g. a 'server' config file statement) 24 */ 25 26 /*** 27 *** Imports 28 ***/ 29 30 #include <inttypes.h> 31 #include <stdbool.h> 32 33 #include <isc/lang.h> 34 #include <isc/magic.h> 35 #include <isc/netaddr.h> 36 #include <isc/refcount.h> 37 38 #include <dns/types.h> 39 40 #define DNS_PEERLIST_MAGIC ISC_MAGIC('s', 'e', 'R', 'L') 41 #define DNS_PEER_MAGIC ISC_MAGIC('S', 'E', 'r', 'v') 42 43 #define DNS_PEERLIST_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_PEERLIST_MAGIC) 44 #define DNS_PEER_VALID(ptr) ISC_MAGIC_VALID(ptr, DNS_PEER_MAGIC) 45 46 /*** 47 *** Types 48 ***/ 49 50 struct dns_peerlist { 51 unsigned int magic; 52 isc_refcount_t refs; 53 54 isc_mem_t *mem; 55 56 ISC_LIST(dns_peer_t) elements; 57 }; 58 59 struct dns_peer { 60 unsigned int magic; 61 isc_refcount_t refs; 62 63 isc_mem_t *mem; 64 65 isc_netaddr_t address; 66 unsigned int prefixlen; 67 bool bogus; 68 dns_transfer_format_t transfer_format; 69 uint32_t transfers; 70 bool support_ixfr; 71 bool provide_ixfr; 72 bool request_ixfr; 73 bool support_edns; 74 bool request_nsid; 75 bool send_cookie; 76 bool request_expire; 77 bool force_tcp; 78 bool tcp_keepalive; 79 dns_name_t *key; 80 isc_sockaddr_t *transfer_source; 81 isc_dscp_t transfer_dscp; 82 isc_sockaddr_t *notify_source; 83 isc_dscp_t notify_dscp; 84 isc_sockaddr_t *query_source; 85 isc_dscp_t query_dscp; 86 uint16_t udpsize; /* receive size */ 87 uint16_t maxudp; /* transmit size */ 88 uint16_t padding; /* pad block size */ 89 uint8_t ednsversion; /* edns version */ 90 91 uint32_t bitflags; 92 93 ISC_LINK(dns_peer_t) next; 94 }; 95 96 /*** 97 *** Functions 98 ***/ 99 100 ISC_LANG_BEGINDECLS 101 102 isc_result_t 103 dns_peerlist_new(isc_mem_t *mem, dns_peerlist_t **list); 104 105 void 106 dns_peerlist_attach(dns_peerlist_t *source, dns_peerlist_t **target); 107 108 void 109 dns_peerlist_detach(dns_peerlist_t **list); 110 111 /* 112 * After return caller still holds a reference to peer. 113 */ 114 void 115 dns_peerlist_addpeer(dns_peerlist_t *peers, dns_peer_t *peer); 116 117 /* 118 * Ditto. */ 119 isc_result_t 120 dns_peerlist_peerbyaddr(dns_peerlist_t *peers, const isc_netaddr_t *addr, 121 dns_peer_t **retval); 122 123 /* 124 * What he said. 125 */ 126 isc_result_t 127 dns_peerlist_currpeer(dns_peerlist_t *peers, dns_peer_t **retval); 128 129 isc_result_t 130 dns_peer_new(isc_mem_t *mem, const isc_netaddr_t *ipaddr, dns_peer_t **peer); 131 132 isc_result_t 133 dns_peer_newprefix(isc_mem_t *mem, const isc_netaddr_t *ipaddr, 134 unsigned int prefixlen, dns_peer_t **peer); 135 136 void 137 dns_peer_attach(dns_peer_t *source, dns_peer_t **target); 138 139 void 140 dns_peer_detach(dns_peer_t **list); 141 142 isc_result_t 143 dns_peer_setbogus(dns_peer_t *peer, bool newval); 144 145 isc_result_t 146 dns_peer_getbogus(dns_peer_t *peer, bool *retval); 147 148 isc_result_t 149 dns_peer_setrequestixfr(dns_peer_t *peer, bool newval); 150 151 isc_result_t 152 dns_peer_getrequestixfr(dns_peer_t *peer, bool *retval); 153 154 isc_result_t 155 dns_peer_setprovideixfr(dns_peer_t *peer, bool newval); 156 157 isc_result_t 158 dns_peer_getprovideixfr(dns_peer_t *peer, bool *retval); 159 160 isc_result_t 161 dns_peer_setrequestnsid(dns_peer_t *peer, bool newval); 162 163 isc_result_t 164 dns_peer_getrequestnsid(dns_peer_t *peer, bool *retval); 165 166 isc_result_t 167 dns_peer_setsendcookie(dns_peer_t *peer, bool newval); 168 169 isc_result_t 170 dns_peer_getsendcookie(dns_peer_t *peer, bool *retval); 171 172 isc_result_t 173 dns_peer_setrequestexpire(dns_peer_t *peer, bool newval); 174 175 isc_result_t 176 dns_peer_getrequestexpire(dns_peer_t *peer, bool *retval); 177 178 isc_result_t 179 dns_peer_setsupportedns(dns_peer_t *peer, bool newval); 180 181 isc_result_t 182 dns_peer_getforcetcp(dns_peer_t *peer, bool *retval); 183 184 isc_result_t 185 dns_peer_setforcetcp(dns_peer_t *peer, bool newval); 186 187 isc_result_t 188 dns_peer_gettcpkeepalive(dns_peer_t *peer, bool *retval); 189 190 isc_result_t 191 dns_peer_settcpkeepalive(dns_peer_t *peer, bool newval); 192 193 isc_result_t 194 dns_peer_getsupportedns(dns_peer_t *peer, bool *retval); 195 196 isc_result_t 197 dns_peer_settransfers(dns_peer_t *peer, uint32_t newval); 198 199 isc_result_t 200 dns_peer_gettransfers(dns_peer_t *peer, uint32_t *retval); 201 202 isc_result_t 203 dns_peer_settransferformat(dns_peer_t *peer, dns_transfer_format_t newval); 204 205 isc_result_t 206 dns_peer_gettransferformat(dns_peer_t *peer, dns_transfer_format_t *retval); 207 208 isc_result_t 209 dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval); 210 211 isc_result_t 212 dns_peer_getkey(dns_peer_t *peer, dns_name_t **retval); 213 214 isc_result_t 215 dns_peer_setkey(dns_peer_t *peer, dns_name_t **keyval); 216 217 isc_result_t 218 dns_peer_settransfersource(dns_peer_t *peer, 219 const isc_sockaddr_t *transfer_source); 220 221 isc_result_t 222 dns_peer_gettransfersource(dns_peer_t *peer, isc_sockaddr_t *transfer_source); 223 224 isc_result_t 225 dns_peer_setudpsize(dns_peer_t *peer, uint16_t udpsize); 226 227 isc_result_t 228 dns_peer_getudpsize(dns_peer_t *peer, uint16_t *udpsize); 229 230 isc_result_t 231 dns_peer_setmaxudp(dns_peer_t *peer, uint16_t maxudp); 232 233 isc_result_t 234 dns_peer_getmaxudp(dns_peer_t *peer, uint16_t *maxudp); 235 236 isc_result_t 237 dns_peer_setpadding(dns_peer_t *peer, uint16_t padding); 238 239 isc_result_t 240 dns_peer_getpadding(dns_peer_t *peer, uint16_t *padding); 241 242 isc_result_t 243 dns_peer_setnotifysource(dns_peer_t *peer, const isc_sockaddr_t *notify_source); 244 245 isc_result_t 246 dns_peer_getnotifysource(dns_peer_t *peer, isc_sockaddr_t *notify_source); 247 248 isc_result_t 249 dns_peer_setquerysource(dns_peer_t *peer, const isc_sockaddr_t *query_source); 250 251 isc_result_t 252 dns_peer_getquerysource(dns_peer_t *peer, isc_sockaddr_t *query_source); 253 254 isc_result_t 255 dns_peer_setnotifydscp(dns_peer_t *peer, isc_dscp_t dscp); 256 257 isc_result_t 258 dns_peer_getnotifydscp(dns_peer_t *peer, isc_dscp_t *dscpp); 259 260 isc_result_t 261 dns_peer_settransferdscp(dns_peer_t *peer, isc_dscp_t dscp); 262 263 isc_result_t 264 dns_peer_gettransferdscp(dns_peer_t *peer, isc_dscp_t *dscpp); 265 266 isc_result_t 267 dns_peer_setquerydscp(dns_peer_t *peer, isc_dscp_t dscp); 268 269 isc_result_t 270 dns_peer_getquerydscp(dns_peer_t *peer, isc_dscp_t *dscpp); 271 272 isc_result_t 273 dns_peer_setednsversion(dns_peer_t *peer, uint8_t ednsversion); 274 275 isc_result_t 276 dns_peer_getednsversion(dns_peer_t *peer, uint8_t *ednsversion); 277 ISC_LANG_ENDDECLS 278 279 #endif /* DNS_PEER_H */ 280