Electroneum
outside_network.h File Reference
#include "util/rbtree.h"
#include "util/netevent.h"
#include "dnstap/dnstap_config.h"
Include dependency graph for outside_network.h:

Go to the source code of this file.

Classes

struct  outside_network
 
struct  port_if
 
struct  port_comm
 
struct  pending
 
struct  pending_tcp
 
struct  waiting_tcp
 
struct  service_callback
 
struct  serviced_query
 

Macros

#define EDNS_FRAG_SIZE_IP4   1472
 
#define EDNS_FRAG_SIZE_IP6   1232
 

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)
 
void outside_network_delete (struct outside_network *outnet)
 
void outside_network_quit_prepare (struct outside_network *outnet)
 
struct pendingpending_udp_query (struct serviced_query *sq, struct sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg)
 
struct waiting_tcppending_tcp_query (struct serviced_query *sq, struct sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg)
 
void pending_delete (struct outside_network *outnet, struct pending *p)
 
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, char *tls_auth_name, 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)
 
void outnet_serviced_query_stop (struct serviced_query *sq, void *cb_arg)
 
size_t outnet_get_mem (struct outside_network *outnet)
 
size_t serviced_get_mem (struct serviced_query *sq)
 
int outnet_get_tcp_fd (struct sockaddr_storage *addr, socklen_t addrlen, int tcp_mss)
 
struct comm_pointoutnet_comm_point_for_udp (struct outside_network *outnet, comm_point_callback_type *cb, void *cb_arg, struct sockaddr_storage *to_addr, socklen_t to_addrlen)
 
struct comm_pointoutnet_comm_point_for_tcp (struct outside_network *outnet, comm_point_callback_type *cb, void *cb_arg, struct sockaddr_storage *to_addr, socklen_t to_addrlen, struct sldns_buffer *query, int timeout)
 
struct comm_pointoutnet_comm_point_for_http (struct outside_network *outnet, comm_point_callback_type *cb, void *cb_arg, struct sockaddr_storage *to_addr, socklen_t to_addrlen, int timeout, int ssl, char *host, char *path)
 
int outnet_tcp_connect (int s, struct sockaddr_storage *addr, socklen_t addrlen)
 
int outnet_udp_cb (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info)
 
int outnet_tcp_cb (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info)
 
void pending_udp_timer_cb (void *arg)
 
void pending_udp_timer_delay_cb (void *arg)
 
void outnet_tcptimer (void *arg)
 
int serviced_udp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep)
 
int serviced_tcp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep)
 
int pending_cmp (const void *key1, const void *key2)
 
int serviced_cmp (const void *key1, const void *key2)
 

Detailed Description

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

Definition in file outside_network.h.

Macro Definition Documentation

◆ EDNS_FRAG_SIZE_IP4

#define EDNS_FRAG_SIZE_IP4   1472

fallback size for fragmentation for EDNS in IPv4

Definition at line 310 of file outside_network.h.

◆ EDNS_FRAG_SIZE_IP6

#define EDNS_FRAG_SIZE_IP6   1232

fallback size for EDNS in IPv6, fits one fragment with ip6-tunnel-ids

Definition at line 312 of file outside_network.h.

Function Documentation

◆ outnet_comm_point_for_http()

struct comm_point* outnet_comm_point_for_http ( struct outside_network outnet,
comm_point_callback_type cb,
void *  cb_arg,
struct sockaddr_storage to_addr,
socklen_t  to_addrlen,
int  timeout,
int  ssl,
char *  host,
char *  path 
)

Create http commpoint suitable for communication to the destination. Creates the http request buffer. It also performs connect() to the to_addr.

Parameters
outnetoutside_network with the comm_base it is attached to, and the tcp_mss.
cbcallback function for the commpoint.
cb_argcallback argument for cb.
to_addrintended destination.
to_addrlenlength of to_addr.
timeouttimeout for the TCP connection. timeout in milliseconds, or -1 for no (change to the) timeout. So seconds*1000.
sslset to true for https.
hosthostname to use for the destination. part of http request.
pathpathname to lookup, eg. name of the file on the destination.
Returns
http_out commpoint, or NULL.

◆ outnet_comm_point_for_tcp()

struct comm_point* outnet_comm_point_for_tcp ( struct outside_network outnet,
comm_point_callback_type cb,
void *  cb_arg,
struct sockaddr_storage to_addr,
socklen_t  to_addrlen,
struct sldns_buffer query,
int  timeout 
)

Create tcp commpoint suitable for communication to the destination. It also performs connect() to the to_addr.

Parameters
outnetoutside_network with the comm_base it is attached to, and the tcp_mss.
cbcallback function for the commpoint.
cb_argcallback argument for cb.
to_addrintended destination.
to_addrlenlength of to_addr.
queryinitial packet to send writing, in buffer. It is copied to the commpoint buffer that is created.
timeouttimeout for the TCP connection. timeout in milliseconds, or -1 for no (change to the) timeout. So seconds*1000.
Returns
tcp_out commpoint, or NULL.

◆ outnet_comm_point_for_udp()

struct comm_point* outnet_comm_point_for_udp ( struct outside_network outnet,
comm_point_callback_type cb,
void *  cb_arg,
struct sockaddr_storage to_addr,
socklen_t  to_addrlen 
)

Create udp commpoint suitable for sending packets to the destination.

Parameters
outnetoutside_network with the comm_base it is attached to, with the outgoing interfaces chosen from, and rnd gen for random.
cbcallback function for the commpoint.
cb_argcallback argument for cb.
to_addrintended destination.
to_addrlenlength of to_addr.
Returns
commpoint that you can comm_point_send_udp_msg with, or NULL.

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

◆ outnet_get_tcp_fd()

int outnet_get_tcp_fd ( struct sockaddr_storage addr,
socklen_t  addrlen,
int  tcp_mss 
)

get TCP file descriptor for address, returns -1 on failure, tcp_mss is 0 or maxseg size to set for TCP packets.

◆ 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,
char *  tls_auth_name,
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.
tls_auth_namewhen ssl_upstream is true, use this name to check the server's peer certificate.
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.

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

◆ outnet_tcp_cb()

int outnet_tcp_cb ( struct comm_point c,
void *  arg,
int  error,
struct comm_reply reply_info 
)

callback for pending tcp connections

◆ outnet_tcp_connect()

int outnet_tcp_connect ( int  s,
struct sockaddr_storage addr,
socklen_t  addrlen 
)

connect tcp connection to addr, 0 on failure

◆ outnet_tcptimer()

void outnet_tcptimer ( void *  arg)

callback for outgoing TCP timer event

◆ outnet_udp_cb()

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

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

◆ outside_network_delete()

void outside_network_delete ( struct outside_network outnet)

Delete outside_network structure.

Parameters
outnetobject to delete.

◆ 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

◆ pending_cmp()

int pending_cmp ( const void *  key1,
const void *  key2 
)

compare function of pending rbtree

◆ pending_delete()

void pending_delete ( struct outside_network outnet,
struct pending p 
)

Delete pending answer.

Parameters
outnetoutside network the pending query is part of. Internal feature: if outnet is NULL, p is not unlinked from rbtree.
pdeleted

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

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

◆ pending_udp_timer_cb()

void pending_udp_timer_cb ( void *  arg)

callback for udp timeout

◆ pending_udp_timer_delay_cb()

void pending_udp_timer_delay_cb ( void *  arg)

callback for udp delay for timeout

◆ serviced_cmp()

int serviced_cmp ( const void *  key1,
const void *  key2 
)

compare function of serviced query rbtree

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

◆ serviced_tcp_callback()

int serviced_tcp_callback ( struct comm_point c,
void *  arg,
int  error,
struct comm_reply rep 
)

TCP reply or error callback for serviced queries

◆ serviced_udp_callback()

int serviced_udp_callback ( struct comm_point c,
void *  arg,
int  error,
struct comm_reply rep 
)

callback for serviced query UDP answers