|
unbound
0.1
|
This file contains the worker process or thread that performs the DNS resolving and validation. More...
#include "config.h"#include <ldns/dname.h>#include <ldns/wire2host.h>#include <openssl/ssl.h>#include "libunbound/libworker.h"#include "libunbound/context.h"#include "libunbound/unbound.h"#include "services/outside_network.h"#include "services/mesh.h"#include "services/localzone.h"#include "services/cache/rrset.h"#include "services/outbound_list.h"#include "util/module.h"#include "util/regional.h"#include "util/random.h"#include "util/config_file.h"#include "util/netevent.h"#include "util/storage/lookup3.h"#include "util/storage/slabhash.h"#include "util/net_help.h"#include "util/data/dname.h"#include "util/data/msgreply.h"#include "util/data/msgencode.h"#include "util/tube.h"#include "iterator/iter_fwd.h"Functions | |
| static void | handle_newq (struct libworker *w, uint8_t *buf, uint32_t len) |
| handle new query command for bg worker | |
| static void | libworker_delete (struct libworker *w) |
| delete libworker struct | |
| static struct libworker * | libworker_setup (struct ub_ctx *ctx, int is_bg) |
| setup fresh libworker struct | |
| static void | handle_cancel (struct libworker *w, uint8_t *buf, uint32_t len) |
| handle cancel command for bg worker | |
| static void | libworker_do_cmd (struct libworker *w, uint8_t *msg, uint32_t len) |
| do control command coming into bg server | |
| void | libworker_handle_control_cmd (struct tube *ATTR_UNUSED(tube), uint8_t *msg, size_t len, int err, void *arg) |
| handle control command coming into server | |
| static void * | libworker_dobg (void *arg) |
| the background thread func | |
| int | libworker_bg (struct ub_ctx *ctx) |
| Create a background worker. | |
| static struct reply_info * | parse_reply (ldns_buffer *pkt, struct regional *region, struct query_info *qi) |
| get msg reply struct (in temp region) | |
| static int | fill_canon (struct ub_result *res, uint8_t *s) |
| insert canonname | |
| static int | fill_res (struct ub_result *res, struct ub_packed_rrset_key *answer, uint8_t *finalcname, struct query_info *rq) |
| fill data into result | |
| void | libworker_enter_result (struct ub_result *res, ldns_buffer *buf, struct regional *temp, enum sec_status msg_security) |
| fill result from parsed message, on error fills servfail | |
| static void | libworker_fillup_fg (struct ctx_query *q, int rcode, ldns_buffer *buf, enum sec_status s, char *why_bogus) |
| fillup fg results | |
| void | libworker_fg_done_cb (void *arg, int rcode, ldns_buffer *buf, enum sec_status s, char *why_bogus) |
| mesh callback with fg results | |
| static int | setup_qinfo_edns (struct libworker *w, struct ctx_query *q, struct query_info *qinfo, struct edns_data *edns) |
| setup qinfo and edns | |
| int | libworker_fg (struct ub_ctx *ctx, struct ctx_query *q) |
| Create a foreground worker. | |
| static void | add_bg_result (struct libworker *w, struct ctx_query *q, ldns_buffer *pkt, int err, char *reason) |
| add result to the bg worker result queue | |
| void | libworker_bg_done_cb (void *arg, int rcode, ldns_buffer *buf, enum sec_status s, char *why_bogus) |
| mesh callback with bg results | |
| void | libworker_alloc_cleanup (void *arg) |
| cleanup the cache to remove all rrset IDs from it, arg is libworker | |
| static int | outbound_entry_compare (void *a, void *b) |
| compare outbound entry qstates | |
| 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) |
| Worker service routine to send serviced queries to authoritative servers. | |
| 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 | worker_handle_control_cmd (struct tube *ATTR_UNUSED(tube), uint8_t *ATTR_UNUSED(buffer), size_t ATTR_UNUSED(len), int ATTR_UNUSED(error), void *ATTR_UNUSED(arg)) |
| int | worker_handle_request (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(repinfo)) |
| int | worker_handle_reply (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info)) |
| int | worker_handle_service_reply (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info)) |
| int | remote_accept_callback (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(repinfo)) |
| int | remote_control_callback (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(repinfo)) |
| void | worker_sighandler (int ATTR_UNUSED(sig), void *ATTR_UNUSED(arg)) |
| struct outbound_entry * | worker_send_query (uint8_t *ATTR_UNUSED(qname), size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype), uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags), int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec), struct sockaddr_storage *ATTR_UNUSED(addr), socklen_t ATTR_UNUSED(addrlen), struct module_qstate *ATTR_UNUSED(q)) |
| void | worker_alloc_cleanup (void *ATTR_UNUSED(arg)) |
| void | worker_stat_timer_cb (void *ATTR_UNUSED(arg)) |
| void | worker_probe_timer_cb (void *ATTR_UNUSED(arg)) |
| int | order_lock_cmp (const void *ATTR_UNUSED(e1), const void *ATTR_UNUSED(e2)) |
| int | codeline_cmp (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b)) |
| int | replay_var_compare (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b)) |
| void | remote_get_opt_ssl (char *ATTR_UNUSED(str), void *ATTR_UNUSED(arg)) |
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.
| int libworker_bg | ( | struct ub_ctx * | ctx | ) |
Create a background worker.
| 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. |
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().
| void libworker_enter_result | ( | struct ub_result * | res, |
| ldns_buffer * | buf, | ||
| struct regional * | temp, | ||
| enum sec_status | msg_security | ||
| ) |
fill result from parsed message, on error fills servfail
| 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().
| 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.
| ctx,: | new allocation cache obtained and returned to it. |
| q,: | query (result is stored in here). |
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(), UB_INITFAIL, UB_NOERROR, UB_NOMEM, UB_SYNTAX, outside_network::udp_buff, and ctx_query::w.
Referenced by ub_resolve().
| 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.
| 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. |
References libworker::back, module_env::cfg, module_qstate::env, outbound_entry_compare(), outnet_serviced_query(), module_qstate::region, regional_alloc(), config_file::ssl_upstream, config_file::tcp_upstream, outside_network::udp_buff, and module_env::worker.
1.7.6.1