1*00b67f09SDavid van Moolenbroek /* $NetBSD: peer.c,v 1.7 2014/12/10 04:37:58 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004-2009, 2012-2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: peer.c,v 1.33 2009/09/02 23:48:02 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek /*! \file */
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <config.h>
25*00b67f09SDavid van Moolenbroek
26*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
27*00b67f09SDavid van Moolenbroek #include <isc/string.h>
28*00b67f09SDavid van Moolenbroek #include <isc/util.h>
29*00b67f09SDavid van Moolenbroek #include <isc/sockaddr.h>
30*00b67f09SDavid van Moolenbroek
31*00b67f09SDavid van Moolenbroek #include <dns/bit.h>
32*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
33*00b67f09SDavid van Moolenbroek #include <dns/name.h>
34*00b67f09SDavid van Moolenbroek #include <dns/peer.h>
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek /*%
37*00b67f09SDavid van Moolenbroek * Bit positions in the dns_peer_t structure flags field
38*00b67f09SDavid van Moolenbroek */
39*00b67f09SDavid van Moolenbroek #define BOGUS_BIT 0
40*00b67f09SDavid van Moolenbroek #define SERVER_TRANSFER_FORMAT_BIT 1
41*00b67f09SDavid van Moolenbroek #define TRANSFERS_BIT 2
42*00b67f09SDavid van Moolenbroek #define PROVIDE_IXFR_BIT 3
43*00b67f09SDavid van Moolenbroek #define REQUEST_IXFR_BIT 4
44*00b67f09SDavid van Moolenbroek #define SUPPORT_EDNS_BIT 5
45*00b67f09SDavid van Moolenbroek #define SERVER_UDPSIZE_BIT 6
46*00b67f09SDavid van Moolenbroek #define SERVER_MAXUDP_BIT 7
47*00b67f09SDavid van Moolenbroek #define REQUEST_NSID_BIT 8
48*00b67f09SDavid van Moolenbroek #define REQUEST_SIT_BIT 9
49*00b67f09SDavid van Moolenbroek #define NOTIFY_DSCP_BIT 10
50*00b67f09SDavid van Moolenbroek #define TRANSFER_DSCP_BIT 11
51*00b67f09SDavid van Moolenbroek #define QUERY_DSCP_BIT 12
52*00b67f09SDavid van Moolenbroek
53*00b67f09SDavid van Moolenbroek static void
54*00b67f09SDavid van Moolenbroek peerlist_delete(dns_peerlist_t **list);
55*00b67f09SDavid van Moolenbroek
56*00b67f09SDavid van Moolenbroek static void
57*00b67f09SDavid van Moolenbroek peer_delete(dns_peer_t **peer);
58*00b67f09SDavid van Moolenbroek
59*00b67f09SDavid van Moolenbroek isc_result_t
dns_peerlist_new(isc_mem_t * mem,dns_peerlist_t ** list)60*00b67f09SDavid van Moolenbroek dns_peerlist_new(isc_mem_t *mem, dns_peerlist_t **list) {
61*00b67f09SDavid van Moolenbroek dns_peerlist_t *l;
62*00b67f09SDavid van Moolenbroek
63*00b67f09SDavid van Moolenbroek REQUIRE(list != NULL);
64*00b67f09SDavid van Moolenbroek
65*00b67f09SDavid van Moolenbroek l = isc_mem_get(mem, sizeof(*l));
66*00b67f09SDavid van Moolenbroek if (l == NULL)
67*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
68*00b67f09SDavid van Moolenbroek
69*00b67f09SDavid van Moolenbroek ISC_LIST_INIT(l->elements);
70*00b67f09SDavid van Moolenbroek l->mem = mem;
71*00b67f09SDavid van Moolenbroek l->refs = 1;
72*00b67f09SDavid van Moolenbroek l->magic = DNS_PEERLIST_MAGIC;
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek *list = l;
75*00b67f09SDavid van Moolenbroek
76*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
77*00b67f09SDavid van Moolenbroek }
78*00b67f09SDavid van Moolenbroek
79*00b67f09SDavid van Moolenbroek void
dns_peerlist_attach(dns_peerlist_t * source,dns_peerlist_t ** target)80*00b67f09SDavid van Moolenbroek dns_peerlist_attach(dns_peerlist_t *source, dns_peerlist_t **target) {
81*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEERLIST_VALID(source));
82*00b67f09SDavid van Moolenbroek REQUIRE(target != NULL);
83*00b67f09SDavid van Moolenbroek REQUIRE(*target == NULL);
84*00b67f09SDavid van Moolenbroek
85*00b67f09SDavid van Moolenbroek source->refs++;
86*00b67f09SDavid van Moolenbroek
87*00b67f09SDavid van Moolenbroek ENSURE(source->refs != 0xffffffffU);
88*00b67f09SDavid van Moolenbroek
89*00b67f09SDavid van Moolenbroek *target = source;
90*00b67f09SDavid van Moolenbroek }
91*00b67f09SDavid van Moolenbroek
92*00b67f09SDavid van Moolenbroek void
dns_peerlist_detach(dns_peerlist_t ** list)93*00b67f09SDavid van Moolenbroek dns_peerlist_detach(dns_peerlist_t **list) {
94*00b67f09SDavid van Moolenbroek dns_peerlist_t *plist;
95*00b67f09SDavid van Moolenbroek
96*00b67f09SDavid van Moolenbroek REQUIRE(list != NULL);
97*00b67f09SDavid van Moolenbroek REQUIRE(*list != NULL);
98*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEERLIST_VALID(*list));
99*00b67f09SDavid van Moolenbroek
100*00b67f09SDavid van Moolenbroek plist = *list;
101*00b67f09SDavid van Moolenbroek *list = NULL;
102*00b67f09SDavid van Moolenbroek
103*00b67f09SDavid van Moolenbroek REQUIRE(plist->refs > 0);
104*00b67f09SDavid van Moolenbroek
105*00b67f09SDavid van Moolenbroek plist->refs--;
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek if (plist->refs == 0)
108*00b67f09SDavid van Moolenbroek peerlist_delete(&plist);
109*00b67f09SDavid van Moolenbroek }
110*00b67f09SDavid van Moolenbroek
111*00b67f09SDavid van Moolenbroek static void
peerlist_delete(dns_peerlist_t ** list)112*00b67f09SDavid van Moolenbroek peerlist_delete(dns_peerlist_t **list) {
113*00b67f09SDavid van Moolenbroek dns_peerlist_t *l;
114*00b67f09SDavid van Moolenbroek dns_peer_t *server, *stmp;
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroek REQUIRE(list != NULL);
117*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEERLIST_VALID(*list));
118*00b67f09SDavid van Moolenbroek
119*00b67f09SDavid van Moolenbroek l = *list;
120*00b67f09SDavid van Moolenbroek
121*00b67f09SDavid van Moolenbroek REQUIRE(l->refs == 0);
122*00b67f09SDavid van Moolenbroek
123*00b67f09SDavid van Moolenbroek server = ISC_LIST_HEAD(l->elements);
124*00b67f09SDavid van Moolenbroek while (server != NULL) {
125*00b67f09SDavid van Moolenbroek stmp = ISC_LIST_NEXT(server, next);
126*00b67f09SDavid van Moolenbroek ISC_LIST_UNLINK(l->elements, server, next);
127*00b67f09SDavid van Moolenbroek dns_peer_detach(&server);
128*00b67f09SDavid van Moolenbroek server = stmp;
129*00b67f09SDavid van Moolenbroek }
130*00b67f09SDavid van Moolenbroek
131*00b67f09SDavid van Moolenbroek l->magic = 0;
132*00b67f09SDavid van Moolenbroek isc_mem_put(l->mem, l, sizeof(*l));
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek *list = NULL;
135*00b67f09SDavid van Moolenbroek }
136*00b67f09SDavid van Moolenbroek
137*00b67f09SDavid van Moolenbroek void
dns_peerlist_addpeer(dns_peerlist_t * peers,dns_peer_t * peer)138*00b67f09SDavid van Moolenbroek dns_peerlist_addpeer(dns_peerlist_t *peers, dns_peer_t *peer) {
139*00b67f09SDavid van Moolenbroek dns_peer_t *p = NULL;
140*00b67f09SDavid van Moolenbroek
141*00b67f09SDavid van Moolenbroek dns_peer_attach(peer, &p);
142*00b67f09SDavid van Moolenbroek
143*00b67f09SDavid van Moolenbroek /*
144*00b67f09SDavid van Moolenbroek * More specifics to front of list.
145*00b67f09SDavid van Moolenbroek */
146*00b67f09SDavid van Moolenbroek for (p = ISC_LIST_HEAD(peers->elements);
147*00b67f09SDavid van Moolenbroek p != NULL;
148*00b67f09SDavid van Moolenbroek p = ISC_LIST_NEXT(p, next))
149*00b67f09SDavid van Moolenbroek if (p->prefixlen < peer->prefixlen)
150*00b67f09SDavid van Moolenbroek break;
151*00b67f09SDavid van Moolenbroek
152*00b67f09SDavid van Moolenbroek if (p != NULL)
153*00b67f09SDavid van Moolenbroek ISC_LIST_INSERTBEFORE(peers->elements, p, peer, next);
154*00b67f09SDavid van Moolenbroek else
155*00b67f09SDavid van Moolenbroek ISC_LIST_APPEND(peers->elements, peer, next);
156*00b67f09SDavid van Moolenbroek
157*00b67f09SDavid van Moolenbroek }
158*00b67f09SDavid van Moolenbroek
159*00b67f09SDavid van Moolenbroek isc_result_t
dns_peerlist_peerbyaddr(dns_peerlist_t * servers,isc_netaddr_t * addr,dns_peer_t ** retval)160*00b67f09SDavid van Moolenbroek dns_peerlist_peerbyaddr(dns_peerlist_t *servers,
161*00b67f09SDavid van Moolenbroek isc_netaddr_t *addr, dns_peer_t **retval)
162*00b67f09SDavid van Moolenbroek {
163*00b67f09SDavid van Moolenbroek dns_peer_t *server;
164*00b67f09SDavid van Moolenbroek isc_result_t res;
165*00b67f09SDavid van Moolenbroek
166*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
167*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEERLIST_VALID(servers));
168*00b67f09SDavid van Moolenbroek
169*00b67f09SDavid van Moolenbroek server = ISC_LIST_HEAD(servers->elements);
170*00b67f09SDavid van Moolenbroek while (server != NULL) {
171*00b67f09SDavid van Moolenbroek if (isc_netaddr_eqprefix(addr, &server->address,
172*00b67f09SDavid van Moolenbroek server->prefixlen))
173*00b67f09SDavid van Moolenbroek break;
174*00b67f09SDavid van Moolenbroek
175*00b67f09SDavid van Moolenbroek server = ISC_LIST_NEXT(server, next);
176*00b67f09SDavid van Moolenbroek }
177*00b67f09SDavid van Moolenbroek
178*00b67f09SDavid van Moolenbroek if (server != NULL) {
179*00b67f09SDavid van Moolenbroek *retval = server;
180*00b67f09SDavid van Moolenbroek res = ISC_R_SUCCESS;
181*00b67f09SDavid van Moolenbroek } else {
182*00b67f09SDavid van Moolenbroek res = ISC_R_NOTFOUND;
183*00b67f09SDavid van Moolenbroek }
184*00b67f09SDavid van Moolenbroek
185*00b67f09SDavid van Moolenbroek return (res);
186*00b67f09SDavid van Moolenbroek }
187*00b67f09SDavid van Moolenbroek
188*00b67f09SDavid van Moolenbroek
189*00b67f09SDavid van Moolenbroek
190*00b67f09SDavid van Moolenbroek isc_result_t
dns_peerlist_currpeer(dns_peerlist_t * peers,dns_peer_t ** retval)191*00b67f09SDavid van Moolenbroek dns_peerlist_currpeer(dns_peerlist_t *peers, dns_peer_t **retval) {
192*00b67f09SDavid van Moolenbroek dns_peer_t *p = NULL;
193*00b67f09SDavid van Moolenbroek
194*00b67f09SDavid van Moolenbroek p = ISC_LIST_TAIL(peers->elements);
195*00b67f09SDavid van Moolenbroek
196*00b67f09SDavid van Moolenbroek dns_peer_attach(p, retval);
197*00b67f09SDavid van Moolenbroek
198*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
199*00b67f09SDavid van Moolenbroek }
200*00b67f09SDavid van Moolenbroek
201*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_new(isc_mem_t * mem,isc_netaddr_t * addr,dns_peer_t ** peerptr)202*00b67f09SDavid van Moolenbroek dns_peer_new(isc_mem_t *mem, isc_netaddr_t *addr, dns_peer_t **peerptr) {
203*00b67f09SDavid van Moolenbroek unsigned int prefixlen = 0;
204*00b67f09SDavid van Moolenbroek
205*00b67f09SDavid van Moolenbroek REQUIRE(peerptr != NULL);
206*00b67f09SDavid van Moolenbroek switch(addr->family) {
207*00b67f09SDavid van Moolenbroek case AF_INET:
208*00b67f09SDavid van Moolenbroek prefixlen = 32;
209*00b67f09SDavid van Moolenbroek break;
210*00b67f09SDavid van Moolenbroek case AF_INET6:
211*00b67f09SDavid van Moolenbroek prefixlen = 128;
212*00b67f09SDavid van Moolenbroek break;
213*00b67f09SDavid van Moolenbroek default:
214*00b67f09SDavid van Moolenbroek INSIST(0);
215*00b67f09SDavid van Moolenbroek }
216*00b67f09SDavid van Moolenbroek
217*00b67f09SDavid van Moolenbroek return (dns_peer_newprefix(mem, addr, prefixlen, peerptr));
218*00b67f09SDavid van Moolenbroek }
219*00b67f09SDavid van Moolenbroek
220*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_newprefix(isc_mem_t * mem,isc_netaddr_t * addr,unsigned int prefixlen,dns_peer_t ** peerptr)221*00b67f09SDavid van Moolenbroek dns_peer_newprefix(isc_mem_t *mem, isc_netaddr_t *addr, unsigned int prefixlen,
222*00b67f09SDavid van Moolenbroek dns_peer_t **peerptr)
223*00b67f09SDavid van Moolenbroek {
224*00b67f09SDavid van Moolenbroek dns_peer_t *peer;
225*00b67f09SDavid van Moolenbroek
226*00b67f09SDavid van Moolenbroek REQUIRE(peerptr != NULL);
227*00b67f09SDavid van Moolenbroek
228*00b67f09SDavid van Moolenbroek peer = isc_mem_get(mem, sizeof(*peer));
229*00b67f09SDavid van Moolenbroek if (peer == NULL)
230*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
231*00b67f09SDavid van Moolenbroek
232*00b67f09SDavid van Moolenbroek peer->magic = DNS_PEER_MAGIC;
233*00b67f09SDavid van Moolenbroek peer->address = *addr;
234*00b67f09SDavid van Moolenbroek peer->prefixlen = prefixlen;
235*00b67f09SDavid van Moolenbroek peer->mem = mem;
236*00b67f09SDavid van Moolenbroek peer->bogus = ISC_FALSE;
237*00b67f09SDavid van Moolenbroek peer->transfer_format = dns_one_answer;
238*00b67f09SDavid van Moolenbroek peer->transfers = 0;
239*00b67f09SDavid van Moolenbroek peer->request_ixfr = ISC_FALSE;
240*00b67f09SDavid van Moolenbroek peer->provide_ixfr = ISC_FALSE;
241*00b67f09SDavid van Moolenbroek peer->key = NULL;
242*00b67f09SDavid van Moolenbroek peer->refs = 1;
243*00b67f09SDavid van Moolenbroek peer->transfer_source = NULL;
244*00b67f09SDavid van Moolenbroek peer->notify_source = NULL;
245*00b67f09SDavid van Moolenbroek peer->query_source = NULL;
246*00b67f09SDavid van Moolenbroek
247*00b67f09SDavid van Moolenbroek memset(&peer->bitflags, 0x0, sizeof(peer->bitflags));
248*00b67f09SDavid van Moolenbroek
249*00b67f09SDavid van Moolenbroek ISC_LINK_INIT(peer, next);
250*00b67f09SDavid van Moolenbroek
251*00b67f09SDavid van Moolenbroek *peerptr = peer;
252*00b67f09SDavid van Moolenbroek
253*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
254*00b67f09SDavid van Moolenbroek }
255*00b67f09SDavid van Moolenbroek
256*00b67f09SDavid van Moolenbroek void
dns_peer_attach(dns_peer_t * source,dns_peer_t ** target)257*00b67f09SDavid van Moolenbroek dns_peer_attach(dns_peer_t *source, dns_peer_t **target) {
258*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(source));
259*00b67f09SDavid van Moolenbroek REQUIRE(target != NULL);
260*00b67f09SDavid van Moolenbroek REQUIRE(*target == NULL);
261*00b67f09SDavid van Moolenbroek
262*00b67f09SDavid van Moolenbroek source->refs++;
263*00b67f09SDavid van Moolenbroek
264*00b67f09SDavid van Moolenbroek ENSURE(source->refs != 0xffffffffU);
265*00b67f09SDavid van Moolenbroek
266*00b67f09SDavid van Moolenbroek *target = source;
267*00b67f09SDavid van Moolenbroek }
268*00b67f09SDavid van Moolenbroek
269*00b67f09SDavid van Moolenbroek void
dns_peer_detach(dns_peer_t ** peer)270*00b67f09SDavid van Moolenbroek dns_peer_detach(dns_peer_t **peer) {
271*00b67f09SDavid van Moolenbroek dns_peer_t *p;
272*00b67f09SDavid van Moolenbroek
273*00b67f09SDavid van Moolenbroek REQUIRE(peer != NULL);
274*00b67f09SDavid van Moolenbroek REQUIRE(*peer != NULL);
275*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(*peer));
276*00b67f09SDavid van Moolenbroek
277*00b67f09SDavid van Moolenbroek p = *peer;
278*00b67f09SDavid van Moolenbroek
279*00b67f09SDavid van Moolenbroek REQUIRE(p->refs > 0);
280*00b67f09SDavid van Moolenbroek
281*00b67f09SDavid van Moolenbroek *peer = NULL;
282*00b67f09SDavid van Moolenbroek p->refs--;
283*00b67f09SDavid van Moolenbroek
284*00b67f09SDavid van Moolenbroek if (p->refs == 0)
285*00b67f09SDavid van Moolenbroek peer_delete(&p);
286*00b67f09SDavid van Moolenbroek }
287*00b67f09SDavid van Moolenbroek
288*00b67f09SDavid van Moolenbroek static void
peer_delete(dns_peer_t ** peer)289*00b67f09SDavid van Moolenbroek peer_delete(dns_peer_t **peer) {
290*00b67f09SDavid van Moolenbroek dns_peer_t *p;
291*00b67f09SDavid van Moolenbroek isc_mem_t *mem;
292*00b67f09SDavid van Moolenbroek
293*00b67f09SDavid van Moolenbroek REQUIRE(peer != NULL);
294*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(*peer));
295*00b67f09SDavid van Moolenbroek
296*00b67f09SDavid van Moolenbroek p = *peer;
297*00b67f09SDavid van Moolenbroek
298*00b67f09SDavid van Moolenbroek REQUIRE(p->refs == 0);
299*00b67f09SDavid van Moolenbroek
300*00b67f09SDavid van Moolenbroek mem = p->mem;
301*00b67f09SDavid van Moolenbroek p->mem = NULL;
302*00b67f09SDavid van Moolenbroek p->magic = 0;
303*00b67f09SDavid van Moolenbroek
304*00b67f09SDavid van Moolenbroek if (p->key != NULL) {
305*00b67f09SDavid van Moolenbroek dns_name_free(p->key, mem);
306*00b67f09SDavid van Moolenbroek isc_mem_put(mem, p->key, sizeof(dns_name_t));
307*00b67f09SDavid van Moolenbroek }
308*00b67f09SDavid van Moolenbroek
309*00b67f09SDavid van Moolenbroek if (p->query_source != NULL)
310*00b67f09SDavid van Moolenbroek isc_mem_put(mem, p->query_source, sizeof(*p->query_source));
311*00b67f09SDavid van Moolenbroek
312*00b67f09SDavid van Moolenbroek if (p->notify_source != NULL)
313*00b67f09SDavid van Moolenbroek isc_mem_put(mem, p->notify_source, sizeof(*p->notify_source));
314*00b67f09SDavid van Moolenbroek
315*00b67f09SDavid van Moolenbroek if (p->transfer_source != NULL)
316*00b67f09SDavid van Moolenbroek isc_mem_put(mem, p->transfer_source,
317*00b67f09SDavid van Moolenbroek sizeof(*p->transfer_source));
318*00b67f09SDavid van Moolenbroek
319*00b67f09SDavid van Moolenbroek isc_mem_put(mem, p, sizeof(*p));
320*00b67f09SDavid van Moolenbroek
321*00b67f09SDavid van Moolenbroek *peer = NULL;
322*00b67f09SDavid van Moolenbroek }
323*00b67f09SDavid van Moolenbroek
324*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setbogus(dns_peer_t * peer,isc_boolean_t newval)325*00b67f09SDavid van Moolenbroek dns_peer_setbogus(dns_peer_t *peer, isc_boolean_t newval) {
326*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
327*00b67f09SDavid van Moolenbroek
328*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
329*00b67f09SDavid van Moolenbroek
330*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(BOGUS_BIT, &peer->bitflags);
331*00b67f09SDavid van Moolenbroek
332*00b67f09SDavid van Moolenbroek peer->bogus = newval;
333*00b67f09SDavid van Moolenbroek DNS_BIT_SET(BOGUS_BIT, &peer->bitflags);
334*00b67f09SDavid van Moolenbroek
335*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
336*00b67f09SDavid van Moolenbroek }
337*00b67f09SDavid van Moolenbroek
338*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getbogus(dns_peer_t * peer,isc_boolean_t * retval)339*00b67f09SDavid van Moolenbroek dns_peer_getbogus(dns_peer_t *peer, isc_boolean_t *retval) {
340*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
341*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
342*00b67f09SDavid van Moolenbroek
343*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(BOGUS_BIT, &peer->bitflags)) {
344*00b67f09SDavid van Moolenbroek *retval = peer->bogus;
345*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
346*00b67f09SDavid van Moolenbroek } else
347*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
348*00b67f09SDavid van Moolenbroek }
349*00b67f09SDavid van Moolenbroek
350*00b67f09SDavid van Moolenbroek
351*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setprovideixfr(dns_peer_t * peer,isc_boolean_t newval)352*00b67f09SDavid van Moolenbroek dns_peer_setprovideixfr(dns_peer_t *peer, isc_boolean_t newval) {
353*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
354*00b67f09SDavid van Moolenbroek
355*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
356*00b67f09SDavid van Moolenbroek
357*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(PROVIDE_IXFR_BIT, &peer->bitflags);
358*00b67f09SDavid van Moolenbroek
359*00b67f09SDavid van Moolenbroek peer->provide_ixfr = newval;
360*00b67f09SDavid van Moolenbroek DNS_BIT_SET(PROVIDE_IXFR_BIT, &peer->bitflags);
361*00b67f09SDavid van Moolenbroek
362*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
363*00b67f09SDavid van Moolenbroek }
364*00b67f09SDavid van Moolenbroek
365*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getprovideixfr(dns_peer_t * peer,isc_boolean_t * retval)366*00b67f09SDavid van Moolenbroek dns_peer_getprovideixfr(dns_peer_t *peer, isc_boolean_t *retval) {
367*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
368*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
369*00b67f09SDavid van Moolenbroek
370*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(PROVIDE_IXFR_BIT, &peer->bitflags)) {
371*00b67f09SDavid van Moolenbroek *retval = peer->provide_ixfr;
372*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
373*00b67f09SDavid van Moolenbroek } else {
374*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
375*00b67f09SDavid van Moolenbroek }
376*00b67f09SDavid van Moolenbroek }
377*00b67f09SDavid van Moolenbroek
378*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setrequestixfr(dns_peer_t * peer,isc_boolean_t newval)379*00b67f09SDavid van Moolenbroek dns_peer_setrequestixfr(dns_peer_t *peer, isc_boolean_t newval) {
380*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
381*00b67f09SDavid van Moolenbroek
382*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
383*00b67f09SDavid van Moolenbroek
384*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(REQUEST_IXFR_BIT, &peer->bitflags);
385*00b67f09SDavid van Moolenbroek
386*00b67f09SDavid van Moolenbroek peer->request_ixfr = newval;
387*00b67f09SDavid van Moolenbroek DNS_BIT_SET(REQUEST_IXFR_BIT, &peer->bitflags);
388*00b67f09SDavid van Moolenbroek
389*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
390*00b67f09SDavid van Moolenbroek }
391*00b67f09SDavid van Moolenbroek
392*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getrequestixfr(dns_peer_t * peer,isc_boolean_t * retval)393*00b67f09SDavid van Moolenbroek dns_peer_getrequestixfr(dns_peer_t *peer, isc_boolean_t *retval) {
394*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
395*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
396*00b67f09SDavid van Moolenbroek
397*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(REQUEST_IXFR_BIT, &peer->bitflags)) {
398*00b67f09SDavid van Moolenbroek *retval = peer->request_ixfr;
399*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
400*00b67f09SDavid van Moolenbroek } else
401*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
402*00b67f09SDavid van Moolenbroek }
403*00b67f09SDavid van Moolenbroek
404*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setsupportedns(dns_peer_t * peer,isc_boolean_t newval)405*00b67f09SDavid van Moolenbroek dns_peer_setsupportedns(dns_peer_t *peer, isc_boolean_t newval) {
406*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
407*00b67f09SDavid van Moolenbroek
408*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
409*00b67f09SDavid van Moolenbroek
410*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(SUPPORT_EDNS_BIT, &peer->bitflags);
411*00b67f09SDavid van Moolenbroek
412*00b67f09SDavid van Moolenbroek peer->support_edns = newval;
413*00b67f09SDavid van Moolenbroek DNS_BIT_SET(SUPPORT_EDNS_BIT, &peer->bitflags);
414*00b67f09SDavid van Moolenbroek
415*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
416*00b67f09SDavid van Moolenbroek }
417*00b67f09SDavid van Moolenbroek
418*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getsupportedns(dns_peer_t * peer,isc_boolean_t * retval)419*00b67f09SDavid van Moolenbroek dns_peer_getsupportedns(dns_peer_t *peer, isc_boolean_t *retval) {
420*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
421*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
422*00b67f09SDavid van Moolenbroek
423*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(SUPPORT_EDNS_BIT, &peer->bitflags)) {
424*00b67f09SDavid van Moolenbroek *retval = peer->support_edns;
425*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
426*00b67f09SDavid van Moolenbroek } else
427*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
428*00b67f09SDavid van Moolenbroek }
429*00b67f09SDavid van Moolenbroek
430*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setrequestnsid(dns_peer_t * peer,isc_boolean_t newval)431*00b67f09SDavid van Moolenbroek dns_peer_setrequestnsid(dns_peer_t *peer, isc_boolean_t newval) {
432*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
433*00b67f09SDavid van Moolenbroek
434*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
435*00b67f09SDavid van Moolenbroek
436*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(REQUEST_NSID_BIT, &peer->bitflags);
437*00b67f09SDavid van Moolenbroek
438*00b67f09SDavid van Moolenbroek peer->request_nsid = newval;
439*00b67f09SDavid van Moolenbroek DNS_BIT_SET(REQUEST_NSID_BIT, &peer->bitflags);
440*00b67f09SDavid van Moolenbroek
441*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
442*00b67f09SDavid van Moolenbroek }
443*00b67f09SDavid van Moolenbroek
444*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getrequestnsid(dns_peer_t * peer,isc_boolean_t * retval)445*00b67f09SDavid van Moolenbroek dns_peer_getrequestnsid(dns_peer_t *peer, isc_boolean_t *retval) {
446*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
447*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
448*00b67f09SDavid van Moolenbroek
449*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(REQUEST_NSID_BIT, &peer->bitflags)) {
450*00b67f09SDavid van Moolenbroek *retval = peer->request_nsid;
451*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
452*00b67f09SDavid van Moolenbroek } else
453*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
454*00b67f09SDavid van Moolenbroek }
455*00b67f09SDavid van Moolenbroek
456*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setrequestsit(dns_peer_t * peer,isc_boolean_t newval)457*00b67f09SDavid van Moolenbroek dns_peer_setrequestsit(dns_peer_t *peer, isc_boolean_t newval) {
458*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
459*00b67f09SDavid van Moolenbroek
460*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
461*00b67f09SDavid van Moolenbroek
462*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(REQUEST_SIT_BIT, &peer->bitflags);
463*00b67f09SDavid van Moolenbroek
464*00b67f09SDavid van Moolenbroek peer->request_sit = newval;
465*00b67f09SDavid van Moolenbroek DNS_BIT_SET(REQUEST_SIT_BIT, &peer->bitflags);
466*00b67f09SDavid van Moolenbroek
467*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
468*00b67f09SDavid van Moolenbroek }
469*00b67f09SDavid van Moolenbroek
470*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getrequestsit(dns_peer_t * peer,isc_boolean_t * retval)471*00b67f09SDavid van Moolenbroek dns_peer_getrequestsit(dns_peer_t *peer, isc_boolean_t *retval) {
472*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
473*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
474*00b67f09SDavid van Moolenbroek
475*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(REQUEST_SIT_BIT, &peer->bitflags)) {
476*00b67f09SDavid van Moolenbroek *retval = peer->request_sit;
477*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
478*00b67f09SDavid van Moolenbroek } else
479*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
480*00b67f09SDavid van Moolenbroek }
481*00b67f09SDavid van Moolenbroek
482*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_settransfers(dns_peer_t * peer,isc_uint32_t newval)483*00b67f09SDavid van Moolenbroek dns_peer_settransfers(dns_peer_t *peer, isc_uint32_t newval) {
484*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
485*00b67f09SDavid van Moolenbroek
486*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
487*00b67f09SDavid van Moolenbroek
488*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(TRANSFERS_BIT, &peer->bitflags);
489*00b67f09SDavid van Moolenbroek
490*00b67f09SDavid van Moolenbroek peer->transfers = newval;
491*00b67f09SDavid van Moolenbroek DNS_BIT_SET(TRANSFERS_BIT, &peer->bitflags);
492*00b67f09SDavid van Moolenbroek
493*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
494*00b67f09SDavid van Moolenbroek }
495*00b67f09SDavid van Moolenbroek
496*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_gettransfers(dns_peer_t * peer,isc_uint32_t * retval)497*00b67f09SDavid van Moolenbroek dns_peer_gettransfers(dns_peer_t *peer, isc_uint32_t *retval) {
498*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
499*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
500*00b67f09SDavid van Moolenbroek
501*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(TRANSFERS_BIT, &peer->bitflags)) {
502*00b67f09SDavid van Moolenbroek *retval = peer->transfers;
503*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
504*00b67f09SDavid van Moolenbroek } else {
505*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
506*00b67f09SDavid van Moolenbroek }
507*00b67f09SDavid van Moolenbroek }
508*00b67f09SDavid van Moolenbroek
509*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_settransferformat(dns_peer_t * peer,dns_transfer_format_t newval)510*00b67f09SDavid van Moolenbroek dns_peer_settransferformat(dns_peer_t *peer, dns_transfer_format_t newval) {
511*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
512*00b67f09SDavid van Moolenbroek
513*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
514*00b67f09SDavid van Moolenbroek
515*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(SERVER_TRANSFER_FORMAT_BIT,
516*00b67f09SDavid van Moolenbroek &peer->bitflags);
517*00b67f09SDavid van Moolenbroek
518*00b67f09SDavid van Moolenbroek peer->transfer_format = newval;
519*00b67f09SDavid van Moolenbroek DNS_BIT_SET(SERVER_TRANSFER_FORMAT_BIT, &peer->bitflags);
520*00b67f09SDavid van Moolenbroek
521*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
522*00b67f09SDavid van Moolenbroek }
523*00b67f09SDavid van Moolenbroek
524*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_gettransferformat(dns_peer_t * peer,dns_transfer_format_t * retval)525*00b67f09SDavid van Moolenbroek dns_peer_gettransferformat(dns_peer_t *peer, dns_transfer_format_t *retval) {
526*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
527*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
528*00b67f09SDavid van Moolenbroek
529*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(SERVER_TRANSFER_FORMAT_BIT, &peer->bitflags)) {
530*00b67f09SDavid van Moolenbroek *retval = peer->transfer_format;
531*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
532*00b67f09SDavid van Moolenbroek } else {
533*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
534*00b67f09SDavid van Moolenbroek }
535*00b67f09SDavid van Moolenbroek }
536*00b67f09SDavid van Moolenbroek
537*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getkey(dns_peer_t * peer,dns_name_t ** retval)538*00b67f09SDavid van Moolenbroek dns_peer_getkey(dns_peer_t *peer, dns_name_t **retval) {
539*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
540*00b67f09SDavid van Moolenbroek REQUIRE(retval != NULL);
541*00b67f09SDavid van Moolenbroek
542*00b67f09SDavid van Moolenbroek if (peer->key != NULL) {
543*00b67f09SDavid van Moolenbroek *retval = peer->key;
544*00b67f09SDavid van Moolenbroek }
545*00b67f09SDavid van Moolenbroek
546*00b67f09SDavid van Moolenbroek return (peer->key == NULL ? ISC_R_NOTFOUND : ISC_R_SUCCESS);
547*00b67f09SDavid van Moolenbroek }
548*00b67f09SDavid van Moolenbroek
549*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setkey(dns_peer_t * peer,dns_name_t ** keyval)550*00b67f09SDavid van Moolenbroek dns_peer_setkey(dns_peer_t *peer, dns_name_t **keyval) {
551*00b67f09SDavid van Moolenbroek isc_boolean_t exists = ISC_FALSE;
552*00b67f09SDavid van Moolenbroek
553*00b67f09SDavid van Moolenbroek if (peer->key != NULL) {
554*00b67f09SDavid van Moolenbroek dns_name_free(peer->key, peer->mem);
555*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, peer->key, sizeof(dns_name_t));
556*00b67f09SDavid van Moolenbroek exists = ISC_TRUE;
557*00b67f09SDavid van Moolenbroek }
558*00b67f09SDavid van Moolenbroek
559*00b67f09SDavid van Moolenbroek peer->key = *keyval;
560*00b67f09SDavid van Moolenbroek *keyval = NULL;
561*00b67f09SDavid van Moolenbroek
562*00b67f09SDavid van Moolenbroek return (exists ? ISC_R_EXISTS : ISC_R_SUCCESS);
563*00b67f09SDavid van Moolenbroek }
564*00b67f09SDavid van Moolenbroek
565*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setkeybycharp(dns_peer_t * peer,const char * keyval)566*00b67f09SDavid van Moolenbroek dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval) {
567*00b67f09SDavid van Moolenbroek isc_buffer_t b;
568*00b67f09SDavid van Moolenbroek dns_fixedname_t fname;
569*00b67f09SDavid van Moolenbroek dns_name_t *name;
570*00b67f09SDavid van Moolenbroek isc_result_t result;
571*00b67f09SDavid van Moolenbroek
572*00b67f09SDavid van Moolenbroek dns_fixedname_init(&fname);
573*00b67f09SDavid van Moolenbroek isc_buffer_constinit(&b, keyval, strlen(keyval));
574*00b67f09SDavid van Moolenbroek isc_buffer_add(&b, strlen(keyval));
575*00b67f09SDavid van Moolenbroek result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
576*00b67f09SDavid van Moolenbroek dns_rootname, 0, NULL);
577*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS)
578*00b67f09SDavid van Moolenbroek return (result);
579*00b67f09SDavid van Moolenbroek
580*00b67f09SDavid van Moolenbroek name = isc_mem_get(peer->mem, sizeof(dns_name_t));
581*00b67f09SDavid van Moolenbroek if (name == NULL)
582*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
583*00b67f09SDavid van Moolenbroek
584*00b67f09SDavid van Moolenbroek dns_name_init(name, NULL);
585*00b67f09SDavid van Moolenbroek result = dns_name_dup(dns_fixedname_name(&fname), peer->mem, name);
586*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS) {
587*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, name, sizeof(dns_name_t));
588*00b67f09SDavid van Moolenbroek return (result);
589*00b67f09SDavid van Moolenbroek }
590*00b67f09SDavid van Moolenbroek
591*00b67f09SDavid van Moolenbroek result = dns_peer_setkey(peer, &name);
592*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS)
593*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, name, sizeof(dns_name_t));
594*00b67f09SDavid van Moolenbroek
595*00b67f09SDavid van Moolenbroek return (result);
596*00b67f09SDavid van Moolenbroek }
597*00b67f09SDavid van Moolenbroek
598*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_settransfersource(dns_peer_t * peer,const isc_sockaddr_t * transfer_source)599*00b67f09SDavid van Moolenbroek dns_peer_settransfersource(dns_peer_t *peer,
600*00b67f09SDavid van Moolenbroek const isc_sockaddr_t *transfer_source)
601*00b67f09SDavid van Moolenbroek {
602*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
603*00b67f09SDavid van Moolenbroek
604*00b67f09SDavid van Moolenbroek if (peer->transfer_source != NULL) {
605*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, peer->transfer_source,
606*00b67f09SDavid van Moolenbroek sizeof(*peer->transfer_source));
607*00b67f09SDavid van Moolenbroek peer->transfer_source = NULL;
608*00b67f09SDavid van Moolenbroek }
609*00b67f09SDavid van Moolenbroek if (transfer_source != NULL) {
610*00b67f09SDavid van Moolenbroek peer->transfer_source = isc_mem_get(peer->mem,
611*00b67f09SDavid van Moolenbroek sizeof(*peer->transfer_source));
612*00b67f09SDavid van Moolenbroek if (peer->transfer_source == NULL)
613*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
614*00b67f09SDavid van Moolenbroek
615*00b67f09SDavid van Moolenbroek *peer->transfer_source = *transfer_source;
616*00b67f09SDavid van Moolenbroek }
617*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
618*00b67f09SDavid van Moolenbroek }
619*00b67f09SDavid van Moolenbroek
620*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_gettransfersource(dns_peer_t * peer,isc_sockaddr_t * transfer_source)621*00b67f09SDavid van Moolenbroek dns_peer_gettransfersource(dns_peer_t *peer, isc_sockaddr_t *transfer_source) {
622*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
623*00b67f09SDavid van Moolenbroek REQUIRE(transfer_source != NULL);
624*00b67f09SDavid van Moolenbroek
625*00b67f09SDavid van Moolenbroek if (peer->transfer_source == NULL)
626*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
627*00b67f09SDavid van Moolenbroek *transfer_source = *peer->transfer_source;
628*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
629*00b67f09SDavid van Moolenbroek }
630*00b67f09SDavid van Moolenbroek
631*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setnotifysource(dns_peer_t * peer,const isc_sockaddr_t * notify_source)632*00b67f09SDavid van Moolenbroek dns_peer_setnotifysource(dns_peer_t *peer,
633*00b67f09SDavid van Moolenbroek const isc_sockaddr_t *notify_source)
634*00b67f09SDavid van Moolenbroek {
635*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
636*00b67f09SDavid van Moolenbroek
637*00b67f09SDavid van Moolenbroek if (peer->notify_source != NULL) {
638*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, peer->notify_source,
639*00b67f09SDavid van Moolenbroek sizeof(*peer->notify_source));
640*00b67f09SDavid van Moolenbroek peer->notify_source = NULL;
641*00b67f09SDavid van Moolenbroek }
642*00b67f09SDavid van Moolenbroek if (notify_source != NULL) {
643*00b67f09SDavid van Moolenbroek peer->notify_source = isc_mem_get(peer->mem,
644*00b67f09SDavid van Moolenbroek sizeof(*peer->notify_source));
645*00b67f09SDavid van Moolenbroek if (peer->notify_source == NULL)
646*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
647*00b67f09SDavid van Moolenbroek
648*00b67f09SDavid van Moolenbroek *peer->notify_source = *notify_source;
649*00b67f09SDavid van Moolenbroek }
650*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
651*00b67f09SDavid van Moolenbroek }
652*00b67f09SDavid van Moolenbroek
653*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getnotifysource(dns_peer_t * peer,isc_sockaddr_t * notify_source)654*00b67f09SDavid van Moolenbroek dns_peer_getnotifysource(dns_peer_t *peer, isc_sockaddr_t *notify_source) {
655*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
656*00b67f09SDavid van Moolenbroek REQUIRE(notify_source != NULL);
657*00b67f09SDavid van Moolenbroek
658*00b67f09SDavid van Moolenbroek if (peer->notify_source == NULL)
659*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
660*00b67f09SDavid van Moolenbroek *notify_source = *peer->notify_source;
661*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
662*00b67f09SDavid van Moolenbroek }
663*00b67f09SDavid van Moolenbroek
664*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setquerysource(dns_peer_t * peer,const isc_sockaddr_t * query_source)665*00b67f09SDavid van Moolenbroek dns_peer_setquerysource(dns_peer_t *peer, const isc_sockaddr_t *query_source) {
666*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
667*00b67f09SDavid van Moolenbroek
668*00b67f09SDavid van Moolenbroek if (peer->query_source != NULL) {
669*00b67f09SDavid van Moolenbroek isc_mem_put(peer->mem, peer->query_source,
670*00b67f09SDavid van Moolenbroek sizeof(*peer->query_source));
671*00b67f09SDavid van Moolenbroek peer->query_source = NULL;
672*00b67f09SDavid van Moolenbroek }
673*00b67f09SDavid van Moolenbroek if (query_source != NULL) {
674*00b67f09SDavid van Moolenbroek peer->query_source = isc_mem_get(peer->mem,
675*00b67f09SDavid van Moolenbroek sizeof(*peer->query_source));
676*00b67f09SDavid van Moolenbroek if (peer->query_source == NULL)
677*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
678*00b67f09SDavid van Moolenbroek
679*00b67f09SDavid van Moolenbroek *peer->query_source = *query_source;
680*00b67f09SDavid van Moolenbroek }
681*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
682*00b67f09SDavid van Moolenbroek }
683*00b67f09SDavid van Moolenbroek
684*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getquerysource(dns_peer_t * peer,isc_sockaddr_t * query_source)685*00b67f09SDavid van Moolenbroek dns_peer_getquerysource(dns_peer_t *peer, isc_sockaddr_t *query_source) {
686*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
687*00b67f09SDavid van Moolenbroek REQUIRE(query_source != NULL);
688*00b67f09SDavid van Moolenbroek
689*00b67f09SDavid van Moolenbroek if (peer->query_source == NULL)
690*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
691*00b67f09SDavid van Moolenbroek *query_source = *peer->query_source;
692*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
693*00b67f09SDavid van Moolenbroek }
694*00b67f09SDavid van Moolenbroek
695*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setudpsize(dns_peer_t * peer,isc_uint16_t udpsize)696*00b67f09SDavid van Moolenbroek dns_peer_setudpsize(dns_peer_t *peer, isc_uint16_t udpsize) {
697*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
698*00b67f09SDavid van Moolenbroek
699*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
700*00b67f09SDavid van Moolenbroek
701*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(SERVER_UDPSIZE_BIT, &peer->bitflags);
702*00b67f09SDavid van Moolenbroek
703*00b67f09SDavid van Moolenbroek peer->udpsize = udpsize;
704*00b67f09SDavid van Moolenbroek DNS_BIT_SET(SERVER_UDPSIZE_BIT, &peer->bitflags);
705*00b67f09SDavid van Moolenbroek
706*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
707*00b67f09SDavid van Moolenbroek }
708*00b67f09SDavid van Moolenbroek
709*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getudpsize(dns_peer_t * peer,isc_uint16_t * udpsize)710*00b67f09SDavid van Moolenbroek dns_peer_getudpsize(dns_peer_t *peer, isc_uint16_t *udpsize) {
711*00b67f09SDavid van Moolenbroek
712*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
713*00b67f09SDavid van Moolenbroek REQUIRE(udpsize != NULL);
714*00b67f09SDavid van Moolenbroek
715*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(SERVER_UDPSIZE_BIT, &peer->bitflags)) {
716*00b67f09SDavid van Moolenbroek *udpsize = peer->udpsize;
717*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
718*00b67f09SDavid van Moolenbroek } else {
719*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
720*00b67f09SDavid van Moolenbroek }
721*00b67f09SDavid van Moolenbroek }
722*00b67f09SDavid van Moolenbroek
723*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setmaxudp(dns_peer_t * peer,isc_uint16_t maxudp)724*00b67f09SDavid van Moolenbroek dns_peer_setmaxudp(dns_peer_t *peer, isc_uint16_t maxudp) {
725*00b67f09SDavid van Moolenbroek isc_boolean_t existed;
726*00b67f09SDavid van Moolenbroek
727*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
728*00b67f09SDavid van Moolenbroek
729*00b67f09SDavid van Moolenbroek existed = DNS_BIT_CHECK(SERVER_MAXUDP_BIT, &peer->bitflags);
730*00b67f09SDavid van Moolenbroek
731*00b67f09SDavid van Moolenbroek peer->maxudp = maxudp;
732*00b67f09SDavid van Moolenbroek DNS_BIT_SET(SERVER_MAXUDP_BIT, &peer->bitflags);
733*00b67f09SDavid van Moolenbroek
734*00b67f09SDavid van Moolenbroek return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS);
735*00b67f09SDavid van Moolenbroek }
736*00b67f09SDavid van Moolenbroek
737*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getmaxudp(dns_peer_t * peer,isc_uint16_t * maxudp)738*00b67f09SDavid van Moolenbroek dns_peer_getmaxudp(dns_peer_t *peer, isc_uint16_t *maxudp) {
739*00b67f09SDavid van Moolenbroek
740*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
741*00b67f09SDavid van Moolenbroek REQUIRE(maxudp != NULL);
742*00b67f09SDavid van Moolenbroek
743*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(SERVER_MAXUDP_BIT, &peer->bitflags)) {
744*00b67f09SDavid van Moolenbroek *maxudp = peer->maxudp;
745*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
746*00b67f09SDavid van Moolenbroek } else {
747*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
748*00b67f09SDavid van Moolenbroek }
749*00b67f09SDavid van Moolenbroek }
750*00b67f09SDavid van Moolenbroek
751*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setnotifydscp(dns_peer_t * peer,isc_dscp_t dscp)752*00b67f09SDavid van Moolenbroek dns_peer_setnotifydscp(dns_peer_t *peer, isc_dscp_t dscp) {
753*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
754*00b67f09SDavid van Moolenbroek REQUIRE(dscp < 64);
755*00b67f09SDavid van Moolenbroek
756*00b67f09SDavid van Moolenbroek peer->notify_dscp = dscp;
757*00b67f09SDavid van Moolenbroek DNS_BIT_SET(NOTIFY_DSCP_BIT, &peer->bitflags);
758*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
759*00b67f09SDavid van Moolenbroek }
760*00b67f09SDavid van Moolenbroek
761*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getnotifydscp(dns_peer_t * peer,isc_dscp_t * dscpp)762*00b67f09SDavid van Moolenbroek dns_peer_getnotifydscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
763*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
764*00b67f09SDavid van Moolenbroek REQUIRE(dscpp != NULL);
765*00b67f09SDavid van Moolenbroek
766*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(NOTIFY_DSCP_BIT, &peer->bitflags)) {
767*00b67f09SDavid van Moolenbroek *dscpp = peer->notify_dscp;
768*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
769*00b67f09SDavid van Moolenbroek }
770*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
771*00b67f09SDavid van Moolenbroek }
772*00b67f09SDavid van Moolenbroek
773*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_settransferdscp(dns_peer_t * peer,isc_dscp_t dscp)774*00b67f09SDavid van Moolenbroek dns_peer_settransferdscp(dns_peer_t *peer, isc_dscp_t dscp) {
775*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
776*00b67f09SDavid van Moolenbroek REQUIRE(dscp < 64);
777*00b67f09SDavid van Moolenbroek
778*00b67f09SDavid van Moolenbroek peer->transfer_dscp = dscp;
779*00b67f09SDavid van Moolenbroek DNS_BIT_SET(TRANSFER_DSCP_BIT, &peer->bitflags);
780*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
781*00b67f09SDavid van Moolenbroek }
782*00b67f09SDavid van Moolenbroek
783*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_gettransferdscp(dns_peer_t * peer,isc_dscp_t * dscpp)784*00b67f09SDavid van Moolenbroek dns_peer_gettransferdscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
785*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
786*00b67f09SDavid van Moolenbroek REQUIRE(dscpp != NULL);
787*00b67f09SDavid van Moolenbroek
788*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(TRANSFER_DSCP_BIT, &peer->bitflags)) {
789*00b67f09SDavid van Moolenbroek *dscpp = peer->transfer_dscp;
790*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
791*00b67f09SDavid van Moolenbroek }
792*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
793*00b67f09SDavid van Moolenbroek }
794*00b67f09SDavid van Moolenbroek
795*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_setquerydscp(dns_peer_t * peer,isc_dscp_t dscp)796*00b67f09SDavid van Moolenbroek dns_peer_setquerydscp(dns_peer_t *peer, isc_dscp_t dscp) {
797*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
798*00b67f09SDavid van Moolenbroek REQUIRE(dscp < 64);
799*00b67f09SDavid van Moolenbroek
800*00b67f09SDavid van Moolenbroek peer->query_dscp = dscp;
801*00b67f09SDavid van Moolenbroek DNS_BIT_SET(QUERY_DSCP_BIT, &peer->bitflags);
802*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
803*00b67f09SDavid van Moolenbroek }
804*00b67f09SDavid van Moolenbroek
805*00b67f09SDavid van Moolenbroek isc_result_t
dns_peer_getquerydscp(dns_peer_t * peer,isc_dscp_t * dscpp)806*00b67f09SDavid van Moolenbroek dns_peer_getquerydscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
807*00b67f09SDavid van Moolenbroek REQUIRE(DNS_PEER_VALID(peer));
808*00b67f09SDavid van Moolenbroek REQUIRE(dscpp != NULL);
809*00b67f09SDavid van Moolenbroek
810*00b67f09SDavid van Moolenbroek if (DNS_BIT_CHECK(QUERY_DSCP_BIT, &peer->bitflags)) {
811*00b67f09SDavid van Moolenbroek *dscpp = peer->query_dscp;
812*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
813*00b67f09SDavid van Moolenbroek }
814*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
815*00b67f09SDavid van Moolenbroek }
816