"Fossies" - the Fresh Open Source Software Archive

Member "opendnssec-2.1.4/signer/src/wire/xfrd.h" (16 May 2019, 5360 Bytes) of package /linux/misc/dns/opendnssec-2.1.4.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "xfrd.h" see the Fossies "Dox" file reference documentation.

    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 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 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 void xfrd_cleanup(xfrd_type* xfrd, int backup);
  190 
  191 #endif /* WIRE_XFRD_H */