]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSCore/DNSCommon.h
13b7ca80f2bc64dbbd1cf8d41316b63559e986c6
[apple/mdnsresponder.git] / mDNSCore / DNSCommon.h
1 /*
2 * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22
23 Change History (most recent first):
24
25 $Log: DNSCommon.h,v $
26 Revision 1.32 2005/03/21 00:33:51 shersche
27 <rdar://problem/4021486> Fix build warnings on Win32 platform
28
29 Revision 1.31 2005/02/18 00:43:11 cheshire
30 <rdar://problem/4010245> mDNSResponder should auto-truncate service names that are too long
31
32 Revision 1.30 2005/01/19 03:12:44 cheshire
33 Move LocalRecordReady() macro from mDNS.c to DNSCommon.h
34
35 Revision 1.29 2004/12/15 02:11:22 ksekar
36 <rdar://problem/3917317> Don't check for Dynamic DNS hostname uniqueness
37
38 Revision 1.28 2004/12/06 21:15:22 ksekar
39 <rdar://problem/3884386> mDNSResponder crashed in CheckServiceRegistrations
40
41 Revision 1.27 2004/12/03 07:20:50 ksekar
42 <rdar://problem/3674208> Wide-Area: Registration of large TXT record fails
43
44 Revision 1.26 2004/12/03 05:18:33 ksekar
45 <rdar://problem/3810596> mDNSResponder needs to return more specific TSIG errors
46
47 Revision 1.25 2004/10/26 03:52:02 cheshire
48 Update checkin comments
49
50 Revision 1.24 2004/10/23 01:16:00 cheshire
51 <rdar://problem/3851677> uDNS operations not always reliable on multi-homed hosts
52
53 Revision 1.23 2004/10/03 23:18:58 cheshire
54 Move address comparison macros from DNSCommon.h to mDNSEmbeddedAPI.h
55
56 Revision 1.22 2004/09/30 00:24:56 ksekar
57 <rdar://problem/3695802> Dynamically update default registration domains on config change
58
59 Revision 1.21 2004/09/17 01:08:48 cheshire
60 Renamed mDNSClientAPI.h to mDNSEmbeddedAPI.h
61 The name "mDNSClientAPI.h" is misleading to new developers looking at this code. The interfaces
62 declared in that file are ONLY appropriate to single-address-space embedded applications.
63 For clients on general-purpose computers, the interfaces defined in dns_sd.h should be used.
64
65 Revision 1.20 2004/09/17 00:49:51 cheshire
66 Get rid of now-unused GetResourceRecord -- the correct (safe) routine to use
67 is GetLargeResourceRecord
68
69 Revision 1.19 2004/09/16 21:59:15 cheshire
70 For consistency with zerov6Addr, rename zeroIPAddr to zerov4Addr
71
72 Revision 1.18 2004/09/16 02:29:39 cheshire
73 Moved mDNS_Lock/mDNS_Unlock to DNSCommon.c; Added necessary locking around
74 uDNS_ReceiveMsg, uDNS_StartQuery, uDNS_UpdateRecord, uDNS_RegisterService
75
76 Revision 1.17 2004/09/14 23:27:46 cheshire
77 Fix compile errors
78
79 Revision 1.16 2004/08/13 23:46:58 cheshire
80 "asyncronous" -> "asynchronous"
81
82 Revision 1.15 2004/08/10 23:19:14 ksekar
83 <rdar://problem/3722542>: DNS Extension daemon for Wide Area Service Discovery
84 Moved routines/constants to allow extern access for garbage collection daemon
85
86 Revision 1.14 2004/05/28 23:42:36 ksekar
87 <rdar://problem/3258021>: Feature: DNS server->client notification on record changes (#7805)
88
89 Revision 1.13 2004/05/18 23:51:25 cheshire
90 Tidy up all checkin comments to use consistent "<rdar://problem/xxxxxxx>" format for bug numbers
91
92 Revision 1.12 2004/04/22 04:03:59 cheshire
93 Headers should use "extern" declarations, not "mDNSexport"
94
95 Revision 1.11 2004/04/14 23:09:28 ksekar
96 Support for TSIG signed dynamic updates.
97
98 Revision 1.10 2004/03/13 01:57:33 ksekar
99 <rdar://problem/3192546>: DynDNS: Dynamic update of service records
100
101 Revision 1.9 2004/02/21 08:56:58 bradley
102 Wrap prototypes with extern "C" for C++ builds.
103
104 Revision 1.8 2004/02/06 23:04:18 ksekar
105 Basic Dynamic Update support via mDNS_Register (dissabled via
106 UNICAST_REGISTRATION #define)
107
108 Revision 1.7 2004/02/03 19:47:36 ksekar
109 Added an asynchronous state machine mechanism to uDNS.c, including
110 calls to find the parent zone for a domain name. Changes include code
111 in repository previously dissabled via "#if 0 incomplete". Codepath
112 is currently unused, and will be called to create update records, etc.
113
114 Revision 1.6 2004/01/27 20:15:22 cheshire
115 <rdar://problem/3541288>: Time to prune obsolete code for listening on port 53
116
117 Revision 1.5 2004/01/24 03:40:56 cheshire
118 Move mDNSAddrIsDNSMulticast() from DNSCommon.h to mDNSEmbeddedAPI.h so embedded clients can use it
119
120 Revision 1.4 2004/01/24 03:38:27 cheshire
121 Fix minor syntactic error: Headers should use "extern" declarations, not "mDNSexport"
122
123 Revision 1.3 2004/01/23 23:23:14 ksekar
124 Added TCP support for truncated unicast messages.
125
126 Revision 1.2 2004/01/21 21:12:23 cheshire
127 Add missing newline at end of file to make Unix tools happier
128
129 Revision 1.1 2003/12/13 03:05:27 ksekar
130 <rdar://problem/3192548>: DynDNS: Unicast query of service records
131
132
133 */
134
135 #ifndef __DNSCOMMON_H_
136 #define __DNSCOMMON_H_
137
138 #include "mDNSEmbeddedAPI.h"
139
140 #ifdef __cplusplus
141 extern "C" {
142 #endif
143
144 // ***************************************************************************
145 #if COMPILER_LIKES_PRAGMA_MARK
146 #pragma mark - DNS Protocol Constants
147 #endif
148
149 typedef enum
150 {
151 kDNSFlag0_QR_Mask = 0x80, // Query or response?
152 kDNSFlag0_QR_Query = 0x00,
153 kDNSFlag0_QR_Response = 0x80,
154
155 kDNSFlag0_OP_Mask = 0x78, // Operation type
156 kDNSFlag0_OP_StdQuery = 0x00,
157 kDNSFlag0_OP_Iquery = 0x08,
158 kDNSFlag0_OP_Status = 0x10,
159 kDNSFlag0_OP_Unused3 = 0x18,
160 kDNSFlag0_OP_Notify = 0x20,
161 kDNSFlag0_OP_Update = 0x28,
162
163 kDNSFlag0_QROP_Mask = kDNSFlag0_QR_Mask | kDNSFlag0_OP_Mask,
164
165 kDNSFlag0_AA = 0x04, // Authoritative Answer?
166 kDNSFlag0_TC = 0x02, // Truncated?
167 kDNSFlag0_RD = 0x01, // Recursion Desired?
168 kDNSFlag1_RA = 0x80, // Recursion Available?
169
170 kDNSFlag1_Zero = 0x40, // Reserved; must be zero
171 kDNSFlag1_AD = 0x20, // Authentic Data [RFC 2535]
172 kDNSFlag1_CD = 0x10, // Checking Disabled [RFC 2535]
173
174 kDNSFlag1_RC = 0x0F, // Response code
175 kDNSFlag1_RC_NoErr = 0x00,
176 kDNSFlag1_RC_FmtErr = 0x01,
177 kDNSFlag1_RC_SrvErr = 0x02,
178 kDNSFlag1_RC_NXDomain = 0x03,
179 kDNSFlag1_RC_NotImpl = 0x04,
180 kDNSFlag1_RC_Refused = 0x05,
181 kDNSFlag1_RC_YXDomain = 0x06,
182 kDNSFlag1_RC_YXRRSet = 0x07,
183 kDNSFlag1_RC_NXRRSet = 0x08,
184 kDNSFlag1_RC_NotAuth = 0x09,
185 kDNSFlag1_RC_NotZone = 0x0A
186 } DNS_Flags;
187
188 typedef enum
189 {
190 TSIG_ErrBadSig = 16,
191 TSIG_ErrBadKey = 17,
192 TSIG_ErrBadTime = 18
193 } TSIG_ErrorCode;
194
195 // ***************************************************************************
196 #if COMPILER_LIKES_PRAGMA_MARK
197 #pragma mark -
198 #pragma mark - General Utility Functions
199 #endif
200
201 extern const NetworkInterfaceInfo *GetFirstActiveInterface(const NetworkInterfaceInfo *intf);
202 extern mDNSInterfaceID GetNextActiveInterfaceID(const NetworkInterfaceInfo *intf);
203
204 extern mDNSu32 mDNSRandom(mDNSu32 max);
205
206
207 // ***************************************************************************
208 #if COMPILER_LIKES_PRAGMA_MARK
209 #pragma mark -
210 #pragma mark - Domain Name Utility Functions
211 #endif
212
213 #define mdnsIsDigit(X) ((X) >= '0' && (X) <= '9')
214 #define mDNSIsUpperCase(X) ((X) >= 'A' && (X) <= 'Z')
215 #define mDNSIsLowerCase(X) ((X) >= 'a' && (X) <= 'z')
216 #define mdnsIsLetter(X) (mDNSIsUpperCase(X) || mDNSIsLowerCase(X))
217
218 #define mdnsValidHostChar(X, notfirst, notlast) (mdnsIsLetter(X) || mdnsIsDigit(X) || ((notfirst) && (notlast) && (X) == '-') )
219
220 extern mDNSu16 CompressedDomainNameLength(const domainname *const name, const domainname *parent);
221
222 extern mDNSu32 TruncateUTF8ToLength(mDNSu8 *string, mDNSu32 length, mDNSu32 max);
223 extern mDNSBool LabelContainsSuffix(const domainlabel *const name, const mDNSBool RichText);
224 extern mDNSu32 RemoveLabelSuffix(domainlabel *name, mDNSBool RichText);
225 extern void AppendLabelSuffix(domainlabel *name, mDNSu32 val, mDNSBool RichText);
226 extern void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
227 #define ValidateDomainName(N) (DomainNameLength(N) <= MAX_DOMAIN_NAME)
228
229
230 // ***************************************************************************
231 #if COMPILER_LIKES_PRAGMA_MARK
232 #pragma mark -
233 #pragma mark - Resource Record Utility Functions
234 #endif
235
236 extern mDNSu32 RDataHashValue(mDNSu16 const rdlength, const RDataBody *const rdb);
237
238 extern mDNSBool SameRData(const ResourceRecord *const r1, const ResourceRecord *const r2);
239
240 extern mDNSBool ResourceRecordAnswersQuestion(const ResourceRecord *const rr, const DNSQuestion *const q);
241
242 extern mDNSBool SameResourceRecord(ResourceRecord *r1, ResourceRecord *r2);
243
244 extern mDNSu16 GetRDLength(const ResourceRecord *const rr, mDNSBool estimate);
245
246 #define GetRRDomainNameTarget(RR) ( \
247 ((RR)->rrtype == kDNSType_CNAME || (RR)->rrtype == kDNSType_PTR || (RR)->rrtype == kDNSType_NS) \
248 ? &(RR)->rdata->u.name : \
249 ((RR)->rrtype == kDNSType_SRV ) ? &(RR)->rdata->u.srv.target : mDNSNULL )
250
251 extern mDNSBool ValidateRData(const mDNSu16 rrtype, const mDNSu16 rdlength, const RData *const rd);
252 #define LocalRecordReady(X) ((X)->resrec.RecordType != kDNSRecordTypeUnique && (X)->resrec.RecordType != kDNSRecordTypeDeregistering)
253
254
255 // ***************************************************************************
256 #if COMPILER_LIKES_PRAGMA_MARK
257 #pragma mark -
258 #pragma mark -
259 #pragma mark - DNS Message Creation Functions
260 #endif
261
262 extern void InitializeDNSMessage(DNSMessageHeader *h, mDNSOpaque16 id, mDNSOpaque16 flags);
263 extern const mDNSu8 *FindCompressionPointer(const mDNSu8 *const base, const mDNSu8 *const end, const mDNSu8 *const domname);
264
265 extern mDNSu8 *putDomainNameAsLabels(const DNSMessage *const msg, mDNSu8 *ptr, const mDNSu8 *const limit, const domainname *const name);
266
267 extern mDNSu8 *putRData(const DNSMessage *const msg, mDNSu8 *ptr, const mDNSu8 *const limit, ResourceRecord *rr);
268
269 // If we have a single large record to put in the packet, then we allow the packet to be up to 9K bytes,
270 // but in the normal case we try to keep the packets below 1500 to avoid IP fragmentation on standard Ethernet
271
272 extern mDNSu8 *PutResourceRecordTTLWithLimit(DNSMessage *const msg, mDNSu8 *ptr, mDNSu16 *count, ResourceRecord *rr, mDNSu32 ttl, const mDNSu8 *limit);
273
274 #define PutResourceRecordTTL(msg, ptr, count, rr, ttl) PutResourceRecordTTLWithLimit((msg), (ptr), (count), (rr), (ttl), \
275 ((msg)->h.numAnswers || (msg)->h.numAuthorities || (msg)->h.numAdditionals) ? (msg)->data + NormalMaxDNSMessageData : (msg)->data + AbsoluteMaxDNSMessageData)
276
277 #define PutResourceRecordTTLJumbo(msg, ptr, count, rr, ttl) PutResourceRecordTTLWithLimit((msg), (ptr), (count), (rr), (ttl), \
278 (msg)->data + AbsoluteMaxDNSMessageData)
279
280 extern mDNSu8 *PutResourceRecordCappedTTL(DNSMessage *const msg, mDNSu8 *ptr, mDNSu16 *count, ResourceRecord *rr, mDNSu32 maxttl);
281
282 extern mDNSu8 *putEmptyResourceRecord(DNSMessage *const msg, mDNSu8 *ptr, const mDNSu8 *const limit, mDNSu16 *count, const AuthRecord *rr);
283
284 extern mDNSu8 *putQuestion(DNSMessage *const msg, mDNSu8 *ptr, const mDNSu8 *const limit, const domainname *const name, mDNSu16 rrtype, mDNSu16 rrclass);
285
286 extern mDNSu8 *putZone(DNSMessage *const msg, mDNSu8 *ptr, mDNSu8 *limit, const domainname *zone, mDNSOpaque16 zoneClass);
287
288 extern mDNSu8 *putPrereqNameNotInUse(domainname *name, DNSMessage *msg, mDNSu8 *ptr, mDNSu8 *end);
289
290 extern mDNSu8 *putDeletionRecord(DNSMessage *msg, mDNSu8 *ptr, ResourceRecord *rr);
291
292 extern mDNSu8 *putDeleteRRSet(DNSMessage *msg, mDNSu8 *ptr, const domainname *name, mDNSu16 rrtype);
293
294 extern mDNSu8 *putDeleteAllRRSets(DNSMessage *msg, mDNSu8 *ptr, const domainname *name);
295
296 extern mDNSu8 *putUpdateLease(DNSMessage *msg, mDNSu8 *end, mDNSu32 lease);
297
298 #define PutResourceRecord(MSG, P, C, RR) PutResourceRecordTTL((MSG), (P), (C), (RR), (RR)->rroriginalttl)
299
300
301 // ***************************************************************************
302 #if COMPILER_LIKES_PRAGMA_MARK
303 #pragma mark -
304 #pragma mark - DNS Message Parsing Functions
305 #endif
306
307 extern mDNSu32 DomainNameHashValue(const domainname *const name);
308
309 extern void SetNewRData(ResourceRecord *const rr, RData *NewRData, mDNSu16 rdlength);
310
311
312 extern const mDNSu8 *skipDomainName(const DNSMessage *const msg, const mDNSu8 *ptr, const mDNSu8 *const end);
313
314 extern const mDNSu8 *getDomainName(const DNSMessage *const msg, const mDNSu8 *ptr, const mDNSu8 *const end,
315 domainname *const name);
316
317 extern const mDNSu8 *skipResourceRecord(const DNSMessage *msg, const mDNSu8 *ptr, const mDNSu8 *end);
318
319 extern const mDNSu8 *GetLargeResourceRecord(mDNS *const m, const DNSMessage * const msg, const mDNSu8 *ptr,
320 const mDNSu8 * end, const mDNSInterfaceID InterfaceID, mDNSu8 RecordType, LargeCacheRecord *largecr);
321
322 extern const mDNSu8 *skipQuestion(const DNSMessage *msg, const mDNSu8 *ptr, const mDNSu8 *end);
323
324 extern const mDNSu8 *getQuestion(const DNSMessage *msg, const mDNSu8 *ptr, const mDNSu8 *end, const mDNSInterfaceID InterfaceID,
325 DNSQuestion *question);
326
327 extern const mDNSu8 *LocateAnswers(const DNSMessage *const msg, const mDNSu8 *const end);
328
329 extern const mDNSu8 *LocateAuthorities(const DNSMessage *const msg, const mDNSu8 *const end);
330
331 extern const mDNSu8 *LocateAdditionals(const DNSMessage *const msg, const mDNSu8 *const end);
332
333 // ***************************************************************************
334 #if COMPILER_LIKES_PRAGMA_MARK
335 #pragma mark -
336 #pragma mark -
337 #pragma mark - Packet Sending Functions
338 #endif
339
340 extern mStatus mDNSSendDNSMessage(const mDNS *const m, DNSMessage *const msg, mDNSu8 *end,
341 mDNSInterfaceID InterfaceID, const mDNSAddr *dst, mDNSIPPort dstport, int sd, uDNS_AuthInfo *authInfo);
342
343 // ***************************************************************************
344 #if COMPILER_LIKES_PRAGMA_MARK
345 #pragma mark -
346 #pragma mark - RR List Management & Task Management
347 #endif
348
349 extern void mDNS_Lock(mDNS *const m);
350 extern void mDNS_Unlock(mDNS *const m);
351
352 #ifdef __cplusplus
353 }
354 #endif
355
356 #endif // __DNSCOMMON_H_