unbound
0.1
|
This file has functions to send queries to authoritative servers, and wait for the pending answer, with timeouts. More...
Data Structures | |
struct | outside_network |
Send queries to outside servers and wait for answers from servers. More... | |
struct | port_if |
Outgoing interface. More... | |
struct | port_comm |
Outgoing commpoint for UDP port. More... | |
struct | pending |
A query that has an answer pending for it. More... | |
struct | pending_tcp |
Pending TCP query to server. More... | |
struct | waiting_tcp |
Query waiting for TCP buffer. More... | |
struct | service_callback |
Callback to party interested in serviced query results. More... | |
struct | serviced_query |
Query service record. More... | |
Macros | |
#define | EDNS_FRAG_SIZE_IP4 1472 |
fallback size for fragmentation for EDNS in IPv4 | |
#define | EDNS_FRAG_SIZE_IP6 1232 |
fallback size for EDNS in IPv6, fits one fragment with ip6-tunnel-ids | |
Functions | |
struct outside_network * | outside_network_create (struct comm_base *base, size_t bufsize, size_t num_ports, char **ifs, int num_ifs, int do_ip4, int do_ip6, size_t num_tcp, struct infra_cache *infra, struct ub_randstate *rnd, int use_caps_for_id, int *availports, int numavailports, size_t unwanted_threshold, int tcp_mss, void(*unwanted_action)(void *), void *unwanted_param, int do_udp, void *sslctx, int delayclose, struct dt_env *dtenv) |
Create outside_network structure with N udp ports. More... | |
void | outside_network_delete (struct outside_network *outnet) |
Delete outside_network structure. More... | |
void | outside_network_quit_prepare (struct outside_network *outnet) |
Prepare for quit. More... | |
struct pending * | pending_udp_query (struct serviced_query *sq, struct sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg) |
Send UDP query, create pending answer. More... | |
struct waiting_tcp * | pending_tcp_query (struct serviced_query *sq, struct sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg) |
Send TCP query. More... | |
void | pending_delete (struct outside_network *outnet, struct pending *p) |
Delete pending answer. More... | |
struct serviced_query * | outnet_serviced_query (struct outside_network *outnet, struct query_info *qinfo, uint16_t flags, int dnssec, int want_dnssec, int nocaps, int tcp_upstream, int ssl_upstream, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *zone, size_t zonelen, struct module_qstate *qstate, comm_point_callback_type *callback, void *callback_arg, struct sldns_buffer *buff, struct module_env *env) |
Perform a serviced query to the authoritative servers. More... | |
void | outnet_serviced_query_stop (struct serviced_query *sq, void *cb_arg) |
Remove service query callback. More... | |
size_t | outnet_get_mem (struct outside_network *outnet) |
Get memory size in use by outside network. More... | |
size_t | serviced_get_mem (struct serviced_query *sq) |
Get memory size in use by serviced query while it is servicing callbacks. More... | |
int | outnet_udp_cb (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info) |
callback for incoming udp answers from the network | |
int | outnet_tcp_cb (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info) |
callback for pending tcp connections | |
void | pending_udp_timer_cb (void *arg) |
callback for udp timeout | |
void | pending_udp_timer_delay_cb (void *arg) |
callback for udp delay for timeout | |
void | outnet_tcptimer (void *arg) |
callback for outgoing TCP timer event | |
int | serviced_udp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep) |
callback for serviced query UDP answers | |
int | serviced_tcp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep) |
TCP reply or error callback for serviced queries. | |
int | pending_cmp (const void *key1, const void *key2) |
compare function of pending rbtree | |
int | serviced_cmp (const void *key1, const void *key2) |
compare function of serviced query rbtree | |
This file has functions to send queries to authoritative servers, and wait for the pending answer, with timeouts.
struct outside_network* outside_network_create | ( | struct comm_base * | base, |
size_t | bufsize, | ||
size_t | num_ports, | ||
char ** | ifs, | ||
int | num_ifs, | ||
int | do_ip4, | ||
int | do_ip6, | ||
size_t | num_tcp, | ||
struct infra_cache * | infra, | ||
struct ub_randstate * | rnd, | ||
int | use_caps_for_id, | ||
int * | availports, | ||
int | numavailports, | ||
size_t | unwanted_threshold, | ||
int | tcp_mss, | ||
void(*)(void *) | unwanted_action, | ||
void * | unwanted_param, | ||
int | do_udp, | ||
void * | sslctx, | ||
int | delayclose, | ||
struct dt_env * | dtenv | ||
) |
Create outside_network structure with N udp ports.
base | the communication base to use for event handling. |
bufsize | size for network buffers. |
num_ports | number of udp ports to open per interface. |
ifs | interface names (or NULL for default interface). These interfaces must be able to access all authoritative servers. |
num_ifs | number of names in array ifs. |
do_ip4 | service IP4. |
do_ip6 | service IP6. |
num_tcp | number of outgoing tcp buffers to preallocate. |
infra | pointer to infra cached used for serviced queries. |
rnd | stored to create random numbers for serviced queries. |
use_caps_for_id | enable to use 0x20 bits to encode id randomness. |
availports | array of available ports. |
numavailports | number of available ports in array. |
unwanted_threshold | when to take defensive action. |
unwanted_action | the action to take. |
unwanted_param | user parameter to action. |
tcp_mss | maximum segment size of tcp socket. |
do_udp | if udp is done. |
sslctx | context to create outgoing connections with (if enabled). |
delayclose | if not 0, udp sockets are delayed before timeout closure. msec to wait on timeouted udp sockets. |
dtenv | environment to send dnstap events with (if enabled). |
References outside_network::base, calc_num46(), comm_base_timept(), comm_point_create_udp(), port_comm::cp, create_pending_tcp(), outside_network::delay_tv, outside_network::delayclose, outside_network::do_udp, outside_network::infra, outside_network::ip4_ifs, outside_network::ip6_ifs, log_err(), port_comm::next, outside_network::now_secs, outside_network::now_tv, outside_network::num_ip4, outside_network::num_ip6, outside_network::num_tcp, outside_network::num_tcp_outgoing, outnet_udp_cb(), outside_network_delete(), outside_network::pending, pending_cmp(), rbtree_create(), outside_network::rnd, outside_network::serviced, serviced_cmp(), setup_if(), sldns_buffer_new(), outside_network::sslctx, str_is_ip6(), outside_network::svcd_overhead, outside_network::tcp_mss, outside_network::udp_buff, outside_network::unused_fds, outside_network::unwanted_action, outside_network::unwanted_param, outside_network::unwanted_threshold, outside_network::use_caps_for_id, and outside_network::want_to_quit.
void outside_network_delete | ( | struct outside_network * | outnet | ) |
Delete outside_network structure.
outnet | object to delete. |
References port_if::avail_ports, pending_tcp::c, comm_point_delete(), port_comm::cp, port_if::inuse, outside_network::ip4_ifs, outside_network::ip6_ifs, port_comm::next, pending::next_waiting, waiting_tcp::next_waiting, outside_network::num_ip4, outside_network::num_ip6, outside_network::num_tcp, port_if::out, pending::outnet, waiting_tcp::outnet, outside_network::pending, pending_delete(), pending_node_del(), pending_tcp::query, outside_network::serviced, serviced_node_del(), sldns_buffer_free(), outside_network::tcp_conns, outside_network::tcp_wait_first, traverse_postorder(), outside_network::udp_buff, outside_network::udp_wait_first, outside_network::unused_fds, waiting_tcp_delete(), and outside_network::want_to_quit.
Referenced by libworker_delete_env(), outside_network_create(), and worker_delete().
void outside_network_quit_prepare | ( | struct outside_network * | outnet | ) |
Prepare for quit.
Sends no more queries, even if queued up.
outnet | object to prepare for removal |
References outside_network::want_to_quit.
Referenced by libworker_delete_env(), and worker_delete().
struct pending* pending_udp_query | ( | struct serviced_query * | sq, |
struct sldns_buffer * | packet, | ||
int | timeout, | ||
comm_point_callback_type * | callback, | ||
void * | callback_arg | ||
) |
Send UDP query, create pending answer.
Changes the ID for the query to be random and unique for that destination.
sq | serviced query. |
packet | wireformat query to send to destination. |
timeout | in milliseconds from now. |
callback | function to call on error, timeout or reply. |
callback_arg | user argument for callback function. |
References pending::addr, serviced_query::addr, pending::addrlen, serviced_query::addrlen, outside_network::base, pending::cb, pending::cb_arg, comm_timer_create(), comm_timer_delete(), rbnode_type::key, log_assert, memdup(), pending::next_waiting, pending::node, pending::outnet, serviced_query::outnet, pending_delete(), pending_udp_timer_cb(), pending::pkt, pending::pkt_len, randomize_and_send_udp(), sldns_buffer_begin(), sldns_buffer_capacity(), sldns_buffer_flip(), sldns_buffer_limit(), sldns_buffer_new(), sldns_buffer_write(), pending::sq, pending::timeout, pending::timer, outside_network::udp_wait_first, outside_network::udp_wait_last, outside_network::unused_fds, VERB_ALGO, and verbose().
Referenced by serviced_udp_send().
struct waiting_tcp* pending_tcp_query | ( | struct serviced_query * | sq, |
struct sldns_buffer * | packet, | ||
int | timeout, | ||
comm_point_callback_type * | callback, | ||
void * | callback_arg | ||
) |
Send TCP query.
May wait for TCP buffer. Selects ID to be random, and checks id.
sq | serviced query. |
packet | wireformat query to send to destination. copied from. |
timeout | in seconds from now. Timer starts running now. Timer may expire if all buffers are used, without any query been sent to the server yet. |
callback | function to call on error, timeout or reply. |
callback_arg | user argument for callback function. |
References serviced_query::addr, serviced_query::addrlen, outside_network::base, comm_timer_create(), log_assert, serviced_query::outnet, outnet_tcptimer(), waiting_tcp::pkt, waiting_tcp::pkt_len, outside_network::rnd, sldns_buffer_begin(), sldns_buffer_capacity(), sldns_buffer_flip(), sldns_buffer_limit(), sldns_buffer_new(), sldns_buffer_write(), outside_network::tcp_free, waiting_tcp::timer, and ub_random().
Referenced by serviced_tcp_initiate(), and serviced_tcp_send().
void pending_delete | ( | struct outside_network * | outnet, |
struct pending * | p | ||
) |
Delete pending answer.
outnet | outside network the pending query is part of. Internal feature: if outnet is NULL, p is not unlinked from rbtree. |
p | deleted |
References comm_timer_delete(), rbnode_type::key, log_assert, pending::next_waiting, pending::node, pending::outnet, outside_network::pending, pending::pkt, rbtree_delete(), pending::timer, outside_network::udp_wait_first, and outside_network::udp_wait_last.
Referenced by outnet_send_wait_udp(), outside_network_delete(), pending_node_del(), pending_udp_query(), pending_udp_timer_cb(), pending_udp_timer_delay_cb(), and serviced_delete().
struct serviced_query* outnet_serviced_query | ( | struct outside_network * | outnet, |
struct query_info * | qinfo, | ||
uint16_t | flags, | ||
int | dnssec, | ||
int | want_dnssec, | ||
int | nocaps, | ||
int | tcp_upstream, | ||
int | ssl_upstream, | ||
struct sockaddr_storage * | addr, | ||
socklen_t | addrlen, | ||
uint8_t * | zone, | ||
size_t | zonelen, | ||
struct module_qstate * | qstate, | ||
comm_point_callback_type * | callback, | ||
void * | callback_arg, | ||
struct sldns_buffer * | buff, | ||
struct module_env * | env | ||
) |
Perform a serviced query to the authoritative servers.
Duplicate efforts are detected, and EDNS, TCP and UDP retry is performed.
outnet | outside network, with rbtree of serviced queries. |
qinfo | query info. |
flags | flags u16 (host format), includes opcode, CD bit. |
dnssec | if set, DO bit is set in EDNS queries. If the value includes BIT_CD, CD bit is set when in EDNS queries. If the value includes BIT_DO, DO bit is set when in EDNS queries. |
want_dnssec | signatures are needed, without EDNS the answer is likely to be useless. |
nocaps | ignore use_caps_for_id and use unperturbed qname. |
tcp_upstream | use TCP for upstream queries. |
ssl_upstream | use SSL for upstream queries. |
addr | to which server to send the query. |
addrlen | length of addr. |
zone | name of the zone of the delegation point. wireformat dname. This is the delegation point name for which the server is deemed authoritative. |
zonelen | length of zone. |
qstate | module qstate. Mainly for inspecting the available edns_opts_lists. |
callback | callback function. |
callback_arg | user argument to callback function. |
buff | scratch buffer to create query contents in. Empty on exit. |
env | the module environment. |
References service_callback::cb, serviced_query::cblist, outside_network::do_udp, module_qstate::edns_opts_back_out, inplace_cb_query_call(), lookup_serviced(), serviced_query::qbuf, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, rbtree_delete(), module_qstate::region, outside_network::serviced, serviced_create(), serviced_gen_query(), serviced_tcp_send(), serviced_udp_send(), and serviced_query::zone.
Referenced by libworker_send_query(), and worker_send_query().
void outnet_serviced_query_stop | ( | struct serviced_query * | sq, |
void * | cb_arg | ||
) |
Remove service query callback.
If that leads to zero callbacks, the query is completely cancelled.
sq | serviced query to adjust. |
cb_arg | callback argument of callback that needs removal. same as the callback_arg to outnet_serviced_query(). |
References fake_pending::buffer, callback_list_remove(), service_callback::cb_arg, fake_pending::cb_arg, serviced_query::cblist, log_assert, log_info(), fake_pending::next, serviced_query::outnet, replay_runtime::pending_list, fake_pending::pkt, rbtree_delete(), fake_pending::runtime, outside_network::serviced, serviced_delete(), sldns_buffer_free(), serviced_query::to_be_deleted, and fake_pending::zone.
Referenced by outbound_list_clear(), and outbound_list_remove().
size_t outnet_get_mem | ( | struct outside_network * | outnet | ) |
Get memory size in use by outside network.
Counts buffers and outstanding query (serviced queries) malloced data.
outnet | outside network structure. |
References outside_network::base, port_comm::next, sldns_buffer_capacity(), outside_network::udp_buff, and outside_network::unused_fds.
size_t serviced_get_mem | ( | struct serviced_query * | sq | ) |
Get memory size in use by serviced query while it is servicing callbacks.
This takes into account the pre-deleted status of it; it will be deleted when the callbacks are done.
sq | serviced query. |
References serviced_query::cblist, comm_timer_get_mem(), service_callback::next, serviced_query::qbuflen, and serviced_query::status.