context.c File Reference

This file contains the validator context structure. More...

#include "config.h"
#include "libunbound/context.h"
#include "util/module.h"
#include "util/config_file.h"
#include "util/net_help.h"
#include "services/modstack.h"
#include "services/localzone.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
#include "services/authzone.h"
#include "services/listen_dnsport.h"
#include "util/data/msgreply.h"
#include "util/storage/slabhash.h"
#include "util/edns.h"
#include "sldns/sbuffer.h"

Macros

#define NUM_ID_TRIES   100000
 How many times to try to find an unused query-id-number for async.
 

Functions

int context_finalize (struct ub_ctx *ctx)
 finalize a context. More...
 
int context_query_cmp (const void *a, const void *b)
 compare two ctx_query elements
 
void context_query_delete (struct ctx_query *q)
 delete context query More...
 
static int find_id (struct ub_ctx *ctx, int *id)
 find next useful id number of 0 on error
 
struct ctx_querycontext_new (struct ub_ctx *ctx, const char *name, int rrtype, int rrclass, ub_callback_type cb, ub_event_callback_type cb_event, void *cbarg)
 Create new query in context, add to querynum list. More...
 
struct alloc_cachecontext_obtain_alloc (struct ub_ctx *ctx, int locking)
 Get a new alloc. More...
 
void context_release_alloc (struct ub_ctx *ctx, struct alloc_cache *alloc, int locking)
 Release an alloc. More...
 
uint8_t * context_serialize_new_query (struct ctx_query *q, uint32_t *len)
 Serialize a context query that questions data. More...
 
struct ctx_querycontext_deserialize_new_query (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Deserialize a new_query buffer. More...
 
struct ctx_querycontext_lookup_new_query (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Lookup query from new_query buffer. More...
 
uint8_t * context_serialize_answer (struct ctx_query *q, int err, sldns_buffer *pkt, uint32_t *len)
 Serialize a context_query result to hand back to user. More...
 
struct ctx_querycontext_deserialize_answer (struct ub_ctx *ctx, uint8_t *p, uint32_t len, int *err)
 Deserialize an answer buffer. More...
 
uint8_t * context_serialize_cancel (struct ctx_query *q, uint32_t *len)
 Serialize a query cancellation. More...
 
struct ctx_querycontext_deserialize_cancel (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Deserialize a cancel buffer. More...
 
uint8_t * context_serialize_quit (uint32_t *len)
 Serialize a 'quit' command. More...
 
enum ub_ctx_cmd context_serial_getcmd (uint8_t *p, uint32_t len)
 Obtain command code from serialized buffer. More...
 

Detailed Description

This file contains the validator context structure.

Function Documentation

◆ context_finalize()

◆ context_query_delete()

void context_query_delete ( struct ctx_query q)

delete context query

Parameters
qquery to delete, including message packet and prealloc result

References ctx_query::msg, ctx_query::res, and ub_resolve_free().

Referenced by add_bg_result(), libworker_bg_done_cb(), ub_cancel(), ub_resolve(), and ub_resolve_async().

◆ context_new()

struct ctx_query* context_new ( struct ub_ctx ctx,
const char *  name,
int  rrtype,
int  rrclass,
ub_callback_type  cb,
ub_event_callback_type  cb_event,
void *  cbarg 
)

Create new query in context, add to querynum list.

Parameters
ctxcontext
namequery name
rrtypetype
rrclassclass
cbcallback for async, or NULL for sync.
cb_eventevent callback for async, or NULL for sync.
cbarguser arg for async queries.
Returns
new ctx_query or NULL for malloc failure.

Referenced by ub_resolve(), and ub_resolve_async().

◆ context_obtain_alloc()

struct alloc_cache* context_obtain_alloc ( struct ub_ctx ctx,
int  locking 
)

Get a new alloc.

Creates a new one or uses a cached one.

Parameters
ctxcontext
lockingif true, cfglock is locked while getting alloc.
Returns
an alloc, or NULL on mem error.

References alloc_init(), ub_ctx::alloc_list, ub_ctx::cfglock, alloc_cache::super, ub_ctx::superalloc, and ub_ctx::thr_next_num.

Referenced by libworker_setup().

◆ context_release_alloc()

void context_release_alloc ( struct ub_ctx ctx,
struct alloc_cache alloc,
int  locking 
)

Release an alloc.

Puts it into the cache.

Parameters
ctxcontext
lockingif true, cfglock is locked while releasing alloc.
allocalloc to relinquish.

References ub_ctx::alloc_list, ub_ctx::cfglock, and alloc_cache::super.

Referenced by libworker_delete_env().

◆ context_serialize_new_query()

uint8_t* context_serialize_new_query ( struct ctx_query q,
uint32_t *  len 
)

Serialize a context query that questions data.

This serializes the query name, type, ... As well as command code 'new_query'.

Parameters
qcontext query
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References ub_result::qname, and ctx_query::res.

Referenced by ub_resolve_async().

◆ context_deserialize_new_query()

struct ctx_query* context_deserialize_new_query ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Deserialize a new_query buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
new ctx_query or NULL for malloc failure.

add to query list

References log_assert.

Referenced by handle_newq().

◆ context_lookup_new_query()

struct ctx_query* context_lookup_new_query ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Lookup query from new_query buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
looked up ctx_query or NULL for malloc failure.

References log_assert, and ctx_query::querynum.

Referenced by handle_newq().

◆ context_serialize_answer()

uint8_t* context_serialize_answer ( struct ctx_query q,
int  err,
struct sldns_buffer pkt,
uint32_t *  len 
)

Serialize a context_query result to hand back to user.

This serializes the query name, type, ..., and result. As well as command code 'answer'.

Parameters
qcontext query
errerror code to pass to client.
pktthe packet to add, can be NULL.
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References ctx_query::res, sldns_buffer_remaining(), and ub_result::why_bogus.

Referenced by add_bg_result().

◆ context_deserialize_answer()

struct ctx_query* context_deserialize_answer ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len,
int *  err 
)

Deserialize an answer buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
errerror code to be returned to client is passed.
Returns
ctx_query with answer added or NULL for malloc failure.

References log_assert.

Referenced by process_answer_detail().

◆ context_serialize_cancel()

uint8_t* context_serialize_cancel ( struct ctx_query q,
uint32_t *  len 
)

Serialize a query cancellation.

Serializes query async id as well as command code 'cancel'

Parameters
qcontext query
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

Referenced by ub_cancel().

◆ context_deserialize_cancel()

struct ctx_query* context_deserialize_cancel ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Deserialize a cancel buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
ctx_query to cancel or NULL for failure.

References log_assert.

Referenced by handle_cancel().

◆ context_serialize_quit()

uint8_t* context_serialize_quit ( uint32_t *  len)

Serialize a 'quit' command.

Parameters
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

◆ context_serial_getcmd()

enum ub_ctx_cmd context_serial_getcmd ( uint8_t *  p,
uint32_t  len 
)

Obtain command code from serialized buffer.

Parameters
pbuffer serialized.
lenlength of buffer.
Returns
command code or QUIT on error.

Referenced by libworker_do_cmd(), process_answer_detail(), and ub_stop_bg().