1/*
2 * Copyright (C) 2004-2009  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2000, 2001, 2003  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* $Id: peer.h,v 1.35 2009/01/17 23:47:43 tbox Exp $ */
19
20#ifndef DNS_PEER_H
21#define DNS_PEER_H 1
22
23/*****
24 ***** Module Info
25 *****/
26
27/*! \file dns/peer.h
28 * \brief
29 * Data structures for peers (e.g. a 'server' config file statement)
30 */
31
32/***
33 *** Imports
34 ***/
35
36#include <isc/lang.h>
37#include <isc/magic.h>
38#include <isc/netaddr.h>
39
40#include <dns/types.h>
41
42#define DNS_PEERLIST_MAGIC	ISC_MAGIC('s','e','R','L')
43#define DNS_PEER_MAGIC		ISC_MAGIC('S','E','r','v')
44
45#define DNS_PEERLIST_VALID(ptr)	ISC_MAGIC_VALID(ptr, DNS_PEERLIST_MAGIC)
46#define DNS_PEER_VALID(ptr)	ISC_MAGIC_VALID(ptr, DNS_PEER_MAGIC)
47
48/***
49 *** Types
50 ***/
51
52struct dns_peerlist {
53	unsigned int		magic;
54	isc_uint32_t		refs;
55
56	isc_mem_t	       *mem;
57
58	ISC_LIST(dns_peer_t) elements;
59};
60
61struct dns_peer {
62	unsigned int		magic;
63	isc_uint32_t		refs;
64
65	isc_mem_t	       *mem;
66
67	isc_netaddr_t		address;
68	unsigned int		prefixlen;
69	isc_boolean_t		bogus;
70	dns_transfer_format_t	transfer_format;
71	isc_uint32_t		transfers;
72	isc_boolean_t		support_ixfr;
73	isc_boolean_t		provide_ixfr;
74	isc_boolean_t		request_ixfr;
75	isc_boolean_t		support_edns;
76	isc_boolean_t		request_nsid;
77	dns_name_t	       *key;
78	isc_sockaddr_t	       *transfer_source;
79	isc_sockaddr_t	       *notify_source;
80	isc_sockaddr_t	       *query_source;
81	isc_uint16_t		udpsize;		/* receive size */
82	isc_uint16_t		maxudp;			/* transmit size */
83
84	isc_uint32_t		bitflags;
85
86	ISC_LINK(dns_peer_t)	next;
87};
88
89/***
90 *** Functions
91 ***/
92
93ISC_LANG_BEGINDECLS
94
95isc_result_t
96dns_peerlist_new(isc_mem_t *mem, dns_peerlist_t **list);
97
98void
99dns_peerlist_attach(dns_peerlist_t *source, dns_peerlist_t **target);
100
101void
102dns_peerlist_detach(dns_peerlist_t **list);
103
104/*
105 * After return caller still holds a reference to peer.
106 */
107void
108dns_peerlist_addpeer(dns_peerlist_t *peers, dns_peer_t *peer);
109
110/*
111 * Ditto. */
112isc_result_t
113dns_peerlist_peerbyaddr(dns_peerlist_t *peers, isc_netaddr_t *addr,
114			dns_peer_t **retval);
115
116/*
117 * What he said.
118 */
119isc_result_t
120dns_peerlist_currpeer(dns_peerlist_t *peers, dns_peer_t **retval);
121
122isc_result_t
123dns_peer_new(isc_mem_t *mem, isc_netaddr_t *ipaddr, dns_peer_t **peer);
124
125isc_result_t
126dns_peer_newprefix(isc_mem_t *mem, isc_netaddr_t *ipaddr,
127		   unsigned int prefixlen, dns_peer_t **peer);
128
129void
130dns_peer_attach(dns_peer_t *source, dns_peer_t **target);
131
132void
133dns_peer_detach(dns_peer_t **list);
134
135isc_result_t
136dns_peer_setbogus(dns_peer_t *peer, isc_boolean_t newval);
137
138isc_result_t
139dns_peer_getbogus(dns_peer_t *peer, isc_boolean_t *retval);
140
141isc_result_t
142dns_peer_setrequestixfr(dns_peer_t *peer, isc_boolean_t newval);
143
144isc_result_t
145dns_peer_getrequestixfr(dns_peer_t *peer, isc_boolean_t *retval);
146
147isc_result_t
148dns_peer_setprovideixfr(dns_peer_t *peer, isc_boolean_t newval);
149
150isc_result_t
151dns_peer_getprovideixfr(dns_peer_t *peer, isc_boolean_t *retval);
152
153isc_result_t
154dns_peer_setrequestnsid(dns_peer_t *peer, isc_boolean_t newval);
155
156isc_result_t
157dns_peer_getrequestnsid(dns_peer_t *peer, isc_boolean_t *retval);
158
159isc_result_t
160dns_peer_setsupportedns(dns_peer_t *peer, isc_boolean_t newval);
161
162isc_result_t
163dns_peer_getsupportedns(dns_peer_t *peer, isc_boolean_t *retval);
164
165isc_result_t
166dns_peer_settransfers(dns_peer_t *peer, isc_uint32_t newval);
167
168isc_result_t
169dns_peer_gettransfers(dns_peer_t *peer, isc_uint32_t *retval);
170
171isc_result_t
172dns_peer_settransferformat(dns_peer_t *peer, dns_transfer_format_t newval);
173
174isc_result_t
175dns_peer_gettransferformat(dns_peer_t *peer, dns_transfer_format_t *retval);
176
177isc_result_t
178dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval);
179
180isc_result_t
181dns_peer_getkey(dns_peer_t *peer, dns_name_t **retval);
182
183isc_result_t
184dns_peer_setkey(dns_peer_t *peer, dns_name_t **keyval);
185
186isc_result_t
187dns_peer_settransfersource(dns_peer_t *peer,
188			   const isc_sockaddr_t *transfer_source);
189
190isc_result_t
191dns_peer_gettransfersource(dns_peer_t *peer, isc_sockaddr_t *transfer_source);
192
193isc_result_t
194dns_peer_setudpsize(dns_peer_t *peer, isc_uint16_t udpsize);
195
196isc_result_t
197dns_peer_getudpsize(dns_peer_t *peer, isc_uint16_t *udpsize);
198
199isc_result_t
200dns_peer_setmaxudp(dns_peer_t *peer, isc_uint16_t maxudp);
201
202isc_result_t
203dns_peer_getmaxudp(dns_peer_t *peer, isc_uint16_t *maxudp);
204
205isc_result_t
206dns_peer_setnotifysource(dns_peer_t *peer, const isc_sockaddr_t *notify_source);
207
208isc_result_t
209dns_peer_getnotifysource(dns_peer_t *peer, isc_sockaddr_t *notify_source);
210
211isc_result_t
212dns_peer_setquerysource(dns_peer_t *peer, const isc_sockaddr_t *query_source);
213
214isc_result_t
215dns_peer_getquerysource(dns_peer_t *peer, isc_sockaddr_t *query_source);
216
217ISC_LANG_ENDDECLS
218
219#endif /* DNS_PEER_H */
220