Data Structures | Macros | Functions
outside_network.h File Reference

This file has functions to send queries to authoritative servers, and wait for the pending answer, with timeouts. More...

#include "util/rbtree.h"
#include "util/netevent.h"
#include "dnstap/dnstap_config.h"

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_networkoutside_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 pendingpending_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_tcppending_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_queryoutnet_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
 

Detailed Description

This file has functions to send queries to authoritative servers, and wait for the pending answer, with timeouts.

Function Documentation

◆ outside_network_create()

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.

Parameters
basethe communication base to use for event handling.
bufsizesize for network buffers.
num_portsnumber of udp ports to open per interface.
ifsinterface names (or NULL for default interface). These interfaces must be able to access all authoritative servers.
num_ifsnumber of names in array ifs.
do_ip4service IP4.
do_ip6service IP6.
num_tcpnumber of outgoing tcp buffers to preallocate.
infrapointer to infra cached used for serviced queries.
rndstored to create random numbers for serviced queries.
use_caps_for_idenable to use 0x20 bits to encode id randomness.
availportsarray of available ports.
numavailportsnumber of available ports in array.
unwanted_thresholdwhen to take defensive action.
unwanted_actionthe action to take.
unwanted_paramuser parameter to action.
tcp_mssmaximum segment size of tcp socket.
do_udpif udp is done.
sslctxcontext to create outgoing connections with (if enabled).
delaycloseif not 0, udp sockets are delayed before timeout closure. msec to wait on timeouted udp sockets.
dtenvenvironment to send dnstap events with (if enabled).
Returns
: the new structure (with no pending answers) or NULL on error.

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.

◆ outside_network_delete()

void outside_network_delete ( struct outside_network outnet)

◆ outside_network_quit_prepare()

void outside_network_quit_prepare ( struct outside_network outnet)

Prepare for quit.

Sends no more queries, even if queued up.

Parameters
outnetobject to prepare for removal

References outside_network::want_to_quit.

Referenced by libworker_delete_env(), and worker_delete().

◆ pending_udp_query()

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.

Parameters
sqserviced query.
packetwireformat query to send to destination.
timeoutin milliseconds from now.
callbackfunction to call on error, timeout or reply.
callback_arguser argument for callback function.
Returns
: NULL on error for malloc or socket. Else the pending query object.

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().

◆ pending_tcp_query()

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.

Parameters
sqserviced query.
packetwireformat query to send to destination. copied from.
timeoutin seconds from now. Timer starts running now. Timer may expire if all buffers are used, without any query been sent to the server yet.
callbackfunction to call on error, timeout or reply.
callback_arguser argument for callback function.
Returns
: false on error for malloc or socket. Else the pending TCP object.

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().

◆ pending_delete()

void pending_delete ( struct outside_network outnet,
struct pending p 
)

◆ outnet_serviced_query()

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.

Parameters
outnetoutside network, with rbtree of serviced queries.
qinfoquery info.
flagsflags u16 (host format), includes opcode, CD bit.
dnssecif 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_dnssecsignatures are needed, without EDNS the answer is likely to be useless.
nocapsignore use_caps_for_id and use unperturbed qname.
tcp_upstreamuse TCP for upstream queries.
ssl_upstreamuse SSL for upstream queries.
addrto which server to send the query.
addrlenlength of addr.
zonename of the zone of the delegation point. wireformat dname. This is the delegation point name for which the server is deemed authoritative.
zonelenlength of zone.
qstatemodule qstate. Mainly for inspecting the available edns_opts_lists.
callbackcallback function.
callback_arguser argument to callback function.
buffscratch buffer to create query contents in. Empty on exit.
envthe module environment.
Returns
0 on error, or pointer to serviced query that is used to answer this serviced query may be shared with other callbacks as well.

References service_callback::cb, service_callback::cb_arg, serviced_query::cblist, outside_network::do_udp, module_qstate::edns_opts_back_out, inplace_cb_query_call(), lookup_serviced(), service_callback::next, 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().

◆ outnet_serviced_query_stop()

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.

Parameters
sqserviced query to adjust.
cb_argcallback argument of callback that needs removal. same as the callback_arg to outnet_serviced_query().

References fake_pending::buffer, callback_list_remove(), 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().

◆ outnet_get_mem()

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.

Parameters
outnetoutside network structure.
Returns
size in bytes.

References outside_network::base, port_comm::next, sldns_buffer_capacity(), outside_network::udp_buff, and outside_network::unused_fds.

◆ serviced_get_mem()

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.

Parameters
sqserviced query.
Returns
size in bytes.

References serviced_query::cblist, comm_timer_get_mem(), service_callback::next, serviced_query::qbuflen, and serviced_query::status.