Data Structures | Functions
libworker.h File Reference

This file contains the worker process or thread that performs the DNS resolving and validation. More...

#include "util/data/packed_rrset.h"

Data Structures

struct  libworker
 The library-worker status structure Internal to the worker. More...
 

Functions

int libworker_bg (struct ub_ctx *ctx)
 Create a background worker. More...
 
int libworker_fg (struct ub_ctx *ctx, struct ctx_query *q)
 Create a foreground worker. More...
 
struct libworkerlibworker_create_event (struct ub_ctx *ctx, struct event_base *eb)
 create worker for event-based interface. More...
 
int libworker_attach_mesh (struct ub_ctx *ctx, struct ctx_query *q, int *async_id)
 Attach context_query to mesh for callback in event-driven setup. More...
 
void libworker_delete_event (struct libworker *w)
 delete worker for event-based interface. More...
 
void libworker_alloc_cleanup (void *arg)
 cleanup the cache to remove all rrset IDs from it, arg is libworker
 
struct outbound_entrylibworker_send_query (uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *zone, size_t zonelen, struct module_qstate *q)
 Worker service routine to send serviced queries to authoritative servers. More...
 
int libworker_handle_reply (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info)
 process incoming replies from the network
 
int libworker_handle_service_reply (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info)
 process incoming serviced query replies from the network
 
void libworker_handle_control_cmd (struct tube *tube, uint8_t *msg, size_t len, int err, void *arg)
 handle control command coming into server
 
void libworker_handle_result_write (struct tube *tube, uint8_t *msg, size_t len, int err, void *arg)
 handle opportunity to write result back
 
void libworker_fg_done_cb (void *arg, int rcode, struct sldns_buffer *buf, enum sec_status s, char *why_bogus)
 mesh callback with fg results
 
void libworker_bg_done_cb (void *arg, int rcode, struct sldns_buffer *buf, enum sec_status s, char *why_bogus)
 mesh callback with bg results
 
void libworker_event_done_cb (void *arg, int rcode, struct sldns_buffer *buf, enum sec_status s, char *why_bogus)
 mesh callback with event results
 
void libworker_enter_result (struct ub_result *res, struct sldns_buffer *buf, struct regional *temp, enum sec_status msg_security)
 fill result from parsed message, on error fills servfail More...
 

Detailed Description

This file contains the worker process or thread that performs the DNS resolving and validation.

The worker is called by a procedure and if in the background continues until exit, if in the foreground returns from the procedure when done.

Function Documentation

int libworker_bg ( struct ub_ctx ctx)

Create a background worker.

Parameters
ctx,:is updated with pid/tid of the background worker. a new allocation cache is obtained from ctx. It contains the threadnumber and unique id for further (shared) cache insertions.
Returns
0 if OK, else error. Further communication is done via the pipes in ctx.

References ub_ctx::bg_pid, ub_ctx::bg_tid, ub_ctx::cfglock, ub_ctx::dothread, fatal_exit(), libworker::is_bg_thread, libworker_dobg(), libworker_setup(), ub_ctx::qq_pipe, ub_ctx::rr_pipe, libworker::thread_num, tube_close_read(), tube_close_write(), UB_FORKFAIL, UB_NOERROR, and UB_NOMEM.

Referenced by ub_resolve_async().

int libworker_fg ( struct ub_ctx ctx,
struct ctx_query q 
)

Create a foreground worker.

This worker will join the threadpool of resolver threads. It exits when the query answer has been obtained (or error). This routine blocks until the worker is finished.

Parameters
ctx,:new allocation cache obtained and returned to it.
q,:query (result is stored in here).
Returns
0 if finished OK, else error.

References libworker::back, libworker::base, BIT_RD, comm_base_dispatch(), libworker::env, libworker_delete(), libworker_fillup_fg(), libworker_setup(), ub_ctx::local_zones, local_zones_answer(), module_env::mesh, mesh_new_callback(), query_info::qname, regional_free_all(), module_env::scratch, sec_status_insecure, setup_qinfo_edns(), sldns_buffer_write_u16_at(), UB_INITFAIL, UB_NOERROR, UB_NOMEM, UB_SYNTAX, outside_network::udp_buff, and ctx_query::w.

Referenced by ub_resolve().

struct libworker* libworker_create_event ( struct ub_ctx ctx,
struct event_base *  eb 
)
read

create worker for event-based interface.

Parameters
ctx,:context with config.
eb,:event base.
Returns
new worker or NULL.

References libworker_setup().

Referenced by ub_resolve_event().

int libworker_attach_mesh ( struct ub_ctx ctx,
struct ctx_query q,
int *  async_id 
)

Attach context_query to mesh for callback in event-driven setup.

Parameters
ctx,:context
q,:context query entry
async_id,:store query num if query takes long.
Returns
0 if finished OK, else error.

References libworker::back, BIT_RD, libworker::env, ub_ctx::event_worker, ub_ctx::local_zones, local_zones_answer(), module_env::mesh, mesh_new_callback(), query_info::qname, ctx_query::querynum, regional_free_all(), module_env::scratch, sec_status_insecure, setup_qinfo_edns(), sldns_buffer_write_u16_at(), UB_INITFAIL, UB_NOERROR, UB_NOMEM, UB_SYNTAX, outside_network::udp_buff, and ctx_query::w.

Referenced by ub_resolve_event().

void libworker_delete_event ( struct libworker w)

delete worker for event-based interface.

does not free the event_base.

Parameters
w,:event-based worker to delete.

References libworker::base, comm_base_delete_no_base(), and libworker_delete_env().

Referenced by ub_ctx_delete(), and ub_ctx_set_event().

struct outbound_entry* libworker_send_query ( uint8_t *  qname,
size_t  qnamelen,
uint16_t  qtype,
uint16_t  qclass,
uint16_t  flags,
int  dnssec,
int  want_dnssec,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
uint8_t *  zone,
size_t  zonelen,
struct module_qstate q 
)
read

Worker service routine to send serviced queries to authoritative servers.

Parameters
qname,:query name. (host order)
qnamelen,:length in bytes of qname, including trailing 0.
qtype,:query type. (host order)
qclass,:query class. (host order)
flags,:host order flags word, with opcode and CD bit.
dnssec,:if set, EDNS record will have DO bit set.
want_dnssec,:signatures needed.
addr,:where to.
addrlen,:length of addr.
zone,:delegation point name.
zonelen,:length of zone name wireformat dname.
q,:wich query state to reactivate upon return.
Returns
: false on failure (memory or socket related). no query was sent.

References libworker::back, module_env::cfg, module_qstate::env, outnet_serviced_query(), module_qstate::region, regional_alloc(), config_file::ssl_upstream, config_file::tcp_upstream, outside_network::udp_buff, and module_env::worker.

void libworker_enter_result ( struct ub_result res,
struct sldns_buffer buf,
struct regional temp,
enum sec_status  msg_security 
)

fill result from parsed message, on error fills servfail

Parameters
res,:is clear at start, filled in at end.
buf,:contains DNS message.
temp,:temporary buffer for parse.
msg_security,:security status of the DNS message. On error, the res may contain a different status (out of memory is not secure, not bogus).

References ub_result::bogus, ub_result::data, fill_res(), reply_info::flags, FLAGS_GET_RCODE, ub_result::havedata, log_err(), ub_result::nxdomain, parse_reply(), ub_result::rcode, reply_find_answer_rrset(), reply_find_final_cname_target(), sec_status_bogus, sec_status_secure, and ub_result::secure.

Referenced by libworker_fillup_fg(), and process_answer_detail().