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"

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

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, void(*unwanted_action)(void *), void *unwanted_param, int do_udp)
 Create outside_network structure with N udp ports.
void outside_network_delete (struct outside_network *outnet)
 Delete outside_network structure.
void outside_network_quit_prepare (struct outside_network *outnet)
 Prepare for quit.
struct pendingpending_udp_query (struct outside_network *outnet, ldns_buffer *packet, struct sockaddr_storage *addr, socklen_t addrlen, int timeout, comm_point_callback_t *callback, void *callback_arg)
 Send UDP query, create pending answer.
struct waiting_tcppending_tcp_query (struct outside_network *outnet, ldns_buffer *packet, struct sockaddr_storage *addr, socklen_t addrlen, int timeout, comm_point_callback_t *callback, void *callback_arg)
 Send TCP query.
void pending_delete (struct outside_network *outnet, struct pending *p)
 Delete pending answer.
struct serviced_queryoutnet_serviced_query (struct outside_network *outnet, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, struct sockaddr_storage *addr, socklen_t addrlen, comm_point_callback_t *callback, void *callback_arg, ldns_buffer *buff, int(*arg_compare)(void *, void *))
 Perform a serviced query to the authoritative servers.
void outnet_serviced_query_stop (struct serviced_query *sq, void *cb_arg)
 Remove service query callback.
size_t outnet_get_mem (struct outside_network *outnet)
 Get memory size in use by outside network.
size_t serviced_get_mem (struct serviced_query *sq)
 Get memory size in use by serviced query while it is servicing callbacks.
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 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

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,
void(*)(void *)  unwanted_action,
void *  unwanted_param,
int  do_udp 
) [read]

Create outside_network structure with N udp ports.

Parameters:
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.
do_udp,: if udp is done.
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::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, outnet_udp_cb(), outside_network_delete(), outside_network::pending, pending_cmp(), rbtree_create(), outside_network::rnd, outside_network::serviced, serviced_cmp(), setup_if(), str_is_ip6(), outside_network::svcd_overhead, 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.

Referenced by libworker_setup(), and worker_init().

void outside_network_delete ( struct outside_network outnet  ) 
void outside_network_quit_prepare ( struct outside_network outnet  ) 

Prepare for quit.

Sends no more queries, even if queued up.

Parameters:
outnet,: object to prepare for removal

References outside_network::want_to_quit.

Referenced by libworker_delete(), and worker_delete().

struct pending* pending_udp_query ( struct outside_network outnet,
ldns_buffer *  packet,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
int  timeout,
comm_point_callback_t callback,
void *  callback_arg 
) [read]

Send UDP query, create pending answer.

Changes the ID for the query to be random and unique for that destination.

Parameters:
outnet,: provides the event handling
packet,: wireformat query to send to destination.
addr,: address to send to.
addrlen,: length of addr.
timeout,: in milliseconds from now.
callback,: function to call on error, timeout or reply.
callback_arg,: user argument for callback function.
Returns:
: NULL on error for malloc or socket. Else the pending query object.

References replay_moment::addr, pending::addr, replay_moment::addrlen, pending::addrlen, advance_moment(), outside_network::base, pending::cb, pending::cb_arg, comm_timer_create(), comm_timer_delete(), replay_moment::evt_type, fatal_exit(), find_match(), rbnode_t::key, log_assert, log_err(), log_info(), log_pkt(), replay_moment::match, memdup(), pending::next_waiting, pending::node, replay_runtime::now, pending::outnet, pending_delete(), replay_runtime::pending_list, pending_udp_timer_cb(), pending::pkt, pending::pkt_len, randomize_and_send_udp(), repevt_string(), sockaddr_cmp(), replay_moment::time_step, pending::timeout, pending::timer, outside_network::udp_wait_first, outside_network::udp_wait_last, outside_network::unused_fds, VERB_ALGO, and verbose().

Referenced by libworker_send_packet(), serviced_udp_send(), and worker_send_packet().

struct waiting_tcp* pending_tcp_query ( struct outside_network outnet,
ldns_buffer *  packet,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
int  timeout,
comm_point_callback_t callback,
void *  callback_arg 
) [read]

Send TCP query.

May wait for TCP buffer. Selects ID to be random, and checks id.

Parameters:
outnet,: provides the event handling.
packet,: wireformat query to send to destination. copied from.
addr,: address to send to.
addrlen,: length of addr.
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.
Returns:
: false on error for malloc or socket. Else the pending TCP object.

References replay_moment::addr, waiting_tcp::addr, replay_moment::addrlen, waiting_tcp::addrlen, advance_moment(), outside_network::base, waiting_tcp::cb, waiting_tcp::cb_arg, comm_timer_create(), comm_timer_set(), replay_moment::evt_type, fatal_exit(), find_match(), log_assert, log_err(), log_info(), log_pkt(), replay_moment::match, waiting_tcp::next_waiting, replay_runtime::now, waiting_tcp::outnet, outnet_tcp_take_into_use(), outnet_tcptimer(), replay_runtime::pending_list, waiting_tcp::pkt, waiting_tcp::pkt_len, repevt_string(), outside_network::rnd, sockaddr_cmp(), outside_network::tcp_free, outside_network::tcp_wait_first, outside_network::tcp_wait_last, replay_moment::time_step, waiting_tcp::timer, ub_random(), and waiting_tcp_delete().

Referenced by libworker_send_packet(), serviced_tcp_initiate(), serviced_tcp_send(), and worker_send_packet().

void pending_delete ( struct outside_network outnet,
struct pending p 
)

Delete pending answer.

Parameters:
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_t::key, log_assert, pending::next_waiting, pending::node, 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(), outnet_udp_cb(), outside_network_delete(), pending_node_del(), pending_udp_query(), pending_udp_timer_cb(), and serviced_delete().

struct serviced_query* outnet_serviced_query ( struct outside_network outnet,
uint8_t *  qname,
size_t  qnamelen,
uint16_t  qtype,
uint16_t  qclass,
uint16_t  flags,
int  dnssec,
struct sockaddr_storage *  addr,
socklen_t  addrlen,
comm_point_callback_t callback,
void *  callback_arg,
ldns_buffer *  buff,
int(*)(void *, void *)  arg_compare 
) [read]

Perform a serviced query to the authoritative servers.

Duplicate efforts are detected, and EDNS, TCP and UDP retry is performed.

Parameters:
outnet,: outside network, with rbtree of serviced queries.
qname,: what qname to query.
qnamelen,: length of qname in octets including 0 root label.
qtype,: rrset type to query (host format)
qclass,: query class. (host format)
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.
callback,: callback function.
callback_arg,: user argument to callback function.
addr,: to which server to send the query.
addrlen,: length of addr.
buff,: scratch buffer to create query contents in. Empty on exit.
arg_compare,: function to compare callback args, return true if identical. It is given the callback_arg and args that are listed.
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 replay_moment::addr, replay_moment::addrlen, advance_moment(), attach_edns_record(), outside_network::base, BIT_CD, BIT_RD, edns_data::bits, callback_list_find(), service_callback::cb, service_callback::cb_arg, serviced_query::cblist, outside_network::do_udp, EDNS_ADVERTISED_SIZE, EDNS_ADVERTISED_VERSION, EDNS_DO, edns_data::edns_present, edns_data::edns_version, replay_moment::evt_type, edns_data::ext_rcode, fatal_exit(), find_match(), log_assert, log_err(), log_info(), log_nametypeclass(), lookup_serviced(), replay_moment::match, service_callback::next, replay_runtime::now, replay_runtime::pending_list, serviced_query::qbuf, rbtree_delete(), repevt_string(), outside_network::serviced, serviced_create(), serviced_gen_query(), serviced_tcp_send(), serviced_udp_send(), sockaddr_cmp(), replay_moment::time_step, UDP_AUTH_QUERY_TIMEOUT, edns_data::udp_size, VERB_OPS, and verbose().

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.

Parameters:
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(), 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(), and serviced_query::to_be_deleted.

Referenced by outbound_list_clear(), and outbound_list_remove().

size_t outnet_get_mem ( struct outside_network outnet  ) 
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:
sq,: serviced query.
Returns:
size in bytes.

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

Referenced by worker_mem_report().

Generated on Thu Apr 22 00:27:06 2010 for unbound by  doxygen 1.6.3