1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * libunbound/context.h - validating context for unbound internal use
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * This file contains the validator context structure.
40b7579f77SDag-Erling Smørgrav  */
41b7579f77SDag-Erling Smørgrav #ifndef LIBUNBOUND_CONTEXT_H
42b7579f77SDag-Erling Smørgrav #define LIBUNBOUND_CONTEXT_H
43b7579f77SDag-Erling Smørgrav #include "util/locks.h"
44b7579f77SDag-Erling Smørgrav #include "util/alloc.h"
45b7579f77SDag-Erling Smørgrav #include "util/rbtree.h"
46b7579f77SDag-Erling Smørgrav #include "services/modstack.h"
47b7579f77SDag-Erling Smørgrav #include "libunbound/unbound.h"
483bd4df0aSDag-Erling Smørgrav #include "libunbound/unbound-event.h"
49b7579f77SDag-Erling Smørgrav #include "util/data/packed_rrset.h"
50b7579f77SDag-Erling Smørgrav struct libworker;
51b7579f77SDag-Erling Smørgrav struct tube;
5217d15b25SDag-Erling Smørgrav struct sldns_buffer;
53e2d15004SDag-Erling Smørgrav struct ub_event_base;
54b7579f77SDag-Erling Smørgrav 
550eefd307SCy Schubert /** store that the logfile has a debug override */
560eefd307SCy Schubert extern int ctx_logfile_overridden;
570eefd307SCy Schubert 
58b7579f77SDag-Erling Smørgrav /**
59b7579f77SDag-Erling Smørgrav  * The context structure
60b7579f77SDag-Erling Smørgrav  *
61b7579f77SDag-Erling Smørgrav  * Contains two pipes for async service
62b7579f77SDag-Erling Smørgrav  *	qq : write queries to the async service pid/tid.
63b7579f77SDag-Erling Smørgrav  *	rr : read results from the async service pid/tid.
64b7579f77SDag-Erling Smørgrav  */
65b7579f77SDag-Erling Smørgrav struct ub_ctx {
66b7579f77SDag-Erling Smørgrav 	/* --- pipes --- */
67b7579f77SDag-Erling Smørgrav 	/** mutex on query write pipe */
683005e0a3SDag-Erling Smørgrav 	lock_basic_type qqpipe_lock;
69b7579f77SDag-Erling Smørgrav 	/** the query write pipe */
70b7579f77SDag-Erling Smørgrav 	struct tube* qq_pipe;
71b7579f77SDag-Erling Smørgrav 	/** mutex on result read pipe */
723005e0a3SDag-Erling Smørgrav 	lock_basic_type rrpipe_lock;
73b7579f77SDag-Erling Smørgrav 	/** the result read pipe */
74b7579f77SDag-Erling Smørgrav 	struct tube* rr_pipe;
75b7579f77SDag-Erling Smørgrav 
76b7579f77SDag-Erling Smørgrav 	/* --- shared data --- */
77b7579f77SDag-Erling Smørgrav 	/** mutex for access to env.cfg, finalized and dothread */
783005e0a3SDag-Erling Smørgrav 	lock_basic_type cfglock;
79b7579f77SDag-Erling Smørgrav 	/**
80b7579f77SDag-Erling Smørgrav 	 * The context has been finalized
81b7579f77SDag-Erling Smørgrav 	 * This is after config when the first resolve is done.
82b7579f77SDag-Erling Smørgrav 	 * The modules are inited (module-init()) and shared caches created.
83b7579f77SDag-Erling Smørgrav 	 */
84b7579f77SDag-Erling Smørgrav 	int finalized;
85b7579f77SDag-Erling Smørgrav 
86b7579f77SDag-Erling Smørgrav 	/** is bg worker created yet ? */
87b7579f77SDag-Erling Smørgrav 	int created_bg;
88b7579f77SDag-Erling Smørgrav 	/** pid of bg worker process */
89b7579f77SDag-Erling Smørgrav 	pid_t bg_pid;
90b7579f77SDag-Erling Smørgrav 	/** tid of bg worker thread */
913005e0a3SDag-Erling Smørgrav 	ub_thread_type bg_tid;
921838dec3SCy Schubert 	/** pid when pipes are created. This was the process when the
931838dec3SCy Schubert 	 * setup was called. Helps with clean up, so we can tell after a fork
941838dec3SCy Schubert 	 * which side of the fork the delete is on. */
951838dec3SCy Schubert 	pid_t pipe_pid;
961838dec3SCy Schubert 	/** when threaded, the worker that exists in the created thread. */
971838dec3SCy Schubert 	struct libworker* thread_worker;
98b7579f77SDag-Erling Smørgrav 
99b7579f77SDag-Erling Smørgrav 	/** do threading (instead of forking) for async resolution */
100b7579f77SDag-Erling Smørgrav 	int dothread;
101b7579f77SDag-Erling Smørgrav 	/** next thread number for new threads */
102b7579f77SDag-Erling Smørgrav 	int thr_next_num;
1038a384985SDag-Erling Smørgrav 	/** if logfile is overridden */
104b7579f77SDag-Erling Smørgrav 	int logfile_override;
105b7579f77SDag-Erling Smørgrav 	/** what logfile to use instead */
106b7579f77SDag-Erling Smørgrav 	FILE* log_out;
107b7579f77SDag-Erling Smørgrav 	/**
108b7579f77SDag-Erling Smørgrav 	 * List of alloc-cache-id points per threadnum for notinuse threads.
109b7579f77SDag-Erling Smørgrav 	 * Simply the entire struct alloc_cache with the 'super' member used
110b7579f77SDag-Erling Smørgrav 	 * to link a simply linked list. Reset super member to the superalloc
111b7579f77SDag-Erling Smørgrav 	 * before use.
112b7579f77SDag-Erling Smørgrav 	 */
113b7579f77SDag-Erling Smørgrav 	struct alloc_cache* alloc_list;
114b7579f77SDag-Erling Smørgrav 
115b7579f77SDag-Erling Smørgrav 	/** shared caches, and so on */
116b7579f77SDag-Erling Smørgrav 	struct alloc_cache superalloc;
117b7579f77SDag-Erling Smørgrav 	/** module env master value */
118b7579f77SDag-Erling Smørgrav 	struct module_env* env;
119b7579f77SDag-Erling Smørgrav 	/** module stack */
120b7579f77SDag-Erling Smørgrav 	struct module_stack mods;
121b7579f77SDag-Erling Smørgrav 	/** local authority zones */
122b7579f77SDag-Erling Smørgrav 	struct local_zones* local_zones;
123b7579f77SDag-Erling Smørgrav 	/** random state used to seed new random state structures */
124b7579f77SDag-Erling Smørgrav 	struct ub_randstate* seed_rnd;
125b7579f77SDag-Erling Smørgrav 
12617d15b25SDag-Erling Smørgrav 	/** event base for event oriented interface */
127e2d15004SDag-Erling Smørgrav 	struct ub_event_base* event_base;
1280eefd307SCy Schubert 	/** true if the event_base is a pluggable base that is malloced
1290eefd307SCy Schubert 	 * with a user event base inside, if so, clean up the pluggable alloc*/
1300eefd307SCy Schubert 	int event_base_malloced;
13117d15b25SDag-Erling Smørgrav 	/** libworker for event based interface */
13217d15b25SDag-Erling Smørgrav 	struct libworker* event_worker;
13317d15b25SDag-Erling Smørgrav 
134b7579f77SDag-Erling Smørgrav 	/** next query number (to try) to use */
135b7579f77SDag-Erling Smørgrav 	int next_querynum;
136b7579f77SDag-Erling Smørgrav 	/** number of async queries outstanding */
137b7579f77SDag-Erling Smørgrav 	size_t num_async;
138b7579f77SDag-Erling Smørgrav 	/**
139b7579f77SDag-Erling Smørgrav 	 * Tree of outstanding queries. Indexed by querynum
140b7579f77SDag-Erling Smørgrav 	 * Used when results come in for async to lookup.
141b7579f77SDag-Erling Smørgrav 	 * Used when cancel is done for lookup (and delete).
142b7579f77SDag-Erling Smørgrav 	 * Used to see if querynum is free for use.
143b7579f77SDag-Erling Smørgrav 	 * Content of type ctx_query.
144b7579f77SDag-Erling Smørgrav 	 */
1453005e0a3SDag-Erling Smørgrav 	rbtree_type queries;
146b7579f77SDag-Erling Smørgrav };
147b7579f77SDag-Erling Smørgrav 
148b7579f77SDag-Erling Smørgrav /**
149b7579f77SDag-Erling Smørgrav  * The queries outstanding for the libunbound resolver.
150b7579f77SDag-Erling Smørgrav  * These are outstanding for async resolution.
151b7579f77SDag-Erling Smørgrav  * But also, outstanding for sync resolution by one of the threads that
152b7579f77SDag-Erling Smørgrav  * has joined the threadpool.
153b7579f77SDag-Erling Smørgrav  */
154b7579f77SDag-Erling Smørgrav struct ctx_query {
155b7579f77SDag-Erling Smørgrav 	/** node in rbtree, must be first entry, key is ptr to the querynum */
1563005e0a3SDag-Erling Smørgrav 	struct rbnode_type node;
157b7579f77SDag-Erling Smørgrav 	/** query id number, key for node */
158b7579f77SDag-Erling Smørgrav 	int querynum;
159b7579f77SDag-Erling Smørgrav 	/** was this an async query? */
160b7579f77SDag-Erling Smørgrav 	int async;
161b7579f77SDag-Erling Smørgrav 	/** was this query cancelled (for bg worker) */
162b7579f77SDag-Erling Smørgrav 	int cancelled;
163b7579f77SDag-Erling Smørgrav 
1643bd4df0aSDag-Erling Smørgrav 	/** for async query, the callback function of type ub_callback_type */
1653005e0a3SDag-Erling Smørgrav 	ub_callback_type cb;
1663bd4df0aSDag-Erling Smørgrav 	/** for event callbacks the type is ub_event_callback_type */
1673bd4df0aSDag-Erling Smørgrav         ub_event_callback_type cb_event;
168b7579f77SDag-Erling Smørgrav 	/** for async query, the callback user arg */
169b7579f77SDag-Erling Smørgrav 	void* cb_arg;
170b7579f77SDag-Erling Smørgrav 
171b7579f77SDag-Erling Smørgrav 	/** answer message, result from resolver lookup. */
172b7579f77SDag-Erling Smørgrav 	uint8_t* msg;
173b7579f77SDag-Erling Smørgrav 	/** resulting message length. */
174b7579f77SDag-Erling Smørgrav 	size_t msg_len;
175b7579f77SDag-Erling Smørgrav 	/** validation status on security */
176b7579f77SDag-Erling Smørgrav 	enum sec_status msg_security;
177b7579f77SDag-Erling Smørgrav 	/** store libworker that is handling this query */
178b7579f77SDag-Erling Smørgrav 	struct libworker* w;
179b7579f77SDag-Erling Smørgrav 
180b7579f77SDag-Erling Smørgrav 	/** result structure, also contains original query, type, class.
181b7579f77SDag-Erling Smørgrav 	 * malloced ptr ready to hand to the client. */
182b7579f77SDag-Erling Smørgrav 	struct ub_result* res;
183b7579f77SDag-Erling Smørgrav };
184b7579f77SDag-Erling Smørgrav 
185b7579f77SDag-Erling Smørgrav /**
186b7579f77SDag-Erling Smørgrav  * Command codes for libunbound pipe.
187b7579f77SDag-Erling Smørgrav  *
188b7579f77SDag-Erling Smørgrav  * Serialization looks like this:
189b7579f77SDag-Erling Smørgrav  * 	o length (of remainder) uint32.
190b7579f77SDag-Erling Smørgrav  * 	o uint32 command code.
191b7579f77SDag-Erling Smørgrav  * 	o per command format.
192b7579f77SDag-Erling Smørgrav  */
193b7579f77SDag-Erling Smørgrav enum ub_ctx_cmd {
194b7579f77SDag-Erling Smørgrav 	/** QUIT */
195b7579f77SDag-Erling Smørgrav 	UB_LIBCMD_QUIT = 0,
196b7579f77SDag-Erling Smørgrav 	/** New query, sent to bg worker */
197b7579f77SDag-Erling Smørgrav 	UB_LIBCMD_NEWQUERY,
198b7579f77SDag-Erling Smørgrav 	/** Cancel query, sent to bg worker */
199b7579f77SDag-Erling Smørgrav 	UB_LIBCMD_CANCEL,
200b7579f77SDag-Erling Smørgrav 	/** Query result, originates from bg worker */
201b7579f77SDag-Erling Smørgrav 	UB_LIBCMD_ANSWER
202b7579f77SDag-Erling Smørgrav };
203b7579f77SDag-Erling Smørgrav 
204b7579f77SDag-Erling Smørgrav /**
205b7579f77SDag-Erling Smørgrav  * finalize a context.
206b7579f77SDag-Erling Smørgrav  * @param ctx: context to finalize. creates shared data.
207b7579f77SDag-Erling Smørgrav  * @return 0 if OK, or errcode.
208b7579f77SDag-Erling Smørgrav  */
209b7579f77SDag-Erling Smørgrav int context_finalize(struct ub_ctx* ctx);
210b7579f77SDag-Erling Smørgrav 
211b7579f77SDag-Erling Smørgrav /** compare two ctx_query elements */
212b7579f77SDag-Erling Smørgrav int context_query_cmp(const void* a, const void* b);
213b7579f77SDag-Erling Smørgrav 
214b7579f77SDag-Erling Smørgrav /**
215b7579f77SDag-Erling Smørgrav  * delete context query
216b7579f77SDag-Erling Smørgrav  * @param q: query to delete, including message packet and prealloc result
217b7579f77SDag-Erling Smørgrav  */
218b7579f77SDag-Erling Smørgrav void context_query_delete(struct ctx_query* q);
219b7579f77SDag-Erling Smørgrav 
220b7579f77SDag-Erling Smørgrav /**
221b7579f77SDag-Erling Smørgrav  * Create new query in context, add to querynum list.
222b7579f77SDag-Erling Smørgrav  * @param ctx: context
223b7579f77SDag-Erling Smørgrav  * @param name: query name
224b7579f77SDag-Erling Smørgrav  * @param rrtype: type
225b7579f77SDag-Erling Smørgrav  * @param rrclass: class
226b7579f77SDag-Erling Smørgrav  * @param cb: callback for async, or NULL for sync.
2273bd4df0aSDag-Erling Smørgrav  * @param cb_event: event callback for async, or NULL for sync.
228b7579f77SDag-Erling Smørgrav  * @param cbarg: user arg for async queries.
229b7579f77SDag-Erling Smørgrav  * @return new ctx_query or NULL for malloc failure.
230b7579f77SDag-Erling Smørgrav  */
23117d15b25SDag-Erling Smørgrav struct ctx_query* context_new(struct ub_ctx* ctx, const char* name, int rrtype,
2323bd4df0aSDag-Erling Smørgrav         int rrclass,  ub_callback_type cb, ub_event_callback_type cb_event,
2333bd4df0aSDag-Erling Smørgrav 	void* cbarg);
234b7579f77SDag-Erling Smørgrav 
235b7579f77SDag-Erling Smørgrav /**
236b7579f77SDag-Erling Smørgrav  * Get a new alloc. Creates a new one or uses a cached one.
237b7579f77SDag-Erling Smørgrav  * @param ctx: context
238b7579f77SDag-Erling Smørgrav  * @param locking: if true, cfglock is locked while getting alloc.
239b7579f77SDag-Erling Smørgrav  * @return an alloc, or NULL on mem error.
240b7579f77SDag-Erling Smørgrav  */
241b7579f77SDag-Erling Smørgrav struct alloc_cache* context_obtain_alloc(struct ub_ctx* ctx, int locking);
242b7579f77SDag-Erling Smørgrav 
243b7579f77SDag-Erling Smørgrav /**
244b7579f77SDag-Erling Smørgrav  * Release an alloc. Puts it into the cache.
245b7579f77SDag-Erling Smørgrav  * @param ctx: context
246b7579f77SDag-Erling Smørgrav  * @param locking: if true, cfglock is locked while releasing alloc.
247b7579f77SDag-Erling Smørgrav  * @param alloc: alloc to relinquish.
248b7579f77SDag-Erling Smørgrav  */
249b7579f77SDag-Erling Smørgrav void context_release_alloc(struct ub_ctx* ctx, struct alloc_cache* alloc,
250b7579f77SDag-Erling Smørgrav 	int locking);
251b7579f77SDag-Erling Smørgrav 
252b7579f77SDag-Erling Smørgrav /**
253b7579f77SDag-Erling Smørgrav  * Serialize a context query that questions data.
254b7579f77SDag-Erling Smørgrav  * This serializes the query name, type, ...
255b7579f77SDag-Erling Smørgrav  * As well as command code 'new_query'.
256b7579f77SDag-Erling Smørgrav  * @param q: context query
257b7579f77SDag-Erling Smørgrav  * @param len: the length of the allocation is returned.
258b7579f77SDag-Erling Smørgrav  * @return: an alloc, or NULL on mem error.
259b7579f77SDag-Erling Smørgrav  */
260b7579f77SDag-Erling Smørgrav uint8_t* context_serialize_new_query(struct ctx_query* q, uint32_t* len);
261b7579f77SDag-Erling Smørgrav 
262b7579f77SDag-Erling Smørgrav /**
263b7579f77SDag-Erling Smørgrav  * Serialize a context_query result to hand back to user.
264b7579f77SDag-Erling Smørgrav  * This serializes the query name, type, ..., and result.
265b7579f77SDag-Erling Smørgrav  * As well as command code 'answer'.
266b7579f77SDag-Erling Smørgrav  * @param q: context query
267b7579f77SDag-Erling Smørgrav  * @param err: error code to pass to client.
268b7579f77SDag-Erling Smørgrav  * @param pkt: the packet to add, can be NULL.
269b7579f77SDag-Erling Smørgrav  * @param len: the length of the allocation is returned.
270b7579f77SDag-Erling Smørgrav  * @return: an alloc, or NULL on mem error.
271b7579f77SDag-Erling Smørgrav  */
272b7579f77SDag-Erling Smørgrav uint8_t* context_serialize_answer(struct ctx_query* q, int err,
27317d15b25SDag-Erling Smørgrav 	struct sldns_buffer* pkt, uint32_t* len);
274b7579f77SDag-Erling Smørgrav 
275b7579f77SDag-Erling Smørgrav /**
276b7579f77SDag-Erling Smørgrav  * Serialize a query cancellation. Serializes query async id
277b7579f77SDag-Erling Smørgrav  * as well as command code 'cancel'
278b7579f77SDag-Erling Smørgrav  * @param q: context query
279b7579f77SDag-Erling Smørgrav  * @param len: the length of the allocation is returned.
280b7579f77SDag-Erling Smørgrav  * @return: an alloc, or NULL on mem error.
281b7579f77SDag-Erling Smørgrav  */
282b7579f77SDag-Erling Smørgrav uint8_t* context_serialize_cancel(struct ctx_query* q, uint32_t* len);
283b7579f77SDag-Erling Smørgrav 
284b7579f77SDag-Erling Smørgrav /**
285b7579f77SDag-Erling Smørgrav  * Serialize a 'quit' command.
286b7579f77SDag-Erling Smørgrav  * @param len: the length of the allocation is returned.
287b7579f77SDag-Erling Smørgrav  * @return: an alloc, or NULL on mem error.
288b7579f77SDag-Erling Smørgrav  */
289b7579f77SDag-Erling Smørgrav uint8_t* context_serialize_quit(uint32_t* len);
290b7579f77SDag-Erling Smørgrav 
291b7579f77SDag-Erling Smørgrav /**
292b7579f77SDag-Erling Smørgrav  * Obtain command code from serialized buffer
293b7579f77SDag-Erling Smørgrav  * @param p: buffer serialized.
294b7579f77SDag-Erling Smørgrav  * @param len: length of buffer.
295b7579f77SDag-Erling Smørgrav  * @return command code or QUIT on error.
296b7579f77SDag-Erling Smørgrav  */
297b7579f77SDag-Erling Smørgrav enum ub_ctx_cmd context_serial_getcmd(uint8_t* p, uint32_t len);
298b7579f77SDag-Erling Smørgrav 
299b7579f77SDag-Erling Smørgrav /**
300b7579f77SDag-Erling Smørgrav  * Lookup query from new_query buffer.
301b7579f77SDag-Erling Smørgrav  * @param ctx: context
302b7579f77SDag-Erling Smørgrav  * @param p: buffer serialized.
303b7579f77SDag-Erling Smørgrav  * @param len: length of buffer.
304b7579f77SDag-Erling Smørgrav  * @return looked up ctx_query or NULL for malloc failure.
305b7579f77SDag-Erling Smørgrav  */
306b7579f77SDag-Erling Smørgrav struct ctx_query* context_lookup_new_query(struct ub_ctx* ctx,
307b7579f77SDag-Erling Smørgrav 	uint8_t* p, uint32_t len);
308b7579f77SDag-Erling Smørgrav 
309b7579f77SDag-Erling Smørgrav /**
310b7579f77SDag-Erling Smørgrav  * Deserialize a new_query buffer.
311b7579f77SDag-Erling Smørgrav  * @param ctx: context
312b7579f77SDag-Erling Smørgrav  * @param p: buffer serialized.
313b7579f77SDag-Erling Smørgrav  * @param len: length of buffer.
314b7579f77SDag-Erling Smørgrav  * @return new ctx_query or NULL for malloc failure.
315b7579f77SDag-Erling Smørgrav  */
316b7579f77SDag-Erling Smørgrav struct ctx_query* context_deserialize_new_query(struct ub_ctx* ctx,
317b7579f77SDag-Erling Smørgrav 	uint8_t* p, uint32_t len);
318b7579f77SDag-Erling Smørgrav 
319b7579f77SDag-Erling Smørgrav /**
320b7579f77SDag-Erling Smørgrav  * Deserialize an answer buffer.
321b7579f77SDag-Erling Smørgrav  * @param ctx: context
322b7579f77SDag-Erling Smørgrav  * @param p: buffer serialized.
323b7579f77SDag-Erling Smørgrav  * @param len: length of buffer.
324b7579f77SDag-Erling Smørgrav  * @param err: error code to be returned to client is passed.
325b7579f77SDag-Erling Smørgrav  * @return ctx_query with answer added or NULL for malloc failure.
326b7579f77SDag-Erling Smørgrav  */
327b7579f77SDag-Erling Smørgrav struct ctx_query* context_deserialize_answer(struct ub_ctx* ctx,
328b7579f77SDag-Erling Smørgrav 	uint8_t* p, uint32_t len, int* err);
329b7579f77SDag-Erling Smørgrav 
330b7579f77SDag-Erling Smørgrav /**
331b7579f77SDag-Erling Smørgrav  * Deserialize a cancel buffer.
332b7579f77SDag-Erling Smørgrav  * @param ctx: context
333b7579f77SDag-Erling Smørgrav  * @param p: buffer serialized.
334b7579f77SDag-Erling Smørgrav  * @param len: length of buffer.
335b7579f77SDag-Erling Smørgrav  * @return ctx_query to cancel or NULL for failure.
336b7579f77SDag-Erling Smørgrav  */
337b7579f77SDag-Erling Smørgrav struct ctx_query* context_deserialize_cancel(struct ub_ctx* ctx,
338b7579f77SDag-Erling Smørgrav 	uint8_t* p, uint32_t len);
339b7579f77SDag-Erling Smørgrav 
340b7579f77SDag-Erling Smørgrav #endif /* LIBUNBOUND_CONTEXT_H */
341