]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/unbound/iterator/iter_resptype.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / unbound / iterator / iter_resptype.h
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 LIMITED
25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * 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 */