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  * @return the response type (CNAME or ANSWER).
123  */
124 enum response_type response_type_from_server(int rdset,
125 	struct dns_msg* msg, struct query_info* request, struct delegpt* dp);
126 
127 #endif /* ITERATOR_ITER_RESPTYPE_H */
128