Home | History | Annotate | Line # | Download | only in dnstap
      1 /* dnstap support for Unbound */
      2 
      3 /*
      4  * Copyright (c) 2013-2014, Farsight Security, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  * notice, this list of conditions and the following disclaimer.
     13  *
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  * notice, this list of conditions and the following disclaimer in the
     16  * documentation and/or other materials provided with the distribution.
     17  *
     18  * 3. Neither the name of the copyright holder nor the names of its
     19  * contributors may be used to endorse or promote products derived from
     20  * this software without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     25  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     26  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     29  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     30  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     31  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     32  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33  */
     34 
     35 #ifndef UNBOUND_DNSTAP_H
     36 #define UNBOUND_DNSTAP_H
     37 
     38 #include "dnstap/dnstap_config.h"
     39 
     40 #ifdef USE_DNSTAP
     41 
     42 #include "util/locks.h"
     43 struct config_file;
     44 struct sldns_buffer;
     45 struct dt_msg_queue;
     46 
     47 struct dt_env {
     48 	/** the io thread (made by the struct daemon) */
     49 	struct dt_io_thread* dtio;
     50 
     51 	/** valid in worker struct, not in daemon struct, the per-worker
     52 	 * message list */
     53 	struct dt_msg_queue* msgqueue;
     54 
     55 	/** dnstap "identity" field, NULL if disabled */
     56 	char *identity;
     57 
     58 	/** dnstap "version" field, NULL if disabled */
     59 	char *version;
     60 
     61 	/** length of "identity" field */
     62 	unsigned len_identity;
     63 
     64 	/** length of "version" field */
     65 	unsigned len_version;
     66 
     67 	/** whether to log Message/RESOLVER_QUERY */
     68 	unsigned log_resolver_query_messages : 1;
     69 	/** whether to log Message/RESOLVER_RESPONSE */
     70 	unsigned log_resolver_response_messages : 1;
     71 	/** whether to log Message/CLIENT_QUERY */
     72 	unsigned log_client_query_messages : 1;
     73 	/** whether to log Message/CLIENT_RESPONSE */
     74 	unsigned log_client_response_messages : 1;
     75 	/** whether to log Message/FORWARDER_QUERY */
     76 	unsigned log_forwarder_query_messages : 1;
     77 	/** whether to log Message/FORWARDER_RESPONSE */
     78 	unsigned log_forwarder_response_messages : 1;
     79 
     80 	/** lock on sample count */
     81 	lock_basic_type sample_lock;
     82 	/** rate limit value from config, samples 1/N messages */
     83 	unsigned int sample_rate;
     84 	/** rate limit counter */
     85 	unsigned int sample_rate_count;
     86 };
     87 
     88 /**
     89  * Create dnstap environment object. Afterwards, call dt_apply_cfg() to fill in
     90  * the config variables and dt_init() to fill in the per-worker state. Each
     91  * worker needs a copy of this object but with its own I/O queue (the fq field
     92  * of the structure) to ensure lock-free access to its own per-worker circular
     93  * queue.  Duplicate the environment object if more than one worker needs to
     94  * share access to the dnstap I/O socket.
     95  * @param cfg: with config settings.
     96  * @return dt_env object, NULL on failure.
     97  */
     98 struct dt_env *
     99 dt_create(struct config_file* cfg);
    100 
    101 /**
    102  * Apply config settings.
    103  * @param env: dnstap environment object.
    104  * @param cfg: new config settings.
    105  */
    106 void
    107 dt_apply_cfg(struct dt_env *env, struct config_file *cfg);
    108 
    109 /**
    110  * Apply config settings for log enable for message types.
    111  * @param env: dnstap environment object.
    112  * @param cfg: new config settings.
    113  */
    114 void dt_apply_logcfg(struct dt_env *env, struct config_file *cfg);
    115 
    116 /**
    117  * Initialize per-worker state in dnstap environment object.
    118  * @param env: dnstap environment object to initialize, created with dt_create().
    119  * @param base: event base for wakeup timer.
    120  * @return: true on success, false on failure.
    121  */
    122 int
    123 dt_init(struct dt_env *env, struct comm_base* base);
    124 
    125 /**
    126  * Deletes the per-worker state created by dt_init
    127  */
    128 void dt_deinit(struct dt_env *env);
    129 
    130 /**
    131  * Delete dnstap environment object. Closes dnstap I/O socket and deletes all
    132  * per-worker I/O queues.
    133  */
    134 void
    135 dt_delete(struct dt_env *env);
    136 
    137 /**
    138  * Create and send a new dnstap "Message" event of type CLIENT_QUERY.
    139  * @param env: dnstap environment object.
    140  * @param qsock: address/port of client.
    141  * @param rsock: local (service) address/port.
    142  * @param cptype: comm_udp or comm_tcp.
    143  * @param qmsg: query message.
    144  * @param tstamp: timestamp or NULL if none provided.
    145  */
    146 void
    147 dt_msg_send_client_query(struct dt_env *env,
    148 			 struct sockaddr_storage *qsock,
    149 			 struct sockaddr_storage *rsock,
    150 			 enum comm_point_type cptype,
    151 			 void *cpssl,
    152 			 struct sldns_buffer *qmsg,
    153 			 struct timeval* tstamp);
    154 
    155 /**
    156  * Create and send a new dnstap "Message" event of type CLIENT_RESPONSE.
    157  * @param env: dnstap environment object.
    158  * @param qsock: address/port of client.
    159  * @param rsock: local (service) address/port.
    160  * @param cptype: comm_udp or comm_tcp.
    161  * @param rmsg: response message.
    162  */
    163 void
    164 dt_msg_send_client_response(struct dt_env *env,
    165 			    struct sockaddr_storage *qsock,
    166 			    struct sockaddr_storage *rsock,
    167 			    enum comm_point_type cptype,
    168 			    void *cpssl,
    169 			    struct sldns_buffer *rmsg);
    170 
    171 /**
    172  * Create and send a new dnstap "Message" event of type RESOLVER_QUERY or
    173  * FORWARDER_QUERY. The type used is dependent on the value of the RD bit
    174  * in the query header.
    175  * @param env: dnstap environment object.
    176  * @param rsock: address/port of server (upstream) the query is being sent to.
    177  * @param qsock: address/port of server (local) the query is being sent from.
    178  * @param cptype: comm_udp or comm_tcp.
    179  * @param zone: query zone.
    180  * @param zone_len: length of zone.
    181  * @param qmsg: query message.
    182  */
    183 void
    184 dt_msg_send_outside_query(struct dt_env *env,
    185 			  struct sockaddr_storage *rsock,
    186 			  struct sockaddr_storage *qsock,
    187 			  enum comm_point_type cptype,
    188 			  void *cpssl,
    189 			  uint8_t *zone, size_t zone_len,
    190 			  struct sldns_buffer *qmsg);
    191 
    192 /**
    193  * Create and send a new dnstap "Message" event of type RESOLVER_RESPONSE or
    194  * FORWARDER_RESPONSE. The type used is dependent on the value of the RD bit
    195  * in the query header.
    196  * @param env: dnstap environment object.
    197  * @param rsock: address/port of server (upstream) the response was received from.
    198  * @param qsock: address/port of server (local) the response was received to.
    199  * @param cptype: comm_udp or comm_tcp.
    200  * @param zone: query zone.
    201  * @param zone_len: length of zone.
    202  * @param qbuf: outside_network's qbuf key.
    203  * @param qbuf_len: length of outside_network's qbuf key.
    204  * @param qtime: time query message was sent.
    205  * @param rtime: time response message was sent.
    206  * @param rmsg: response message.
    207  */
    208 void
    209 dt_msg_send_outside_response(struct dt_env *env,
    210 			     struct sockaddr_storage *rsock,
    211 			     struct sockaddr_storage *qsock,
    212 			     enum comm_point_type cptype,
    213 			     void *cpssl,
    214 			     uint8_t *zone, size_t zone_len,
    215 			     uint8_t *qbuf, size_t qbuf_len,
    216 			     const struct timeval *qtime,
    217 			     const struct timeval *rtime,
    218 			     struct sldns_buffer *rmsg);
    219 
    220 #endif /* USE_DNSTAP */
    221 
    222 #endif /* UNBOUND_DNSTAP_H */
    223