Home | History | Annotate | Line # | Download | only in iterator
      1 /*
      2  * iterator/iter_resptype.h - response type information and classification.
      3  *
      4  * Copyright (c) 2007, NLnet Labs. All rights reserved.
      5  *
      6  * This software is open source.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * Redistributions of source code must retain the above copyright notice,
     13  * this list of conditions and the following disclaimer.
     14  *
     15  * Redistributions in binary form must reproduce the above copyright notice,
     16  * this list of conditions and the following disclaimer in the documentation
     17  * and/or other materials provided with the distribution.
     18  *
     19  * Neither the name of the NLNET LABS nor the names of its contributors may
     20  * be used to endorse or promote products derived from this software without
     21  * specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     29  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 /**
     37  * \file
     38  *
     39  * This file defines the response type. DNS Responses can be classified as
     40  * one of the response types.
     41  */
     42 
     43 #ifndef ITERATOR_ITER_RESPTYPE_H
     44 #define ITERATOR_ITER_RESPTYPE_H
     45 struct dns_msg;
     46 struct query_info;
     47 struct delegpt;
     48 
     49 /**
     50  * The response type is used to interpret the response.
     51  */
     52 enum response_type {
     53 	/**
     54 	 * 'untyped' means that the type of this response hasn't been
     55 	 * assigned.
     56 	 */
     57 	RESPONSE_TYPE_UNTYPED   = 0,
     58 
     59 	/**
     60 	 * 'answer' means that the response terminates the resolution
     61 	 * process.
     62 	 */
     63 	RESPONSE_TYPE_ANSWER,
     64 
     65 	/** 'delegation' means that the response is a delegation. */
     66 	RESPONSE_TYPE_REFERRAL,
     67 
     68 	/**
     69 	 * 'cname' means that the response is a cname without the final
     70 	 * answer, and thus must be restarted.
     71 	 */
     72 	RESPONSE_TYPE_CNAME,
     73 
     74 	/**
     75 	 * 'throwaway' means that this particular response should be
     76 	 * discarded and the next nameserver should be contacted
     77 	 */
     78 	RESPONSE_TYPE_THROWAWAY,
     79 
     80 	/**
     81 	 * 'lame' means that this particular response indicates that
     82 	 * the nameserver knew nothing about the question.
     83 	 */
     84 	RESPONSE_TYPE_LAME,
     85 
     86 	/**
     87 	 * Recursion lame means that the nameserver is some sort of
     88 	 * open recursor, and not authoritative for the question.
     89 	 * It may know something, but not authoritatively.
     90 	 */
     91 	RESPONSE_TYPE_REC_LAME
     92 };
     93 
     94 /**
     95  * Classifies a response message from cache based on the current request.
     96  * Note that this routine assumes that THROWAWAY or LAME responses will not
     97  * occur. Also, it will not detect REFERRAL type messages, since those are
     98  * (currently) automatically classified based on how they came from the
     99  * cache (findDelegation() instead of lookup()).
    100  *
    101  * @param msg: the message from the cache.
    102  * @param request: the request that generated the response.
    103  * @return the response type (CNAME or ANSWER).
    104  */
    105 enum response_type response_type_from_cache(struct dns_msg* msg,
    106 	struct query_info* request);
    107 
    108 /**
    109  * Classifies a response message (from the wire) based on the current
    110  * request.
    111  *
    112  * NOTE: currently this routine uses the AA bit in the response to help
    113  * distinguish between some non-standard referrals and answers. It also
    114  * relies somewhat on the originating zone to be accurate (for lameness
    115  * detection, mostly).
    116  *
    117  * @param rdset: if RD bit was sent in query sent by unbound.
    118  * @param msg: the message from the cache.
    119  * @param request: the request that generated the response.
    120  * @param dp: The delegation point that was being queried
    121  *          when the response was returned.
    122  * @param empty_nodata_found: flag to keep track of empty nodata detection.
    123  * @param msg_lame_empty: The scrubber indicates that this empty message
    124  *	is lame, before it became empty.
    125  * @param msg_lame_referral: returned true if the reply has a referral before
    126  *	scrub.
    127  * @return the response type (CNAME or ANSWER).
    128  */
    129 enum response_type response_type_from_server(int rdset,
    130 	struct dns_msg* msg, struct query_info* request, struct delegpt* dp,
    131 	int* empty_nodata_found, int msg_lame_empty, int msg_lame_referral);
    132 
    133 #endif /* ITERATOR_ITER_RESPTYPE_H */
    134