1 /*
2  * Copyright (c) 2011 NLNet Labs. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
19  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
21  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
22  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
23  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26 
27 /**
28  * Zone transfers.
29  *
30  */
31 
32 #ifndef WIRE_XFRD_H
33 #define WIRE_XFRD_H
34 
35 #include "config.h"
36 #include <stdint.h>
37 #include <time.h>
38 
39 /**
40  * Packet status.
41  *
42  */
43 enum xfrd_pkt_enum {
44     XFRD_PKT_BAD, /* drop the packet/connection */
45     XFRD_PKT_MORE, /* more packets to follow on tcp */
46     XFRD_PKT_NOTIMPL, /* server responded with NOTIMPL or FORMATERR */
47     XFRD_PKT_TC, /* try tcp connection */
48     XFRD_PKT_XFR, /* server responded with transfer*/
49     XFRD_PKT_NEWLEASE /* no changes, soa OK */
50 };
51 typedef enum xfrd_pkt_enum xfrd_pkt_status;
52 
53 typedef struct soa_struct soa_type;
54 
55 typedef struct xfrd_struct xfrd_type;
56 
57 #include "locks.h"
58 #include "status.h"
59 #include "wire/acl.h"
60 #include "wire/buffer.h"
61 #include "wire/netio.h"
62 #include "wire/tsig.h"
63 #include "daemon/xfrhandler.h"
64 
65 #define XFRD_MAX_ROUNDS 3 /* max number of rounds along the masters */
66 #define XFRD_MAX_UDP 100 /* max number of udp sockets at a time for ixfr */
67 #define XFRD_NO_IXFR_CACHE 172800 /* 48h before retrying ixfr after notimpl */
68 #define XFRD_TCP_TIMEOUT 120 /* seconds, before a tcp request times out */
69 #define XFRD_UDP_TIMEOUT 5 /* seconds, before a udp request times out */
70 
71 /*
72  * Zone transfer SOA information.
73  */
74 struct soa_struct {
75     /* owner equals zone apex */
76     /* class equals zone klass */
77     /* type is SOA */
78     uint32_t ttl;
79     /* rdata count = 7 */
80     uint8_t mname[MAXDOMAINLEN + 2];
81     uint8_t rname[MAXDOMAINLEN + 2];
82     uint32_t serial;
83     uint32_t refresh;
84     uint32_t retry;
85     uint32_t expire;
86     uint32_t minimum;
87 };
88 
89 /**
90  * Zone transfer state.
91  *
92  */
93 struct xfrd_struct
94 {
95     xfrhandler_type* xfrhandler;
96     zone_type* zone;
97     pthread_mutex_t serial_lock; /* mutexes soa serial management */
98     pthread_mutex_t rw_lock; /* mutexes <zone>.xfrd file */
99 
100     /* transfer request handling */
101     int tcp_conn;
102     int round_num;
103     int master_num;
104     int next_master;
105     acl_type* master;
106 
107     /* soa serial management */
108     uint32_t serial_xfr;
109     /* Last received serial via notify. Only valid if
110      * serial_notify_acquired is not 0 */
111     uint32_t serial_notify;
112     /* current serial on inbound side */
113     uint32_t serial_disk;
114     time_t serial_xfr_acquired;
115     /* time of last received notify that is being handled. If non-zero
116      * it indicates a transfer is in progress */
117     time_t serial_notify_acquired;
118     time_t serial_disk_acquired;
119     uint8_t serial_retransfer;
120     soa_type soa;
121 
122     /* timeout and event handling */
123     struct timespec timeout;
124     netio_handler_type handler;
125 
126     /* packet handling */
127     uint16_t query_id;
128     uint32_t msg_seq_nr;
129     uint32_t msg_old_serial;
130     uint32_t msg_new_serial;
131     size_t msg_rr_count;
132     uint8_t msg_is_ixfr;
133     uint8_t msg_do_retransfer;
134     tsig_rr_type* tsig_rr;
135 
136     xfrd_type* tcp_waiting_next;
137     xfrd_type* udp_waiting_next;
138     unsigned tcp_waiting : 1;
139     unsigned udp_waiting : 1;
140 
141 };
142 
143 /**
144  * Create zone transfer structure.
145  * \param[in] xfrhandler zone transfer handler
146  * \param[in] zone zone reference
147  * \return xfrd_type* zone transfer structure.
148  *
149  */
150 extern xfrd_type* xfrd_create(xfrhandler_type* xfrhandler, zone_type* zone);
151 
152 /**
153  * Set timeout for zone transfer to now.
154  * \param[in] xfrd zone transfer structure.
155  *
156  */
157 void xfrd_set_timer_now(xfrd_type* xfrd);
158 
159 /**
160  * Set timeout for zone transfer to RETRY.
161  * \param[in] xfrd zone transfer structure.
162  *
163  */
164 void xfrd_set_timer_retry(xfrd_type* xfrd);
165 
166 /**
167  * Set timeout for zone transfer to REFRESH.
168  * \param[in] xfrd zone transfer structure.
169  *
170  */
171 void xfrd_set_timer_refresh(xfrd_type* xfrd);
172 
173 /**
174  * Use acl address to setup remote sockaddr struct.
175  * \param[in] acl acl
176  * \param[in] to remote address storage
177  * \return socklen_t length of address
178  *
179  */
180 extern socklen_t xfrd_acl_sockaddr_to(acl_type* acl,
181     struct sockaddr_storage* to);
182 
183 /**
184  * Cleanup zone transfer structure.
185  * \param[in] xfrd zone transfer structure.
186  * \param[in] backup backup transfer variables.
187  *
188  */
189 extern void xfrd_cleanup(xfrd_type* xfrd, int backup);
190 
191 #endif /* WIRE_XFRD_H */
192