|
unbound
0.1
|
#include "config.h"#include <ctype.h>#include <sys/time.h>#include "services/outside_network.h"#include "services/listen_dnsport.h"#include "services/cache/infra.h"#include "iterator/iterator.h"#include "util/data/msgparse.h"#include "util/data/msgreply.h"#include "util/data/msgencode.h"#include "util/data/dname.h"#include "util/netevent.h"#include "util/log.h"#include "util/net_help.h"#include "util/random.h"#include "util/fptr_wlist.h"#include "sldns/sbuffer.h"#include "dnstap/dnstap.h"#include <fcntl.h>Macros | |
| #define | MAX_ID_RETRY 1000 |
| number of times to retry making a random ID that is unique. | |
| #define | MAX_PORT_RETRY 10000 |
| number of times to retry finding interface, port that can be opened. | |
| #define | OUTBOUND_UDP_RETRY 1 |
| number of retries on outgoing UDP queries | |
Functions | |
| static void | serviced_tcp_initiate (struct serviced_query *sq, sldns_buffer *buff) |
| initiate TCP transaction for serviced query | |
| static int | randomize_and_send_udp (struct pending *pend, sldns_buffer *packet, int timeout) |
| with a fd available, randomize and send UDP | |
| static void | waiting_list_remove (struct outside_network *outnet, struct waiting_tcp *w) |
| remove waiting tcp from the outnet waiting list | |
| 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 | |
| static void | waiting_tcp_delete (struct waiting_tcp *w) |
| delete waiting_tcp entry. More... | |
| static int | pick_outgoing_tcp (struct waiting_tcp *w, int s) |
| Pick random outgoing-interface of that family, and bind it. More... | |
| int | outnet_get_tcp_fd (struct sockaddr_storage *addr, socklen_t addrlen, int tcp_mss, int dscp) |
| get TCP file descriptor for address, returns -1 on failure, tcp_mss is 0 or maxseg size to set for TCP packets. | |
| int | outnet_tcp_connect (int s, struct sockaddr_storage *addr, socklen_t addrlen) |
| connect tcp connection to addr, 0 on failure | |
| static int | outnet_tcp_take_into_use (struct waiting_tcp *w, uint8_t *pkt, size_t pkt_len) |
| use next free buffer to service a tcp query | |
| static void | use_free_buffer (struct outside_network *outnet) |
| see if buffers can be used to service TCP queries | |
| static void | decommission_pending_tcp (struct outside_network *outnet, struct pending_tcp *pend) |
| decommission a tcp buffer, closes commpoint and frees waiting_tcp entry | |
| int | outnet_tcp_cb (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info) |
| callback for pending tcp connections | |
| static void | portcomm_loweruse (struct outside_network *outnet, struct port_comm *pc) |
| lower use count on pc, see if it can be closed | |
| static void | outnet_send_wait_udp (struct outside_network *outnet) |
| try to send waiting UDP queries | |
| 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 | |
| static void | calc_num46 (char **ifs, int num_ifs, int do_ip4, int do_ip6, int *num_ip4, int *num_ip6) |
| calculate number of ip4 and ip6 interfaces | |
| void | pending_udp_timer_delay_cb (void *arg) |
| callback for udp delay for timeout | |
| void | pending_udp_timer_cb (void *arg) |
| callback for udp timeout | |
| static int | create_pending_tcp (struct outside_network *outnet, size_t bufsize) |
| create pending_tcp buffers | |
| static int | setup_if (struct port_if *pif, const char *addrstr, int *avail, int numavail, size_t numfd) |
| setup an outgoing interface, ready address | |
| 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, int dscp, 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, int tls_use_sni, struct dt_env *dtenv) |
| Create outside_network structure with N udp ports. More... | |
| static void | pending_node_del (rbnode_type *node, void *arg) |
| helper pending delete | |
| static void | serviced_node_del (rbnode_type *node, void *ATTR_UNUSED(arg)) |
| helper serviced delete | |
| void | outside_network_quit_prepare (struct outside_network *outnet) |
| Prepare for quit. More... | |
| void | outside_network_delete (struct outside_network *outnet) |
| Delete outside_network structure. More... | |
| void | pending_delete (struct outside_network *outnet, struct pending *p) |
| Delete pending answer. More... | |
| static void | sai6_putrandom (struct sockaddr_in6 *sa, int pfxlen, struct ub_randstate *rnd) |
| static int | udp_sockport (struct sockaddr_storage *addr, socklen_t addrlen, int pfxlen, int port, int *inuse, struct ub_randstate *rnd, int dscp) |
| Try to open a UDP socket for outgoing communication. More... | |
| static int | select_id (struct outside_network *outnet, struct pending *pend, sldns_buffer *packet) |
| Select random ID. | |
| static int | select_ifport (struct outside_network *outnet, struct pending *pend, int num_if, struct port_if *ifs) |
| Select random interface and port. | |
| struct pending * | pending_udp_query (struct serviced_query *sq, struct sldns_buffer *packet, int timeout, comm_point_callback_type *cb, void *cb_arg) |
| Send UDP query, create pending answer. More... | |
| void | outnet_tcptimer (void *arg) |
| callback for outgoing TCP timer event | |
| struct waiting_tcp * | pending_tcp_query (struct serviced_query *sq, sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg) |
| Send TCP query. More... | |
| static void | serviced_gen_query (sldns_buffer *buff, uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags) |
| create query for serviced queries | |
| static struct serviced_query * | lookup_serviced (struct outside_network *outnet, sldns_buffer *buff, int dnssec, struct sockaddr_storage *addr, socklen_t addrlen, struct edns_option *opt_list) |
| lookup serviced query in serviced query rbtree | |
| static struct serviced_query * | serviced_create (struct outside_network *outnet, sldns_buffer *buff, 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, int qtype, struct edns_option *opt_list) |
| Create new serviced entry. | |
| static void | serviced_delete (struct serviced_query *sq) |
| cleanup serviced query entry | |
| static void | serviced_perturb_qname (struct ub_randstate *rnd, uint8_t *qbuf, size_t len) |
| perturb a dname capitalization randomly | |
| static void | serviced_encode (struct serviced_query *sq, sldns_buffer *buff, int with_edns) |
| put serviced query into a buffer | |
| static int | serviced_udp_send (struct serviced_query *sq, sldns_buffer *buff) |
| Perform serviced query UDP sending operation. More... | |
| static int | serviced_check_qname (sldns_buffer *pkt, uint8_t *qbuf, size_t qbuflen) |
| check that perturbed qname is identical | |
| static void | serviced_callbacks (struct serviced_query *sq, int error, struct comm_point *c, struct comm_reply *rep) |
| call the callbacks for a serviced query | |
| int | serviced_tcp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep) |
| TCP reply or error callback for serviced queries. | |
| static int | serviced_tcp_send (struct serviced_query *sq, sldns_buffer *buff) |
| Send serviced query over TCP return false on initial failure. | |
| static int | packet_edns_malformed (struct sldns_buffer *buf, int qtype) |
| int | serviced_udp_callback (struct comm_point *c, void *arg, int error, struct comm_reply *rep) |
| callback for serviced query UDP answers | |
| 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, sldns_buffer *buff, struct module_env *env) |
| Perform a serviced query to the authoritative servers. More... | |
| static void | callback_list_remove (struct serviced_query *sq, void *cb_arg) |
| remove callback from list | |
| void | outnet_serviced_query_stop (struct serviced_query *sq, void *cb_arg) |
| Remove service query callback. More... | |
| static int | fd_for_dest (struct outside_network *outnet, struct sockaddr_storage *to_addr, socklen_t to_addrlen) |
| create fd to send to this destination | |
| 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. More... | |
| static int | setup_comm_ssl (struct comm_point *cp, struct outside_network *outnet, int fd, char *host) |
| setup SSL for comm point | |
| 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, sldns_buffer *query, int timeout, int ssl, char *host) |
| Create tcp commpoint suitable for communication to the destination. More... | |
| static int | setup_http_request (sldns_buffer *buf, char *host, char *path) |
| setup http request headers in buffer for sending query to destination | |
| 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. More... | |
| static size_t | waiting_tcp_get_mem (struct waiting_tcp *w) |
| get memory used by waiting tcp entry (in use or not) | |
| static size_t | if_get_mem (struct port_if *pif) |
| get memory used by port if | |
| static size_t | waiting_udp_get_mem (struct pending *w) |
| get memory used by waiting udp | |
| 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... | |
This file has functions to send queries to authoritative servers and wait for the pending answer events.
|
static |
delete waiting_tcp entry.
Does not unlink from waiting list.
| w | to delete. |
References comm_timer_delete(), and waiting_tcp::timer.
Referenced by decommission_pending_tcp(), outnet_tcptimer(), outside_network_delete(), serviced_delete(), and use_free_buffer().
|
static |
Pick random outgoing-interface of that family, and bind it.
port set to 0 so OS picks a port number for us. if it is the ANY address, do not bind.
| w | tcp structure with destination address. |
| s | socket fd. |
References port_if::addr, waiting_tcp::addr, addr_is_any(), addr_is_ip6(), port_if::addrlen, waiting_tcp::addrlen, outside_network::ip4_ifs, outside_network::ip6_ifs, log_addr(), log_assert, log_err(), outside_network::num_ip4, outside_network::num_ip6, waiting_tcp::outnet, outside_network::rnd, ub_random_max(), VERB_ALGO, and VERB_OPS.
Referenced by outnet_tcp_take_into_use().
| 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, | ||
| int | dscp, | ||
| 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, | ||
| int | tls_use_sni, | ||
| 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. |
| dscp | DSCP to use. |
| 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. |
| tls_use_sni | if SNI is used for TLS connections. |
| dtenv | environment to send dnstap events with (if enabled). |
References outside_network::base, calc_num46(), comm_base_timept(), 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, outside_network::ip_dscp, log_err(), 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, outside_network_delete(), outside_network::pending, pending_cmp(), rbtree_create(), outside_network::rnd, outside_network::serviced, serviced_cmp(), sldns_buffer_new(), outside_network::sslctx, outside_network::svcd_overhead, outside_network::tcp_mss, outside_network::tls_use_sni, outside_network::udp_buff, 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_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().
| void outside_network_delete | ( | struct outside_network * | outnet | ) |
Delete outside_network structure.
| outnet | object to delete. |
Referenced by libworker_delete_env(), outside_network_create(), and worker_delete().
| 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().
|
static |
Try to open a UDP socket for outgoing communication.
Sets sockets options as needed.
| addr | socket address. |
| addrlen | length of address. |
| pfxlen | length of network prefix (for address randomisation). |
| port | port override for addr. |
| inuse | if -1 is returned, this bool means the port was in use. |
| rnd | random state (for address randomisation). |
| dscp | DSCP to use. |
References pending::addr, addr_is_ip6(), and pending::addrlen.
Referenced by select_ifport().
| 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. |
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 milliseconds 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. |
Referenced by serviced_tcp_initiate(), and serviced_tcp_send().
|
static |
Perform serviced query UDP sending operation.
Sends UDP with EDNS, unless infra host marked non EDNS.
| sq | query to send. |
| buff | buffer scratch space. |
References serviced_query::addr, serviced_query::addrlen, serviced_query::edns_lame_known, outside_network::infra, infra_host(), serviced_query::last_rtt, serviced_query::last_sent_time, outside_network::now_secs, outside_network::now_tv, serviced_query::outnet, serviced_query::pending, pending_udp_query(), serviced_encode(), serviced_udp_callback(), serviced_query::status, VERB_ALGO, verbose(), serviced_query::zone, and serviced_query::zonelen.
Referenced by outnet_serviced_query(), and serviced_udp_callback().
| 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.
| 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. |
| tls_auth_name | when ssl_upstream is true, use this name to check the server's peer certificate. |
| 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::node, 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_node_del(), serviced_tcp_send(), and serviced_udp_send().
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(). |
Referenced by outbound_list_clear(), and outbound_list_remove().
| 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.
| outnet | outside_network with the comm_base it is attached to, with the outgoing interfaces chosen from, and rnd gen for random. |
| cb | callback function for the commpoint. |
| cb_arg | callback argument for cb. |
| to_addr | intended destination. |
| to_addrlen | length of to_addr. |
References comm_point::fd, and fd_for_dest().
Referenced by xfr_probe_send_probe().
| 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, | ||
| int | ssl, | ||
| char * | host | ||
| ) |
Create tcp commpoint suitable for communication to the destination.
It also performs connect() to the to_addr.
| outnet | outside_network with the comm_base it is attached to, and the tcp_mss. |
| cb | callback function for the commpoint. |
| cb_arg | callback argument for cb. |
| to_addr | intended destination. |
| to_addrlen | length of to_addr. |
| query | initial packet to send writing, in buffer. It is copied to the commpoint buffer that is created. |
| timeout | timeout for the TCP connection. timeout in milliseconds, or -1 for no (change to the) timeout. So seconds*1000. |
| ssl | set to true for TLS. |
| host | hostname for host name verification of TLS (or NULL if no TLS). |
References comm_point::fd, fd_set_nonblock(), outside_network::ip_dscp, outnet_get_tcp_fd(), outnet_tcp_connect(), and outside_network::tcp_mss.
| 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.
| outnet | outside_network with the comm_base it is attached to, and the tcp_mss. |
| cb | callback function for the commpoint. |
| cb_arg | callback argument for cb. |
| to_addr | intended destination. |
| to_addrlen | length of to_addr. |
| timeout | timeout for the TCP connection. timeout in milliseconds, or -1 for no (change to the) timeout. So seconds*1000. |
| ssl | set to true for https. |
| host | hostname to use for the destination. part of http request. |
| path | pathname to lookup, eg. name of the file on the destination. |
| 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.
1.8.18