Home | History | Annotate | Line # | Download | only in cache
dns.h revision 1.1
      1  1.1  christos /*
      2  1.1  christos  * services/cache/dns.h - Cache services for DNS using msg and rrset caches.
      3  1.1  christos  *
      4  1.1  christos  * Copyright (c) 2007, NLnet Labs. All rights reserved.
      5  1.1  christos  *
      6  1.1  christos  * This software is open source.
      7  1.1  christos  *
      8  1.1  christos  * Redistribution and use in source and binary forms, with or without
      9  1.1  christos  * modification, are permitted provided that the following conditions
     10  1.1  christos  * are met:
     11  1.1  christos  *
     12  1.1  christos  * Redistributions of source code must retain the above copyright notice,
     13  1.1  christos  * this list of conditions and the following disclaimer.
     14  1.1  christos  *
     15  1.1  christos  * Redistributions in binary form must reproduce the above copyright notice,
     16  1.1  christos  * this list of conditions and the following disclaimer in the documentation
     17  1.1  christos  * and/or other materials provided with the distribution.
     18  1.1  christos  *
     19  1.1  christos  * Neither the name of the NLNET LABS nor the names of its contributors may
     20  1.1  christos  * be used to endorse or promote products derived from this software without
     21  1.1  christos  * specific prior written permission.
     22  1.1  christos  *
     23  1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     24  1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     25  1.1  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     26  1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     27  1.1  christos  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     28  1.1  christos  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     29  1.1  christos  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     30  1.1  christos  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     31  1.1  christos  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     32  1.1  christos  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     33  1.1  christos  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  1.1  christos  */
     35  1.1  christos 
     36  1.1  christos /**
     37  1.1  christos  * \file
     38  1.1  christos  *
     39  1.1  christos  * This file contains the DNS cache.
     40  1.1  christos  */
     41  1.1  christos 
     42  1.1  christos #ifndef SERVICES_CACHE_DNS_H
     43  1.1  christos #define SERVICES_CACHE_DNS_H
     44  1.1  christos #include "util/storage/lruhash.h"
     45  1.1  christos #include "util/data/msgreply.h"
     46  1.1  christos struct module_env;
     47  1.1  christos struct query_info;
     48  1.1  christos struct reply_info;
     49  1.1  christos struct regional;
     50  1.1  christos struct delegpt;
     51  1.1  christos 
     52  1.1  christos /**
     53  1.1  christos  * Region allocated message reply
     54  1.1  christos  */
     55  1.1  christos struct dns_msg {
     56  1.1  christos 	/** query info */
     57  1.1  christos 	struct query_info qinfo;
     58  1.1  christos 	/** reply info - ptr to packed repinfo structure */
     59  1.1  christos 	struct reply_info *rep;
     60  1.1  christos };
     61  1.1  christos 
     62  1.1  christos /**
     63  1.1  christos  * Allocate a dns_msg with malloc/alloc structure and store in dns cache.
     64  1.1  christos  *
     65  1.1  christos  * @param env: environment, with alloc structure and dns cache.
     66  1.1  christos  * @param qinf: query info, the query for which answer is stored.
     67  1.1  christos  * 	this is allocated in a region, and will be copied to malloc area
     68  1.1  christos  * 	before insertion.
     69  1.1  christos  * @param rep: reply in dns_msg from dns_alloc_msg for example.
     70  1.1  christos  * 	this is allocated in a region, and will be copied to malloc area
     71  1.1  christos  * 	before insertion.
     72  1.1  christos  * @param is_referral: If true, then the given message to be stored is a
     73  1.1  christos  *      referral. The cache implementation may use this as a hint.
     74  1.1  christos  *      It will store only the RRsets, not the message.
     75  1.1  christos  * @param leeway: TTL value, if not 0, other rrsets are considered expired
     76  1.1  christos  *	that many seconds before actual TTL expiry.
     77  1.1  christos  * @param pside: if true, information came from a server which was fetched
     78  1.1  christos  * 	from the parentside of the zonecut.  This means that the type NS
     79  1.1  christos  * 	can be updated to full TTL even in prefetch situations.
     80  1.1  christos  * @param region: region to allocate better entries from cache into.
     81  1.1  christos  *   (used when is_referral is false).
     82  1.1  christos  * @param flags: flags with BIT_CD for AAAA queries in dns64 translation.
     83  1.1  christos  * @return 0 on alloc error (out of memory).
     84  1.1  christos  */
     85  1.1  christos int dns_cache_store(struct module_env* env, struct query_info* qinf,
     86  1.1  christos         struct reply_info* rep, int is_referral, time_t leeway, int pside,
     87  1.1  christos 	struct regional* region, uint16_t flags);
     88  1.1  christos 
     89  1.1  christos /**
     90  1.1  christos  * Store message in the cache. Stores in message cache and rrset cache.
     91  1.1  christos  * Both qinfo and rep should be malloced and are put in the cache.
     92  1.1  christos  * They should not be used after this call, as they are then in shared cache.
     93  1.1  christos  * Does not return errors, they are logged and only lead to less cache.
     94  1.1  christos  *
     95  1.1  christos  * @param env: module environment with the DNS cache.
     96  1.1  christos  * @param qinfo: query info
     97  1.1  christos  * @param hash: hash over qinfo.
     98  1.1  christos  * @param rep: reply info, together with qinfo makes up the message.
     99  1.1  christos  *	Adjusts the reply info TTLs to absolute time.
    100  1.1  christos  * @param leeway: TTL value, if not 0, other rrsets are considered expired
    101  1.1  christos  *	that many seconds before actual TTL expiry.
    102  1.1  christos  * @param pside: if true, information came from a server which was fetched
    103  1.1  christos  * 	from the parentside of the zonecut.  This means that the type NS
    104  1.1  christos  * 	can be updated to full TTL even in prefetch situations.
    105  1.1  christos  * @param qrep: message that can be altered with better rrs from cache.
    106  1.1  christos  * @param region: to allocate into for qmsg.
    107  1.1  christos  */
    108  1.1  christos void dns_cache_store_msg(struct module_env* env, struct query_info* qinfo,
    109  1.1  christos 	hashvalue_t hash, struct reply_info* rep, time_t leeway, int pside,
    110  1.1  christos 	struct reply_info* qrep, struct regional* region);
    111  1.1  christos 
    112  1.1  christos /**
    113  1.1  christos  * Find a delegation from the cache.
    114  1.1  christos  * @param env: module environment with the DNS cache.
    115  1.1  christos  * @param qname: query name.
    116  1.1  christos  * @param qnamelen: length of qname.
    117  1.1  christos  * @param qtype: query type.
    118  1.1  christos  * @param qclass: query class.
    119  1.1  christos  * @param region: where to allocate result delegation.
    120  1.1  christos  * @param msg: if not NULL, delegation message is returned here, synthesized
    121  1.1  christos  *	from the cache.
    122  1.1  christos  * @param timenow: the time now, for checking if TTL on cache entries is OK.
    123  1.1  christos  * @return new delegation or NULL on error or if not found in cache.
    124  1.1  christos  */
    125  1.1  christos struct delegpt* dns_cache_find_delegation(struct module_env* env,
    126  1.1  christos 	uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
    127  1.1  christos 	struct regional* region, struct dns_msg** msg, time_t timenow);
    128  1.1  christos 
    129  1.1  christos /**
    130  1.1  christos  * Find cached message
    131  1.1  christos  * @param env: module environment with the DNS cache.
    132  1.1  christos  * @param qname: query name.
    133  1.1  christos  * @param qnamelen: length of qname.
    134  1.1  christos  * @param qtype: query type.
    135  1.1  christos  * @param qclass: query class.
    136  1.1  christos  * @param flags: flags with BIT_CD for AAAA queries in dns64 translation.
    137  1.1  christos  * @param region: where to allocate result.
    138  1.1  christos  * @param scratch: where to allocate temporary data.
    139  1.1  christos  * @return new response message (alloced in region, rrsets do not have IDs).
    140  1.1  christos  * 	or NULL on error or if not found in cache.
    141  1.1  christos  *	TTLs are made relative to the current time.
    142  1.1  christos  */
    143  1.1  christos struct dns_msg* dns_cache_lookup(struct module_env* env,
    144  1.1  christos 	uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
    145  1.1  christos 	uint16_t flags, struct regional* region, struct regional* scratch);
    146  1.1  christos 
    147  1.1  christos /**
    148  1.1  christos  * find and add A and AAAA records for missing nameservers in delegpt
    149  1.1  christos  * @param env: module environment with rrset cache
    150  1.1  christos  * @param qclass: which class to look in.
    151  1.1  christos  * @param region: where to store new dp info.
    152  1.1  christos  * @param dp: delegation point to fill missing entries.
    153  1.1  christos  * @return false on alloc failure.
    154  1.1  christos  */
    155  1.1  christos int cache_fill_missing(struct module_env* env, uint16_t qclass,
    156  1.1  christos 	struct regional* region, struct delegpt* dp);
    157  1.1  christos 
    158  1.1  christos /**
    159  1.1  christos  * Utility, create new, unpacked data structure for cache response.
    160  1.1  christos  * QR bit set, no AA. Query set as indicated. Space for number of rrsets.
    161  1.1  christos  * @param qname: query section name
    162  1.1  christos  * @param qnamelen: len of qname
    163  1.1  christos  * @param qtype: query section type
    164  1.1  christos  * @param qclass: query section class
    165  1.1  christos  * @param region: where to alloc.
    166  1.1  christos  * @param capacity: number of rrsets space to create in the array.
    167  1.1  christos  * @return new dns_msg struct or NULL on mem fail.
    168  1.1  christos  */
    169  1.1  christos struct dns_msg* dns_msg_create(uint8_t* qname, size_t qnamelen, uint16_t qtype,
    170  1.1  christos 	uint16_t qclass, struct regional* region, size_t capacity);
    171  1.1  christos 
    172  1.1  christos /**
    173  1.1  christos  * Add rrset to authority section in unpacked dns_msg message. Must have enough
    174  1.1  christos  * space left, does not grow the array.
    175  1.1  christos  * @param msg: msg to put it in.
    176  1.1  christos  * @param region: region to alloc in
    177  1.1  christos  * @param rrset: to add in authority section
    178  1.1  christos  * @param now: now.
    179  1.1  christos  * @return true if worked, false on fail
    180  1.1  christos  */
    181  1.1  christos int dns_msg_authadd(struct dns_msg* msg, struct regional* region,
    182  1.1  christos 	struct ub_packed_rrset_key* rrset, time_t now);
    183  1.1  christos 
    184  1.1  christos /**
    185  1.1  christos  * Adjust the prefetch_ttl for a cached message.  This adds a value to the
    186  1.1  christos  * prefetch ttl - postponing the time when it will be prefetched for future
    187  1.1  christos  * incoming queries.
    188  1.1  christos  * @param env: module environment with caches and time.
    189  1.1  christos  * @param qinfo: query info for the query that needs adjustment.
    190  1.1  christos  * @param adjust: time in seconds to add to the prefetch_leeway.
    191  1.1  christos  * @param flags: flags with BIT_CD for AAAA queries in dns64 translation.
    192  1.1  christos  * @return false if not in cache. true if added.
    193  1.1  christos  */
    194  1.1  christos int dns_cache_prefetch_adjust(struct module_env* env, struct query_info* qinfo,
    195  1.1  christos         time_t adjust, uint16_t flags);
    196  1.1  christos 
    197  1.1  christos #endif /* SERVICES_CACHE_DNS_H */
    198