Functions | Variables
fake_event.c File Reference

Event service that replays a scenario. More...

#include "config.h"
#include "testcode/fake_event.h"
#include "util/netevent.h"
#include "util/net_help.h"
#include "util/data/msgparse.h"
#include "util/data/msgreply.h"
#include "util/data/msgencode.h"
#include "util/data/dname.h"
#include "util/config_file.h"
#include "services/listen_dnsport.h"
#include "services/outside_network.h"
#include "services/cache/infra.h"
#include "testcode/replay.h"
#include "testcode/testpkts.h"
#include "util/log.h"
#include "util/fptr_wlist.h"
#include "sldns/sbuffer.h"
#include "sldns/wire2str.h"
#include "sldns/str2wire.h"
#include <signal.h>

Functions

static void timeval_add (struct timeval *d, const struct timeval *add)
 add timers and the values do not overflow or become negative
 
void fake_temp_file (const char *adj, const char *id, char *buf, size_t len)
 Get filename to store temporary config stuff. More...
 
void fake_event_init (struct replay_scenario *scen)
 Initialise fake event services. More...
 
void fake_event_cleanup (void)
 Deinit fake event services.
 
static void log_pkt (const char *desc, uint8_t *pkt, size_t len)
 helper function that logs a sldns_pkt packet to logfile
 
static const char * repevt_string (enum replay_event_type t)
 Returns a string describing the event type.
 
static void delete_fake_pending (struct fake_pending *pend)
 delete a fake pending
 
static void delete_replay_answer (struct replay_answer *a)
 delete a replay answer
 
static int pending_matches_current (struct replay_runtime *runtime, struct entry **entry, struct fake_pending **pend)
 return: true if pending query matches the now event.
 
static int pending_find_match (struct replay_runtime *runtime, struct entry **entry, struct fake_pending *pend)
 Find the range that matches this pending message. More...
 
static int pending_matches_range (struct replay_runtime *runtime, struct entry **entry, struct fake_pending **pend)
 See if outgoing pending query matches an entry. More...
 
static void pending_list_delete (struct replay_runtime *runtime, struct fake_pending *pend)
 Remove the item from the pending list.
 
static void fill_buffer_with_reply (sldns_buffer *buffer, struct entry *entry, uint8_t *q, size_t qlen)
 Fill buffer with reply from the entry.
 
static void answer_callback_from_entry (struct replay_runtime *runtime, struct entry *entry, struct fake_pending *pend)
 Perform range entry on pending message. More...
 
static void answer_check_it (struct replay_runtime *runtime)
 Check the now moment answer check event.
 
static void fake_front_query (struct replay_runtime *runtime, struct replay_moment *todo)
 Create commpoint (as return address) for a fake incoming query.
 
static void fake_pending_callback (struct replay_runtime *runtime, struct replay_moment *todo, int error)
 Perform callback for fake pending message.
 
static void moment_assign (struct replay_runtime *runtime, struct replay_moment *mom)
 pass time
 
static void time_passes (struct replay_runtime *runtime, struct replay_moment *mom)
 pass time
 
static void autotrust_check (struct replay_runtime *runtime, struct replay_moment *mom)
 check autotrust file contents
 
static void do_infra_rtt (struct replay_runtime *runtime)
 Store RTT in infra cache.
 
static void expon_timeout_backoff (struct replay_runtime *runtime)
 perform exponential backoff on the timeout
 
static void advance_moment (struct replay_runtime *runtime)
 Advance to the next moment.
 
static void do_moment_and_advance (struct replay_runtime *runtime)
 Perform actions or checks determined by the moment. More...
 
static void run_scenario (struct replay_runtime *runtime)
 run the scenario in event callbacks
 
struct listen_dnsportlisten_create (struct comm_base *base, struct listen_port *ATTR_UNUSED(ports), size_t bufsize, int ATTR_UNUSED(tcp_accept_count), void *ATTR_UNUSED(sslctx), struct dt_env *ATTR_UNUSED(dtenv), comm_point_callback_type *cb, void *cb_arg)
 
void listen_delete (struct listen_dnsport *listen)
 delete the listening structure More...
 
struct comm_basecomm_base_create (int ATTR_UNUSED(sigs))
 
void comm_base_delete (struct comm_base *b)
 Destroy a comm base. More...
 
void comm_base_timept (struct comm_base *b, time_t **tt, struct timeval **tv)
 Obtain two pointers. More...
 
void comm_base_dispatch (struct comm_base *b)
 Dispatch the comm base events. More...
 
void comm_base_exit (struct comm_base *b)
 Exit from dispatch loop. More...
 
struct comm_signalcomm_signal_create (struct comm_base *base, void(*callback)(int, void *), void *cb_arg)
 Create a signal handler. More...
 
int comm_signal_bind (struct comm_signal *ATTR_UNUSED(comsig), int ATTR_UNUSED(sig))
 
void comm_signal_delete (struct comm_signal *comsig)
 Delete the signal communication point. More...
 
void comm_point_send_reply (struct comm_reply *repinfo)
 Send reply. More...
 
void comm_point_drop_reply (struct comm_reply *repinfo)
 Drop reply. More...
 
struct outside_networkoutside_network_create (struct comm_base *base, size_t bufsize, size_t ATTR_UNUSED(num_ports), char **ATTR_UNUSED(ifs), int ATTR_UNUSED(num_ifs), int ATTR_UNUSED(do_ip4), int ATTR_UNUSED(do_ip6), size_t ATTR_UNUSED(num_tcp), struct infra_cache *infra, struct ub_randstate *ATTR_UNUSED(rnd), int ATTR_UNUSED(use_caps_for_id), int *ATTR_UNUSED(availports), int ATTR_UNUSED(numavailports), size_t ATTR_UNUSED(unwanted_threshold), int ATTR_UNUSED(outgoing_tcp_mss), void(*unwanted_action)(void *), void *ATTR_UNUSED(unwanted_param), int ATTR_UNUSED(do_udp), void *ATTR_UNUSED(sslctx), int ATTR_UNUSED(delayclose), struct dt_env *ATTR_UNUSED(dtenv))
 
void outside_network_delete (struct outside_network *outnet)
 Delete outside_network structure. More...
 
void outside_network_quit_prepare (struct outside_network *ATTR_UNUSED(outnet))
 
struct pendingpending_udp_query (struct serviced_query *sq, 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, sldns_buffer *packet, int timeout, comm_point_callback_type *callback, void *callback_arg)
 Send TCP query. More...
 
struct serviced_queryoutnet_serviced_query (struct outside_network *outnet, struct query_info *qinfo, uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec), int ATTR_UNUSED(nocaps), int ATTR_UNUSED(tcp_upstream), int ATTR_UNUSED(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, sldns_buffer *ATTR_UNUSED(buff), struct module_env *ATTR_UNUSED(env))
 
void outnet_serviced_query_stop (struct serviced_query *sq, void *cb_arg)
 Remove service query callback. More...
 
struct listen_portlistening_ports_open (struct config_file *ATTR_UNUSED(cfg), int *ATTR_UNUSED(reuseport))
 
void listening_ports_free (struct listen_port *list)
 Close and delete the (list of) listening ports.
 
struct comm_pointcomm_point_create_local (struct comm_base *ATTR_UNUSED(base), int ATTR_UNUSED(fd), size_t ATTR_UNUSED(bufsize), comm_point_callback_type *ATTR_UNUSED(callback), void *ATTR_UNUSED(callback_arg))
 
struct comm_pointcomm_point_create_raw (struct comm_base *ATTR_UNUSED(base), int ATTR_UNUSED(fd), int ATTR_UNUSED(writing), comm_point_callback_type *ATTR_UNUSED(callback), void *ATTR_UNUSED(callback_arg))
 
void comm_point_start_listening (struct comm_point *ATTR_UNUSED(c), int ATTR_UNUSED(newfd), int ATTR_UNUSED(sec))
 
void comm_point_stop_listening (struct comm_point *ATTR_UNUSED(c))
 
void comm_point_delete (struct comm_point *c)
 Close and deallocate (free) the comm point. More...
 
size_t listen_get_mem (struct listen_dnsport *ATTR_UNUSED(listen))
 
size_t outnet_get_mem (struct outside_network *ATTR_UNUSED(outnet))
 
size_t comm_point_get_mem (struct comm_point *ATTR_UNUSED(c))
 
size_t serviced_get_mem (struct serviced_query *ATTR_UNUSED(c))
 
int outnet_udp_cb (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info))
 
int outnet_tcp_cb (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info))
 
void pending_udp_timer_cb (void *ATTR_UNUSED(arg))
 
void pending_udp_timer_delay_cb (void *ATTR_UNUSED(arg))
 
void outnet_tcptimer (void *ATTR_UNUSED(arg))
 
void comm_point_udp_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_point_udp_ancil_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_point_tcp_accept_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_point_tcp_handle_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_timer_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_signal_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_point_local_handle_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_point_raw_handle_callback (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
void comm_base_handle_slow_accept (int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void *ATTR_UNUSED(arg))
 
int serviced_udp_callback (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info))
 
int serviced_tcp_callback (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info))
 
int pending_cmp (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b))
 
int serviced_cmp (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b))
 
struct comm_timercomm_timer_create (struct comm_base *base, void(*cb)(void *), void *cb_arg)
 create timer. More...
 
void comm_timer_disable (struct comm_timer *timer)
 disable timer. More...
 
void comm_timer_set (struct comm_timer *timer, struct timeval *tv)
 reset timevalue for timer. More...
 
void comm_timer_delete (struct comm_timer *timer)
 delete timer. More...
 
void comm_base_set_slow_accept_handlers (struct comm_base *ATTR_UNUSED(b), void(*stop_acc)(void *), void(*start_acc)(void *), void *ATTR_UNUSED(arg))
 
struct ub_event_basecomm_base_internal (struct comm_base *ATTR_UNUSED(b))
 
void daemon_remote_exec (struct worker *ATTR_UNUSED(worker))
 
void listen_start_accept (struct listen_dnsport *ATTR_UNUSED(listen))
 
void listen_stop_accept (struct listen_dnsport *ATTR_UNUSED(listen))
 
void daemon_remote_start_accept (struct daemon_remote *ATTR_UNUSED(rc))
 
void daemon_remote_stop_accept (struct daemon_remote *ATTR_UNUSED(rc))
 

Variables

static struct replay_scenariosaved_scenario = NULL
 Global variable: the scenario. More...
 

Detailed Description

Event service that replays a scenario.

This implements the same exported symbols as the files: util/netevent.c services/listen_dnsport.c services/outside_network.c But these do not actually access the network or events, instead the scenario is played.

Function Documentation

◆ fake_temp_file()

void fake_temp_file ( const char *  adj,
const char *  id,
char *  buf,
size_t  len 
)

Get filename to store temporary config stuff.

The pid is added. in /tmp.

Parameters
adjadjective, like "_cfg_", "_auto_"
ididentifier, like "example.com".
bufwhere to store.
lenlength of buf.

Referenced by autotrust_check(), and setup_config().

◆ fake_event_init()

void fake_event_init ( struct replay_scenario scen)

Initialise fake event services.

The fake event services will automatically start when the main program calls netevent.h functions, such as comm_base_dispatch().

Parameters
scenSet the scenario to use for upcoming event handling.

◆ pending_find_match()

static int pending_find_match ( struct replay_runtime runtime,
struct entry **  entry,
struct fake_pending pend 
)
static

Find the range that matches this pending message.

Parameters
runtimeruntime with current moment, and range list.
entryreturns the pointer to entry that matches.
pendthe pending that the entry must match.
Returns
: true if a match is found.

References replay_range::addr, fake_pending::addr, replay_range::addrlen, fake_pending::addrlen, replay_range::end_step, find_match(), log_addr(), log_info(), log_pkt(), replay_range::match, replay_range::next_range, replay_runtime::now, fake_pending::pkt, replay_scenario::range_list, replay_runtime::scenario, sockaddr_cmp(), replay_range::start_step, replay_moment::time_step, and fake_pending::transport.

Referenced by pending_matches_range().

◆ pending_matches_range()

static int pending_matches_range ( struct replay_runtime runtime,
struct entry **  entry,
struct fake_pending **  pend 
)
static

See if outgoing pending query matches an entry.

Parameters
runtimeruntime.
entryif true, the entry that matches is returned.
pendif true, the outgoing message that matches is returned.
Returns
: true if pending query matches the now event.

References log_info(), fake_pending::next, pending_find_match(), and replay_runtime::pending_list.

Referenced by run_scenario().

◆ answer_callback_from_entry()

static void answer_callback_from_entry ( struct replay_runtime runtime,
struct entry entry,
struct fake_pending pend 
)
static

Perform range entry on pending message.

Parameters
runtimeruntime buffer size preference.
entryentry that codes for the reply to do.
pendpending query that is answered, callback called.

References comm_point::buffer, replay_runtime::bufsize, fake_pending::callback, fake_pending::cb_arg, comm_point::fd, sldns_buffer_new(), fake_pending::transport, and comm_point::type.

Referenced by run_scenario().

◆ do_moment_and_advance()

static void do_moment_and_advance ( struct replay_runtime runtime)
static

Perform actions or checks determined by the moment.

Also advances the time by one step.

Parameters
runtimescenario runtime information.

References advance_moment(), replay_runtime::answer_list, replay_moment::evt_type, fake_front_query(), log_err(), log_info(), replay_runtime::now, replay_moment::repevt_front_query, replay_moment::repevt_front_reply, replay_moment::repevt_nothing, repevt_string(), and replay_moment::time_step.

Referenced by run_scenario().

◆ listen_delete()

void listen_delete ( struct listen_dnsport listen)

delete the listening structure

Parameters
listenlistening structure.

References listen_dnsport::cps, listen_list_delete(), sldns_buffer_free(), and listen_dnsport::udp_buff.

◆ comm_base_delete()

void comm_base_delete ( struct comm_base b)

Destroy a comm base.

All comm points must have been deleted.

Parameters
bthe base to delete.

Referenced by libworker_delete().

◆ comm_base_timept()

void comm_base_timept ( struct comm_base b,
time_t **  tt,
struct timeval **  tv 
)

Obtain two pointers.

The pointers never change (until base_delete()). The pointers point to time values that are updated regularly.

Parameters
bthe communication base that will update the time values.
ttpointer to time in seconds is returned.
tvpointer to time in microseconds is returned.

Referenced by outside_network_create(), and ub_comm_base_now().

◆ comm_base_dispatch()

void comm_base_dispatch ( struct comm_base b)

Dispatch the comm base events.

Parameters
bthe communication to perform.

Referenced by libworker_dobg(), and worker_work().

◆ comm_base_exit()

void comm_base_exit ( struct comm_base b)

Exit from dispatch loop.

Parameters
bthe communication base that is in dispatch().

Referenced by do_reload(), do_stop(), libworker_do_cmd(), libworker_fg_done_cb(), and worker_sighandler().

◆ comm_signal_create()

struct comm_signal* comm_signal_create ( struct comm_base base,
void(*)(int, void *)  callback,
void *  cb_arg 
)

Create a signal handler.

Call signal_bind() later to bind to a signal.

Parameters
basecommunication base to use.
callbackcalled when signal is caught.
cb_arguser argument to callback
Returns
: the signal struct or NULL on error.

◆ comm_signal_delete()

void comm_signal_delete ( struct comm_signal comsig)

Delete the signal communication point.

Parameters
comsigto delete.

Referenced by worker_delete().

◆ comm_point_send_reply()

void comm_point_send_reply ( struct comm_reply repinfo)

Send reply.

Put message into commpoint buffer.

Parameters
repinfoThe reply info copied from a commpoint callback call.

Referenced by reply_and_prefetch().

◆ comm_point_drop_reply()

void comm_point_drop_reply ( struct comm_reply repinfo)

Drop reply.

Cleans up.

Parameters
repinfoThe reply info copied from a commpoint callback call.

Referenced by dnsc_handle_curved_request(), mesh_new_client(), mesh_query_done(), mesh_state_cleanup(), and worker_handle_request().

◆ outside_network_delete()

void outside_network_delete ( struct outside_network outnet)

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

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

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

◆ comm_point_delete()

void comm_point_delete ( struct comm_point c)

Close and deallocate (free) the comm point.

If the comm point is a tcp-accept point, also its tcp-handler points are deleted.

Parameters
ccomm point to delete.

Referenced by clean_point(), daemon_remote_clear(), listen_create(), listen_list_delete(), outside_network_delete(), tube_remove_bg_listen(), and tube_remove_bg_write().

◆ comm_timer_create()

struct comm_timer* comm_timer_create ( struct comm_base base,
void(*)(void *)  cb,
void *  cb_arg 
)

create timer.

Not active upon creation.

Parameters
baseevent handling base.
cbcallback function: void myfunc(void* myarg);
cb_arguser callback argument.
Returns
: the new timer or NULL on error.

Referenced by pending_tcp_query(), and pending_udp_query().

◆ comm_timer_disable()

void comm_timer_disable ( struct comm_timer timer)

disable timer.

Stops callbacks from happening.

Parameters
timerto disable.

◆ comm_timer_set()

void comm_timer_set ( struct comm_timer timer,
struct timeval *  tv 
)

reset timevalue for timer.

Parameters
timertimer to (re)set.
tvwhen the timer should activate. if NULL timer is disabled.

Referenced by pending_udp_timer_cb(), randomize_and_send_udp(), reset_worker_timer(), set_cron_timer(), worker_probe_timer_cb(), and worker_restart_timer().

◆ comm_timer_delete()

void comm_timer_delete ( struct comm_timer timer)

delete timer.

Parameters
timerto delete.

Referenced by pending_delete(), pending_udp_query(), waiting_tcp_delete(), and worker_delete().

Variable Documentation

◆ saved_scenario

struct replay_scenario* saved_scenario = NULL
static

Global variable: the scenario.

Saved here for when event_init is done.