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