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