Home | History | Annotate | Line # | Download | only in dnstap
      1 /*
      2  * dnstap/dnstap_collector.h -- nsd collector process for dnstap information
      3  *
      4  * Copyright (c) 2018, NLnet Labs. All rights reserved.
      5  *
      6  * See LICENSE for the license.
      7  *
      8  */
      9 
     10 #ifndef DNSTAP_COLLECTOR_H
     11 #define DNSTAP_COLLECTOR_H
     12 struct dt_env;
     13 struct nsd;
     14 struct event_base;
     15 struct event;
     16 struct dt_collector_input;
     17 struct zone;
     18 struct buffer;
     19 struct region;
     20 
     21 /* information for the dnstap collector process. It collects information
     22  * for dnstap from the worker processes.  And writes them to the dnstap
     23  * socket. */
     24 struct dt_collector {
     25 	/* dnstap env for the write to the dnstap socket */
     26 	struct dt_env* dt_env;
     27 	/* number of workers to collect from */
     28 	int count;
     29 	/* socketpair for communication between (xfrd) and the
     30 	 * dnstap collector process.  If closed, the collector process
     31 	 * exits.  The collector closes the other side of the socketpair, so
     32 	 * that if xfrd exits, so does the dnstap collector */
     33 	int cmd_socket_dt, cmd_socket_nsd;
     34 	/* the pid of the dt collector process (0 on that process) */
     35 	pid_t dt_pid;
     36 	/* in the collector process, the event base */
     37 	struct event_base* event_base;
     38 	/* in the collector process, the cmd handle event */
     39 	struct event* cmd_event;
     40 	/* in the collector process, array size count of input per worker */
     41 	struct dt_collector_input* inputs;
     42 	/* region for buffers */
     43 	struct region* region;
     44 	/* buffer for sending data to the collector */
     45 	struct buffer* send_buffer;
     46 };
     47 
     48 /* information per worker to get input from that worker. */
     49 struct dt_collector_input {
     50 	/* the collector this is part of (for use in callbacks) */
     51 	struct dt_collector* dt_collector;
     52 	/* the event to listen to the datagrams to process for that worker*/
     53 	struct event* event;
     54 	/* buffer to store the datagrams while they are read in */
     55 	struct buffer* buffer;
     56 };
     57 
     58 /* create dt_collector process structure and dt_env */
     59 struct dt_collector* dt_collector_create(struct nsd* nsd);
     60 /* destroy the dt_collector structure */
     61 void dt_collector_destroy(struct dt_collector* dt_col, struct nsd* nsd);
     62 /* close file descriptors */
     63 void dt_collector_close(struct dt_collector* dt_col, struct nsd* nsd);
     64 /* start the collector process */
     65 void dt_collector_start(struct dt_collector* dt_col, struct nsd* nsd);
     66 
     67 /* submit auth query from worker.  It attempts to send it to the collector,
     68  * if the nonblocking fails, then it silently skips it.  So it does not block
     69  * on the log.
     70  */
     71 void dt_collector_submit_auth_query(struct nsd* nsd,
     72 #ifdef INET6
     73 	struct sockaddr_storage* local_addr,
     74 	struct sockaddr_storage* addr,
     75 #else
     76 	struct sockaddr_in* local_addr,
     77 	struct sockaddr_in* addr,
     78 #endif
     79 	socklen_t addrlen, int is_tcp, struct buffer* packet);
     80 
     81 /* submit auth response from worker.  It attempts to send it to the collector,
     82  * if the nonblocking fails, then it silently skips it.  So it does not block
     83  * on the log.
     84  */
     85 void dt_collector_submit_auth_response(struct nsd* nsd,
     86 #ifdef INET6
     87 	struct sockaddr_storage* local_addr,
     88 	struct sockaddr_storage* addr,
     89 #else
     90 	struct sockaddr_in* local_addr,
     91 	struct sockaddr_in* addr,
     92 #endif
     93 	socklen_t addrlen, int is_tcp, struct buffer* packet,
     94 	struct zone* zone);
     95 
     96 #endif /* DNSTAP_COLLECTOR_H */
     97