xref: /aosp_15_r20/external/mdnsresponder/mDNSCore/mDNSEmbeddedAPI.h (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker 
17*48a54d36SAndroid Build Coastguard Worker    NOTE:
18*48a54d36SAndroid Build Coastguard Worker    If you're building an application that uses DNS Service Discovery
19*48a54d36SAndroid Build Coastguard Worker    this is probably NOT the header file you're looking for.
20*48a54d36SAndroid Build Coastguard Worker    In most cases you will want to use /usr/include/dns_sd.h instead.
21*48a54d36SAndroid Build Coastguard Worker 
22*48a54d36SAndroid Build Coastguard Worker    This header file defines the lowest level raw interface to mDNSCore,
23*48a54d36SAndroid Build Coastguard Worker    which is appropriate *only* on tiny embedded systems where everything
24*48a54d36SAndroid Build Coastguard Worker    runs in a single address space and memory is extremely constrained.
25*48a54d36SAndroid Build Coastguard Worker    All the APIs here are malloc-free, which means that the caller is
26*48a54d36SAndroid Build Coastguard Worker    responsible for passing in a pointer to the relevant storage that
27*48a54d36SAndroid Build Coastguard Worker    will be used in the execution of that call, and (when called with
28*48a54d36SAndroid Build Coastguard Worker    correct parameters) all the calls are guaranteed to succeed. There
29*48a54d36SAndroid Build Coastguard Worker    is never a case where a call can suffer intermittent failures because
30*48a54d36SAndroid Build Coastguard Worker    the implementation calls malloc() and sometimes malloc() returns NULL
31*48a54d36SAndroid Build Coastguard Worker    because memory is so limited that no more is available.
32*48a54d36SAndroid Build Coastguard Worker    This is primarily for devices that need to have precisely known fixed
33*48a54d36SAndroid Build Coastguard Worker    memory requirements, with absolutely no uncertainty or run-time variation,
34*48a54d36SAndroid Build Coastguard Worker    but that certainty comes at a cost of more difficult programming.
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker    For applications running on general-purpose desktop operating systems
37*48a54d36SAndroid Build Coastguard Worker    (Mac OS, Linux, Solaris, Windows, etc.) the API you should use is
38*48a54d36SAndroid Build Coastguard Worker    /usr/include/dns_sd.h, which defines the API by which multiple
39*48a54d36SAndroid Build Coastguard Worker    independent client processes communicate their DNS Service Discovery
40*48a54d36SAndroid Build Coastguard Worker    requests to a single "mdnsd" daemon running in the background.
41*48a54d36SAndroid Build Coastguard Worker 
42*48a54d36SAndroid Build Coastguard Worker    Even on platforms that don't run multiple independent processes in
43*48a54d36SAndroid Build Coastguard Worker    multiple independent address spaces, you can still use the preferred
44*48a54d36SAndroid Build Coastguard Worker    dns_sd.h APIs by linking in "dnssd_clientshim.c", which implements
45*48a54d36SAndroid Build Coastguard Worker    the standard "dns_sd.h" API calls, allocates any required storage
46*48a54d36SAndroid Build Coastguard Worker    using malloc(), and then calls through to the low-level malloc-free
47*48a54d36SAndroid Build Coastguard Worker    mDNSCore routines defined here. This has the benefit that even though
48*48a54d36SAndroid Build Coastguard Worker    you're running on a small embedded system with a single address space,
49*48a54d36SAndroid Build Coastguard Worker    you can still use the exact same client C code as you'd use on a
50*48a54d36SAndroid Build Coastguard Worker    general-purpose desktop system.
51*48a54d36SAndroid Build Coastguard Worker 
52*48a54d36SAndroid Build Coastguard Worker  */
53*48a54d36SAndroid Build Coastguard Worker 
54*48a54d36SAndroid Build Coastguard Worker #ifndef __mDNSClientAPI_h
55*48a54d36SAndroid Build Coastguard Worker #define __mDNSClientAPI_h
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker /* MinGW thinks "#define interface struct" is a cute way to do ObjC
58*48a54d36SAndroid Build Coastguard Worker  * compatibility. Everything is terrible.
59*48a54d36SAndroid Build Coastguard Worker  */
60*48a54d36SAndroid Build Coastguard Worker #ifdef _WIN32
61*48a54d36SAndroid Build Coastguard Worker #ifndef interface
62*48a54d36SAndroid Build Coastguard Worker #warning "MinGW no longer does weird things with 'interface'. "\
63*48a54d36SAndroid Build Coastguard Worker          "You can remove this code."
64*48a54d36SAndroid Build Coastguard Worker #endif /* ! interface */
65*48a54d36SAndroid Build Coastguard Worker #undef interface
66*48a54d36SAndroid Build Coastguard Worker #endif /* _WIN32 */
67*48a54d36SAndroid Build Coastguard Worker 
68*48a54d36SAndroid Build Coastguard Worker #if defined(EFI32) || defined(EFI64) || defined(EFIX64)
69*48a54d36SAndroid Build Coastguard Worker // EFI doesn't have stdarg.h unless it's building with GCC.
70*48a54d36SAndroid Build Coastguard Worker #include "Tiano.h"
71*48a54d36SAndroid Build Coastguard Worker #if !defined(__GNUC__)
72*48a54d36SAndroid Build Coastguard Worker #define va_list         VA_LIST
73*48a54d36SAndroid Build Coastguard Worker #define va_start(a, b)  VA_START(a, b)
74*48a54d36SAndroid Build Coastguard Worker #define va_end(a)       VA_END(a)
75*48a54d36SAndroid Build Coastguard Worker #define va_arg(a, b)    VA_ARG(a, b)
76*48a54d36SAndroid Build Coastguard Worker #endif
77*48a54d36SAndroid Build Coastguard Worker #else
78*48a54d36SAndroid Build Coastguard Worker #include <stdarg.h>		// stdarg.h is required for for va_list support for the mDNS_vsnprintf declaration
79*48a54d36SAndroid Build Coastguard Worker #endif
80*48a54d36SAndroid Build Coastguard Worker 
81*48a54d36SAndroid Build Coastguard Worker #include "mDNSDebug.h"
82*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
83*48a54d36SAndroid Build Coastguard Worker #include <uuid/uuid.h>
84*48a54d36SAndroid Build Coastguard Worker #endif
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus
87*48a54d36SAndroid Build Coastguard Worker 	extern "C" {
88*48a54d36SAndroid Build Coastguard Worker #endif
89*48a54d36SAndroid Build Coastguard Worker 
90*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
91*48a54d36SAndroid Build Coastguard Worker // Function scope indicators
92*48a54d36SAndroid Build Coastguard Worker 
93*48a54d36SAndroid Build Coastguard Worker // If you see "mDNSlocal" before a function name in a C file, it means the function is not callable outside this file
94*48a54d36SAndroid Build Coastguard Worker #ifndef mDNSlocal
95*48a54d36SAndroid Build Coastguard Worker #define mDNSlocal static
96*48a54d36SAndroid Build Coastguard Worker #endif
97*48a54d36SAndroid Build Coastguard Worker // If you see "mDNSexport" before a symbol in a C file, it means the symbol is exported for use by clients
98*48a54d36SAndroid Build Coastguard Worker // For every "mDNSexport" in a C file, there needs to be a corresponding "extern" declaration in some header file
99*48a54d36SAndroid Build Coastguard Worker // (When a C file #includes a header file, the "extern" declarations tell the compiler:
100*48a54d36SAndroid Build Coastguard Worker // "This symbol exists -- but not necessarily in this C file.")
101*48a54d36SAndroid Build Coastguard Worker #ifndef mDNSexport
102*48a54d36SAndroid Build Coastguard Worker #define mDNSexport
103*48a54d36SAndroid Build Coastguard Worker #endif
104*48a54d36SAndroid Build Coastguard Worker 
105*48a54d36SAndroid Build Coastguard Worker // Explanation: These local/export markers are a little habit of mine for signaling the programmers' intentions.
106*48a54d36SAndroid Build Coastguard Worker // When "mDNSlocal" is just a synonym for "static", and "mDNSexport" is a complete no-op, you could be
107*48a54d36SAndroid Build Coastguard Worker // forgiven for asking what purpose they serve. The idea is that if you see "mDNSexport" in front of a
108*48a54d36SAndroid Build Coastguard Worker // function definition it means the programmer intended it to be exported and callable from other files
109*48a54d36SAndroid Build Coastguard Worker // in the project. If you see "mDNSlocal" in front of a function definition it means the programmer
110*48a54d36SAndroid Build Coastguard Worker // intended it to be private to that file. If you see neither in front of a function definition it
111*48a54d36SAndroid Build Coastguard Worker // means the programmer forgot (so you should work out which it is supposed to be, and fix it).
112*48a54d36SAndroid Build Coastguard Worker // Using "mDNSlocal" instead of "static" makes it easier to do a textual searches for one or the other.
113*48a54d36SAndroid Build Coastguard Worker // For example you can do a search for "static" to find if any functions declare any local variables as "static"
114*48a54d36SAndroid Build Coastguard Worker // (generally a bad idea unless it's also "const", because static storage usually risks being non-thread-safe)
115*48a54d36SAndroid Build Coastguard Worker // without the results being cluttered with hundreds of matches for functions declared static.
116*48a54d36SAndroid Build Coastguard Worker // - Stuart Cheshire
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
119*48a54d36SAndroid Build Coastguard Worker // Structure packing macro
120*48a54d36SAndroid Build Coastguard Worker 
121*48a54d36SAndroid Build Coastguard Worker // If we're not using GNUC, it's not fatal.
122*48a54d36SAndroid Build Coastguard Worker // Most compilers naturally pack the on-the-wire structures correctly anyway, so a plain "struct" is usually fine.
123*48a54d36SAndroid Build Coastguard Worker // In the event that structures are not packed correctly, mDNS_Init() will detect this and report an error, so the
124*48a54d36SAndroid Build Coastguard Worker // developer will know what's wrong, and can investigate what needs to be done on that compiler to provide proper packing.
125*48a54d36SAndroid Build Coastguard Worker #ifndef packedstruct
126*48a54d36SAndroid Build Coastguard Worker  #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
127*48a54d36SAndroid Build Coastguard Worker   #define packedstruct struct __attribute__((__packed__))
128*48a54d36SAndroid Build Coastguard Worker   #define packedunion  union  __attribute__((__packed__))
129*48a54d36SAndroid Build Coastguard Worker  #else
130*48a54d36SAndroid Build Coastguard Worker   #define packedstruct struct
131*48a54d36SAndroid Build Coastguard Worker   #define packedunion  union
132*48a54d36SAndroid Build Coastguard Worker  #endif
133*48a54d36SAndroid Build Coastguard Worker #endif
134*48a54d36SAndroid Build Coastguard Worker 
135*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
136*48a54d36SAndroid Build Coastguard Worker #if 0
137*48a54d36SAndroid Build Coastguard Worker #pragma mark - DNS Resource Record class and type constants
138*48a54d36SAndroid Build Coastguard Worker #endif
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker typedef enum							// From RFC 1035
141*48a54d36SAndroid Build Coastguard Worker 	{
142*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_IN               = 1,		// Internet
143*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_CS               = 2,		// CSNET
144*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_CH               = 3,		// CHAOS
145*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_HS               = 4,		// Hesiod
146*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_NONE             = 254,	// Used in DNS UPDATE [RFC 2136]
147*48a54d36SAndroid Build Coastguard Worker 
148*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_Mask             = 0x7FFF,// Multicast DNS uses the bottom 15 bits to identify the record class...
149*48a54d36SAndroid Build Coastguard Worker 	kDNSClass_UniqueRRSet      = 0x8000,// ... and the top bit indicates that all other cached records are now invalid
150*48a54d36SAndroid Build Coastguard Worker 
151*48a54d36SAndroid Build Coastguard Worker 	kDNSQClass_ANY             = 255,	// Not a DNS class, but a DNS query class, meaning "all classes"
152*48a54d36SAndroid Build Coastguard Worker 	kDNSQClass_UnicastResponse = 0x8000	// Top bit set in a question means "unicast response acceptable"
153*48a54d36SAndroid Build Coastguard Worker 	} DNS_ClassValues;
154*48a54d36SAndroid Build Coastguard Worker 
155*48a54d36SAndroid Build Coastguard Worker typedef enum				// From RFC 1035
156*48a54d36SAndroid Build Coastguard Worker 	{
157*48a54d36SAndroid Build Coastguard Worker 	kDNSType_A = 1,			//  1 Address
158*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NS,			//  2 Name Server
159*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MD,			//  3 Mail Destination
160*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MF,			//  4 Mail Forwarder
161*48a54d36SAndroid Build Coastguard Worker 	kDNSType_CNAME,			//  5 Canonical Name
162*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SOA,			//  6 Start of Authority
163*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MB,			//  7 Mailbox
164*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MG,			//  8 Mail Group
165*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MR,			//  9 Mail Rename
166*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NULL,			// 10 NULL RR
167*48a54d36SAndroid Build Coastguard Worker 	kDNSType_WKS,			// 11 Well-known-service
168*48a54d36SAndroid Build Coastguard Worker 	kDNSType_PTR,			// 12 Domain name pointer
169*48a54d36SAndroid Build Coastguard Worker 	kDNSType_HINFO,			// 13 Host information
170*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MINFO,			// 14 Mailbox information
171*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MX,			// 15 Mail Exchanger
172*48a54d36SAndroid Build Coastguard Worker 	kDNSType_TXT,			// 16 Arbitrary text string
173*48a54d36SAndroid Build Coastguard Worker 	kDNSType_RP,			// 17 Responsible person
174*48a54d36SAndroid Build Coastguard Worker 	kDNSType_AFSDB,			// 18 AFS cell database
175*48a54d36SAndroid Build Coastguard Worker 	kDNSType_X25,			// 19 X_25 calling address
176*48a54d36SAndroid Build Coastguard Worker 	kDNSType_ISDN,			// 20 ISDN calling address
177*48a54d36SAndroid Build Coastguard Worker 	kDNSType_RT,			// 21 Router
178*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NSAP,			// 22 NSAP address
179*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NSAP_PTR,		// 23 Reverse NSAP lookup (deprecated)
180*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SIG,			// 24 Security signature
181*48a54d36SAndroid Build Coastguard Worker 	kDNSType_KEY,			// 25 Security key
182*48a54d36SAndroid Build Coastguard Worker 	kDNSType_PX,			// 26 X.400 mail mapping
183*48a54d36SAndroid Build Coastguard Worker 	kDNSType_GPOS,			// 27 Geographical position (withdrawn)
184*48a54d36SAndroid Build Coastguard Worker 	kDNSType_AAAA,			// 28 IPv6 Address
185*48a54d36SAndroid Build Coastguard Worker 	kDNSType_LOC,			// 29 Location Information
186*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NXT,			// 30 Next domain (security)
187*48a54d36SAndroid Build Coastguard Worker 	kDNSType_EID,			// 31 Endpoint identifier
188*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NIMLOC,		// 32 Nimrod Locator
189*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SRV,			// 33 Service record
190*48a54d36SAndroid Build Coastguard Worker 	kDNSType_ATMA,			// 34 ATM Address
191*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NAPTR,			// 35 Naming Authority PoinTeR
192*48a54d36SAndroid Build Coastguard Worker 	kDNSType_KX,			// 36 Key Exchange
193*48a54d36SAndroid Build Coastguard Worker 	kDNSType_CERT,			// 37 Certification record
194*48a54d36SAndroid Build Coastguard Worker 	kDNSType_A6,			// 38 IPv6 Address (deprecated)
195*48a54d36SAndroid Build Coastguard Worker 	kDNSType_DNAME,			// 39 Non-terminal DNAME (for IPv6)
196*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SINK,			// 40 Kitchen sink (experimental)
197*48a54d36SAndroid Build Coastguard Worker 	kDNSType_OPT,			// 41 EDNS0 option (meta-RR)
198*48a54d36SAndroid Build Coastguard Worker 	kDNSType_APL,			// 42 Address Prefix List
199*48a54d36SAndroid Build Coastguard Worker 	kDNSType_DS,			// 43 Delegation Signer
200*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SSHFP,			// 44 SSH Key Fingerprint
201*48a54d36SAndroid Build Coastguard Worker 	kDNSType_IPSECKEY,		// 45 IPSECKEY
202*48a54d36SAndroid Build Coastguard Worker 	kDNSType_RRSIG,			// 46 RRSIG
203*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NSEC,			// 47 Denial of Existence
204*48a54d36SAndroid Build Coastguard Worker 	kDNSType_DNSKEY,		// 48 DNSKEY
205*48a54d36SAndroid Build Coastguard Worker 	kDNSType_DHCID,			// 49 DHCP Client Identifier
206*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NSEC3,			// 50 Hashed Authenticated Denial of Existence
207*48a54d36SAndroid Build Coastguard Worker 	kDNSType_NSEC3PARAM,	// 51 Hashed Authenticated Denial of Existence
208*48a54d36SAndroid Build Coastguard Worker 
209*48a54d36SAndroid Build Coastguard Worker 	kDNSType_HIP = 55,		// 55 Host Identity Protocol
210*48a54d36SAndroid Build Coastguard Worker 
211*48a54d36SAndroid Build Coastguard Worker 	kDNSType_SPF = 99,		// 99 Sender Policy Framework for E-Mail
212*48a54d36SAndroid Build Coastguard Worker 	kDNSType_UINFO,			// 100 IANA-Reserved
213*48a54d36SAndroid Build Coastguard Worker 	kDNSType_UID,			// 101 IANA-Reserved
214*48a54d36SAndroid Build Coastguard Worker 	kDNSType_GID,			// 102 IANA-Reserved
215*48a54d36SAndroid Build Coastguard Worker 	kDNSType_UNSPEC,		// 103 IANA-Reserved
216*48a54d36SAndroid Build Coastguard Worker 
217*48a54d36SAndroid Build Coastguard Worker 	kDNSType_TKEY = 249,	// 249 Transaction key
218*48a54d36SAndroid Build Coastguard Worker 	kDNSType_TSIG,			// 250 Transaction signature
219*48a54d36SAndroid Build Coastguard Worker 	kDNSType_IXFR,			// 251 Incremental zone transfer
220*48a54d36SAndroid Build Coastguard Worker 	kDNSType_AXFR,			// 252 Transfer zone of authority
221*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MAILB,			// 253 Transfer mailbox records
222*48a54d36SAndroid Build Coastguard Worker 	kDNSType_MAILA,			// 254 Transfer mail agent records
223*48a54d36SAndroid Build Coastguard Worker 	kDNSQType_ANY			// Not a DNS type, but a DNS query type, meaning "all types"
224*48a54d36SAndroid Build Coastguard Worker 	} DNS_TypeValues;
225*48a54d36SAndroid Build Coastguard Worker 
226*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
227*48a54d36SAndroid Build Coastguard Worker #if 0
228*48a54d36SAndroid Build Coastguard Worker #pragma mark -
229*48a54d36SAndroid Build Coastguard Worker #pragma mark - Simple types
230*48a54d36SAndroid Build Coastguard Worker #endif
231*48a54d36SAndroid Build Coastguard Worker 
232*48a54d36SAndroid Build Coastguard Worker // mDNS defines its own names for these common types to simplify portability across
233*48a54d36SAndroid Build Coastguard Worker // multiple platforms that may each have their own (different) names for these types.
234*48a54d36SAndroid Build Coastguard Worker typedef          int   mDNSBool;
235*48a54d36SAndroid Build Coastguard Worker typedef   signed char  mDNSs8;
236*48a54d36SAndroid Build Coastguard Worker typedef unsigned char  mDNSu8;
237*48a54d36SAndroid Build Coastguard Worker typedef   signed short mDNSs16;
238*48a54d36SAndroid Build Coastguard Worker typedef unsigned short mDNSu16;
239*48a54d36SAndroid Build Coastguard Worker 
240*48a54d36SAndroid Build Coastguard Worker // <http://gcc.gnu.org/onlinedocs/gcc-3.3.3/cpp/Common-Predefined-Macros.html> says
241*48a54d36SAndroid Build Coastguard Worker //   __LP64__ _LP64
242*48a54d36SAndroid Build Coastguard Worker //   These macros are defined, with value 1, if (and only if) the compilation is
243*48a54d36SAndroid Build Coastguard Worker //   for a target where long int and pointer both use 64-bits and int uses 32-bit.
244*48a54d36SAndroid Build Coastguard Worker // <http://www.intel.com/software/products/compilers/clin/docs/ug/lin1077.htm> says
245*48a54d36SAndroid Build Coastguard Worker //   Macro Name __LP64__ Value 1
246*48a54d36SAndroid Build Coastguard Worker // A quick Google search for "defined(__LP64__)" OR "#ifdef __LP64__" gives 2590 hits and
247*48a54d36SAndroid Build Coastguard Worker // a search for "#if __LP64__" gives only 12, so I think we'll go with the majority and use defined()
248*48a54d36SAndroid Build Coastguard Worker #if defined(_ILP64) || defined(__ILP64__)
249*48a54d36SAndroid Build Coastguard Worker typedef   signed int32 mDNSs32;
250*48a54d36SAndroid Build Coastguard Worker typedef unsigned int32 mDNSu32;
251*48a54d36SAndroid Build Coastguard Worker #elif defined(_LP64) || defined(__LP64__)
252*48a54d36SAndroid Build Coastguard Worker typedef   signed int   mDNSs32;
253*48a54d36SAndroid Build Coastguard Worker typedef unsigned int   mDNSu32;
254*48a54d36SAndroid Build Coastguard Worker #else
255*48a54d36SAndroid Build Coastguard Worker typedef   signed long  mDNSs32;
256*48a54d36SAndroid Build Coastguard Worker typedef unsigned long  mDNSu32;
257*48a54d36SAndroid Build Coastguard Worker //typedef   signed int mDNSs32;
258*48a54d36SAndroid Build Coastguard Worker //typedef unsigned int mDNSu32;
259*48a54d36SAndroid Build Coastguard Worker #endif
260*48a54d36SAndroid Build Coastguard Worker 
261*48a54d36SAndroid Build Coastguard Worker // To enforce useful type checking, we make mDNSInterfaceID be a pointer to a dummy struct
262*48a54d36SAndroid Build Coastguard Worker // This way, mDNSInterfaceIDs can be assigned, and compared with each other, but not with other types
263*48a54d36SAndroid Build Coastguard Worker // Declaring the type to be the typical generic "void *" would lack this type checking
264*48a54d36SAndroid Build Coastguard Worker typedef struct mDNSInterfaceID_dummystruct { void *dummy; } *mDNSInterfaceID;
265*48a54d36SAndroid Build Coastguard Worker 
266*48a54d36SAndroid Build Coastguard Worker // These types are for opaque two- and four-byte identifiers.
267*48a54d36SAndroid Build Coastguard Worker // The "NotAnInteger" fields of the unions allow the value to be conveniently passed around in a
268*48a54d36SAndroid Build Coastguard Worker // register for the sake of efficiency, and compared for equality or inequality, but don't forget --
269*48a54d36SAndroid Build Coastguard Worker // just because it is in a register doesn't mean it is an integer. Operations like greater than,
270*48a54d36SAndroid Build Coastguard Worker // less than, add, multiply, increment, decrement, etc., are undefined for opaque identifiers,
271*48a54d36SAndroid Build Coastguard Worker // and if you make the mistake of trying to do those using the NotAnInteger field, then you'll
272*48a54d36SAndroid Build Coastguard Worker // find you get code that doesn't work consistently on big-endian and little-endian machines.
273*48a54d36SAndroid Build Coastguard Worker #if defined(_WIN32)
274*48a54d36SAndroid Build Coastguard Worker  #pragma pack(push,2)
275*48a54d36SAndroid Build Coastguard Worker #endif
276*48a54d36SAndroid Build Coastguard Worker typedef       union { mDNSu8 b[ 2]; mDNSu16 NotAnInteger; } mDNSOpaque16;
277*48a54d36SAndroid Build Coastguard Worker typedef       union { mDNSu8 b[ 4]; mDNSu32 NotAnInteger; } mDNSOpaque32;
278*48a54d36SAndroid Build Coastguard Worker typedef packedunion { mDNSu8 b[ 6]; mDNSu16 w[3]; mDNSu32 l[1]; } mDNSOpaque48;
279*48a54d36SAndroid Build Coastguard Worker typedef       union { mDNSu8 b[ 8]; mDNSu16 w[4]; mDNSu32 l[2]; } mDNSOpaque64;
280*48a54d36SAndroid Build Coastguard Worker typedef       union { mDNSu8 b[16]; mDNSu16 w[8]; mDNSu32 l[4]; } mDNSOpaque128;
281*48a54d36SAndroid Build Coastguard Worker #if defined(_WIN32)
282*48a54d36SAndroid Build Coastguard Worker  #pragma pack(pop)
283*48a54d36SAndroid Build Coastguard Worker #endif
284*48a54d36SAndroid Build Coastguard Worker 
285*48a54d36SAndroid Build Coastguard Worker typedef mDNSOpaque16  mDNSIPPort;		// An IP port is a two-byte opaque identifier (not an integer)
286*48a54d36SAndroid Build Coastguard Worker typedef mDNSOpaque32  mDNSv4Addr;		// An IP address is a four-byte opaque identifier (not an integer)
287*48a54d36SAndroid Build Coastguard Worker typedef mDNSOpaque128 mDNSv6Addr;		// An IPv6 address is a 16-byte opaque identifier (not an integer)
288*48a54d36SAndroid Build Coastguard Worker typedef mDNSOpaque48  mDNSEthAddr;		// An Ethernet address is a six-byte opaque identifier (not an integer)
289*48a54d36SAndroid Build Coastguard Worker 
290*48a54d36SAndroid Build Coastguard Worker // Bit operations for opaque 64 bit quantity. Uses the 32 bit quantity(l[2]) to set and clear bits
291*48a54d36SAndroid Build Coastguard Worker #define mDNSNBBY 8
292*48a54d36SAndroid Build Coastguard Worker #define bit_set_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] |= (1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
293*48a54d36SAndroid Build Coastguard Worker #define bit_clr_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] &= ~(1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
294*48a54d36SAndroid Build Coastguard Worker #define bit_get_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] & (1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
295*48a54d36SAndroid Build Coastguard Worker 
296*48a54d36SAndroid Build Coastguard Worker enum
297*48a54d36SAndroid Build Coastguard Worker 	{
298*48a54d36SAndroid Build Coastguard Worker 	mDNSAddrType_None    = 0,
299*48a54d36SAndroid Build Coastguard Worker 	mDNSAddrType_IPv4    = 4,
300*48a54d36SAndroid Build Coastguard Worker 	mDNSAddrType_IPv6    = 6,
301*48a54d36SAndroid Build Coastguard Worker 	mDNSAddrType_Unknown = ~0	// Special marker value used in known answer list recording
302*48a54d36SAndroid Build Coastguard Worker 	};
303*48a54d36SAndroid Build Coastguard Worker 
304*48a54d36SAndroid Build Coastguard Worker enum
305*48a54d36SAndroid Build Coastguard Worker 	{
306*48a54d36SAndroid Build Coastguard Worker 	mDNSTransport_None = 0,
307*48a54d36SAndroid Build Coastguard Worker 	mDNSTransport_UDP  = 1,
308*48a54d36SAndroid Build Coastguard Worker 	mDNSTransport_TCP  = 2
309*48a54d36SAndroid Build Coastguard Worker 	};
310*48a54d36SAndroid Build Coastguard Worker 
311*48a54d36SAndroid Build Coastguard Worker typedef struct
312*48a54d36SAndroid Build Coastguard Worker 	{
313*48a54d36SAndroid Build Coastguard Worker 	mDNSs32 type;
314*48a54d36SAndroid Build Coastguard Worker 	union { mDNSv6Addr v6; mDNSv4Addr v4; } ip;
315*48a54d36SAndroid Build Coastguard Worker 	} mDNSAddr;
316*48a54d36SAndroid Build Coastguard Worker 
317*48a54d36SAndroid Build Coastguard Worker enum { mDNSfalse = 0, mDNStrue = 1 };
318*48a54d36SAndroid Build Coastguard Worker 
319*48a54d36SAndroid Build Coastguard Worker #define mDNSNULL 0L
320*48a54d36SAndroid Build Coastguard Worker 
321*48a54d36SAndroid Build Coastguard Worker enum
322*48a54d36SAndroid Build Coastguard Worker 	{
323*48a54d36SAndroid Build Coastguard Worker 	mStatus_Waiting           = 1,
324*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoError           = 0,
325*48a54d36SAndroid Build Coastguard Worker 
326*48a54d36SAndroid Build Coastguard Worker 	// mDNS return values are in the range FFFE FF00 (-65792) to FFFE FFFF (-65537)
327*48a54d36SAndroid Build Coastguard Worker 	// The top end of the range (FFFE FFFF) is used for error codes;
328*48a54d36SAndroid Build Coastguard Worker 	// the bottom end of the range (FFFE FF00) is used for non-error values;
329*48a54d36SAndroid Build Coastguard Worker 
330*48a54d36SAndroid Build Coastguard Worker 	// Error codes:
331*48a54d36SAndroid Build Coastguard Worker 	mStatus_UnknownErr                = -65537,		// First value: 0xFFFE FFFF
332*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoSuchNameErr             = -65538,
333*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoMemoryErr               = -65539,
334*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadParamErr               = -65540,
335*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadReferenceErr           = -65541,
336*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadStateErr               = -65542,
337*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadFlagsErr               = -65543,
338*48a54d36SAndroid Build Coastguard Worker 	mStatus_UnsupportedErr            = -65544,
339*48a54d36SAndroid Build Coastguard Worker 	mStatus_NotInitializedErr         = -65545,
340*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoCache                   = -65546,
341*48a54d36SAndroid Build Coastguard Worker 	mStatus_AlreadyRegistered         = -65547,
342*48a54d36SAndroid Build Coastguard Worker 	mStatus_NameConflict              = -65548,
343*48a54d36SAndroid Build Coastguard Worker 	mStatus_Invalid                   = -65549,
344*48a54d36SAndroid Build Coastguard Worker 	mStatus_Firewall                  = -65550,
345*48a54d36SAndroid Build Coastguard Worker 	mStatus_Incompatible              = -65551,
346*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadInterfaceErr           = -65552,
347*48a54d36SAndroid Build Coastguard Worker 	mStatus_Refused                   = -65553,
348*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoSuchRecord              = -65554,
349*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoAuth                    = -65555,
350*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoSuchKey                 = -65556,
351*48a54d36SAndroid Build Coastguard Worker 	mStatus_NATTraversal              = -65557,
352*48a54d36SAndroid Build Coastguard Worker 	mStatus_DoubleNAT                 = -65558,
353*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadTime                   = -65559,
354*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadSig                    = -65560,     // while we define this per RFC 2845, BIND 9 returns Refused for bad/missing signatures
355*48a54d36SAndroid Build Coastguard Worker 	mStatus_BadKey                    = -65561,
356*48a54d36SAndroid Build Coastguard Worker 	mStatus_TransientErr              = -65562,     // transient failures, e.g. sending packets shortly after a network transition or wake from sleep
357*48a54d36SAndroid Build Coastguard Worker 	mStatus_ServiceNotRunning         = -65563,     // Background daemon not running
358*48a54d36SAndroid Build Coastguard Worker 	mStatus_NATPortMappingUnsupported = -65564,     // NAT doesn't support NAT-PMP or UPnP
359*48a54d36SAndroid Build Coastguard Worker 	mStatus_NATPortMappingDisabled    = -65565,     // NAT supports NAT-PMP or UPnP but it's disabled by the administrator
360*48a54d36SAndroid Build Coastguard Worker 	mStatus_NoRouter                  = -65566,
361*48a54d36SAndroid Build Coastguard Worker 	mStatus_PollingMode               = -65567,
362*48a54d36SAndroid Build Coastguard Worker 	mStatus_Timeout                   = -65568,
363*48a54d36SAndroid Build Coastguard Worker 	// -65568 to -65786 currently unused; available for allocation
364*48a54d36SAndroid Build Coastguard Worker 
365*48a54d36SAndroid Build Coastguard Worker 	// tcp connection status
366*48a54d36SAndroid Build Coastguard Worker 	mStatus_ConnPending       = -65787,
367*48a54d36SAndroid Build Coastguard Worker 	mStatus_ConnFailed        = -65788,
368*48a54d36SAndroid Build Coastguard Worker 	mStatus_ConnEstablished   = -65789,
369*48a54d36SAndroid Build Coastguard Worker 
370*48a54d36SAndroid Build Coastguard Worker 	// Non-error values:
371*48a54d36SAndroid Build Coastguard Worker 	mStatus_GrowCache         = -65790,
372*48a54d36SAndroid Build Coastguard Worker 	mStatus_ConfigChanged     = -65791,
373*48a54d36SAndroid Build Coastguard Worker 	mStatus_MemFree           = -65792		// Last value: 0xFFFE FF00
374*48a54d36SAndroid Build Coastguard Worker 	// mStatus_MemFree is the last legal mDNS error code, at the end of the range allocated for mDNS
375*48a54d36SAndroid Build Coastguard Worker 	};
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker typedef mDNSs32 mStatus;
378*48a54d36SAndroid Build Coastguard Worker 
379*48a54d36SAndroid Build Coastguard Worker // RFC 1034/1035 specify that a domain label consists of a length byte plus up to 63 characters
380*48a54d36SAndroid Build Coastguard Worker #define MAX_DOMAIN_LABEL 63
381*48a54d36SAndroid Build Coastguard Worker typedef struct { mDNSu8 c[ 64]; } domainlabel;		// One label: length byte and up to 63 characters
382*48a54d36SAndroid Build Coastguard Worker 
383*48a54d36SAndroid Build Coastguard Worker // RFC 1034/1035/2181 specify that a domain name (length bytes and data bytes) may be up to 255 bytes long,
384*48a54d36SAndroid Build Coastguard Worker // plus the terminating zero at the end makes 256 bytes total in the on-the-wire format.
385*48a54d36SAndroid Build Coastguard Worker #define MAX_DOMAIN_NAME 256
386*48a54d36SAndroid Build Coastguard Worker typedef struct { mDNSu8 c[256]; } domainname;		// Up to 256 bytes of length-prefixed domainlabels
387*48a54d36SAndroid Build Coastguard Worker 
388*48a54d36SAndroid Build Coastguard Worker typedef struct { mDNSu8 c[256]; } UTF8str255;		// Null-terminated C string
389*48a54d36SAndroid Build Coastguard Worker 
390*48a54d36SAndroid Build Coastguard Worker // The longest legal textual form of a DNS name is 1009 bytes, including the C-string terminating NULL at the end.
391*48a54d36SAndroid Build Coastguard Worker // Explanation:
392*48a54d36SAndroid Build Coastguard Worker // When a native domainname object is converted to printable textual form using ConvertDomainNameToCString(),
393*48a54d36SAndroid Build Coastguard Worker // non-printing characters are represented in the conventional DNS way, as '\ddd', where ddd is a three-digit decimal number.
394*48a54d36SAndroid Build Coastguard Worker // The longest legal domain name is 256 bytes, in the form of four labels as shown below:
395*48a54d36SAndroid Build Coastguard Worker // Length byte, 63 data bytes, length byte, 63 data bytes, length byte, 63 data bytes, length byte, 62 data bytes, zero byte.
396*48a54d36SAndroid Build Coastguard Worker // Each label is encoded textually as characters followed by a trailing dot.
397*48a54d36SAndroid Build Coastguard Worker // If every character has to be represented as a four-byte escape sequence, then this makes the maximum textual form four labels
398*48a54d36SAndroid Build Coastguard Worker // plus the C-string terminating NULL as shown below:
399*48a54d36SAndroid Build Coastguard Worker // 63*4+1 + 63*4+1 + 63*4+1 + 62*4+1 + 1 = 1009.
400*48a54d36SAndroid Build Coastguard Worker // Note that MAX_ESCAPED_DOMAIN_LABEL is not normally used: If you're only decoding a single label, escaping is usually not required.
401*48a54d36SAndroid Build Coastguard Worker // It is for domain names, where dots are used as label separators, that proper escaping is vital.
402*48a54d36SAndroid Build Coastguard Worker #define MAX_ESCAPED_DOMAIN_LABEL 254
403*48a54d36SAndroid Build Coastguard Worker #define MAX_ESCAPED_DOMAIN_NAME 1009
404*48a54d36SAndroid Build Coastguard Worker 
405*48a54d36SAndroid Build Coastguard Worker // MAX_REVERSE_MAPPING_NAME
406*48a54d36SAndroid Build Coastguard Worker // For IPv4: "123.123.123.123.in-addr.arpa."  30 bytes including terminating NUL
407*48a54d36SAndroid Build Coastguard Worker // For IPv6: "x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.ip6.arpa."  74 bytes including terminating NUL
408*48a54d36SAndroid Build Coastguard Worker 
409*48a54d36SAndroid Build Coastguard Worker #define MAX_REVERSE_MAPPING_NAME_V4 30
410*48a54d36SAndroid Build Coastguard Worker #define MAX_REVERSE_MAPPING_NAME_V6 74
411*48a54d36SAndroid Build Coastguard Worker #define MAX_REVERSE_MAPPING_NAME    74
412*48a54d36SAndroid Build Coastguard Worker 
413*48a54d36SAndroid Build Coastguard Worker // Most records have a TTL of 75 minutes, so that their 80% cache-renewal query occurs once per hour.
414*48a54d36SAndroid Build Coastguard Worker // For records containing a hostname (in the name on the left, or in the rdata on the right),
415*48a54d36SAndroid Build Coastguard Worker // like A, AAAA, reverse-mapping PTR, and SRV, we use a two-minute TTL by default, because we don't want
416*48a54d36SAndroid Build Coastguard Worker // them to hang around for too long in the cache if the host in question crashes or otherwise goes away.
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker #define kStandardTTL (3600UL * 100 / 80)
419*48a54d36SAndroid Build Coastguard Worker #define kHostNameTTL 120UL
420*48a54d36SAndroid Build Coastguard Worker 
421*48a54d36SAndroid Build Coastguard Worker // Some applications want to register their SRV records with a lower ttl so that in case the server
422*48a54d36SAndroid Build Coastguard Worker // using a dynamic port number restarts, the clients will not have stale information for more than
423*48a54d36SAndroid Build Coastguard Worker // 10 seconds
424*48a54d36SAndroid Build Coastguard Worker 
425*48a54d36SAndroid Build Coastguard Worker #define kHostNameSmallTTL 10UL
426*48a54d36SAndroid Build Coastguard Worker 
427*48a54d36SAndroid Build Coastguard Worker 
428*48a54d36SAndroid Build Coastguard Worker // Multicast DNS uses announcements (gratuitous responses) to update peer caches.
429*48a54d36SAndroid Build Coastguard Worker // This means it is feasible to use relatively larger TTL values than we might otherwise
430*48a54d36SAndroid Build Coastguard Worker // use, because we have a cache coherency protocol to keep the peer caches up to date.
431*48a54d36SAndroid Build Coastguard Worker // With Unicast DNS, once an authoritative server gives a record with a certain TTL value to a client
432*48a54d36SAndroid Build Coastguard Worker // or caching server, that client or caching server is entitled to hold onto the record until its TTL
433*48a54d36SAndroid Build Coastguard Worker // expires, and has no obligation to contact the authoritative server again until that time arrives.
434*48a54d36SAndroid Build Coastguard Worker // This means that whereas Multicast DNS can use announcements to pre-emptively update stale data
435*48a54d36SAndroid Build Coastguard Worker // before it would otherwise have expired, standard Unicast DNS (not using LLQs) has no equivalent
436*48a54d36SAndroid Build Coastguard Worker // mechanism, and TTL expiry is the *only* mechanism by which stale data gets deleted. Because of this,
437*48a54d36SAndroid Build Coastguard Worker // we currently limit the TTL to ten seconds in such cases where no dynamic cache updating is possible.
438*48a54d36SAndroid Build Coastguard Worker #define kStaticCacheTTL 10
439*48a54d36SAndroid Build Coastguard Worker 
440*48a54d36SAndroid Build Coastguard Worker #define DefaultTTLforRRType(X) (((X) == kDNSType_A || (X) == kDNSType_AAAA || (X) == kDNSType_SRV) ? kHostNameTTL : kStandardTTL)
441*48a54d36SAndroid Build Coastguard Worker 
442*48a54d36SAndroid Build Coastguard Worker typedef struct AuthRecord_struct AuthRecord;
443*48a54d36SAndroid Build Coastguard Worker typedef struct ServiceRecordSet_struct ServiceRecordSet;
444*48a54d36SAndroid Build Coastguard Worker typedef struct CacheRecord_struct CacheRecord;
445*48a54d36SAndroid Build Coastguard Worker typedef struct CacheGroup_struct CacheGroup;
446*48a54d36SAndroid Build Coastguard Worker typedef struct AuthGroup_struct AuthGroup;
447*48a54d36SAndroid Build Coastguard Worker typedef struct DNSQuestion_struct DNSQuestion;
448*48a54d36SAndroid Build Coastguard Worker typedef struct ZoneData_struct ZoneData;
449*48a54d36SAndroid Build Coastguard Worker typedef struct mDNS_struct mDNS;
450*48a54d36SAndroid Build Coastguard Worker typedef struct mDNS_PlatformSupport_struct mDNS_PlatformSupport;
451*48a54d36SAndroid Build Coastguard Worker typedef struct NATTraversalInfo_struct NATTraversalInfo;
452*48a54d36SAndroid Build Coastguard Worker 
453*48a54d36SAndroid Build Coastguard Worker // Structure to abstract away the differences between TCP/SSL sockets, and one for UDP sockets
454*48a54d36SAndroid Build Coastguard Worker // The actual definition of these structures appear in the appropriate platform support code
455*48a54d36SAndroid Build Coastguard Worker typedef struct TCPSocket_struct TCPSocket;
456*48a54d36SAndroid Build Coastguard Worker typedef struct UDPSocket_struct UDPSocket;
457*48a54d36SAndroid Build Coastguard Worker 
458*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
459*48a54d36SAndroid Build Coastguard Worker #if 0
460*48a54d36SAndroid Build Coastguard Worker #pragma mark -
461*48a54d36SAndroid Build Coastguard Worker #pragma mark - DNS Message structures
462*48a54d36SAndroid Build Coastguard Worker #endif
463*48a54d36SAndroid Build Coastguard Worker 
464*48a54d36SAndroid Build Coastguard Worker #define mDNS_numZones   numQuestions
465*48a54d36SAndroid Build Coastguard Worker #define mDNS_numPrereqs numAnswers
466*48a54d36SAndroid Build Coastguard Worker #define mDNS_numUpdates numAuthorities
467*48a54d36SAndroid Build Coastguard Worker 
468*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
469*48a54d36SAndroid Build Coastguard Worker 	{
470*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 id;
471*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 flags;
472*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 numQuestions;
473*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 numAnswers;
474*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 numAuthorities;
475*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 numAdditionals;
476*48a54d36SAndroid Build Coastguard Worker 	} DNSMessageHeader;
477*48a54d36SAndroid Build Coastguard Worker 
478*48a54d36SAndroid Build Coastguard Worker // We can send and receive packets up to 9000 bytes (Ethernet Jumbo Frame size, if that ever becomes widely used)
479*48a54d36SAndroid Build Coastguard Worker // However, in the normal case we try to limit packets to 1500 bytes so that we don't get IP fragmentation on standard Ethernet
480*48a54d36SAndroid Build Coastguard Worker // 40 (IPv6 header) + 8 (UDP header) + 12 (DNS message header) + 1440 (DNS message body) = 1500 total
481*48a54d36SAndroid Build Coastguard Worker #define AbsoluteMaxDNSMessageData 8940
482*48a54d36SAndroid Build Coastguard Worker #define NormalMaxDNSMessageData 1440
483*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
484*48a54d36SAndroid Build Coastguard Worker 	{
485*48a54d36SAndroid Build Coastguard Worker 	DNSMessageHeader h;						// Note: Size 12 bytes
486*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 data[AbsoluteMaxDNSMessageData];	// 40 (IPv6) + 8 (UDP) + 12 (DNS header) + 8940 (data) = 9000
487*48a54d36SAndroid Build Coastguard Worker 	} DNSMessage;
488*48a54d36SAndroid Build Coastguard Worker 
489*48a54d36SAndroid Build Coastguard Worker typedef struct tcpInfo_t
490*48a54d36SAndroid Build Coastguard Worker 	{
491*48a54d36SAndroid Build Coastguard Worker 	mDNS             *m;
492*48a54d36SAndroid Build Coastguard Worker 	TCPSocket        *sock;
493*48a54d36SAndroid Build Coastguard Worker 	DNSMessage        request;
494*48a54d36SAndroid Build Coastguard Worker 	int               requestLen;
495*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion      *question;   // For queries
496*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       *rr;         // For record updates
497*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr          Addr;
498*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort        Port;
499*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort        SrcPort;
500*48a54d36SAndroid Build Coastguard Worker 	DNSMessage       *reply;
501*48a54d36SAndroid Build Coastguard Worker 	mDNSu16           replylen;
502*48a54d36SAndroid Build Coastguard Worker 	unsigned long     nread;
503*48a54d36SAndroid Build Coastguard Worker 	int               numReplies;
504*48a54d36SAndroid Build Coastguard Worker 	} tcpInfo_t;
505*48a54d36SAndroid Build Coastguard Worker 
506*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
507*48a54d36SAndroid Build Coastguard Worker #if 0
508*48a54d36SAndroid Build Coastguard Worker #pragma mark -
509*48a54d36SAndroid Build Coastguard Worker #pragma mark - Other Packet Format Structures
510*48a54d36SAndroid Build Coastguard Worker #endif
511*48a54d36SAndroid Build Coastguard Worker 
512*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
513*48a54d36SAndroid Build Coastguard Worker 	{
514*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  dst;
515*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  src;
516*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 ethertype;
517*48a54d36SAndroid Build Coastguard Worker 	} EthernetHeader;		// 14 bytes
518*48a54d36SAndroid Build Coastguard Worker 
519*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
520*48a54d36SAndroid Build Coastguard Worker 	{
521*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 hrd;
522*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 pro;
523*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       hln;
524*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       pln;
525*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 op;
526*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  sha;
527*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr   spa;
528*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  tha;
529*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr   tpa;
530*48a54d36SAndroid Build Coastguard Worker 	} ARP_EthIP;			// 28 bytes
531*48a54d36SAndroid Build Coastguard Worker 
532*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
533*48a54d36SAndroid Build Coastguard Worker 	{
534*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       vlen;
535*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       tos;
536*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      totlen;
537*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 id;
538*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 flagsfrags;
539*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       ttl;
540*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       protocol;	// Payload type: 0x06 = TCP, 0x11 = UDP
541*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      checksum;
542*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr   src;
543*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr   dst;
544*48a54d36SAndroid Build Coastguard Worker 	} IPv4Header;			// 20 bytes
545*48a54d36SAndroid Build Coastguard Worker 
546*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
547*48a54d36SAndroid Build Coastguard Worker 	{
548*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      vcf;		// Version, Traffic Class, Flow Label
549*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      len;		// Payload Length
550*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       pro;		// Type of next header: 0x06 = TCP, 0x11 = UDP, 0x3A = ICMPv6
551*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       ttl;		// Hop Limit
552*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr   src;
553*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr   dst;
554*48a54d36SAndroid Build Coastguard Worker 	} IPv6Header;			// 40 bytes
555*48a54d36SAndroid Build Coastguard Worker 
556*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
557*48a54d36SAndroid Build Coastguard Worker 	{
558*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr   src;
559*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr   dst;
560*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque32 len;
561*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque32 pro;
562*48a54d36SAndroid Build Coastguard Worker 	} IPv6PseudoHeader;		// 40 bytes
563*48a54d36SAndroid Build Coastguard Worker 
564*48a54d36SAndroid Build Coastguard Worker typedef union
565*48a54d36SAndroid Build Coastguard Worker 	{
566*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       bytes[20];
567*48a54d36SAndroid Build Coastguard Worker 	ARP_EthIP    arp;
568*48a54d36SAndroid Build Coastguard Worker 	IPv4Header   v4;
569*48a54d36SAndroid Build Coastguard Worker 	IPv6Header   v6;
570*48a54d36SAndroid Build Coastguard Worker 	} NetworkLayerPacket;
571*48a54d36SAndroid Build Coastguard Worker 
572*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
573*48a54d36SAndroid Build Coastguard Worker 	{
574*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort   src;
575*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort   dst;
576*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      seq;
577*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      ack;
578*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       offset;
579*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       flags;
580*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      window;
581*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      checksum;
582*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      urgent;
583*48a54d36SAndroid Build Coastguard Worker 	} TCPHeader;			// 20 bytes; IP protocol type 0x06
584*48a54d36SAndroid Build Coastguard Worker 
585*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
586*48a54d36SAndroid Build Coastguard Worker 	{
587*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort   src;
588*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort   dst;
589*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      len;		// Length including UDP header (i.e. minimum value is 8 bytes)
590*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      checksum;
591*48a54d36SAndroid Build Coastguard Worker 	} UDPHeader;			// 8 bytes; IP protocol type 0x11
592*48a54d36SAndroid Build Coastguard Worker 
593*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
594*48a54d36SAndroid Build Coastguard Worker 	{
595*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       type;		// 0x87 == Neighbor Solicitation, 0x88 == Neighbor Advertisement
596*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       code;
597*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      checksum;
598*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      flags_res;	// R/S/O flags and reserved bits
599*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr   target;
600*48a54d36SAndroid Build Coastguard Worker 	// Typically 8 bytes of options are also present
601*48a54d36SAndroid Build Coastguard Worker 	} IPv6NDP;				// 24 bytes or more; IP protocol type 0x3A
602*48a54d36SAndroid Build Coastguard Worker 
603*48a54d36SAndroid Build Coastguard Worker #define NDP_Sol 0x87
604*48a54d36SAndroid Build Coastguard Worker #define NDP_Adv 0x88
605*48a54d36SAndroid Build Coastguard Worker 
606*48a54d36SAndroid Build Coastguard Worker #define NDP_Router    0x80
607*48a54d36SAndroid Build Coastguard Worker #define NDP_Solicited 0x40
608*48a54d36SAndroid Build Coastguard Worker #define NDP_Override  0x20
609*48a54d36SAndroid Build Coastguard Worker 
610*48a54d36SAndroid Build Coastguard Worker #define NDP_SrcLL 1
611*48a54d36SAndroid Build Coastguard Worker #define NDP_TgtLL 2
612*48a54d36SAndroid Build Coastguard Worker 
613*48a54d36SAndroid Build Coastguard Worker typedef union
614*48a54d36SAndroid Build Coastguard Worker 	{
615*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       bytes[20];
616*48a54d36SAndroid Build Coastguard Worker 	TCPHeader    tcp;
617*48a54d36SAndroid Build Coastguard Worker 	UDPHeader    udp;
618*48a54d36SAndroid Build Coastguard Worker 	IPv6NDP      ndp;
619*48a54d36SAndroid Build Coastguard Worker 	} TransportLayerPacket;
620*48a54d36SAndroid Build Coastguard Worker 
621*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
622*48a54d36SAndroid Build Coastguard Worker 	{
623*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque64 InitiatorCookie;
624*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque64 ResponderCookie;
625*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       NextPayload;
626*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       Version;
627*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       ExchangeType;
628*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       Flags;
629*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque32 MessageID;
630*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      Length;
631*48a54d36SAndroid Build Coastguard Worker 	} IKEHeader;			// 28 bytes
632*48a54d36SAndroid Build Coastguard Worker 
633*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
634*48a54d36SAndroid Build Coastguard Worker #if 0
635*48a54d36SAndroid Build Coastguard Worker #pragma mark -
636*48a54d36SAndroid Build Coastguard Worker #pragma mark - Resource Record structures
637*48a54d36SAndroid Build Coastguard Worker #endif
638*48a54d36SAndroid Build Coastguard Worker 
639*48a54d36SAndroid Build Coastguard Worker // Authoritative Resource Records:
640*48a54d36SAndroid Build Coastguard Worker // There are four basic types: Shared, Advisory, Unique, Known Unique
641*48a54d36SAndroid Build Coastguard Worker 
642*48a54d36SAndroid Build Coastguard Worker // * Shared Resource Records do not have to be unique
643*48a54d36SAndroid Build Coastguard Worker // -- Shared Resource Records are used for DNS-SD service PTRs
644*48a54d36SAndroid Build Coastguard Worker // -- It is okay for several hosts to have RRs with the same name but different RDATA
645*48a54d36SAndroid Build Coastguard Worker // -- We use a random delay on responses to reduce collisions when all the hosts respond to the same query
646*48a54d36SAndroid Build Coastguard Worker // -- These RRs typically have moderately high TTLs (e.g. one hour)
647*48a54d36SAndroid Build Coastguard Worker // -- These records are announced on startup and topology changes for the benefit of passive listeners
648*48a54d36SAndroid Build Coastguard Worker // -- These records send a goodbye packet when deregistering
649*48a54d36SAndroid Build Coastguard Worker //
650*48a54d36SAndroid Build Coastguard Worker // * Advisory Resource Records are like Shared Resource Records, except they don't send a goodbye packet
651*48a54d36SAndroid Build Coastguard Worker //
652*48a54d36SAndroid Build Coastguard Worker // * Unique Resource Records should be unique among hosts within any given mDNS scope
653*48a54d36SAndroid Build Coastguard Worker // -- The majority of Resource Records are of this type
654*48a54d36SAndroid Build Coastguard Worker // -- If two entities on the network have RRs with the same name but different RDATA, this is a conflict
655*48a54d36SAndroid Build Coastguard Worker // -- Responses may be sent immediately, because only one host should be responding to any particular query
656*48a54d36SAndroid Build Coastguard Worker // -- These RRs typically have low TTLs (e.g. a few minutes)
657*48a54d36SAndroid Build Coastguard Worker // -- On startup and after topology changes, a host issues queries to verify uniqueness
658*48a54d36SAndroid Build Coastguard Worker 
659*48a54d36SAndroid Build Coastguard Worker // * Known Unique Resource Records are treated like Unique Resource Records, except that mDNS does
660*48a54d36SAndroid Build Coastguard Worker // not have to verify their uniqueness because this is already known by other means (e.g. the RR name
661*48a54d36SAndroid Build Coastguard Worker // is derived from the host's IP or Ethernet address, which is already known to be a unique identifier).
662*48a54d36SAndroid Build Coastguard Worker 
663*48a54d36SAndroid Build Coastguard Worker // Summary of properties of different record types:
664*48a54d36SAndroid Build Coastguard Worker // Probe?    Does this record type send probes before announcing?
665*48a54d36SAndroid Build Coastguard Worker // Conflict? Does this record type react if we observe an apparent conflict?
666*48a54d36SAndroid Build Coastguard Worker // Goodbye?  Does this record type send a goodbye packet on departure?
667*48a54d36SAndroid Build Coastguard Worker //
668*48a54d36SAndroid Build Coastguard Worker //               Probe? Conflict? Goodbye? Notes
669*48a54d36SAndroid Build Coastguard Worker // Unregistered                            Should not appear in any list (sanity check value)
670*48a54d36SAndroid Build Coastguard Worker // Shared         No      No       Yes     e.g. Service PTR record
671*48a54d36SAndroid Build Coastguard Worker // Deregistering  No      No       Yes     Shared record about to announce its departure and leave the list
672*48a54d36SAndroid Build Coastguard Worker // Advisory       No      No       No
673*48a54d36SAndroid Build Coastguard Worker // Unique         Yes     Yes      No      Record intended to be unique -- will probe to verify
674*48a54d36SAndroid Build Coastguard Worker // Verified       Yes     Yes      No      Record has completed probing, and is verified unique
675*48a54d36SAndroid Build Coastguard Worker // KnownUnique    No      Yes      No      Record is assumed by other means to be unique
676*48a54d36SAndroid Build Coastguard Worker 
677*48a54d36SAndroid Build Coastguard Worker // Valid lifecycle of a record:
678*48a54d36SAndroid Build Coastguard Worker // Unregistered ->                   Shared      -> Deregistering -(goodbye)-> Unregistered
679*48a54d36SAndroid Build Coastguard Worker // Unregistered ->                   Advisory                               -> Unregistered
680*48a54d36SAndroid Build Coastguard Worker // Unregistered -> Unique -(probe)-> Verified                               -> Unregistered
681*48a54d36SAndroid Build Coastguard Worker // Unregistered ->                   KnownUnique                            -> Unregistered
682*48a54d36SAndroid Build Coastguard Worker 
683*48a54d36SAndroid Build Coastguard Worker // Each Authoritative kDNSRecordType has only one bit set. This makes it easy to quickly see if a record
684*48a54d36SAndroid Build Coastguard Worker // is one of a particular set of types simply by performing the appropriate bitwise masking operation.
685*48a54d36SAndroid Build Coastguard Worker 
686*48a54d36SAndroid Build Coastguard Worker // Cache Resource Records (received from the network):
687*48a54d36SAndroid Build Coastguard Worker // There are four basic types: Answer, Unique Answer, Additional, Unique Additional
688*48a54d36SAndroid Build Coastguard Worker // Bit 7 (the top bit) of kDNSRecordType is always set for Cache Resource Records; always clear for Authoritative Resource Records
689*48a54d36SAndroid Build Coastguard Worker // Bit 6 (value 0x40) is set for answer records; clear for authority/additional records
690*48a54d36SAndroid Build Coastguard Worker // Bit 5 (value 0x20) is set for records received with the kDNSClass_UniqueRRSet
691*48a54d36SAndroid Build Coastguard Worker 
692*48a54d36SAndroid Build Coastguard Worker enum
693*48a54d36SAndroid Build Coastguard Worker 	{
694*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeUnregistered     = 0x00,	// Not currently in any list
695*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeDeregistering    = 0x01,	// Shared record about to announce its departure and leave the list
696*48a54d36SAndroid Build Coastguard Worker 
697*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeUnique           = 0x02,	// Will become a kDNSRecordTypeVerified when probing is complete
698*48a54d36SAndroid Build Coastguard Worker 
699*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeAdvisory         = 0x04,	// Like Shared, but no goodbye packet
700*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeShared           = 0x08,	// Shared means record name does not have to be unique -- use random delay on responses
701*48a54d36SAndroid Build Coastguard Worker 
702*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeVerified         = 0x10,	// Unique means mDNS should check that name is unique (and then send immediate responses)
703*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeKnownUnique      = 0x20,	// Known Unique means mDNS can assume name is unique without checking
704*48a54d36SAndroid Build Coastguard Worker 	                                        // For Dynamic Update records, Known Unique means the record must already exist on the server.
705*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeUniqueMask       = (kDNSRecordTypeUnique | kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique),
706*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeActiveSharedMask = (kDNSRecordTypeAdvisory         | kDNSRecordTypeShared),
707*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeActiveUniqueMask = (kDNSRecordTypeVerified         | kDNSRecordTypeKnownUnique),
708*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypeActiveMask       = (kDNSRecordTypeActiveSharedMask | kDNSRecordTypeActiveUniqueMask),
709*48a54d36SAndroid Build Coastguard Worker 
710*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAdd        = 0x80,	// Received in the Additional  Section of a DNS Response
711*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAddUnique  = 0x90,	// Received in the Additional  Section of a DNS Response with kDNSClass_UniqueRRSet set
712*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAuth       = 0xA0,	// Received in the Authorities Section of a DNS Response
713*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAuthUnique = 0xB0,	// Received in the Authorities Section of a DNS Response with kDNSClass_UniqueRRSet set
714*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAns        = 0xC0,	// Received in the Answer      Section of a DNS Response
715*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketAnsUnique  = 0xD0,	// Received in the Answer      Section of a DNS Response with kDNSClass_UniqueRRSet set
716*48a54d36SAndroid Build Coastguard Worker 
717*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketNegative   = 0xF0,	// Pseudo-RR generated to cache non-existence results like NXDomain
718*48a54d36SAndroid Build Coastguard Worker 
719*48a54d36SAndroid Build Coastguard Worker 	kDNSRecordTypePacketUniqueMask = 0x10	// True for PacketAddUnique, PacketAnsUnique, PacketAuthUnique, kDNSRecordTypePacketNegative
720*48a54d36SAndroid Build Coastguard Worker 	};
721*48a54d36SAndroid Build Coastguard Worker 
722*48a54d36SAndroid Build Coastguard Worker typedef packedstruct { mDNSu16 priority; mDNSu16 weight; mDNSIPPort port; domainname target;   } rdataSRV;
723*48a54d36SAndroid Build Coastguard Worker typedef packedstruct { mDNSu16 preference;                                domainname exchange; } rdataMX;
724*48a54d36SAndroid Build Coastguard Worker typedef packedstruct { domainname mbox; domainname txt;                                        } rdataRP;
725*48a54d36SAndroid Build Coastguard Worker typedef packedstruct { mDNSu16 preference; domainname map822; domainname mapx400;              } rdataPX;
726*48a54d36SAndroid Build Coastguard Worker 
727*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
728*48a54d36SAndroid Build Coastguard Worker 	{
729*48a54d36SAndroid Build Coastguard Worker 	domainname mname;
730*48a54d36SAndroid Build Coastguard Worker 	domainname rname;
731*48a54d36SAndroid Build Coastguard Worker 	mDNSs32 serial;		// Modular counter; increases when zone changes
732*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 refresh;	// Time in seconds that a slave waits after successful replication of the database before it attempts replication again
733*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 retry;		// Time in seconds that a slave waits after an unsuccessful replication attempt before it attempts replication again
734*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 expire;		// Time in seconds that a slave holds on to old data while replication attempts remain unsuccessful
735*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 min;		// Nominally the minimum record TTL for this zone, in seconds; also used for negative caching.
736*48a54d36SAndroid Build Coastguard Worker 	} rdataSOA;
737*48a54d36SAndroid Build Coastguard Worker 
738*48a54d36SAndroid Build Coastguard Worker // EDNS Option Code registrations are recorded in the "DNS EDNS0 Options" section of
739*48a54d36SAndroid Build Coastguard Worker // <http://www.iana.org/assignments/dns-parameters>
740*48a54d36SAndroid Build Coastguard Worker 
741*48a54d36SAndroid Build Coastguard Worker #define kDNSOpt_LLQ   1
742*48a54d36SAndroid Build Coastguard Worker #define kDNSOpt_Lease 2
743*48a54d36SAndroid Build Coastguard Worker #define kDNSOpt_NSID  3
744*48a54d36SAndroid Build Coastguard Worker #define kDNSOpt_Owner 4
745*48a54d36SAndroid Build Coastguard Worker 
746*48a54d36SAndroid Build Coastguard Worker typedef struct
747*48a54d36SAndroid Build Coastguard Worker 	{
748*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      vers;
749*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      llqOp;
750*48a54d36SAndroid Build Coastguard Worker 	mDNSu16      err;	// Or UDP reply port, in setup request
751*48a54d36SAndroid Build Coastguard Worker 	// Note: In the in-memory form, there's typically a two-byte space here, so that the following 64-bit id is word-aligned
752*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque64 id;
753*48a54d36SAndroid Build Coastguard Worker 	mDNSu32      llqlease;
754*48a54d36SAndroid Build Coastguard Worker 	} LLQOptData;
755*48a54d36SAndroid Build Coastguard Worker 
756*48a54d36SAndroid Build Coastguard Worker typedef struct
757*48a54d36SAndroid Build Coastguard Worker 	{
758*48a54d36SAndroid Build Coastguard Worker 	mDNSu8       vers;		// Version number of this Owner OPT record
759*48a54d36SAndroid Build Coastguard Worker 	mDNSs8       seq;		// Sleep/wake epoch
760*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  HMAC;		// Host's primary identifier (e.g. MAC of on-board Ethernet)
761*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr  IMAC;		// Interface's MAC address (if different to primary MAC)
762*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque48 password;	// Optional password
763*48a54d36SAndroid Build Coastguard Worker 	} OwnerOptData;
764*48a54d36SAndroid Build Coastguard Worker 
765*48a54d36SAndroid Build Coastguard Worker // Note: rdataOPT format may be repeated an arbitrary number of times in a single resource record
766*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
767*48a54d36SAndroid Build Coastguard Worker 	{
768*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 opt;
769*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 optlen;
770*48a54d36SAndroid Build Coastguard Worker 	union { LLQOptData llq; mDNSu32 updatelease; OwnerOptData owner; } u;
771*48a54d36SAndroid Build Coastguard Worker 	} rdataOPT;
772*48a54d36SAndroid Build Coastguard Worker 
773*48a54d36SAndroid Build Coastguard Worker // Space needed to put OPT records into a packet:
774*48a54d36SAndroid Build Coastguard Worker // Header      11 bytes (name 1, type 2, class 2, TTL 4, length 2)
775*48a54d36SAndroid Build Coastguard Worker // LLQ rdata   18 bytes (opt 2, len 2, vers 2, op 2, err 2, id 8, lease 4)
776*48a54d36SAndroid Build Coastguard Worker // Lease rdata  8 bytes (opt 2, len 2, lease 4)
777*48a54d36SAndroid Build Coastguard Worker // Owner rdata 12-24    (opt 2, len 2, owner 8-20)
778*48a54d36SAndroid Build Coastguard Worker 
779*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_Header_Space                 11
780*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_LLQData_Space               (4 + 2 + 2 + 2 + 8 + 4)
781*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_LeaseData_Space             (4 + 4)
782*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_OwnerData_ID_Space          (4 + 2 + 6)
783*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_OwnerData_ID_Wake_Space     (4 + 2 + 6 + 6)
784*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_OwnerData_ID_Wake_PW4_Space (4 + 2 + 6 + 6 + 4)
785*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_OwnerData_ID_Wake_PW6_Space (4 + 2 + 6 + 6 + 6)
786*48a54d36SAndroid Build Coastguard Worker 
787*48a54d36SAndroid Build Coastguard Worker #define ValidOwnerLength(X) (	(X) == DNSOpt_OwnerData_ID_Space          - 4 || \
788*48a54d36SAndroid Build Coastguard Worker 								(X) == DNSOpt_OwnerData_ID_Wake_Space     - 4 || \
789*48a54d36SAndroid Build Coastguard Worker 								(X) == DNSOpt_OwnerData_ID_Wake_PW4_Space - 4 || \
790*48a54d36SAndroid Build Coastguard Worker 								(X) == DNSOpt_OwnerData_ID_Wake_PW6_Space - 4    )
791*48a54d36SAndroid Build Coastguard Worker 
792*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_Owner_Space(A,B) (mDNSSameEthAddress((A),(B)) ? DNSOpt_OwnerData_ID_Space : DNSOpt_OwnerData_ID_Wake_Space)
793*48a54d36SAndroid Build Coastguard Worker 
794*48a54d36SAndroid Build Coastguard Worker #define DNSOpt_Data_Space(O) (                                  \
795*48a54d36SAndroid Build Coastguard Worker 	(O)->opt == kDNSOpt_LLQ   ? DNSOpt_LLQData_Space   :        \
796*48a54d36SAndroid Build Coastguard Worker 	(O)->opt == kDNSOpt_Lease ? DNSOpt_LeaseData_Space :        \
797*48a54d36SAndroid Build Coastguard Worker 	(O)->opt == kDNSOpt_Owner ? DNSOpt_Owner_Space(&(O)->u.owner.HMAC, &(O)->u.owner.IMAC) : 0x10000)
798*48a54d36SAndroid Build Coastguard Worker 
799*48a54d36SAndroid Build Coastguard Worker // A maximal NSEC record is:
800*48a54d36SAndroid Build Coastguard Worker //   256 bytes domainname 'nextname'
801*48a54d36SAndroid Build Coastguard Worker // + 256 * 34 = 8704 bytes of bitmap data
802*48a54d36SAndroid Build Coastguard Worker // = 8960 bytes total
803*48a54d36SAndroid Build Coastguard Worker // For now we only support NSEC records encoding DNS types 0-255 and ignore the nextname (we always set it to be the same as the rrname),
804*48a54d36SAndroid Build Coastguard Worker // which gives us a fixed in-memory size of 32 bytes (256 bits)
805*48a54d36SAndroid Build Coastguard Worker typedef struct
806*48a54d36SAndroid Build Coastguard Worker 	{
807*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 bitmap[32];
808*48a54d36SAndroid Build Coastguard Worker 	} rdataNSEC;
809*48a54d36SAndroid Build Coastguard Worker 
810*48a54d36SAndroid Build Coastguard Worker // StandardAuthRDSize is 264 (256+8), which is large enough to hold a maximum-sized SRV record (6 + 256 bytes)
811*48a54d36SAndroid Build Coastguard Worker // MaximumRDSize is 8K the absolute maximum we support (at least for now)
812*48a54d36SAndroid Build Coastguard Worker #define StandardAuthRDSize 264
813*48a54d36SAndroid Build Coastguard Worker #define MaximumRDSize 8192
814*48a54d36SAndroid Build Coastguard Worker 
815*48a54d36SAndroid Build Coastguard Worker // InlineCacheRDSize is 68
816*48a54d36SAndroid Build Coastguard Worker // Records received from the network with rdata this size or less have their rdata stored right in the CacheRecord object
817*48a54d36SAndroid Build Coastguard Worker // Records received from the network with rdata larger than this have additional storage allocated for the rdata
818*48a54d36SAndroid Build Coastguard Worker // A quick unscientific sample from a busy network at Apple with lots of machines revealed this:
819*48a54d36SAndroid Build Coastguard Worker // 1461 records in cache
820*48a54d36SAndroid Build Coastguard Worker // 292 were one-byte TXT records
821*48a54d36SAndroid Build Coastguard Worker // 136 were four-byte A records
822*48a54d36SAndroid Build Coastguard Worker // 184 were sixteen-byte AAAA records
823*48a54d36SAndroid Build Coastguard Worker // 780 were various PTR, TXT and SRV records from 12-64 bytes
824*48a54d36SAndroid Build Coastguard Worker // Only 69 records had rdata bigger than 64 bytes
825*48a54d36SAndroid Build Coastguard Worker // Note that since CacheRecord object and a CacheGroup object are allocated out of the same pool, it's sensible to
826*48a54d36SAndroid Build Coastguard Worker // have them both be the same size. Making one smaller without making the other smaller won't actually save any memory.
827*48a54d36SAndroid Build Coastguard Worker #define InlineCacheRDSize 68
828*48a54d36SAndroid Build Coastguard Worker 
829*48a54d36SAndroid Build Coastguard Worker // On 64-bit, the pointers in a CacheRecord are bigger, and that creates 8 bytes more space for the name in a CacheGroup
830*48a54d36SAndroid Build Coastguard Worker #if ENABLE_MULTI_PACKET_QUERY_SNOOPING
831*48a54d36SAndroid Build Coastguard Worker 	#if defined(_ILP64) || defined(__ILP64__) || defined(_LP64) || defined(__LP64__) || defined(_WIN64)
832*48a54d36SAndroid Build Coastguard Worker 	#define InlineCacheGroupNameSize 160
833*48a54d36SAndroid Build Coastguard Worker 	#else
834*48a54d36SAndroid Build Coastguard Worker 	#define InlineCacheGroupNameSize 148
835*48a54d36SAndroid Build Coastguard Worker 	#endif
836*48a54d36SAndroid Build Coastguard Worker #else
837*48a54d36SAndroid Build Coastguard Worker 	#if defined(_ILP64) || defined(__ILP64__) || defined(_LP64) || defined(__LP64__) || defined(_WIN64)
838*48a54d36SAndroid Build Coastguard Worker 	#define InlineCacheGroupNameSize 144
839*48a54d36SAndroid Build Coastguard Worker 	#else
840*48a54d36SAndroid Build Coastguard Worker 	#define InlineCacheGroupNameSize 132
841*48a54d36SAndroid Build Coastguard Worker 	#endif
842*48a54d36SAndroid Build Coastguard Worker #endif
843*48a54d36SAndroid Build Coastguard Worker 
844*48a54d36SAndroid Build Coastguard Worker // The RDataBody union defines the common rdata types that fit into our 264-byte limit
845*48a54d36SAndroid Build Coastguard Worker typedef union
846*48a54d36SAndroid Build Coastguard Worker 	{
847*48a54d36SAndroid Build Coastguard Worker 	mDNSu8      data[StandardAuthRDSize];
848*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr  ipv4;		// For 'A' record
849*48a54d36SAndroid Build Coastguard Worker 	domainname  name;		// For PTR, NS, CNAME, DNAME
850*48a54d36SAndroid Build Coastguard Worker 	UTF8str255  txt;
851*48a54d36SAndroid Build Coastguard Worker 	rdataMX     mx;
852*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr  ipv6;		// For 'AAAA' record
853*48a54d36SAndroid Build Coastguard Worker 	rdataSRV    srv;
854*48a54d36SAndroid Build Coastguard Worker 	rdataOPT    opt[2];		// For EDNS0 OPT record; RDataBody may contain multiple variable-length rdataOPT objects packed together
855*48a54d36SAndroid Build Coastguard Worker 	rdataNSEC   nsec;
856*48a54d36SAndroid Build Coastguard Worker 	} RDataBody;
857*48a54d36SAndroid Build Coastguard Worker 
858*48a54d36SAndroid Build Coastguard Worker // The RDataBody2 union is the same as above, except it includes fields for the larger types like soa, rp, px
859*48a54d36SAndroid Build Coastguard Worker typedef union
860*48a54d36SAndroid Build Coastguard Worker 	{
861*48a54d36SAndroid Build Coastguard Worker 	mDNSu8      data[StandardAuthRDSize];
862*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr  ipv4;		// For 'A' record
863*48a54d36SAndroid Build Coastguard Worker 	domainname  name;		// For PTR, NS, CNAME, DNAME
864*48a54d36SAndroid Build Coastguard Worker 	rdataSOA    soa;		// This is large; not included in the normal RDataBody definition
865*48a54d36SAndroid Build Coastguard Worker 	UTF8str255  txt;
866*48a54d36SAndroid Build Coastguard Worker 	rdataMX     mx;
867*48a54d36SAndroid Build Coastguard Worker 	rdataRP     rp;			// This is large; not included in the normal RDataBody definition
868*48a54d36SAndroid Build Coastguard Worker 	rdataPX     px;			// This is large; not included in the normal RDataBody definition
869*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr  ipv6;		// For 'AAAA' record
870*48a54d36SAndroid Build Coastguard Worker 	rdataSRV    srv;
871*48a54d36SAndroid Build Coastguard Worker 	rdataOPT    opt[2];		// For EDNS0 OPT record; RDataBody may contain multiple variable-length rdataOPT objects packed together
872*48a54d36SAndroid Build Coastguard Worker 	rdataNSEC   nsec;
873*48a54d36SAndroid Build Coastguard Worker 	} RDataBody2;
874*48a54d36SAndroid Build Coastguard Worker 
875*48a54d36SAndroid Build Coastguard Worker typedef struct
876*48a54d36SAndroid Build Coastguard Worker 	{
877*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    MaxRDLength;	// Amount of storage allocated for rdata (usually sizeof(RDataBody))
878*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    padding;		// So that RDataBody is aligned on 32-bit boundary
879*48a54d36SAndroid Build Coastguard Worker 	RDataBody  u;
880*48a54d36SAndroid Build Coastguard Worker 	} RData;
881*48a54d36SAndroid Build Coastguard Worker 
882*48a54d36SAndroid Build Coastguard Worker // sizeofRDataHeader should be 4 bytes
883*48a54d36SAndroid Build Coastguard Worker #define sizeofRDataHeader (sizeof(RData) - sizeof(RDataBody))
884*48a54d36SAndroid Build Coastguard Worker 
885*48a54d36SAndroid Build Coastguard Worker // RData_small is a smaller version of the RData object, used for inline data storage embedded in a CacheRecord_struct
886*48a54d36SAndroid Build Coastguard Worker typedef struct
887*48a54d36SAndroid Build Coastguard Worker 	{
888*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    MaxRDLength;	// Storage allocated for data (may be greater than InlineCacheRDSize if additional storage follows this object)
889*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    padding;		// So that data is aligned on 32-bit boundary
890*48a54d36SAndroid Build Coastguard Worker 	mDNSu8     data[InlineCacheRDSize];
891*48a54d36SAndroid Build Coastguard Worker 	} RData_small;
892*48a54d36SAndroid Build Coastguard Worker 
893*48a54d36SAndroid Build Coastguard Worker // Note: Within an mDNSRecordCallback mDNS all API calls are legal except mDNS_Init(), mDNS_Exit(), mDNS_Execute()
894*48a54d36SAndroid Build Coastguard Worker typedef void mDNSRecordCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
895*48a54d36SAndroid Build Coastguard Worker 
896*48a54d36SAndroid Build Coastguard Worker // Note:
897*48a54d36SAndroid Build Coastguard Worker // Restrictions: An mDNSRecordUpdateCallback may not make any mDNS API calls.
898*48a54d36SAndroid Build Coastguard Worker // The intent of this callback is to allow the client to free memory, if necessary.
899*48a54d36SAndroid Build Coastguard Worker // The internal data structures of the mDNS code may not be in a state where mDNS API calls may be made safely.
900*48a54d36SAndroid Build Coastguard Worker typedef void mDNSRecordUpdateCallback(mDNS *const m, AuthRecord *const rr, RData *OldRData, mDNSu16 OldRDLen);
901*48a54d36SAndroid Build Coastguard Worker 
902*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
903*48a54d36SAndroid Build Coastguard Worker #if 0
904*48a54d36SAndroid Build Coastguard Worker #pragma mark -
905*48a54d36SAndroid Build Coastguard Worker #pragma mark - NAT Traversal structures and constants
906*48a54d36SAndroid Build Coastguard Worker #endif
907*48a54d36SAndroid Build Coastguard Worker 
908*48a54d36SAndroid Build Coastguard Worker #define NATMAP_MAX_RETRY_INTERVAL    ((mDNSPlatformOneSecond * 60) * 15)    // Max retry interval is 15 minutes
909*48a54d36SAndroid Build Coastguard Worker #define NATMAP_MIN_RETRY_INTERVAL     (mDNSPlatformOneSecond * 2)           // Min retry interval is 2 seconds
910*48a54d36SAndroid Build Coastguard Worker #define NATMAP_INIT_RETRY             (mDNSPlatformOneSecond / 4)           // start at 250ms w/ exponential decay
911*48a54d36SAndroid Build Coastguard Worker #define NATMAP_DEFAULT_LEASE          (60 * 60 * 2)                         // 2 hour lease life in seconds
912*48a54d36SAndroid Build Coastguard Worker #define NATMAP_VERS 0
913*48a54d36SAndroid Build Coastguard Worker 
914*48a54d36SAndroid Build Coastguard Worker typedef enum
915*48a54d36SAndroid Build Coastguard Worker 	{
916*48a54d36SAndroid Build Coastguard Worker 	NATOp_AddrRequest    = 0,
917*48a54d36SAndroid Build Coastguard Worker 	NATOp_MapUDP         = 1,
918*48a54d36SAndroid Build Coastguard Worker 	NATOp_MapTCP         = 2,
919*48a54d36SAndroid Build Coastguard Worker 
920*48a54d36SAndroid Build Coastguard Worker 	NATOp_AddrResponse   = 0x80 | 0,
921*48a54d36SAndroid Build Coastguard Worker 	NATOp_MapUDPResponse = 0x80 | 1,
922*48a54d36SAndroid Build Coastguard Worker 	NATOp_MapTCPResponse = 0x80 | 2,
923*48a54d36SAndroid Build Coastguard Worker 	} NATOp_t;
924*48a54d36SAndroid Build Coastguard Worker 
925*48a54d36SAndroid Build Coastguard Worker enum
926*48a54d36SAndroid Build Coastguard Worker 	{
927*48a54d36SAndroid Build Coastguard Worker 	NATErr_None    = 0,
928*48a54d36SAndroid Build Coastguard Worker 	NATErr_Vers    = 1,
929*48a54d36SAndroid Build Coastguard Worker 	NATErr_Refused = 2,
930*48a54d36SAndroid Build Coastguard Worker 	NATErr_NetFail = 3,
931*48a54d36SAndroid Build Coastguard Worker 	NATErr_Res     = 4,
932*48a54d36SAndroid Build Coastguard Worker 	NATErr_Opcode  = 5
933*48a54d36SAndroid Build Coastguard Worker 	};
934*48a54d36SAndroid Build Coastguard Worker 
935*48a54d36SAndroid Build Coastguard Worker typedef mDNSu16 NATErr_t;
936*48a54d36SAndroid Build Coastguard Worker 
937*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
938*48a54d36SAndroid Build Coastguard Worker 	{
939*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 vers;
940*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 opcode;
941*48a54d36SAndroid Build Coastguard Worker 	} NATAddrRequest;
942*48a54d36SAndroid Build Coastguard Worker 
943*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
944*48a54d36SAndroid Build Coastguard Worker 	{
945*48a54d36SAndroid Build Coastguard Worker 	mDNSu8     vers;
946*48a54d36SAndroid Build Coastguard Worker 	mDNSu8     opcode;
947*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    err;
948*48a54d36SAndroid Build Coastguard Worker 	mDNSu32    upseconds;		// Time since last NAT engine reboot, in seconds
949*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr ExtAddr;
950*48a54d36SAndroid Build Coastguard Worker 	} NATAddrReply;
951*48a54d36SAndroid Build Coastguard Worker 
952*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
953*48a54d36SAndroid Build Coastguard Worker 	{
954*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 vers;
955*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 opcode;
956*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 unused;
957*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort intport;
958*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort extport;
959*48a54d36SAndroid Build Coastguard Worker 	mDNSu32    NATReq_lease;
960*48a54d36SAndroid Build Coastguard Worker 	} NATPortMapRequest;
961*48a54d36SAndroid Build Coastguard Worker 
962*48a54d36SAndroid Build Coastguard Worker typedef packedstruct
963*48a54d36SAndroid Build Coastguard Worker 	{
964*48a54d36SAndroid Build Coastguard Worker 	mDNSu8     vers;
965*48a54d36SAndroid Build Coastguard Worker 	mDNSu8     opcode;
966*48a54d36SAndroid Build Coastguard Worker 	mDNSu16    err;
967*48a54d36SAndroid Build Coastguard Worker 	mDNSu32    upseconds;		// Time since last NAT engine reboot, in seconds
968*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort intport;
969*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort extport;
970*48a54d36SAndroid Build Coastguard Worker 	mDNSu32    NATRep_lease;
971*48a54d36SAndroid Build Coastguard Worker 	} NATPortMapReply;
972*48a54d36SAndroid Build Coastguard Worker 
973*48a54d36SAndroid Build Coastguard Worker typedef enum
974*48a54d36SAndroid Build Coastguard Worker 	{
975*48a54d36SAndroid Build Coastguard Worker 	LNTDiscoveryOp      = 1,
976*48a54d36SAndroid Build Coastguard Worker 	LNTExternalAddrOp   = 2,
977*48a54d36SAndroid Build Coastguard Worker 	LNTPortMapOp        = 3,
978*48a54d36SAndroid Build Coastguard Worker 	LNTPortMapDeleteOp  = 4
979*48a54d36SAndroid Build Coastguard Worker 	} LNTOp_t;
980*48a54d36SAndroid Build Coastguard Worker 
981*48a54d36SAndroid Build Coastguard Worker #define LNT_MAXBUFSIZE 8192
982*48a54d36SAndroid Build Coastguard Worker typedef struct tcpLNTInfo_struct tcpLNTInfo;
983*48a54d36SAndroid Build Coastguard Worker struct tcpLNTInfo_struct
984*48a54d36SAndroid Build Coastguard Worker 	{
985*48a54d36SAndroid Build Coastguard Worker 	tcpLNTInfo       *next;
986*48a54d36SAndroid Build Coastguard Worker 	mDNS             *m;
987*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo *parentNATInfo;	// pointer back to the parent NATTraversalInfo
988*48a54d36SAndroid Build Coastguard Worker 	TCPSocket        *sock;
989*48a54d36SAndroid Build Coastguard Worker 	LNTOp_t           op;				// operation performed using this connection
990*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr          Address;			// router address
991*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort        Port;				// router port
992*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *Request;			// xml request to router
993*48a54d36SAndroid Build Coastguard Worker 	int               requestLen;
994*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *Reply;			// xml reply from router
995*48a54d36SAndroid Build Coastguard Worker 	int               replyLen;
996*48a54d36SAndroid Build Coastguard Worker 	unsigned long     nread;			// number of bytes read so far
997*48a54d36SAndroid Build Coastguard Worker 	int               retries;			// number of times we've tried to do this port mapping
998*48a54d36SAndroid Build Coastguard Worker 	};
999*48a54d36SAndroid Build Coastguard Worker 
1000*48a54d36SAndroid Build Coastguard Worker typedef void (*NATTraversalClientCallback)(mDNS *m, NATTraversalInfo *n);
1001*48a54d36SAndroid Build Coastguard Worker 
1002*48a54d36SAndroid Build Coastguard Worker // if m->timenow <  ExpiryTime then we have an active mapping, and we'll renew halfway to expiry
1003*48a54d36SAndroid Build Coastguard Worker // if m->timenow >= ExpiryTime then our mapping has expired, and we're trying to create one
1004*48a54d36SAndroid Build Coastguard Worker 
1005*48a54d36SAndroid Build Coastguard Worker struct NATTraversalInfo_struct
1006*48a54d36SAndroid Build Coastguard Worker 	{
1007*48a54d36SAndroid Build Coastguard Worker 	// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
1008*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo           *next;
1009*48a54d36SAndroid Build Coastguard Worker 
1010*48a54d36SAndroid Build Coastguard Worker 	mDNSs32                     ExpiryTime;			// Time this mapping expires, or zero if no mapping
1011*48a54d36SAndroid Build Coastguard Worker 	mDNSs32                     retryInterval;		// Current interval, between last packet we sent and the next one
1012*48a54d36SAndroid Build Coastguard Worker 	mDNSs32                     retryPortMap;		// If Protocol is nonzero, time to send our next mapping packet
1013*48a54d36SAndroid Build Coastguard Worker 	mStatus                     NewResult;			// New error code; will be copied to Result just prior to invoking callback
1014*48a54d36SAndroid Build Coastguard Worker 
1015*48a54d36SAndroid Build Coastguard Worker #ifdef _LEGACY_NAT_TRAVERSAL_
1016*48a54d36SAndroid Build Coastguard Worker 	tcpLNTInfo                  tcpInfo;			// Legacy NAT traversal (UPnP) TCP connection
1017*48a54d36SAndroid Build Coastguard Worker #endif
1018*48a54d36SAndroid Build Coastguard Worker 
1019*48a54d36SAndroid Build Coastguard Worker 	// Result fields: When the callback is invoked these fields contain the answers the client is looking for
1020*48a54d36SAndroid Build Coastguard Worker 	// When the callback is invoked ExternalPort is *usually* set to be the same the same as RequestedPort, except:
1021*48a54d36SAndroid Build Coastguard Worker 	// (a) When we're behind a NAT gateway with port mapping disabled, ExternalPort is reported as zero to
1022*48a54d36SAndroid Build Coastguard Worker 	//     indicate that we don't currently have a working mapping (but RequestedPort retains the external port
1023*48a54d36SAndroid Build Coastguard Worker 	//     we'd like to get, the next time we meet an accomodating NAT gateway willing to give us one).
1024*48a54d36SAndroid Build Coastguard Worker 	// (b) When we have a routable non-RFC1918 address, we don't *need* a port mapping, so ExternalPort
1025*48a54d36SAndroid Build Coastguard Worker 	//     is reported as the same as our InternalPort, since that is effectively our externally-visible port too.
1026*48a54d36SAndroid Build Coastguard Worker 	//     Again, RequestedPort retains the external port we'd like to get the next time we find ourself behind a NAT gateway.
1027*48a54d36SAndroid Build Coastguard Worker 	// To improve stability of port mappings, RequestedPort is updated any time we get a successful
1028*48a54d36SAndroid Build Coastguard Worker 	// mapping response from the NAT-PMP or UPnP gateway. For example, if we ask for port 80, and
1029*48a54d36SAndroid Build Coastguard Worker 	// get assigned port 81, then thereafter we'll contine asking for port 81.
1030*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID             InterfaceID;
1031*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr                  ExternalAddress;	// Initially set to onesIPv4Addr, until first callback
1032*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort                  ExternalPort;
1033*48a54d36SAndroid Build Coastguard Worker 	mDNSu32                     Lifetime;
1034*48a54d36SAndroid Build Coastguard Worker 	mStatus                     Result;
1035*48a54d36SAndroid Build Coastguard Worker 
1036*48a54d36SAndroid Build Coastguard Worker 	// Client API fields: The client must set up these fields *before* making any NAT traversal API calls
1037*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                      Protocol;			// NATOp_MapUDP or NATOp_MapTCP, or zero if just requesting the external IP address
1038*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort                  IntPort;			// Client's internal port number (doesn't change)
1039*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort                  RequestedPort;		// Requested external port; may be updated with actual value assigned by gateway
1040*48a54d36SAndroid Build Coastguard Worker 	mDNSu32                     NATLease;			// Requested lifetime in seconds (doesn't change)
1041*48a54d36SAndroid Build Coastguard Worker 	NATTraversalClientCallback  clientCallback;
1042*48a54d36SAndroid Build Coastguard Worker 	void                       *clientContext;
1043*48a54d36SAndroid Build Coastguard Worker 	};
1044*48a54d36SAndroid Build Coastguard Worker 
1045*48a54d36SAndroid Build Coastguard Worker enum
1046*48a54d36SAndroid Build Coastguard Worker 	{
1047*48a54d36SAndroid Build Coastguard Worker 	DNSServer_Untested = 0,
1048*48a54d36SAndroid Build Coastguard Worker 	DNSServer_Passed   = 1,
1049*48a54d36SAndroid Build Coastguard Worker 	DNSServer_Failed   = 2,
1050*48a54d36SAndroid Build Coastguard Worker 	DNSServer_Disabled = 3
1051*48a54d36SAndroid Build Coastguard Worker 	};
1052*48a54d36SAndroid Build Coastguard Worker 
1053*48a54d36SAndroid Build Coastguard Worker enum
1054*48a54d36SAndroid Build Coastguard Worker 	{
1055*48a54d36SAndroid Build Coastguard Worker 	DNSServer_FlagDelete = 1,
1056*48a54d36SAndroid Build Coastguard Worker 	DNSServer_FlagNew    = 2
1057*48a54d36SAndroid Build Coastguard Worker 	};
1058*48a54d36SAndroid Build Coastguard Worker 
1059*48a54d36SAndroid Build Coastguard Worker enum
1060*48a54d36SAndroid Build Coastguard Worker 	{
1061*48a54d36SAndroid Build Coastguard Worker 	McastResolver_FlagDelete = 1,
1062*48a54d36SAndroid Build Coastguard Worker 	McastResolver_FlagNew    = 2
1063*48a54d36SAndroid Build Coastguard Worker 	};
1064*48a54d36SAndroid Build Coastguard Worker 
1065*48a54d36SAndroid Build Coastguard Worker typedef struct McastResolver
1066*48a54d36SAndroid Build Coastguard Worker 	{
1067*48a54d36SAndroid Build Coastguard Worker 	struct McastResolver *next;
1068*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID interface;
1069*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         flags;		// Set when we're planning to delete this from the list
1070*48a54d36SAndroid Build Coastguard Worker 	domainname      domain;
1071*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         timeout;	// timeout value for questions
1072*48a54d36SAndroid Build Coastguard Worker 	} McastResolver;
1073*48a54d36SAndroid Build Coastguard Worker 
1074*48a54d36SAndroid Build Coastguard Worker typedef struct DNSServer
1075*48a54d36SAndroid Build Coastguard Worker 	{
1076*48a54d36SAndroid Build Coastguard Worker 	struct DNSServer *next;
1077*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID interface;	// For specialized uses; we can have DNS servers reachable over specific interfaces
1078*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        addr;
1079*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort      port;
1080*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16    testid;
1081*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         flags;		// Set when we're planning to delete this from the list
1082*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         teststate;	// Have we sent bug-detection query to this server?
1083*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         lasttest;	// Time we sent last bug-detection query to this server
1084*48a54d36SAndroid Build Coastguard Worker 	domainname      domain;		// name->server matching for "split dns"
1085*48a54d36SAndroid Build Coastguard Worker 	mDNSs32			penaltyTime; // amount of time this server is penalized
1086*48a54d36SAndroid Build Coastguard Worker 	mDNSBool		scoped;		// interface should be matched against question only
1087*48a54d36SAndroid Build Coastguard Worker 								// if scoped is set
1088*48a54d36SAndroid Build Coastguard Worker 	mDNSu32			timeout;	// timeout value for questions
1089*48a54d36SAndroid Build Coastguard Worker 	} DNSServer;
1090*48a54d36SAndroid Build Coastguard Worker 
1091*48a54d36SAndroid Build Coastguard Worker typedef struct							// Size is 36 bytes when compiling for 32-bit; 48 when compiling for 64-bit
1092*48a54d36SAndroid Build Coastguard Worker 	{
1093*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           RecordType;		// See enum above
1094*48a54d36SAndroid Build Coastguard Worker 	mDNSu16          rrtype;
1095*48a54d36SAndroid Build Coastguard Worker 	mDNSu16          rrclass;
1096*48a54d36SAndroid Build Coastguard Worker 	mDNSu32          rroriginalttl;		// In seconds
1097*48a54d36SAndroid Build Coastguard Worker 	mDNSu16          rdlength;			// Size of the raw rdata, in bytes, in the on-the-wire format
1098*48a54d36SAndroid Build Coastguard Worker 										// (In-memory storage may be larger, for structures containing 'holes', like SOA,
1099*48a54d36SAndroid Build Coastguard Worker 										// or smaller, for NSEC where we don't bother storing the nextname field)
1100*48a54d36SAndroid Build Coastguard Worker 	mDNSu16          rdestimate;		// Upper bound on on-the-wire size of rdata after name compression
1101*48a54d36SAndroid Build Coastguard Worker 	mDNSu32          namehash;			// Name-based (i.e. case-insensitive) hash of name
1102*48a54d36SAndroid Build Coastguard Worker 	mDNSu32          rdatahash;			// For rdata containing domain name (e.g. PTR, SRV, CNAME etc.), case-insensitive name hash
1103*48a54d36SAndroid Build Coastguard Worker 										// else, for all other rdata, 32-bit hash of the raw rdata
1104*48a54d36SAndroid Build Coastguard Worker 										// Note: This requirement is important. Various routines like AddAdditionalsToResponseList(),
1105*48a54d36SAndroid Build Coastguard Worker 										// ReconfirmAntecedents(), etc., use rdatahash as a pre-flight check to see
1106*48a54d36SAndroid Build Coastguard Worker 										// whether it's worth doing a full SameDomainName() call. If the rdatahash
1107*48a54d36SAndroid Build Coastguard Worker 										// is not a correct case-insensitive name hash, they'll get false negatives.
1108*48a54d36SAndroid Build Coastguard Worker 
1109*48a54d36SAndroid Build Coastguard Worker 	// Grouping pointers together at the end of the structure improves the memory layout efficiency
1110*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID  InterfaceID;		// Set if this RR is specific to one interface
1111*48a54d36SAndroid Build Coastguard Worker 										// For records received off the wire, InterfaceID is *always* set to the receiving interface
1112*48a54d36SAndroid Build Coastguard Worker 										// For our authoritative records, InterfaceID is usually zero, except for those few records
1113*48a54d36SAndroid Build Coastguard Worker 										// that are interface-specific (e.g. address records, especially linklocal addresses)
1114*48a54d36SAndroid Build Coastguard Worker 	const domainname *name;
1115*48a54d36SAndroid Build Coastguard Worker 	RData           *rdata;				// Pointer to storage for this rdata
1116*48a54d36SAndroid Build Coastguard Worker 	DNSServer       *rDNSServer;		// Unicast DNS server authoritative for this entry;null for multicast
1117*48a54d36SAndroid Build Coastguard Worker 	} ResourceRecord;
1118*48a54d36SAndroid Build Coastguard Worker 
1119*48a54d36SAndroid Build Coastguard Worker // Unless otherwise noted, states may apply to either independent record registrations or service registrations
1120*48a54d36SAndroid Build Coastguard Worker typedef enum
1121*48a54d36SAndroid Build Coastguard Worker 	{
1122*48a54d36SAndroid Build Coastguard Worker 	regState_Zero              = 0,
1123*48a54d36SAndroid Build Coastguard Worker 	regState_Pending           = 1,     // update sent, reply not received
1124*48a54d36SAndroid Build Coastguard Worker 	regState_Registered        = 2,     // update sent, reply received
1125*48a54d36SAndroid Build Coastguard Worker 	regState_DeregPending      = 3,     // dereg sent, reply not received
1126*48a54d36SAndroid Build Coastguard Worker 	regState_Unregistered      = 4,     // not in any list
1127*48a54d36SAndroid Build Coastguard Worker 	regState_Refresh           = 5,     // outstanding refresh (or target change) message
1128*48a54d36SAndroid Build Coastguard Worker 	regState_NATMap            = 6,     // establishing NAT port mapping
1129*48a54d36SAndroid Build Coastguard Worker 	regState_UpdatePending     = 7,     // update in flight as result of mDNS_Update call
1130*48a54d36SAndroid Build Coastguard Worker 	regState_NoTarget          = 8,     // SRV Record registration pending registration of hostname
1131*48a54d36SAndroid Build Coastguard Worker 	regState_NATError          = 9     // unable to complete NAT traversal
1132*48a54d36SAndroid Build Coastguard Worker 	} regState_t;
1133*48a54d36SAndroid Build Coastguard Worker 
1134*48a54d36SAndroid Build Coastguard Worker enum
1135*48a54d36SAndroid Build Coastguard Worker 	{
1136*48a54d36SAndroid Build Coastguard Worker 	Target_Manual = 0,
1137*48a54d36SAndroid Build Coastguard Worker 	Target_AutoHost = 1,
1138*48a54d36SAndroid Build Coastguard Worker 	Target_AutoHostAndNATMAP = 2
1139*48a54d36SAndroid Build Coastguard Worker 	};
1140*48a54d36SAndroid Build Coastguard Worker 
1141*48a54d36SAndroid Build Coastguard Worker typedef enum
1142*48a54d36SAndroid Build Coastguard Worker 	{
1143*48a54d36SAndroid Build Coastguard Worker 	mergeState_Zero = 0,
1144*48a54d36SAndroid Build Coastguard Worker 	mergeState_DontMerge = 1  // Set on fatal error conditions to disable merging
1145*48a54d36SAndroid Build Coastguard Worker 	} mergeState_t;
1146*48a54d36SAndroid Build Coastguard Worker 
1147*48a54d36SAndroid Build Coastguard Worker struct AuthGroup_struct				// Header object for a list of AuthRecords with the same name
1148*48a54d36SAndroid Build Coastguard Worker 	{
1149*48a54d36SAndroid Build Coastguard Worker 	AuthGroup      *next;				// Next AuthGroup object in this hash table bucket
1150*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         namehash;			// Name-based (i.e. case insensitive) hash of name
1151*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *members;			// List of CacheRecords with this same name
1152*48a54d36SAndroid Build Coastguard Worker 	AuthRecord    **rrauth_tail;		// Tail end of that list
1153*48a54d36SAndroid Build Coastguard Worker 	domainname     *name;				// Common name for all AuthRecords in this list
1154*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *NewLocalOnlyRecords;
1155*48a54d36SAndroid Build Coastguard Worker 	// Size to here is 20 bytes when compiling 32-bit; 40 bytes when compiling 64-bit
1156*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          namestorage[InlineCacheGroupNameSize];
1157*48a54d36SAndroid Build Coastguard Worker 	};
1158*48a54d36SAndroid Build Coastguard Worker 
1159*48a54d36SAndroid Build Coastguard Worker #define AUTH_HASH_SLOTS 499
1160*48a54d36SAndroid Build Coastguard Worker #define FORALL_AUTHRECORDS(SLOT,AG,AR)                           	\
1161*48a54d36SAndroid Build Coastguard Worker 	for ((SLOT) = 0; (SLOT) < AUTH_HASH_SLOTS; (SLOT)++)         	\
1162*48a54d36SAndroid Build Coastguard Worker 		for ((AG)=m->rrauth.rrauth_hash[(SLOT)]; (AG); (AG)=(AG)->next) \
1163*48a54d36SAndroid Build Coastguard Worker 			for ((AR) = (AG)->members; (AR); (AR)=(AR)->next)
1164*48a54d36SAndroid Build Coastguard Worker 
1165*48a54d36SAndroid Build Coastguard Worker typedef union AuthEntity_union AuthEntity;
1166*48a54d36SAndroid Build Coastguard Worker union AuthEntity_union { AuthEntity *next; AuthGroup ag; };
1167*48a54d36SAndroid Build Coastguard Worker typedef struct {
1168*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrauth_size;				// Total number of available auth entries
1169*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrauth_totalused;			// Number of auth entries currently occupied
1170*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrauth_report;
1171*48a54d36SAndroid Build Coastguard Worker 	mDNSu8  rrauth_lock;				// For debugging: Set at times when these lists may not be modified
1172*48a54d36SAndroid Build Coastguard Worker 	AuthEntity *rrauth_free;
1173*48a54d36SAndroid Build Coastguard Worker 	AuthGroup *rrauth_hash[AUTH_HASH_SLOTS];
1174*48a54d36SAndroid Build Coastguard Worker }AuthHash;
1175*48a54d36SAndroid Build Coastguard Worker 
1176*48a54d36SAndroid Build Coastguard Worker // AuthRecordAny includes mDNSInterface_Any and interface specific auth records (anything
1177*48a54d36SAndroid Build Coastguard Worker // other than P2P or LocalOnly)
1178*48a54d36SAndroid Build Coastguard Worker typedef enum
1179*48a54d36SAndroid Build Coastguard Worker 	{
1180*48a54d36SAndroid Build Coastguard Worker 	AuthRecordAny, 				// registered for *Any, NOT including P2P interfaces
1181*48a54d36SAndroid Build Coastguard Worker 	AuthRecordAnyIncludeP2P, 	// registered for *Any, including P2P interfaces
1182*48a54d36SAndroid Build Coastguard Worker 	AuthRecordLocalOnly,
1183*48a54d36SAndroid Build Coastguard Worker 	AuthRecordP2P				// discovered over D2D/P2P framework
1184*48a54d36SAndroid Build Coastguard Worker 	} AuthRecType;
1185*48a54d36SAndroid Build Coastguard Worker 
1186*48a54d36SAndroid Build Coastguard Worker struct AuthRecord_struct
1187*48a54d36SAndroid Build Coastguard Worker 	{
1188*48a54d36SAndroid Build Coastguard Worker 	// For examples of how to set up this structure for use in mDNS_Register(),
1189*48a54d36SAndroid Build Coastguard Worker 	// see mDNS_AdvertiseInterface() or mDNS_RegisterService().
1190*48a54d36SAndroid Build Coastguard Worker 	// Basically, resrec and persistent metadata need to be set up before calling mDNS_Register().
1191*48a54d36SAndroid Build Coastguard Worker 	// mDNS_SetupResourceRecord() is avaliable as a helper routine to set up most fields to sensible default values for you
1192*48a54d36SAndroid Build Coastguard Worker 
1193*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *next;				// Next in list; first element of structure for efficiency reasons
1194*48a54d36SAndroid Build Coastguard Worker 	// Field Group 1: Common ResourceRecord fields
1195*48a54d36SAndroid Build Coastguard Worker 	ResourceRecord  resrec;				// 36 bytes when compiling for 32-bit; 48 when compiling for 64-bit
1196*48a54d36SAndroid Build Coastguard Worker 
1197*48a54d36SAndroid Build Coastguard Worker 	// Field Group 2: Persistent metadata for Authoritative Records
1198*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *Additional1;		// Recommended additional record to include in response (e.g. SRV for PTR record)
1199*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *Additional2;		// Another additional (e.g. TXT for PTR record)
1200*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *DependentOn;		// This record depends on another for its uniqueness checking
1201*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *RRSet;				// This unique record is part of an RRSet
1202*48a54d36SAndroid Build Coastguard Worker 	mDNSRecordCallback *RecordCallback;	// Callback function to call for state changes, and to free memory asynchronously on deregistration
1203*48a54d36SAndroid Build Coastguard Worker 	void           *RecordContext;		// Context parameter for the callback function
1204*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          AutoTarget;			// Set if the target of this record (PTR, CNAME, SRV, etc.) is our host name
1205*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          AllowRemoteQuery;	// Set if we allow hosts not on the local link to query this record
1206*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          ForceMCast;			// Set by client to advertise solely via multicast, even for apparently unicast names
1207*48a54d36SAndroid Build Coastguard Worker 
1208*48a54d36SAndroid Build Coastguard Worker 	OwnerOptData    WakeUp;				// WakeUp.HMAC.l[0] nonzero indicates that this is a Sleep Proxy record
1209*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        AddressProxy;		// For reverse-mapping Sleep Proxy PTR records, address in question
1210*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         TimeRcvd;			// In platform time units
1211*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         TimeExpire;			// In platform time units
1212*48a54d36SAndroid Build Coastguard Worker 	AuthRecType     ARType;             // LocalOnly, P2P or Normal ?
1213*48a54d36SAndroid Build Coastguard Worker 
1214*48a54d36SAndroid Build Coastguard Worker 	// Field Group 3: Transient state for Authoritative Records
1215*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          Acknowledged;		// Set if we've given the success callback to the client
1216*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          ProbeCount;			// Number of probes remaining before this record is valid (kDNSRecordTypeUnique)
1217*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          AnnounceCount;		// Number of announcements remaining (kDNSRecordTypeShared)
1218*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          RequireGoodbye;		// Set if this RR has been announced on the wire and will require a goodbye packet
1219*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          AnsweredLocalQ;		// Set if this AuthRecord has been delivered to any local question (LocalOnly or mDNSInterface_Any)
1220*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          IncludeInProbe;		// Set if this RR is being put into a probe right now
1221*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          ImmedUnicast;		// Set if we may send our response directly via unicast to the requester
1222*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID SendNSECNow;		// Set if we need to generate associated NSEC data for this rrname
1223*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID ImmedAnswer;		// Someone on this interface issued a query we need to answer (all-ones for all interfaces)
1224*48a54d36SAndroid Build Coastguard Worker #if MDNS_LOG_ANSWER_SUPPRESSION_TIMES
1225*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         ImmedAnswerMarkTime;
1226*48a54d36SAndroid Build Coastguard Worker #endif
1227*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID ImmedAdditional;	// Hint that we might want to also send this record, just to be helpful
1228*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID SendRNow;			// The interface this query is being sent on right now
1229*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr      v4Requester;		// Recent v4 query for this record, or all-ones if more than one recent query
1230*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr      v6Requester;		// Recent v6 query for this record, or all-ones if more than one recent query
1231*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *NextResponse;		// Link to the next element in the chain of responses to generate
1232*48a54d36SAndroid Build Coastguard Worker 	const mDNSu8   *NR_AnswerTo;		// Set if this record was selected by virtue of being a direct answer to a question
1233*48a54d36SAndroid Build Coastguard Worker 	AuthRecord     *NR_AdditionalTo;	// Set if this record was selected by virtue of being additional to another
1234*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         ThisAPInterval;		// In platform time units: Current interval for announce/probe
1235*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         LastAPTime;			// In platform time units: Last time we sent announcement/probe
1236*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         LastMCTime;			// Last time we multicast this record (used to guard against packet-storm attacks)
1237*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID LastMCInterface;	// Interface this record was multicast on at the time LastMCTime was recorded
1238*48a54d36SAndroid Build Coastguard Worker 	RData          *NewRData;			// Set if we are updating this record with new rdata
1239*48a54d36SAndroid Build Coastguard Worker 	mDNSu16         newrdlength;		// ... and the length of the new RData
1240*48a54d36SAndroid Build Coastguard Worker 	mDNSRecordUpdateCallback *UpdateCallback;
1241*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         UpdateCredits;		// Token-bucket rate limiting of excessive updates
1242*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         NextUpdateCredit;	// Time next token is added to bucket
1243*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         UpdateBlocked;		// Set if update delaying is in effect
1244*48a54d36SAndroid Build Coastguard Worker 
1245*48a54d36SAndroid Build Coastguard Worker 	// Field Group 4: Transient uDNS state for Authoritative Records
1246*48a54d36SAndroid Build Coastguard Worker 	regState_t   state;			// Maybe combine this with resrec.RecordType state? Right now it's ambiguous and confusing.
1247*48a54d36SAndroid Build Coastguard Worker 								// e.g. rr->resrec.RecordType can be kDNSRecordTypeUnregistered,
1248*48a54d36SAndroid Build Coastguard Worker 								// and rr->state can be regState_Unregistered
1249*48a54d36SAndroid Build Coastguard Worker 								// What if we find one of those statements is true and the other false? What does that mean?
1250*48a54d36SAndroid Build Coastguard Worker 	mDNSBool     uselease;		// dynamic update contains (should contain) lease option
1251*48a54d36SAndroid Build Coastguard Worker 	mDNSs32      expire;		// In platform time units: expiration of lease (-1 for static)
1252*48a54d36SAndroid Build Coastguard Worker 	mDNSBool     Private;		// If zone is private, DNS updates may have to be encrypted to prevent eavesdropping
1253*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 updateid;		// Identifier to match update request and response -- also used when transferring records to Sleep Proxy
1254*48a54d36SAndroid Build Coastguard Worker 	const domainname *zone;		// the zone that is updated
1255*48a54d36SAndroid Build Coastguard Worker 	ZoneData  *nta;
1256*48a54d36SAndroid Build Coastguard Worker 	struct tcpInfo_t *tcp;
1257*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo  NATinfo;
1258*48a54d36SAndroid Build Coastguard Worker 	mDNSBool SRVChanged;       // temporarily deregistered service because its SRV target or port changed
1259*48a54d36SAndroid Build Coastguard Worker 	mergeState_t  mState;      // Unicast Record Registrations merge state
1260*48a54d36SAndroid Build Coastguard Worker 	mDNSu8		  refreshCount; // Number of refreshes to the server
1261*48a54d36SAndroid Build Coastguard Worker 	mStatus		  updateError;  // Record update resulted in Error ?
1262*48a54d36SAndroid Build Coastguard Worker 
1263*48a54d36SAndroid Build Coastguard Worker 	// uDNS_UpdateRecord support fields
1264*48a54d36SAndroid Build Coastguard Worker 	// Do we really need all these in *addition* to NewRData and newrdlength above?
1265*48a54d36SAndroid Build Coastguard Worker 	void *UpdateContext;	// Context parameter for the update callback function
1266*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 OrigRDLen;		// previously registered, being deleted
1267*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 InFlightRDLen;	// currently being registered
1268*48a54d36SAndroid Build Coastguard Worker 	mDNSu16 QueuedRDLen;	// pending operation (re-transmitting if necessary) THEN register the queued update
1269*48a54d36SAndroid Build Coastguard Worker 	RData *OrigRData;
1270*48a54d36SAndroid Build Coastguard Worker 	RData *InFlightRData;
1271*48a54d36SAndroid Build Coastguard Worker 	RData *QueuedRData;
1272*48a54d36SAndroid Build Coastguard Worker 
1273*48a54d36SAndroid Build Coastguard Worker 	// Field Group 5: Large data objects go at the end
1274*48a54d36SAndroid Build Coastguard Worker 	domainname      namestorage;
1275*48a54d36SAndroid Build Coastguard Worker 	RData           rdatastorage;		// Normally the storage is right here, except for oversized records
1276*48a54d36SAndroid Build Coastguard Worker 	// rdatastorage MUST be the last thing in the structure -- when using oversized AuthRecords, extra bytes
1277*48a54d36SAndroid Build Coastguard Worker 	// are appended after the end of the AuthRecord, logically augmenting the size of the rdatastorage
1278*48a54d36SAndroid Build Coastguard Worker 	// DO NOT ADD ANY MORE FIELDS HERE
1279*48a54d36SAndroid Build Coastguard Worker 	};
1280*48a54d36SAndroid Build Coastguard Worker 
1281*48a54d36SAndroid Build Coastguard Worker // IsLocalDomain alone is not sufficient to determine that a record is mDNS or uDNS. By default domain names within
1282*48a54d36SAndroid Build Coastguard Worker // the "local" pseudo-TLD (and within the IPv4 and IPv6 link-local reverse mapping domains) are automatically treated
1283*48a54d36SAndroid Build Coastguard Worker // as mDNS records, but it is also possible to force any record (even those not within one of the inherently local
1284*48a54d36SAndroid Build Coastguard Worker // domains) to be handled as an mDNS record by setting the ForceMCast flag, or by setting a non-zero InterfaceID.
1285*48a54d36SAndroid Build Coastguard Worker // For example, the reverse-mapping PTR record created in AdvertiseInterface sets the ForceMCast flag, since it points to
1286*48a54d36SAndroid Build Coastguard Worker // a dot-local hostname, and therefore it would make no sense to register this record with a wide-area Unicast DNS server.
1287*48a54d36SAndroid Build Coastguard Worker // The same applies to Sleep Proxy records, which we will answer for when queried via mDNS, but we never want to try
1288*48a54d36SAndroid Build Coastguard Worker // to register them with a wide-area Unicast DNS server -- and we probably don't have the required credentials anyway.
1289*48a54d36SAndroid Build Coastguard Worker // Currently we have no concept of a wide-area uDNS record scoped to a particular interface, so if the InterfaceID is
1290*48a54d36SAndroid Build Coastguard Worker // nonzero we treat this the same as ForceMCast.
1291*48a54d36SAndroid Build Coastguard Worker // Note: Question_uDNS(Q) is used in *only* one place -- on entry to mDNS_StartQuery_internal, to decide whether to set TargetQID.
1292*48a54d36SAndroid Build Coastguard Worker // Everywhere else in the code, the determination of whether a question is unicast is made by checking to see if TargetQID is nonzero.
1293*48a54d36SAndroid Build Coastguard Worker #define AuthRecord_uDNS(R) ((R)->resrec.InterfaceID == mDNSInterface_Any && !(R)->ForceMCast && !IsLocalDomain((R)->resrec.name))
1294*48a54d36SAndroid Build Coastguard Worker #define Question_uDNS(Q)   ((Q)->InterfaceID == mDNSInterface_Unicast || \
1295*48a54d36SAndroid Build Coastguard Worker 	((Q)->InterfaceID != mDNSInterface_LocalOnly && (Q)->InterfaceID != mDNSInterface_P2P && !(Q)->ForceMCast && !IsLocalDomain(&(Q)->qname)))
1296*48a54d36SAndroid Build Coastguard Worker 
1297*48a54d36SAndroid Build Coastguard Worker #define RRLocalOnly(rr) ((rr)->ARType == AuthRecordLocalOnly || (rr)->ARType == AuthRecordP2P)
1298*48a54d36SAndroid Build Coastguard Worker 
1299*48a54d36SAndroid Build Coastguard Worker #define RRAny(rr) ((rr)->ARType == AuthRecordAny || (rr)->ARType == AuthRecordAnyIncludeP2P)
1300*48a54d36SAndroid Build Coastguard Worker 
1301*48a54d36SAndroid Build Coastguard Worker // Question (A or AAAA) that is suppressed currently because IPv4 or IPv6 address
1302*48a54d36SAndroid Build Coastguard Worker // is not available locally for A or AAAA question respectively
1303*48a54d36SAndroid Build Coastguard Worker #define QuerySuppressed(Q) ((Q)->SuppressUnusable && (Q)->SuppressQuery)
1304*48a54d36SAndroid Build Coastguard Worker 
1305*48a54d36SAndroid Build Coastguard Worker #define PrivateQuery(Q) ((Q)->AuthInfo && (Q)->AuthInfo->AutoTunnel)
1306*48a54d36SAndroid Build Coastguard Worker 
1307*48a54d36SAndroid Build Coastguard Worker // Normally we always lookup the cache and /etc/hosts before sending the query on the wire. For single label
1308*48a54d36SAndroid Build Coastguard Worker // queries (A and AAAA) that are unqualified (indicated by AppendSearchDomains), we want to append search
1309*48a54d36SAndroid Build Coastguard Worker // domains before we try them as such
1310*48a54d36SAndroid Build Coastguard Worker #define ApplySearchDomainsFirst(q) ((q)->AppendSearchDomains && (CountLabels(&((q)->qname))) == 1)
1311*48a54d36SAndroid Build Coastguard Worker 
1312*48a54d36SAndroid Build Coastguard Worker // Wrapper struct for Auth Records for higher-level code that cannot use the AuthRecord's ->next pointer field
1313*48a54d36SAndroid Build Coastguard Worker typedef struct ARListElem
1314*48a54d36SAndroid Build Coastguard Worker 	{
1315*48a54d36SAndroid Build Coastguard Worker 	struct ARListElem *next;
1316*48a54d36SAndroid Build Coastguard Worker 	AuthRecord ar;          // Note: Must be last element of structure, to accomodate oversized AuthRecords
1317*48a54d36SAndroid Build Coastguard Worker 	} ARListElem;
1318*48a54d36SAndroid Build Coastguard Worker 
1319*48a54d36SAndroid Build Coastguard Worker struct CacheGroup_struct				// Header object for a list of CacheRecords with the same name
1320*48a54d36SAndroid Build Coastguard Worker 	{
1321*48a54d36SAndroid Build Coastguard Worker 	CacheGroup     *next;				// Next CacheGroup object in this hash table bucket
1322*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         namehash;			// Name-based (i.e. case insensitive) hash of name
1323*48a54d36SAndroid Build Coastguard Worker 	CacheRecord    *members;			// List of CacheRecords with this same name
1324*48a54d36SAndroid Build Coastguard Worker 	CacheRecord   **rrcache_tail;		// Tail end of that list
1325*48a54d36SAndroid Build Coastguard Worker 	domainname     *name;				// Common name for all CacheRecords in this list
1326*48a54d36SAndroid Build Coastguard Worker 	// Size to here is 20 bytes when compiling 32-bit; 40 bytes when compiling 64-bit
1327*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          namestorage[InlineCacheGroupNameSize];
1328*48a54d36SAndroid Build Coastguard Worker 	};
1329*48a54d36SAndroid Build Coastguard Worker 
1330*48a54d36SAndroid Build Coastguard Worker 
1331*48a54d36SAndroid Build Coastguard Worker struct CacheRecord_struct
1332*48a54d36SAndroid Build Coastguard Worker 	{
1333*48a54d36SAndroid Build Coastguard Worker 	CacheRecord    *next;				// Next in list; first element of structure for efficiency reasons
1334*48a54d36SAndroid Build Coastguard Worker 	ResourceRecord  resrec;				// 36 bytes when compiling for 32-bit; 48 when compiling for 64-bit
1335*48a54d36SAndroid Build Coastguard Worker 
1336*48a54d36SAndroid Build Coastguard Worker 	// Transient state for Cache Records
1337*48a54d36SAndroid Build Coastguard Worker 	CacheRecord    *NextInKAList;		// Link to the next element in the chain of known answers to send
1338*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         TimeRcvd;			// In platform time units
1339*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         DelayDelivery;		// Set if we want to defer delivery of this answer to local clients
1340*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         NextRequiredQuery;	// In platform time units
1341*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         LastUsed;			// In platform time units
1342*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion    *CRActiveQuestion;	// Points to an active question referencing this answer. Can never point to a NewQuestion.
1343*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         UnansweredQueries;	// Number of times we've issued a query for this record without getting an answer
1344*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         LastUnansweredTime;	// In platform time units; last time we incremented UnansweredQueries
1345*48a54d36SAndroid Build Coastguard Worker #if ENABLE_MULTI_PACKET_QUERY_SNOOPING
1346*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         MPUnansweredQ;		// Multi-packet query handling: Number of times we've seen a query for this record
1347*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         MPLastUnansweredQT;	// Multi-packet query handling: Last time we incremented MPUnansweredQ
1348*48a54d36SAndroid Build Coastguard Worker 	mDNSu32         MPUnansweredKA;		// Multi-packet query handling: Number of times we've seen this record in a KA list
1349*48a54d36SAndroid Build Coastguard Worker 	mDNSBool        MPExpectingKA;		// Multi-packet query handling: Set when we increment MPUnansweredQ; allows one KA
1350*48a54d36SAndroid Build Coastguard Worker #endif
1351*48a54d36SAndroid Build Coastguard Worker 	CacheRecord    *NextInCFList;		// Set if this is in the list of records we just received with the cache flush bit set
1352*48a54d36SAndroid Build Coastguard Worker 	// Size to here is 76 bytes when compiling 32-bit; 104 bytes when compiling 64-bit
1353*48a54d36SAndroid Build Coastguard Worker 	RData_small     smallrdatastorage;	// Storage for small records is right here (4 bytes header + 68 bytes data = 72 bytes)
1354*48a54d36SAndroid Build Coastguard Worker 	};
1355*48a54d36SAndroid Build Coastguard Worker 
1356*48a54d36SAndroid Build Coastguard Worker // Storage sufficient to hold either a CacheGroup header or a CacheRecord
1357*48a54d36SAndroid Build Coastguard Worker // -- for best efficiency (to avoid wasted unused storage) they should be the same size
1358*48a54d36SAndroid Build Coastguard Worker typedef union CacheEntity_union CacheEntity;
1359*48a54d36SAndroid Build Coastguard Worker union CacheEntity_union { CacheEntity *next; CacheGroup cg; CacheRecord cr; };
1360*48a54d36SAndroid Build Coastguard Worker 
1361*48a54d36SAndroid Build Coastguard Worker typedef struct
1362*48a54d36SAndroid Build Coastguard Worker 	{
1363*48a54d36SAndroid Build Coastguard Worker 	CacheRecord r;
1364*48a54d36SAndroid Build Coastguard Worker 	mDNSu8 _extradata[MaximumRDSize-InlineCacheRDSize];		// Glue on the necessary number of extra bytes
1365*48a54d36SAndroid Build Coastguard Worker 	domainname namestorage;									// Needs to go *after* the extra rdata bytes
1366*48a54d36SAndroid Build Coastguard Worker 	} LargeCacheRecord;
1367*48a54d36SAndroid Build Coastguard Worker 
1368*48a54d36SAndroid Build Coastguard Worker typedef struct HostnameInfo
1369*48a54d36SAndroid Build Coastguard Worker 	{
1370*48a54d36SAndroid Build Coastguard Worker 	struct HostnameInfo *next;
1371*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo natinfo;
1372*48a54d36SAndroid Build Coastguard Worker 	domainname fqdn;
1373*48a54d36SAndroid Build Coastguard Worker 	AuthRecord arv4;                          // registered IPv4 address record
1374*48a54d36SAndroid Build Coastguard Worker 	AuthRecord arv6;                          // registered IPv6 address record
1375*48a54d36SAndroid Build Coastguard Worker 	mDNSRecordCallback *StatusCallback;       // callback to deliver success or error code to client layer
1376*48a54d36SAndroid Build Coastguard Worker 	const void *StatusContext;                // Client Context
1377*48a54d36SAndroid Build Coastguard Worker 	} HostnameInfo;
1378*48a54d36SAndroid Build Coastguard Worker 
1379*48a54d36SAndroid Build Coastguard Worker typedef struct ExtraResourceRecord_struct ExtraResourceRecord;
1380*48a54d36SAndroid Build Coastguard Worker struct ExtraResourceRecord_struct
1381*48a54d36SAndroid Build Coastguard Worker 	{
1382*48a54d36SAndroid Build Coastguard Worker 	ExtraResourceRecord *next;
1383*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 ClientID;  // Opaque ID field to be used by client to map an AddRecord call to a set of Extra records
1384*48a54d36SAndroid Build Coastguard Worker 	AuthRecord r;
1385*48a54d36SAndroid Build Coastguard Worker 	// Note: Add any additional fields *before* the AuthRecord in this structure, not at the end.
1386*48a54d36SAndroid Build Coastguard Worker 	// In some cases clients can allocate larger chunks of memory and set r->rdata->MaxRDLength to indicate
1387*48a54d36SAndroid Build Coastguard Worker 	// that this extra memory is available, which would result in any fields after the AuthRecord getting smashed
1388*48a54d36SAndroid Build Coastguard Worker 	};
1389*48a54d36SAndroid Build Coastguard Worker 
1390*48a54d36SAndroid Build Coastguard Worker // Note: Within an mDNSServiceCallback mDNS all API calls are legal except mDNS_Init(), mDNS_Exit(), mDNS_Execute()
1391*48a54d36SAndroid Build Coastguard Worker typedef void mDNSServiceCallback(mDNS *const m, ServiceRecordSet *const sr, mStatus result);
1392*48a54d36SAndroid Build Coastguard Worker 
1393*48a54d36SAndroid Build Coastguard Worker // A ServiceRecordSet has no special meaning to the core code of the Multicast DNS protocol engine;
1394*48a54d36SAndroid Build Coastguard Worker // it is just a convenience structure to group together the records that make up a standard service
1395*48a54d36SAndroid Build Coastguard Worker // registration so that they can be allocted and deallocted together as a single memory object.
1396*48a54d36SAndroid Build Coastguard Worker // It contains its own ServiceCallback+ServiceContext to report aggregate results up to the next layer of software above.
1397*48a54d36SAndroid Build Coastguard Worker // It also contains:
1398*48a54d36SAndroid Build Coastguard Worker //  * the basic PTR/SRV/TXT triplet used to represent any DNS-SD service
1399*48a54d36SAndroid Build Coastguard Worker //  * the "_services" PTR record for service enumeration
1400*48a54d36SAndroid Build Coastguard Worker //  * the optional list of SubType PTR records
1401*48a54d36SAndroid Build Coastguard Worker //  * the optional list of additional records attached to the service set (e.g. iChat pictures)
1402*48a54d36SAndroid Build Coastguard Worker 
1403*48a54d36SAndroid Build Coastguard Worker struct ServiceRecordSet_struct
1404*48a54d36SAndroid Build Coastguard Worker 	{
1405*48a54d36SAndroid Build Coastguard Worker 	// These internal state fields are used internally by mDNSCore; the client layer needn't be concerned with them.
1406*48a54d36SAndroid Build Coastguard Worker 	// No fields need to be set up by the client prior to calling mDNS_RegisterService();
1407*48a54d36SAndroid Build Coastguard Worker 	// all required data is passed as parameters to that function.
1408*48a54d36SAndroid Build Coastguard Worker 	mDNSServiceCallback *ServiceCallback;
1409*48a54d36SAndroid Build Coastguard Worker 	void                *ServiceContext;
1410*48a54d36SAndroid Build Coastguard Worker 	mDNSBool             Conflict;	// Set if this record set was forcibly deregistered because of a conflict
1411*48a54d36SAndroid Build Coastguard Worker 
1412*48a54d36SAndroid Build Coastguard Worker 	ExtraResourceRecord *Extras;	// Optional list of extra AuthRecords attached to this service registration
1413*48a54d36SAndroid Build Coastguard Worker 	mDNSu32              NumSubTypes;
1414*48a54d36SAndroid Build Coastguard Worker 	AuthRecord          *SubTypes;
1415*48a54d36SAndroid Build Coastguard Worker 	AuthRecord           RR_ADV;	// e.g. _services._dns-sd._udp.local. PTR _printer._tcp.local.
1416*48a54d36SAndroid Build Coastguard Worker 	AuthRecord           RR_PTR;	// e.g. _printer._tcp.local.        PTR Name._printer._tcp.local.
1417*48a54d36SAndroid Build Coastguard Worker 	AuthRecord           RR_SRV;	// e.g. Name._printer._tcp.local.   SRV 0 0 port target
1418*48a54d36SAndroid Build Coastguard Worker 	AuthRecord           RR_TXT;	// e.g. Name._printer._tcp.local.   TXT PrintQueueName
1419*48a54d36SAndroid Build Coastguard Worker 	// Don't add any fields after AuthRecord RR_TXT.
1420*48a54d36SAndroid Build Coastguard Worker 	// This is where the implicit extra space goes if we allocate a ServiceRecordSet containing an oversized RR_TXT record
1421*48a54d36SAndroid Build Coastguard Worker 	};
1422*48a54d36SAndroid Build Coastguard Worker 
1423*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
1424*48a54d36SAndroid Build Coastguard Worker #if 0
1425*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1426*48a54d36SAndroid Build Coastguard Worker #pragma mark - Question structures
1427*48a54d36SAndroid Build Coastguard Worker #endif
1428*48a54d36SAndroid Build Coastguard Worker 
1429*48a54d36SAndroid Build Coastguard Worker // We record the last eight instances of each duplicate query
1430*48a54d36SAndroid Build Coastguard Worker // This gives us v4/v6 on each of Ethernet, AirPort and Firewire, and two free slots "for future expansion"
1431*48a54d36SAndroid Build Coastguard Worker // If the host has more active interfaces that this it is not fatal -- duplicate question suppression will degrade gracefully.
1432*48a54d36SAndroid Build Coastguard Worker // Since we will still remember the last eight, the busiest interfaces will still get the effective duplicate question suppression.
1433*48a54d36SAndroid Build Coastguard Worker #define DupSuppressInfoSize 8
1434*48a54d36SAndroid Build Coastguard Worker 
1435*48a54d36SAndroid Build Coastguard Worker typedef struct
1436*48a54d36SAndroid Build Coastguard Worker 	{
1437*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               Time;
1438*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID       InterfaceID;
1439*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               Type;				// v4 or v6?
1440*48a54d36SAndroid Build Coastguard Worker 	} DupSuppressInfo;
1441*48a54d36SAndroid Build Coastguard Worker 
1442*48a54d36SAndroid Build Coastguard Worker typedef enum
1443*48a54d36SAndroid Build Coastguard Worker 	{
1444*48a54d36SAndroid Build Coastguard Worker 	LLQ_InitialRequest    = 1,
1445*48a54d36SAndroid Build Coastguard Worker 	LLQ_SecondaryRequest  = 2,
1446*48a54d36SAndroid Build Coastguard Worker 	LLQ_Established       = 3,
1447*48a54d36SAndroid Build Coastguard Worker 	LLQ_Poll              = 4
1448*48a54d36SAndroid Build Coastguard Worker 	} LLQ_State;
1449*48a54d36SAndroid Build Coastguard Worker 
1450*48a54d36SAndroid Build Coastguard Worker // LLQ constants
1451*48a54d36SAndroid Build Coastguard Worker #define kLLQ_Vers      1
1452*48a54d36SAndroid Build Coastguard Worker #define kLLQ_DefLease  7200 // 2 hours
1453*48a54d36SAndroid Build Coastguard Worker #define kLLQ_MAX_TRIES 3    // retry an operation 3 times max
1454*48a54d36SAndroid Build Coastguard Worker #define kLLQ_INIT_RESEND 2 // resend an un-ack'd packet after 2 seconds, then double for each additional
1455*48a54d36SAndroid Build Coastguard Worker // LLQ Operation Codes
1456*48a54d36SAndroid Build Coastguard Worker #define kLLQOp_Setup     1
1457*48a54d36SAndroid Build Coastguard Worker #define kLLQOp_Refresh   2
1458*48a54d36SAndroid Build Coastguard Worker #define kLLQOp_Event     3
1459*48a54d36SAndroid Build Coastguard Worker 
1460*48a54d36SAndroid Build Coastguard Worker // LLQ Errror Codes
1461*48a54d36SAndroid Build Coastguard Worker enum
1462*48a54d36SAndroid Build Coastguard Worker 	{
1463*48a54d36SAndroid Build Coastguard Worker 	LLQErr_NoError    = 0,
1464*48a54d36SAndroid Build Coastguard Worker 	LLQErr_ServFull   = 1,
1465*48a54d36SAndroid Build Coastguard Worker 	LLQErr_Static     = 2,
1466*48a54d36SAndroid Build Coastguard Worker 	LLQErr_FormErr    = 3,
1467*48a54d36SAndroid Build Coastguard Worker 	LLQErr_NoSuchLLQ  = 4,
1468*48a54d36SAndroid Build Coastguard Worker 	LLQErr_BadVers    = 5,
1469*48a54d36SAndroid Build Coastguard Worker 	LLQErr_UnknownErr = 6
1470*48a54d36SAndroid Build Coastguard Worker 	};
1471*48a54d36SAndroid Build Coastguard Worker 
1472*48a54d36SAndroid Build Coastguard Worker enum { NoAnswer_Normal = 0, NoAnswer_Suspended = 1, NoAnswer_Fail = 2 };
1473*48a54d36SAndroid Build Coastguard Worker 
1474*48a54d36SAndroid Build Coastguard Worker #define HMAC_LEN    64
1475*48a54d36SAndroid Build Coastguard Worker #define HMAC_IPAD   0x36
1476*48a54d36SAndroid Build Coastguard Worker #define HMAC_OPAD   0x5c
1477*48a54d36SAndroid Build Coastguard Worker #define MD5_LEN     16
1478*48a54d36SAndroid Build Coastguard Worker 
1479*48a54d36SAndroid Build Coastguard Worker #define AutoTunnelUnregistered(X) (                                              \
1480*48a54d36SAndroid Build Coastguard Worker 	(X)->AutoTunnelHostRecord.resrec.RecordType == kDNSRecordTypeUnregistered && \
1481*48a54d36SAndroid Build Coastguard Worker 	(X)->AutoTunnelDeviceInfo.resrec.RecordType == kDNSRecordTypeUnregistered && \
1482*48a54d36SAndroid Build Coastguard Worker 	(X)->AutoTunnelService.   resrec.RecordType == kDNSRecordTypeUnregistered && \
1483*48a54d36SAndroid Build Coastguard Worker 	(X)->AutoTunnel6Record.   resrec.RecordType == kDNSRecordTypeUnregistered    )
1484*48a54d36SAndroid Build Coastguard Worker 
1485*48a54d36SAndroid Build Coastguard Worker // Internal data structure to maintain authentication information
1486*48a54d36SAndroid Build Coastguard Worker typedef struct DomainAuthInfo
1487*48a54d36SAndroid Build Coastguard Worker 	{
1488*48a54d36SAndroid Build Coastguard Worker 	struct DomainAuthInfo *next;
1489*48a54d36SAndroid Build Coastguard Worker 	mDNSs32          deltime;				// If we're planning to delete this DomainAuthInfo, the time we want it deleted
1490*48a54d36SAndroid Build Coastguard Worker 	const char*      AutoTunnel;            // If NULL, this is not an AutoTunnel DAI. Otherwise, this is prepended to the IPSec identifier
1491*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       AutoTunnelHostRecord;	// User-visible hostname; used as SRV target for AutoTunnel services
1492*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       AutoTunnelTarget;		// Opaque hostname of tunnel endpoint; used as SRV target for AutoTunnelService record
1493*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       AutoTunnelDeviceInfo;	// Device info of tunnel endpoint
1494*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       AutoTunnelService;		// Service record (possibly NAT-Mapped) of IKE daemon implementing tunnel endpoint
1495*48a54d36SAndroid Build Coastguard Worker 	AuthRecord       AutoTunnel6Record;     // AutoTunnel AAAA Record obtained from Connectivityd
1496*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo AutoTunnelNAT;
1497*48a54d36SAndroid Build Coastguard Worker 	domainname       domain;
1498*48a54d36SAndroid Build Coastguard Worker 	domainname       keyname;
1499*48a54d36SAndroid Build Coastguard Worker 	domainname       hostname;
1500*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort       port;
1501*48a54d36SAndroid Build Coastguard Worker 	char             b64keydata[32];
1502*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           keydata_ipad[HMAC_LEN];	// padded key for inner hash rounds
1503*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           keydata_opad[HMAC_LEN];	// padded key for outer hash rounds
1504*48a54d36SAndroid Build Coastguard Worker 	} DomainAuthInfo;
1505*48a54d36SAndroid Build Coastguard Worker 
1506*48a54d36SAndroid Build Coastguard Worker // Note: Within an mDNSQuestionCallback mDNS all API calls are legal except mDNS_Init(), mDNS_Exit(), mDNS_Execute()
1507*48a54d36SAndroid Build Coastguard Worker typedef enum { QC_rmv = 0, QC_add = 1, QC_addnocache = 2 } QC_result;
1508*48a54d36SAndroid Build Coastguard Worker typedef void mDNSQuestionCallback(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord);
1509*48a54d36SAndroid Build Coastguard Worker 
1510*48a54d36SAndroid Build Coastguard Worker #define NextQSendTime(Q)  ((Q)->LastQTime + (Q)->ThisQInterval)
1511*48a54d36SAndroid Build Coastguard Worker #define ActiveQuestion(Q) ((Q)->ThisQInterval > 0 && !(Q)->DuplicateOf)
1512*48a54d36SAndroid Build Coastguard Worker #define TimeToSendThisQuestion(Q,time) (ActiveQuestion(Q) && (time) - NextQSendTime(Q) >= 0)
1513*48a54d36SAndroid Build Coastguard Worker 
1514*48a54d36SAndroid Build Coastguard Worker struct DNSQuestion_struct
1515*48a54d36SAndroid Build Coastguard Worker 	{
1516*48a54d36SAndroid Build Coastguard Worker 	// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
1517*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion          *next;
1518*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               qnamehash;
1519*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               DelayAnswering;	// Set if we want to defer answering this question until the cache settles
1520*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               LastQTime;		// Last scheduled transmission of this Q on *all* applicable interfaces
1521*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               ThisQInterval;	// LastQTime + ThisQInterval is the next scheduled transmission of this Q
1522*48a54d36SAndroid Build Coastguard Worker 											// ThisQInterval > 0 for an active question;
1523*48a54d36SAndroid Build Coastguard Worker 											// ThisQInterval = 0 for a suspended question that's still in the list
1524*48a54d36SAndroid Build Coastguard Worker 											// ThisQInterval = -1 for a cancelled question (should not still be in list)
1525*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               ExpectUnicastResp;// Set when we send a query with the kDNSQClass_UnicastResponse bit set
1526*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               LastAnswerPktNum;	// The sequence number of the last response packet containing an answer to this Q
1527*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               RecentAnswerPkts;	// Number of answers since the last time we sent this query
1528*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               CurrentAnswers;	// Number of records currently in the cache that answer this question
1529*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               LargeAnswers;		// Number of answers with rdata > 1024 bytes
1530*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               UniqueAnswers;	// Number of answers received with kDNSClass_UniqueRRSet bit set
1531*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID       FlappingInterface1;// Set when an interface goes away, to flag if remove events are delivered for this Q
1532*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID       FlappingInterface2;// Set when an interface goes away, to flag if remove events are delivered for this Q
1533*48a54d36SAndroid Build Coastguard Worker 	DomainAuthInfo       *AuthInfo;			// Non-NULL if query is currently being done using Private DNS
1534*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion          *DuplicateOf;
1535*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion          *NextInDQList;
1536*48a54d36SAndroid Build Coastguard Worker 	DupSuppressInfo       DupSuppress[DupSuppressInfoSize];
1537*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID       SendQNow;			// The interface this query is being sent on right now
1538*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              SendOnAll;		// Set if we're sending this question on all active interfaces
1539*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               RequestUnicast;	// Non-zero if we want to send query with kDNSQClass_UnicastResponse bit set
1540*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               LastQTxTime;		// Last time this Q was sent on one (but not necessarily all) interfaces
1541*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               CNAMEReferrals;	// Count of how many CNAME redirections we've done
1542*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              SuppressQuery;    // This query should be suppressed and not sent on the wire
1543*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                LOAddressAnswers; // Number of answers from the local only auth records that are
1544*48a54d36SAndroid Build Coastguard Worker 		                                    // answering A, AAAA and CNAME (/etc/hosts)
1545*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                WakeOnResolveCount; // Number of wakes that should be sent on resolve
1546*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               StopTime;			// Time this question should be stopped by giving them a negative answer
1547*48a54d36SAndroid Build Coastguard Worker 
1548*48a54d36SAndroid Build Coastguard Worker 	// Wide Area fields. These are used internally by the uDNS core
1549*48a54d36SAndroid Build Coastguard Worker 	UDPSocket            *LocalSocket;
1550*48a54d36SAndroid Build Coastguard Worker 	mDNSBool             deliverAddEvents;  // Change in DNSSserver requiring to deliver ADD events
1551*48a54d36SAndroid Build Coastguard Worker 	DNSServer            *qDNSServer;		// Caching server for this query (in the absence of an SRV saying otherwise)
1552*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque64          validDNSServers;  // Valid DNSServers for this question
1553*48a54d36SAndroid Build Coastguard Worker 	mDNSu16              noServerResponse;  // At least one server did not respond.
1554*48a54d36SAndroid Build Coastguard Worker 	mDNSu16              triedAllServersOnce; // Tried all DNS servers once
1555*48a54d36SAndroid Build Coastguard Worker 	mDNSu8               unansweredQueries;// The number of unanswered queries to this server
1556*48a54d36SAndroid Build Coastguard Worker 
1557*48a54d36SAndroid Build Coastguard Worker 	ZoneData             *nta;				// Used for getting zone data for private or LLQ query
1558*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr              servAddr;			// Address and port learned from _dns-llq, _dns-llq-tls or _dns-query-tls SRV query
1559*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort            servPort;
1560*48a54d36SAndroid Build Coastguard Worker 	struct tcpInfo_t *tcp;
1561*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort            tcpSrcPort;		// Local Port TCP packet received on;need this as tcp struct is disposed
1562*48a54d36SAndroid Build Coastguard Worker 											// by tcpCallback before calling into mDNSCoreReceive
1563*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                NoAnswer;			// Set if we want to suppress answers until tunnel setup has completed
1564*48a54d36SAndroid Build Coastguard Worker 
1565*48a54d36SAndroid Build Coastguard Worker 	// LLQ-specific fields. These fields are only meaningful when LongLived flag is set
1566*48a54d36SAndroid Build Coastguard Worker 	LLQ_State             state;
1567*48a54d36SAndroid Build Coastguard Worker 	mDNSu32               ReqLease;			// seconds (relative)
1568*48a54d36SAndroid Build Coastguard Worker 	mDNSs32               expire;			// ticks (absolute)
1569*48a54d36SAndroid Build Coastguard Worker 	mDNSs16               ntries;           // for UDP: the number of packets sent for this LLQ state
1570*48a54d36SAndroid Build Coastguard Worker 	                                       // for TCP: there is some ambiguity in the use of this variable, but in general, it is
1571*48a54d36SAndroid Build Coastguard Worker 	                                       //          the number of TCP/TLS connection attempts for this LLQ state, or
1572*48a54d36SAndroid Build Coastguard Worker 	                                       //          the number of packets sent for this TCP/TLS connection
1573*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque64          id;
1574*48a54d36SAndroid Build Coastguard Worker 
1575*48a54d36SAndroid Build Coastguard Worker 	// Client API fields: The client must set up these fields *before* calling mDNS_StartQuery()
1576*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID       InterfaceID;		// Non-zero if you want to issue queries only on a single specific IP interface
1577*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr              Target;			// Non-zero if you want to direct queries to a specific unicast target address
1578*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort            TargetPort;		// Must be set if Target is set
1579*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16          TargetQID;		// Must be set if Target is set
1580*48a54d36SAndroid Build Coastguard Worker 	domainname            qname;
1581*48a54d36SAndroid Build Coastguard Worker 	mDNSu16               qtype;
1582*48a54d36SAndroid Build Coastguard Worker 	mDNSu16               qclass;
1583*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              LongLived;        // Set by client for calls to mDNS_StartQuery to indicate LLQs to unicast layer.
1584*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              ExpectUnique;		// Set by client if it's expecting unique RR(s) for this question, not shared RRs
1585*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              ForceMCast;		// Set by client to force mDNS query, even for apparently uDNS names
1586*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              ReturnIntermed;	// Set by client to request callbacks for intermediate CNAME/NXDOMAIN results
1587*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              SuppressUnusable; // Set by client to suppress unusable queries to be sent on the wire
1588*48a54d36SAndroid Build Coastguard Worker 	mDNSBool              RetryWithSearchDomains;	// Retry with search domains if there is no entry in the cache or AuthRecords
1589*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                TimeoutQuestion; // Timeout this question if there is no reply in configured time
1590*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                WakeOnResolve; // Send wakeup on resolve
1591*48a54d36SAndroid Build Coastguard Worker 	mDNSs8                SearchListIndex;  // Index into SearchList; Used by the client layer but not touched by core
1592*48a54d36SAndroid Build Coastguard Worker 	mDNSs8                AppendSearchDomains; // Search domains can be appended for this query
1593*48a54d36SAndroid Build Coastguard Worker 	mDNSs8                AppendLocalSearchDomains; // Search domains ending in .local can be appended for this query
1594*48a54d36SAndroid Build Coastguard Worker 	domainname           *qnameOrig;       // Copy of the original question name if it is not fully qualified
1595*48a54d36SAndroid Build Coastguard Worker 	mDNSQuestionCallback *QuestionCallback;
1596*48a54d36SAndroid Build Coastguard Worker 	void                 *QuestionContext;
1597*48a54d36SAndroid Build Coastguard Worker 	};
1598*48a54d36SAndroid Build Coastguard Worker 
1599*48a54d36SAndroid Build Coastguard Worker typedef struct
1600*48a54d36SAndroid Build Coastguard Worker 	{
1601*48a54d36SAndroid Build Coastguard Worker 	// Client API fields: The client must set up name and InterfaceID *before* calling mDNS_StartResolveService()
1602*48a54d36SAndroid Build Coastguard Worker 	// When the callback is invoked, ip, port, TXTlen and TXTinfo will have been filled in with the results learned from the network.
1603*48a54d36SAndroid Build Coastguard Worker 	domainname      name;
1604*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID InterfaceID;		// ID of the interface the response was received on
1605*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        ip;					// Remote (destination) IP address where this service can be accessed
1606*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort      port;				// Port where this service can be accessed
1607*48a54d36SAndroid Build Coastguard Worker 	mDNSu16         TXTlen;
1608*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          TXTinfo[2048];		// Additional demultiplexing information (e.g. LPR queue name)
1609*48a54d36SAndroid Build Coastguard Worker 	} ServiceInfo;
1610*48a54d36SAndroid Build Coastguard Worker 
1611*48a54d36SAndroid Build Coastguard Worker // Note: Within an mDNSServiceInfoQueryCallback mDNS all API calls are legal except mDNS_Init(), mDNS_Exit(), mDNS_Execute()
1612*48a54d36SAndroid Build Coastguard Worker typedef struct ServiceInfoQuery_struct ServiceInfoQuery;
1613*48a54d36SAndroid Build Coastguard Worker typedef void mDNSServiceInfoQueryCallback(mDNS *const m, ServiceInfoQuery *query);
1614*48a54d36SAndroid Build Coastguard Worker struct ServiceInfoQuery_struct
1615*48a54d36SAndroid Build Coastguard Worker 	{
1616*48a54d36SAndroid Build Coastguard Worker 	// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
1617*48a54d36SAndroid Build Coastguard Worker 	// No fields need to be set up by the client prior to calling mDNS_StartResolveService();
1618*48a54d36SAndroid Build Coastguard Worker 	// all required data is passed as parameters to that function.
1619*48a54d36SAndroid Build Coastguard Worker 	// The ServiceInfoQuery structure memory is working storage for mDNSCore to discover the requested information
1620*48a54d36SAndroid Build Coastguard Worker 	// and place it in the ServiceInfo structure. After the client has called mDNS_StopResolveService(), it may
1621*48a54d36SAndroid Build Coastguard Worker 	// dispose of the ServiceInfoQuery structure while retaining the results in the ServiceInfo structure.
1622*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion                   qSRV;
1623*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion                   qTXT;
1624*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion                   qAv4;
1625*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion                   qAv6;
1626*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                        GotSRV;
1627*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                        GotTXT;
1628*48a54d36SAndroid Build Coastguard Worker 	mDNSu8                        GotADD;
1629*48a54d36SAndroid Build Coastguard Worker 	mDNSu32                       Answers;
1630*48a54d36SAndroid Build Coastguard Worker 	ServiceInfo                  *info;
1631*48a54d36SAndroid Build Coastguard Worker 	mDNSServiceInfoQueryCallback *ServiceInfoQueryCallback;
1632*48a54d36SAndroid Build Coastguard Worker 	void                         *ServiceInfoQueryContext;
1633*48a54d36SAndroid Build Coastguard Worker 	};
1634*48a54d36SAndroid Build Coastguard Worker 
1635*48a54d36SAndroid Build Coastguard Worker typedef enum { ZoneServiceUpdate, ZoneServiceQuery, ZoneServiceLLQ } ZoneService;
1636*48a54d36SAndroid Build Coastguard Worker 
1637*48a54d36SAndroid Build Coastguard Worker typedef void ZoneDataCallback(mDNS *const m, mStatus err, const ZoneData *result);
1638*48a54d36SAndroid Build Coastguard Worker 
1639*48a54d36SAndroid Build Coastguard Worker struct ZoneData_struct
1640*48a54d36SAndroid Build Coastguard Worker 	{
1641*48a54d36SAndroid Build Coastguard Worker 	domainname       ChildName;			// Name for which we're trying to find the responsible server
1642*48a54d36SAndroid Build Coastguard Worker 	ZoneService      ZoneService;		// Which service we're seeking for this zone (update, query, or LLQ)
1643*48a54d36SAndroid Build Coastguard Worker 	domainname       *CurrentSOA;		// Points to somewhere within ChildName
1644*48a54d36SAndroid Build Coastguard Worker 	domainname       ZoneName;			// Discovered result: Left-hand-side of SOA record
1645*48a54d36SAndroid Build Coastguard Worker 	mDNSu16          ZoneClass;			// Discovered result: DNS Class from SOA record
1646*48a54d36SAndroid Build Coastguard Worker 	domainname       Host;				// Discovered result: Target host from SRV record
1647*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort       Port;				// Discovered result: Update port, query port, or LLQ port from SRV record
1648*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr         Addr;				// Discovered result: Address of Target host from SRV record
1649*48a54d36SAndroid Build Coastguard Worker 	mDNSBool         ZonePrivate;		// Discovered result: Does zone require encrypted queries?
1650*48a54d36SAndroid Build Coastguard Worker 	ZoneDataCallback *ZoneDataCallback;	// Caller-specified function to be called upon completion
1651*48a54d36SAndroid Build Coastguard Worker 	void             *ZoneDataContext;
1652*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion      question;			// Storage for any active question
1653*48a54d36SAndroid Build Coastguard Worker 	};
1654*48a54d36SAndroid Build Coastguard Worker 
1655*48a54d36SAndroid Build Coastguard Worker extern ZoneData *StartGetZoneData(mDNS *const m, const domainname *const name, const ZoneService target, ZoneDataCallback callback, void *callbackInfo);
1656*48a54d36SAndroid Build Coastguard Worker extern void CancelGetZoneData(mDNS *const m, ZoneData *nta);
1657*48a54d36SAndroid Build Coastguard Worker extern mDNSBool IsGetZoneDataQuestion(DNSQuestion *q);
1658*48a54d36SAndroid Build Coastguard Worker 
1659*48a54d36SAndroid Build Coastguard Worker typedef struct DNameListElem
1660*48a54d36SAndroid Build Coastguard Worker 	{
1661*48a54d36SAndroid Build Coastguard Worker 	struct DNameListElem *next;
1662*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 uid;
1663*48a54d36SAndroid Build Coastguard Worker 	domainname name;
1664*48a54d36SAndroid Build Coastguard Worker 	} DNameListElem;
1665*48a54d36SAndroid Build Coastguard Worker 
1666*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
1667*48a54d36SAndroid Build Coastguard Worker // Different states that we go through locating the peer
1668*48a54d36SAndroid Build Coastguard Worker #define TC_STATE_AAAA_PEER			0x000000001		/* Peer's BTMM IPv6 address */
1669*48a54d36SAndroid Build Coastguard Worker #define TC_STATE_AAAA_PEER_RELAY	0x000000002		/* Peer's IPv6 Relay address */
1670*48a54d36SAndroid Build Coastguard Worker #define TC_STATE_SRV_PEER			0x000000003		/* Peer's SRV Record corresponding to IPv4 address */
1671*48a54d36SAndroid Build Coastguard Worker #define TC_STATE_ADDR_PEER			0x000000004		/* Peer's IPv4 address */
1672*48a54d36SAndroid Build Coastguard Worker 
1673*48a54d36SAndroid Build Coastguard Worker typedef struct ClientTunnel
1674*48a54d36SAndroid Build Coastguard Worker 	{
1675*48a54d36SAndroid Build Coastguard Worker 	struct ClientTunnel *next;
1676*48a54d36SAndroid Build Coastguard Worker 	const char *prefix;
1677*48a54d36SAndroid Build Coastguard Worker 	domainname dstname;
1678*48a54d36SAndroid Build Coastguard Worker 	mDNSBool   MarkedForDeletion;
1679*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr loc_inner;
1680*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr loc_outer;
1681*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr loc_outer6;
1682*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr rmt_inner;
1683*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr rmt_outer;
1684*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr rmt_outer6;
1685*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort rmt_outer_port;
1686*48a54d36SAndroid Build Coastguard Worker 	mDNSu16	tc_state;
1687*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion q;
1688*48a54d36SAndroid Build Coastguard Worker 	} ClientTunnel;
1689*48a54d36SAndroid Build Coastguard Worker #endif
1690*48a54d36SAndroid Build Coastguard Worker 
1691*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
1692*48a54d36SAndroid Build Coastguard Worker #if 0
1693*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1694*48a54d36SAndroid Build Coastguard Worker #pragma mark - NetworkInterfaceInfo_struct
1695*48a54d36SAndroid Build Coastguard Worker #endif
1696*48a54d36SAndroid Build Coastguard Worker 
1697*48a54d36SAndroid Build Coastguard Worker typedef struct NetworkInterfaceInfo_struct NetworkInterfaceInfo;
1698*48a54d36SAndroid Build Coastguard Worker 
1699*48a54d36SAndroid Build Coastguard Worker // A NetworkInterfaceInfo_struct serves two purposes:
1700*48a54d36SAndroid Build Coastguard Worker // 1. It holds the address, PTR and HINFO records to advertise a given IP address on a given physical interface
1701*48a54d36SAndroid Build Coastguard Worker // 2. It tells mDNSCore which physical interfaces are available; each physical interface has its own unique InterfaceID.
1702*48a54d36SAndroid Build Coastguard Worker //    Since there may be multiple IP addresses on a single physical interface,
1703*48a54d36SAndroid Build Coastguard Worker //    there may be multiple NetworkInterfaceInfo_structs with the same InterfaceID.
1704*48a54d36SAndroid Build Coastguard Worker //    In this case, to avoid sending the same packet n times, when there's more than one
1705*48a54d36SAndroid Build Coastguard Worker //    struct with the same InterfaceID, mDNSCore picks one member of the set to be the
1706*48a54d36SAndroid Build Coastguard Worker //    active representative of the set; all others have the 'InterfaceActive' flag unset.
1707*48a54d36SAndroid Build Coastguard Worker 
1708*48a54d36SAndroid Build Coastguard Worker struct NetworkInterfaceInfo_struct
1709*48a54d36SAndroid Build Coastguard Worker 	{
1710*48a54d36SAndroid Build Coastguard Worker 	// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
1711*48a54d36SAndroid Build Coastguard Worker 	NetworkInterfaceInfo *next;
1712*48a54d36SAndroid Build Coastguard Worker 
1713*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          InterfaceActive;	// Set if interface is sending & receiving packets (see comment above)
1714*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          IPv4Available;		// If InterfaceActive, set if v4 available on this InterfaceID
1715*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          IPv6Available;		// If InterfaceActive, set if v6 available on this InterfaceID
1716*48a54d36SAndroid Build Coastguard Worker 
1717*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion     NetWakeBrowse;
1718*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion     NetWakeResolve[3];	// For fault-tolerance, we try up to three Sleep Proxies
1719*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        SPSAddr[3];
1720*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort      SPSPort[3];
1721*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         NextSPSAttempt;		// -1 if we're not currently attempting to register with any Sleep Proxy
1722*48a54d36SAndroid Build Coastguard Worker 	mDNSs32         NextSPSAttemptTime;
1723*48a54d36SAndroid Build Coastguard Worker 
1724*48a54d36SAndroid Build Coastguard Worker 	// Standard AuthRecords that every Responder host should have (one per active IP address)
1725*48a54d36SAndroid Build Coastguard Worker 	AuthRecord RR_A;					// 'A' or 'AAAA' (address) record for our ".local" name
1726*48a54d36SAndroid Build Coastguard Worker 	AuthRecord RR_PTR;					// PTR (reverse lookup) record
1727*48a54d36SAndroid Build Coastguard Worker 	AuthRecord RR_HINFO;
1728*48a54d36SAndroid Build Coastguard Worker 
1729*48a54d36SAndroid Build Coastguard Worker 	// Client API fields: The client must set up these fields *before* calling mDNS_RegisterInterface()
1730*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID InterfaceID;		// Identifies physical interface; MUST NOT be 0, -1, or -2
1731*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        ip;					// The IPv4 or IPv6 address to advertise
1732*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr        mask;
1733*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr     MAC;
1734*48a54d36SAndroid Build Coastguard Worker 	char            ifname[64];			// Windows uses a GUID string for the interface name, which doesn't fit in 16 bytes
1735*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          Advertise;			// False if you are only searching on this interface
1736*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          McastTxRx;			// Send/Receive multicast on this { InterfaceID, address family } ?
1737*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          NetWake;			// Set if Wake-On-Magic-Packet is enabled on this interface
1738*48a54d36SAndroid Build Coastguard Worker 	mDNSu8          Loopback;			// Set if this is the loopback interface
1739*48a54d36SAndroid Build Coastguard Worker 	};
1740*48a54d36SAndroid Build Coastguard Worker 
1741*48a54d36SAndroid Build Coastguard Worker #define SLE_DELETE              0x00000001
1742*48a54d36SAndroid Build Coastguard Worker #define SLE_WAB_QUERY_STARTED   0x00000002
1743*48a54d36SAndroid Build Coastguard Worker 
1744*48a54d36SAndroid Build Coastguard Worker typedef struct SearchListElem
1745*48a54d36SAndroid Build Coastguard Worker 	{
1746*48a54d36SAndroid Build Coastguard Worker 	struct SearchListElem *next;
1747*48a54d36SAndroid Build Coastguard Worker 	domainname domain;
1748*48a54d36SAndroid Build Coastguard Worker 	int flag;
1749*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID InterfaceID;
1750*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion BrowseQ;
1751*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion DefBrowseQ;
1752*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion AutomaticBrowseQ;
1753*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion RegisterQ;
1754*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion DefRegisterQ;
1755*48a54d36SAndroid Build Coastguard Worker 	int	numCfAnswers;
1756*48a54d36SAndroid Build Coastguard Worker 	ARListElem *AuthRecs;
1757*48a54d36SAndroid Build Coastguard Worker 	} SearchListElem;
1758*48a54d36SAndroid Build Coastguard Worker 
1759*48a54d36SAndroid Build Coastguard Worker // For domain enumeration and automatic browsing
1760*48a54d36SAndroid Build Coastguard Worker // This is the user's DNS search list.
1761*48a54d36SAndroid Build Coastguard Worker // In each of these domains we search for our special pointer records (lb._dns-sd._udp.<domain>, etc.)
1762*48a54d36SAndroid Build Coastguard Worker // to discover recommended domains for domain enumeration (browse, default browse, registration,
1763*48a54d36SAndroid Build Coastguard Worker // default registration) and possibly one or more recommended automatic browsing domains.
1764*48a54d36SAndroid Build Coastguard Worker extern SearchListElem *SearchList;		// This really ought to be part of mDNS_struct -- SC
1765*48a54d36SAndroid Build Coastguard Worker 
1766*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
1767*48a54d36SAndroid Build Coastguard Worker #if 0
1768*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1769*48a54d36SAndroid Build Coastguard Worker #pragma mark - Main mDNS object, used to hold all the mDNS state
1770*48a54d36SAndroid Build Coastguard Worker #endif
1771*48a54d36SAndroid Build Coastguard Worker 
1772*48a54d36SAndroid Build Coastguard Worker typedef void mDNSCallback(mDNS *const m, mStatus result);
1773*48a54d36SAndroid Build Coastguard Worker 
1774*48a54d36SAndroid Build Coastguard Worker #define CACHE_HASH_SLOTS 499
1775*48a54d36SAndroid Build Coastguard Worker 
1776*48a54d36SAndroid Build Coastguard Worker enum		// Bit flags -- i.e. values should be 1, 2, 4, 8, etc.
1777*48a54d36SAndroid Build Coastguard Worker 	{
1778*48a54d36SAndroid Build Coastguard Worker 	mDNS_KnownBug_LimitedIPv6       = 1,
1779*48a54d36SAndroid Build Coastguard Worker 	mDNS_KnownBug_LossySyslog       = 2		// <rdar://problem/6561888>
1780*48a54d36SAndroid Build Coastguard Worker 	};
1781*48a54d36SAndroid Build Coastguard Worker 
1782*48a54d36SAndroid Build Coastguard Worker enum
1783*48a54d36SAndroid Build Coastguard Worker 	{
1784*48a54d36SAndroid Build Coastguard Worker 	SleepState_Awake = 0,
1785*48a54d36SAndroid Build Coastguard Worker 	SleepState_Transferring = 1,
1786*48a54d36SAndroid Build Coastguard Worker 	SleepState_Sleeping = 2
1787*48a54d36SAndroid Build Coastguard Worker 	};
1788*48a54d36SAndroid Build Coastguard Worker 
1789*48a54d36SAndroid Build Coastguard Worker struct mDNS_struct
1790*48a54d36SAndroid Build Coastguard Worker 	{
1791*48a54d36SAndroid Build Coastguard Worker 	// Internal state fields. These hold the main internal state of mDNSCore;
1792*48a54d36SAndroid Build Coastguard Worker 	// the client layer needn't be concerned with them.
1793*48a54d36SAndroid Build Coastguard Worker 	// No fields need to be set up by the client prior to calling mDNS_Init();
1794*48a54d36SAndroid Build Coastguard Worker 	// all required data is passed as parameters to that function.
1795*48a54d36SAndroid Build Coastguard Worker 
1796*48a54d36SAndroid Build Coastguard Worker 	mDNS_PlatformSupport *p;			// Pointer to platform-specific data of indeterminite size
1797*48a54d36SAndroid Build Coastguard Worker 	mDNSu32  KnownBugs;
1798*48a54d36SAndroid Build Coastguard Worker 	mDNSBool CanReceiveUnicastOn5353;
1799*48a54d36SAndroid Build Coastguard Worker 	mDNSBool AdvertiseLocalAddresses;
1800*48a54d36SAndroid Build Coastguard Worker 	mDNSBool DivertMulticastAdvertisements; // from interfaces that do not advertise local addresses to local-only
1801*48a54d36SAndroid Build Coastguard Worker 	mStatus mDNSPlatformStatus;
1802*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort UnicastPort4;
1803*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort UnicastPort6;
1804*48a54d36SAndroid Build Coastguard Worker 	mDNSEthAddr PrimaryMAC;				// Used as unique host ID
1805*48a54d36SAndroid Build Coastguard Worker 	mDNSCallback *MainCallback;
1806*48a54d36SAndroid Build Coastguard Worker 	void         *MainContext;
1807*48a54d36SAndroid Build Coastguard Worker 
1808*48a54d36SAndroid Build Coastguard Worker 	// For debugging: To catch and report locking failures
1809*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 mDNS_busy;					// Incremented between mDNS_Lock/mDNS_Unlock section
1810*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 mDNS_reentrancy;			// Incremented when calling a client callback
1811*48a54d36SAndroid Build Coastguard Worker 	mDNSu8  lock_rrcache;				// For debugging: Set at times when these lists may not be modified
1812*48a54d36SAndroid Build Coastguard Worker 	mDNSu8  lock_Questions;
1813*48a54d36SAndroid Build Coastguard Worker 	mDNSu8  lock_Records;
1814*48a54d36SAndroid Build Coastguard Worker #ifndef MaxMsg
1815*48a54d36SAndroid Build Coastguard Worker 	#define MaxMsg 160
1816*48a54d36SAndroid Build Coastguard Worker #endif
1817*48a54d36SAndroid Build Coastguard Worker 	char MsgBuffer[MaxMsg];				// Temp storage used while building error log messages
1818*48a54d36SAndroid Build Coastguard Worker 
1819*48a54d36SAndroid Build Coastguard Worker 	// Task Scheduling variables
1820*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  timenow_adjust;			// Correction applied if we ever discover time went backwards
1821*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  timenow;					// The time that this particular activation of the mDNS code started
1822*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  timenow_last;				// The time the last time we ran
1823*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledEvent;		// Derived from values below
1824*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  ShutdownTime;				// Set when we're shutting down; allows us to skip some unnecessary steps
1825*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  SuppressSending;			// Don't send local-link mDNS packets during this time
1826*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextCacheCheck;			// Next time to refresh cache record before it expires
1827*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledQuery;		// Next time to send query in its exponential backoff sequence
1828*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledProbe;		// Next time to probe for new authoritative record
1829*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledResponse;		// Next time to send authoritative record(s) in responses
1830*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledNATOp;		// Next time to send NAT-traversal packets
1831*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledSPS;			// Next time to purge expiring Sleep Proxy records
1832*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  RandomQueryDelay;			// For de-synchronization of query packets on the wire
1833*48a54d36SAndroid Build Coastguard Worker 	mDNSu32  RandomReconfirmDelay;		// For de-synchronization of reconfirmation queries on the wire
1834*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  PktNum;					// Unique sequence number assigned to each received packet
1835*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   LocalRemoveEvents;			// Set if we may need to deliver remove events for local-only questions and/or local-only records
1836*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   SleepState;				// Set if we're sleeping
1837*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   SleepSeqNum;				// "Epoch number" of our current period of wakefulness
1838*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   SystemWakeOnLANEnabled;	// Set if we want to register with a Sleep Proxy before going to sleep
1839*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   SentSleepProxyRegistration;// Set if we registered (or tried to register) with a Sleep Proxy
1840*48a54d36SAndroid Build Coastguard Worker 	mDNSu8   SystemSleepOnlyIfWakeOnLAN;// Set if we may only sleep if we managed to register with a Sleep Proxy
1841*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  AnnounceOwner;				// After waking from sleep, include OWNER option in packets until this time
1842*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  DelaySleep;				// To inhibit re-sleeping too quickly right after wake
1843*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  SleepLimit;				// Time window to allow deregistrations, etc.,
1844*48a54d36SAndroid Build Coastguard Worker 										// during which underying platform layer should inhibit system sleep
1845*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  NextScheduledSPRetry;		// Time next sleep proxy registration action is required.
1846*48a54d36SAndroid Build Coastguard Worker 										// Only valid if SleepLimit is nonzero and DelaySleep is zero.
1847*48a54d36SAndroid Build Coastguard Worker 
1848*48a54d36SAndroid Build Coastguard Worker 	mDNSs32 NextScheduledStopTime;      // Next time to stop a question
1849*48a54d36SAndroid Build Coastguard Worker 
1850*48a54d36SAndroid Build Coastguard Worker 	// These fields only required for mDNS Searcher...
1851*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *Questions;				// List of all registered questions, active and inactive
1852*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *NewQuestions;			// Fresh questions not yet answered from cache
1853*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *CurrentQuestion;		// Next question about to be examined in AnswerLocalQuestions()
1854*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *LocalOnlyQuestions;	// Questions with InterfaceID set to mDNSInterface_LocalOnly or mDNSInterface_P2P
1855*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *NewLocalOnlyQuestions;	// Fresh local-only or P2P questions not yet answered
1856*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion *RestartQuestion;		// Questions that are being restarted (stop followed by start)
1857*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrcache_size;				// Total number of available cache entries
1858*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrcache_totalused;			// Number of cache entries currently occupied
1859*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrcache_active;				// Number of cache entries currently occupied by records that answer active questions
1860*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 rrcache_report;
1861*48a54d36SAndroid Build Coastguard Worker 	CacheEntity *rrcache_free;
1862*48a54d36SAndroid Build Coastguard Worker 	CacheGroup *rrcache_hash[CACHE_HASH_SLOTS];
1863*48a54d36SAndroid Build Coastguard Worker 	mDNSs32  rrcache_nextcheck[CACHE_HASH_SLOTS];
1864*48a54d36SAndroid Build Coastguard Worker 
1865*48a54d36SAndroid Build Coastguard Worker 	AuthHash rrauth;
1866*48a54d36SAndroid Build Coastguard Worker 
1867*48a54d36SAndroid Build Coastguard Worker 	// Fields below only required for mDNS Responder...
1868*48a54d36SAndroid Build Coastguard Worker 	domainlabel nicelabel;				// Rich text label encoded using canonically precomposed UTF-8
1869*48a54d36SAndroid Build Coastguard Worker 	domainlabel hostlabel;				// Conforms to RFC 1034 "letter-digit-hyphen" ARPANET host name rules
1870*48a54d36SAndroid Build Coastguard Worker 	domainname  MulticastHostname;		// Fully Qualified "dot-local" Host Name, e.g. "Foo.local."
1871*48a54d36SAndroid Build Coastguard Worker 	UTF8str255  HIHardware;
1872*48a54d36SAndroid Build Coastguard Worker 	UTF8str255  HISoftware;
1873*48a54d36SAndroid Build Coastguard Worker 	AuthRecord  DeviceInfo;
1874*48a54d36SAndroid Build Coastguard Worker 	AuthRecord *ResourceRecords;
1875*48a54d36SAndroid Build Coastguard Worker 	AuthRecord *DuplicateRecords;		// Records currently 'on hold' because they are duplicates of existing records
1876*48a54d36SAndroid Build Coastguard Worker 	AuthRecord *NewLocalRecords;		// Fresh AuthRecords (public) not yet delivered to our local-only questions
1877*48a54d36SAndroid Build Coastguard Worker 	AuthRecord *CurrentRecord;			// Next AuthRecord about to be examined
1878*48a54d36SAndroid Build Coastguard Worker 	mDNSBool    NewLocalOnlyRecords;	// Fresh AuthRecords (local only) not yet delivered to our local questions
1879*48a54d36SAndroid Build Coastguard Worker 	NetworkInterfaceInfo *HostInterfaces;
1880*48a54d36SAndroid Build Coastguard Worker 	mDNSs32 ProbeFailTime;
1881*48a54d36SAndroid Build Coastguard Worker 	mDNSu32 NumFailedProbes;
1882*48a54d36SAndroid Build Coastguard Worker 	mDNSs32 SuppressProbes;
1883*48a54d36SAndroid Build Coastguard Worker 
1884*48a54d36SAndroid Build Coastguard Worker 	// Unicast-specific data
1885*48a54d36SAndroid Build Coastguard Worker 	mDNSs32           NextuDNSEvent;		// uDNS next event
1886*48a54d36SAndroid Build Coastguard Worker 	mDNSs32           NextSRVUpdate;        // Time to perform delayed update
1887*48a54d36SAndroid Build Coastguard Worker 
1888*48a54d36SAndroid Build Coastguard Worker 	DNSServer        *DNSServers;           // list of DNS servers
1889*48a54d36SAndroid Build Coastguard Worker 	McastResolver    *McastResolvers;       // list of Mcast Resolvers
1890*48a54d36SAndroid Build Coastguard Worker 
1891*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr          Router;
1892*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr          AdvertisedV4;         // IPv4 address pointed to by hostname
1893*48a54d36SAndroid Build Coastguard Worker 	mDNSAddr          AdvertisedV6;         // IPv6 address pointed to by hostname
1894*48a54d36SAndroid Build Coastguard Worker 
1895*48a54d36SAndroid Build Coastguard Worker 	DomainAuthInfo   *AuthInfoList;         // list of domains requiring authentication for updates
1896*48a54d36SAndroid Build Coastguard Worker 
1897*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion       ReverseMap;           // Reverse-map query to find static hostname for service target
1898*48a54d36SAndroid Build Coastguard Worker 	DNSQuestion       AutomaticBrowseDomainQ;
1899*48a54d36SAndroid Build Coastguard Worker 	domainname        StaticHostname;       // Current answer to reverse-map query
1900*48a54d36SAndroid Build Coastguard Worker 	domainname        FQDN;
1901*48a54d36SAndroid Build Coastguard Worker 	HostnameInfo     *Hostnames;            // List of registered hostnames + hostname metadata
1902*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr        AutoTunnelHostAddr;	// IPv6 address advertised for AutoTunnel services on this machine
1903*48a54d36SAndroid Build Coastguard Worker 	mDNSBool          AutoTunnelHostAddrActive;
1904*48a54d36SAndroid Build Coastguard Worker 	// AutoTunnel Relay address has two distinct uses
1905*48a54d36SAndroid Build Coastguard Worker 	// AutoTunnelRelayAddrIn: If non-zero, it means that this host can be reached (inbound connection) through the relay
1906*48a54d36SAndroid Build Coastguard Worker 	// AutoTunnelRelayAddrOut: If non-zero, it means that this host can use the relay to reach (outbound connection) the
1907*48a54d36SAndroid Build Coastguard Worker 	// other hosts through the relay
1908*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr        AutoTunnelRelayAddrIn;
1909*48a54d36SAndroid Build Coastguard Worker 	mDNSv6Addr        AutoTunnelRelayAddrOut;
1910*48a54d36SAndroid Build Coastguard Worker 	domainlabel       AutoTunnelLabel;		// Used to construct hostname for *IPv4* address of tunnel endpoints
1911*48a54d36SAndroid Build Coastguard Worker 
1912*48a54d36SAndroid Build Coastguard Worker 	mDNSBool          StartWABQueries;		// Start WAB queries for the purpose of domain enumeration
1913*48a54d36SAndroid Build Coastguard Worker 	mDNSBool          RegisterAutoTunnel6;
1914*48a54d36SAndroid Build Coastguard Worker 
1915*48a54d36SAndroid Build Coastguard Worker 	// NAT-Traversal fields
1916*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo  LLQNAT;					// Single shared NAT Traversal to receive inbound LLQ notifications
1917*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo *NATTraversals;
1918*48a54d36SAndroid Build Coastguard Worker 	NATTraversalInfo *CurrentNATTraversal;
1919*48a54d36SAndroid Build Coastguard Worker 	mDNSs32           retryIntervalGetAddr;		// delta between time sent and retry
1920*48a54d36SAndroid Build Coastguard Worker 	mDNSs32           retryGetAddr;				// absolute time when we retry
1921*48a54d36SAndroid Build Coastguard Worker 	mDNSv4Addr        ExternalAddress;
1922*48a54d36SAndroid Build Coastguard Worker 
1923*48a54d36SAndroid Build Coastguard Worker 	UDPSocket        *NATMcastRecvskt;			// For receiving NAT-PMP AddrReply multicasts from router on port 5350
1924*48a54d36SAndroid Build Coastguard Worker 	mDNSu32           LastNATupseconds;			// NAT engine uptime in seconds, from most recent NAT packet
1925*48a54d36SAndroid Build Coastguard Worker 	mDNSs32           LastNATReplyLocalTime;	// Local time in ticks when most recent NAT packet was received
1926*48a54d36SAndroid Build Coastguard Worker 	mDNSu16           LastNATMapResultCode;		// Most recent error code for mappings
1927*48a54d36SAndroid Build Coastguard Worker 
1928*48a54d36SAndroid Build Coastguard Worker 	tcpLNTInfo        tcpAddrInfo;				// legacy NAT traversal TCP connection info for external address
1929*48a54d36SAndroid Build Coastguard Worker 	tcpLNTInfo        tcpDeviceInfo;			// legacy NAT traversal TCP connection info for device info
1930*48a54d36SAndroid Build Coastguard Worker 	tcpLNTInfo       *tcpInfoUnmapList;			// list of pending unmap requests
1931*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID   UPnPInterfaceID;
1932*48a54d36SAndroid Build Coastguard Worker 	UDPSocket        *SSDPSocket;               // For SSDP request/response
1933*48a54d36SAndroid Build Coastguard Worker 	mDNSBool          SSDPWANPPPConnection;     // whether we should send the SSDP query for WANIPConnection or WANPPPConnection
1934*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort        UPnPRouterPort;			// port we send discovery messages to
1935*48a54d36SAndroid Build Coastguard Worker 	mDNSIPPort        UPnPSOAPPort;				// port we send SOAP messages to
1936*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *UPnPRouterURL;			// router's URL string
1937*48a54d36SAndroid Build Coastguard Worker 	mDNSBool          UPnPWANPPPConnection;     // whether we're using WANIPConnection or WANPPPConnection
1938*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *UPnPSOAPURL;				// router's SOAP control URL string
1939*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *UPnPRouterAddressString;	// holds both the router's address and port
1940*48a54d36SAndroid Build Coastguard Worker 	mDNSu8           *UPnPSOAPAddressString;	// holds both address and port for SOAP messages
1941*48a54d36SAndroid Build Coastguard Worker 
1942*48a54d36SAndroid Build Coastguard Worker 	// Sleep Proxy Server fields
1943*48a54d36SAndroid Build Coastguard Worker 	mDNSu8            SPSType;					// 0 = off, 10-99 encodes desirability metric
1944*48a54d36SAndroid Build Coastguard Worker 	mDNSu8            SPSPortability;			// 10-99
1945*48a54d36SAndroid Build Coastguard Worker 	mDNSu8            SPSMarginalPower;			// 10-99
1946*48a54d36SAndroid Build Coastguard Worker 	mDNSu8            SPSTotalPower;			// 10-99
1947*48a54d36SAndroid Build Coastguard Worker 	mDNSu8            SPSState;					// 0 = off, 1 = running, 2 = shutting down, 3 = suspended during sleep
1948*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID   SPSProxyListChanged;
1949*48a54d36SAndroid Build Coastguard Worker 	UDPSocket        *SPSSocket;
1950*48a54d36SAndroid Build Coastguard Worker 	ServiceRecordSet  SPSRecords;
1951*48a54d36SAndroid Build Coastguard Worker 	mDNSQuestionCallback *SPSBrowseCallback;    // So the platform layer can do something useful with SPS browse results
1952*48a54d36SAndroid Build Coastguard Worker 	int               ProxyRecords;				// Total number of records we're holding as proxy
1953*48a54d36SAndroid Build Coastguard Worker 	#define           MAX_PROXY_RECORDS 10000	/* DOS protection: 400 machines at 25 records each */
1954*48a54d36SAndroid Build Coastguard Worker 
1955*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
1956*48a54d36SAndroid Build Coastguard Worker 	ClientTunnel     *TunnelClients;
1957*48a54d36SAndroid Build Coastguard Worker 	uuid_t           asl_uuid;					// uuid for ASL logging
1958*48a54d36SAndroid Build Coastguard Worker 	void		    *WCF;
1959*48a54d36SAndroid Build Coastguard Worker #endif
1960*48a54d36SAndroid Build Coastguard Worker 
1961*48a54d36SAndroid Build Coastguard Worker 	// Fixed storage, to avoid creating large objects on the stack
1962*48a54d36SAndroid Build Coastguard Worker 	// The imsg is declared as a union with a pointer type to enforce CPU-appropriate alignment
1963*48a54d36SAndroid Build Coastguard Worker 	union { DNSMessage m; void *p; } imsg;  // Incoming message received from wire
1964*48a54d36SAndroid Build Coastguard Worker 	DNSMessage        omsg;                 // Outgoing message we're building
1965*48a54d36SAndroid Build Coastguard Worker 	LargeCacheRecord  rec;                  // Resource Record extracted from received message
1966*48a54d36SAndroid Build Coastguard Worker 	};
1967*48a54d36SAndroid Build Coastguard Worker 
1968*48a54d36SAndroid Build Coastguard Worker #define FORALL_CACHERECORDS(SLOT,CG,CR)                           \
1969*48a54d36SAndroid Build Coastguard Worker 	for ((SLOT) = 0; (SLOT) < CACHE_HASH_SLOTS; (SLOT)++)         \
1970*48a54d36SAndroid Build Coastguard Worker 		for ((CG)=m->rrcache_hash[(SLOT)]; (CG); (CG)=(CG)->next) \
1971*48a54d36SAndroid Build Coastguard Worker 			for ((CR) = (CG)->members; (CR); (CR)=(CR)->next)
1972*48a54d36SAndroid Build Coastguard Worker 
1973*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
1974*48a54d36SAndroid Build Coastguard Worker #if 0
1975*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1976*48a54d36SAndroid Build Coastguard Worker #pragma mark - Useful Static Constants
1977*48a54d36SAndroid Build Coastguard Worker #endif
1978*48a54d36SAndroid Build Coastguard Worker 
1979*48a54d36SAndroid Build Coastguard Worker extern const mDNSInterfaceID mDNSInterface_Any;				// Zero
1980*48a54d36SAndroid Build Coastguard Worker extern const mDNSInterfaceID mDNSInterface_LocalOnly;		// Special value
1981*48a54d36SAndroid Build Coastguard Worker extern const mDNSInterfaceID mDNSInterface_Unicast;			// Special value
1982*48a54d36SAndroid Build Coastguard Worker extern const mDNSInterfaceID mDNSInterfaceMark;				// Special value
1983*48a54d36SAndroid Build Coastguard Worker extern const mDNSInterfaceID mDNSInterface_P2P;				// Special value
1984*48a54d36SAndroid Build Coastguard Worker 
1985*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   DiscardPort;
1986*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   SSHPort;
1987*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   UnicastDNSPort;
1988*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   SSDPPort;
1989*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   IPSECPort;
1990*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   NSIPCPort;
1991*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   NATPMPAnnouncementPort;
1992*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   NATPMPPort;
1993*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   DNSEXTPort;
1994*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   MulticastDNSPort;
1995*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   LoopbackIPCPort;
1996*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort   PrivateDNSPort;
1997*48a54d36SAndroid Build Coastguard Worker 
1998*48a54d36SAndroid Build Coastguard Worker extern const OwnerOptData    zeroOwner;
1999*48a54d36SAndroid Build Coastguard Worker 
2000*48a54d36SAndroid Build Coastguard Worker extern const mDNSIPPort      zeroIPPort;
2001*48a54d36SAndroid Build Coastguard Worker extern const mDNSv4Addr      zerov4Addr;
2002*48a54d36SAndroid Build Coastguard Worker extern const mDNSv6Addr      zerov6Addr;
2003*48a54d36SAndroid Build Coastguard Worker extern const mDNSEthAddr     zeroEthAddr;
2004*48a54d36SAndroid Build Coastguard Worker extern const mDNSv4Addr      onesIPv4Addr;
2005*48a54d36SAndroid Build Coastguard Worker extern const mDNSv6Addr      onesIPv6Addr;
2006*48a54d36SAndroid Build Coastguard Worker extern const mDNSEthAddr     onesEthAddr;
2007*48a54d36SAndroid Build Coastguard Worker extern const mDNSAddr        zeroAddr;
2008*48a54d36SAndroid Build Coastguard Worker 
2009*48a54d36SAndroid Build Coastguard Worker extern const mDNSv4Addr   AllDNSAdminGroup;
2010*48a54d36SAndroid Build Coastguard Worker extern const mDNSv4Addr   AllHosts_v4;
2011*48a54d36SAndroid Build Coastguard Worker extern const mDNSv6Addr   AllHosts_v6;
2012*48a54d36SAndroid Build Coastguard Worker extern const mDNSv6Addr   NDP_prefix;
2013*48a54d36SAndroid Build Coastguard Worker extern const mDNSEthAddr  AllHosts_v6_Eth;
2014*48a54d36SAndroid Build Coastguard Worker extern const mDNSAddr     AllDNSLinkGroup_v4;
2015*48a54d36SAndroid Build Coastguard Worker extern const mDNSAddr     AllDNSLinkGroup_v6;
2016*48a54d36SAndroid Build Coastguard Worker 
2017*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 zeroID;
2018*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 onesID;
2019*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 QueryFlags;
2020*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 uQueryFlags;
2021*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 ResponseFlags;
2022*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 UpdateReqFlags;
2023*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque16 UpdateRespFlags;
2024*48a54d36SAndroid Build Coastguard Worker 
2025*48a54d36SAndroid Build Coastguard Worker extern const mDNSOpaque64 zeroOpaque64;
2026*48a54d36SAndroid Build Coastguard Worker 
2027*48a54d36SAndroid Build Coastguard Worker extern mDNSBool StrictUnicastOrdering;
2028*48a54d36SAndroid Build Coastguard Worker extern mDNSu8 NumUnicastDNSServers;
2029*48a54d36SAndroid Build Coastguard Worker 
2030*48a54d36SAndroid Build Coastguard Worker #define localdomain           (*(const domainname *)"\x5" "local")
2031*48a54d36SAndroid Build Coastguard Worker #define DeviceInfoName        (*(const domainname *)"\xC" "_device-info" "\x4" "_tcp")
2032*48a54d36SAndroid Build Coastguard Worker #define SleepProxyServiceType (*(const domainname *)"\xC" "_sleep-proxy" "\x4" "_udp")
2033*48a54d36SAndroid Build Coastguard Worker 
2034*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2035*48a54d36SAndroid Build Coastguard Worker #if 0
2036*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2037*48a54d36SAndroid Build Coastguard Worker #pragma mark - Inline functions
2038*48a54d36SAndroid Build Coastguard Worker #endif
2039*48a54d36SAndroid Build Coastguard Worker 
2040*48a54d36SAndroid Build Coastguard Worker #if (defined(_MSC_VER))
2041*48a54d36SAndroid Build Coastguard Worker 	#define mDNSinline static __inline
2042*48a54d36SAndroid Build Coastguard Worker #elif ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
2043*48a54d36SAndroid Build Coastguard Worker 	#define mDNSinline static inline
2044*48a54d36SAndroid Build Coastguard Worker #endif
2045*48a54d36SAndroid Build Coastguard Worker 
2046*48a54d36SAndroid Build Coastguard Worker // If we're not doing inline functions, then this header needs to have the extern declarations
2047*48a54d36SAndroid Build Coastguard Worker #if !defined(mDNSinline)
2048*48a54d36SAndroid Build Coastguard Worker extern mDNSs32      NonZeroTime(mDNSs32 t);
2049*48a54d36SAndroid Build Coastguard Worker extern mDNSu16      mDNSVal16(mDNSOpaque16 x);
2050*48a54d36SAndroid Build Coastguard Worker extern mDNSOpaque16 mDNSOpaque16fromIntVal(mDNSu16 v);
2051*48a54d36SAndroid Build Coastguard Worker #endif
2052*48a54d36SAndroid Build Coastguard Worker 
2053*48a54d36SAndroid Build Coastguard Worker // If we're compiling the particular C file that instantiates our inlines, then we
2054*48a54d36SAndroid Build Coastguard Worker // define "mDNSinline" (to empty string) so that we generate code in the following section
2055*48a54d36SAndroid Build Coastguard Worker #if (!defined(mDNSinline) && mDNS_InstantiateInlines)
2056*48a54d36SAndroid Build Coastguard Worker #define mDNSinline
2057*48a54d36SAndroid Build Coastguard Worker #endif
2058*48a54d36SAndroid Build Coastguard Worker 
2059*48a54d36SAndroid Build Coastguard Worker #ifdef mDNSinline
2060*48a54d36SAndroid Build Coastguard Worker 
NonZeroTime(mDNSs32 t)2061*48a54d36SAndroid Build Coastguard Worker mDNSinline mDNSs32 NonZeroTime(mDNSs32 t) { if (t) return(t); else return(1); }
2062*48a54d36SAndroid Build Coastguard Worker 
mDNSVal16(mDNSOpaque16 x)2063*48a54d36SAndroid Build Coastguard Worker mDNSinline mDNSu16 mDNSVal16(mDNSOpaque16 x) { return((mDNSu16)((mDNSu16)x.b[0] <<  8 | (mDNSu16)x.b[1])); }
2064*48a54d36SAndroid Build Coastguard Worker 
mDNSOpaque16fromIntVal(mDNSu16 v)2065*48a54d36SAndroid Build Coastguard Worker mDNSinline mDNSOpaque16 mDNSOpaque16fromIntVal(mDNSu16 v)
2066*48a54d36SAndroid Build Coastguard Worker 	{
2067*48a54d36SAndroid Build Coastguard Worker 	mDNSOpaque16 x;
2068*48a54d36SAndroid Build Coastguard Worker 	x.b[0] = (mDNSu8)(v >> 8);
2069*48a54d36SAndroid Build Coastguard Worker 	x.b[1] = (mDNSu8)(v & 0xFF);
2070*48a54d36SAndroid Build Coastguard Worker 	return(x);
2071*48a54d36SAndroid Build Coastguard Worker 	}
2072*48a54d36SAndroid Build Coastguard Worker 
2073*48a54d36SAndroid Build Coastguard Worker #endif
2074*48a54d36SAndroid Build Coastguard Worker 
2075*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2076*48a54d36SAndroid Build Coastguard Worker #if 0
2077*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2078*48a54d36SAndroid Build Coastguard Worker #pragma mark - Main Client Functions
2079*48a54d36SAndroid Build Coastguard Worker #endif
2080*48a54d36SAndroid Build Coastguard Worker 
2081*48a54d36SAndroid Build Coastguard Worker // Every client should call mDNS_Init, passing in storage for the mDNS object and the mDNS_PlatformSupport object.
2082*48a54d36SAndroid Build Coastguard Worker //
2083*48a54d36SAndroid Build Coastguard Worker // Clients that are only advertising services should use mDNS_Init_NoCache and mDNS_Init_ZeroCacheSize.
2084*48a54d36SAndroid Build Coastguard Worker // Clients that plan to perform queries (mDNS_StartQuery, mDNS_StartBrowse, mDNS_StartResolveService, etc.)
2085*48a54d36SAndroid Build Coastguard Worker // need to provide storage for the resource record cache, or the query calls will return 'mStatus_NoCache'.
2086*48a54d36SAndroid Build Coastguard Worker // The rrcachestorage parameter is the address of memory for the resource record cache, and
2087*48a54d36SAndroid Build Coastguard Worker // the rrcachesize parameter is the number of entries in the CacheRecord array passed in.
2088*48a54d36SAndroid Build Coastguard Worker // (i.e. the size of the cache memory needs to be sizeof(CacheRecord) * rrcachesize).
2089*48a54d36SAndroid Build Coastguard Worker // OS X 10.3 Panther uses an initial cache size of 64 entries, and then mDNSCore sends an
2090*48a54d36SAndroid Build Coastguard Worker // mStatus_GrowCache message if it needs more.
2091*48a54d36SAndroid Build Coastguard Worker //
2092*48a54d36SAndroid Build Coastguard Worker // Most clients should use mDNS_Init_AdvertiseLocalAddresses. This causes mDNSCore to automatically
2093*48a54d36SAndroid Build Coastguard Worker // create the correct address records for all the hosts interfaces. If you plan to advertise
2094*48a54d36SAndroid Build Coastguard Worker // services being offered by the local machine, this is almost always what you want.
2095*48a54d36SAndroid Build Coastguard Worker // There are two cases where you might use mDNS_Init_DontAdvertiseLocalAddresses:
2096*48a54d36SAndroid Build Coastguard Worker // 1. A client-only device, that browses for services but doesn't advertise any of its own.
2097*48a54d36SAndroid Build Coastguard Worker // 2. A proxy-registration service, that advertises services being offered by other machines, and takes
2098*48a54d36SAndroid Build Coastguard Worker //    the appropriate steps to manually create the correct address records for those other machines.
2099*48a54d36SAndroid Build Coastguard Worker // In principle, a proxy-like registration service could manually create address records for its own machine too,
2100*48a54d36SAndroid Build Coastguard Worker // but this would be pointless extra effort when using mDNS_Init_AdvertiseLocalAddresses does that for you.
2101*48a54d36SAndroid Build Coastguard Worker //
2102*48a54d36SAndroid Build Coastguard Worker // Note that a client-only device that wishes to prohibit multicast advertisements (e.g. from
2103*48a54d36SAndroid Build Coastguard Worker // higher-layer API calls) must also set DivertMulticastAdvertisements in the mDNS structure and
2104*48a54d36SAndroid Build Coastguard Worker // advertise local address(es) on a loopback interface.
2105*48a54d36SAndroid Build Coastguard Worker //
2106*48a54d36SAndroid Build Coastguard Worker // When mDNS has finished setting up the client's callback is called
2107*48a54d36SAndroid Build Coastguard Worker // A client can also spin and poll the mDNSPlatformStatus field to see when it changes from mStatus_Waiting to mStatus_NoError
2108*48a54d36SAndroid Build Coastguard Worker //
2109*48a54d36SAndroid Build Coastguard Worker // Call mDNS_StartExit to tidy up before exiting
2110*48a54d36SAndroid Build Coastguard Worker // Because exiting may be an asynchronous process (e.g. if unicast records need to be deregistered)
2111*48a54d36SAndroid Build Coastguard Worker // client layer may choose to wait until mDNS_ExitNow() returns true before calling mDNS_FinalExit().
2112*48a54d36SAndroid Build Coastguard Worker //
2113*48a54d36SAndroid Build Coastguard Worker // Call mDNS_Register with a completed AuthRecord object to register a resource record
2114*48a54d36SAndroid Build Coastguard Worker // If the resource record type is kDNSRecordTypeUnique (or kDNSknownunique) then if a conflicting resource record is discovered,
2115*48a54d36SAndroid Build Coastguard Worker // the resource record's mDNSRecordCallback will be called with error code mStatus_NameConflict. The callback should deregister
2116*48a54d36SAndroid Build Coastguard Worker // the record, and may then try registering the record again after picking a new name (e.g. by automatically appending a number).
2117*48a54d36SAndroid Build Coastguard Worker // Following deregistration, the RecordCallback will be called with result mStatus_MemFree to signal that it is safe to deallocate
2118*48a54d36SAndroid Build Coastguard Worker // the record's storage (memory must be freed asynchronously to allow for goodbye packets and dynamic update deregistration).
2119*48a54d36SAndroid Build Coastguard Worker //
2120*48a54d36SAndroid Build Coastguard Worker // Call mDNS_StartQuery to initiate a query. mDNS will proceed to issue Multicast DNS query packets, and any time a response
2121*48a54d36SAndroid Build Coastguard Worker // is received containing a record which matches the question, the DNSQuestion's mDNSAnswerCallback function will be called
2122*48a54d36SAndroid Build Coastguard Worker // Call mDNS_StopQuery when no more answers are required
2123*48a54d36SAndroid Build Coastguard Worker //
2124*48a54d36SAndroid Build Coastguard Worker // Care should be taken on multi-threaded or interrupt-driven environments.
2125*48a54d36SAndroid Build Coastguard Worker // The main mDNS routines call mDNSPlatformLock() on entry and mDNSPlatformUnlock() on exit;
2126*48a54d36SAndroid Build Coastguard Worker // each platform layer needs to implement these appropriately for its respective platform.
2127*48a54d36SAndroid Build Coastguard Worker // For example, if the support code on a particular platform implements timer callbacks at interrupt time, then
2128*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformLock/Unlock need to disable interrupts or do similar concurrency control to ensure that the mDNS
2129*48a54d36SAndroid Build Coastguard Worker // code is not entered by an interrupt-time timer callback while in the middle of processing a client call.
2130*48a54d36SAndroid Build Coastguard Worker 
2131*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_Init      (mDNS *const m, mDNS_PlatformSupport *const p,
2132*48a54d36SAndroid Build Coastguard Worker 								CacheEntity *rrcachestorage, mDNSu32 rrcachesize,
2133*48a54d36SAndroid Build Coastguard Worker 								mDNSBool AdvertiseLocalAddresses,
2134*48a54d36SAndroid Build Coastguard Worker 								mDNSCallback *Callback, void *Context);
2135*48a54d36SAndroid Build Coastguard Worker // See notes above on use of NoCache/ZeroCacheSize
2136*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_NoCache                     mDNSNULL
2137*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_ZeroCacheSize               0
2138*48a54d36SAndroid Build Coastguard Worker // See notes above on use of Advertise/DontAdvertiseLocalAddresses
2139*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_AdvertiseLocalAddresses     mDNStrue
2140*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_DontAdvertiseLocalAddresses mDNSfalse
2141*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_NoInitCallback              mDNSNULL
2142*48a54d36SAndroid Build Coastguard Worker #define mDNS_Init_NoInitCallbackContext       mDNSNULL
2143*48a54d36SAndroid Build Coastguard Worker 
2144*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_ConfigChanged(mDNS *const m);
2145*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_GrowCache (mDNS *const m, CacheEntity *storage, mDNSu32 numrecords);
2146*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_GrowAuth (mDNS *const m, AuthEntity *storage, mDNSu32 numrecords);
2147*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_StartExit (mDNS *const m);
2148*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_FinalExit (mDNS *const m);
2149*48a54d36SAndroid Build Coastguard Worker #define mDNS_Close(m) do { mDNS_StartExit(m); mDNS_FinalExit(m); } while(0)
2150*48a54d36SAndroid Build Coastguard Worker #define mDNS_ExitNow(m, now) ((now) - (m)->ShutdownTime >= 0 || (!(m)->ResourceRecords))
2151*48a54d36SAndroid Build Coastguard Worker 
2152*48a54d36SAndroid Build Coastguard Worker extern mDNSs32 mDNS_Execute   (mDNS *const m);
2153*48a54d36SAndroid Build Coastguard Worker 
2154*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_Register  (mDNS *const m, AuthRecord *const rr);
2155*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_Update    (mDNS *const m, AuthRecord *const rr, mDNSu32 newttl,
2156*48a54d36SAndroid Build Coastguard Worker 								const mDNSu16 newrdlength, RData *const newrdata, mDNSRecordUpdateCallback *Callback);
2157*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_Deregister(mDNS *const m, AuthRecord *const rr);
2158*48a54d36SAndroid Build Coastguard Worker 
2159*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StartQuery(mDNS *const m, DNSQuestion *const question);
2160*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StopQuery (mDNS *const m, DNSQuestion *const question);
2161*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StopQueryWithRemoves(mDNS *const m, DNSQuestion *const question);
2162*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_Reconfirm (mDNS *const m, CacheRecord *const cacherr);
2163*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_ReconfirmByValue(mDNS *const m, ResourceRecord *const rr);
2164*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_PurgeCacheResourceRecord(mDNS *const m, CacheRecord *rr);
2165*48a54d36SAndroid Build Coastguard Worker extern mDNSs32 mDNS_TimeNow(const mDNS *const m);
2166*48a54d36SAndroid Build Coastguard Worker 
2167*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StartNATOperation(mDNS *const m, NATTraversalInfo *traversal);
2168*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StopNATOperation(mDNS *const m, NATTraversalInfo *traversal);
2169*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StopNATOperation_internal(mDNS *m, NATTraversalInfo *traversal);
2170*48a54d36SAndroid Build Coastguard Worker 
2171*48a54d36SAndroid Build Coastguard Worker extern DomainAuthInfo *GetAuthInfoForName(mDNS *m, const domainname *const name);
2172*48a54d36SAndroid Build Coastguard Worker 
2173*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_UpdateAllowSleep(mDNS *const m);
2174*48a54d36SAndroid Build Coastguard Worker 
2175*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2176*48a54d36SAndroid Build Coastguard Worker #if 0
2177*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2178*48a54d36SAndroid Build Coastguard Worker #pragma mark - Platform support functions that are accessible to the client layer too
2179*48a54d36SAndroid Build Coastguard Worker #endif
2180*48a54d36SAndroid Build Coastguard Worker 
2181*48a54d36SAndroid Build Coastguard Worker extern mDNSs32  mDNSPlatformOneSecond;
2182*48a54d36SAndroid Build Coastguard Worker 
2183*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2184*48a54d36SAndroid Build Coastguard Worker #if 0
2185*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2186*48a54d36SAndroid Build Coastguard Worker #pragma mark - General utility and helper functions
2187*48a54d36SAndroid Build Coastguard Worker #endif
2188*48a54d36SAndroid Build Coastguard Worker 
2189*48a54d36SAndroid Build Coastguard Worker // mDNS_Dereg_normal is used for most calls to mDNS_Deregister_internal
2190*48a54d36SAndroid Build Coastguard Worker // mDNS_Dereg_rapid is used to send one goodbye instead of three, when we want the memory available for reuse sooner
2191*48a54d36SAndroid Build Coastguard Worker // mDNS_Dereg_conflict is used to indicate that this record is being forcibly deregistered because of a conflict
2192*48a54d36SAndroid Build Coastguard Worker // mDNS_Dereg_repeat is used when cleaning up, for records that may have already been forcibly deregistered
2193*48a54d36SAndroid Build Coastguard Worker typedef enum { mDNS_Dereg_normal, mDNS_Dereg_rapid, mDNS_Dereg_conflict, mDNS_Dereg_repeat } mDNS_Dereg_type;
2194*48a54d36SAndroid Build Coastguard Worker 
2195*48a54d36SAndroid Build Coastguard Worker // mDNS_RegisterService is a single call to register the set of resource records associated with a given named service.
2196*48a54d36SAndroid Build Coastguard Worker //
2197*48a54d36SAndroid Build Coastguard Worker // mDNS_StartResolveService is single call which is equivalent to multiple calls to mDNS_StartQuery,
2198*48a54d36SAndroid Build Coastguard Worker // to find the IP address, port number, and demultiplexing information for a given named service.
2199*48a54d36SAndroid Build Coastguard Worker // As with mDNS_StartQuery, it executes asynchronously, and calls the ServiceInfoQueryCallback when the answer is
2200*48a54d36SAndroid Build Coastguard Worker // found. After the service is resolved, the client should call mDNS_StopResolveService to complete the transaction.
2201*48a54d36SAndroid Build Coastguard Worker // The client can also call mDNS_StopResolveService at any time to abort the transaction.
2202*48a54d36SAndroid Build Coastguard Worker //
2203*48a54d36SAndroid Build Coastguard Worker // mDNS_AddRecordToService adds an additional record to a Service Record Set.  This record may be deregistered
2204*48a54d36SAndroid Build Coastguard Worker // via mDNS_RemoveRecordFromService, or by deregistering the service.  mDNS_RemoveRecordFromService is passed a
2205*48a54d36SAndroid Build Coastguard Worker // callback to free the memory associated with the extra RR when it is safe to do so.  The ExtraResourceRecord
2206*48a54d36SAndroid Build Coastguard Worker // object can be found in the record's context pointer.
2207*48a54d36SAndroid Build Coastguard Worker 
2208*48a54d36SAndroid Build Coastguard Worker // mDNS_GetBrowseDomains is a special case of the mDNS_StartQuery call, where the resulting answers
2209*48a54d36SAndroid Build Coastguard Worker // are a list of PTR records indicating (in the rdata) domains that are recommended for browsing.
2210*48a54d36SAndroid Build Coastguard Worker // After getting the list of domains to browse, call mDNS_StopQuery to end the search.
2211*48a54d36SAndroid Build Coastguard Worker // mDNS_GetDefaultBrowseDomain returns the name of the domain that should be highlighted by default.
2212*48a54d36SAndroid Build Coastguard Worker //
2213*48a54d36SAndroid Build Coastguard Worker // mDNS_GetRegistrationDomains and mDNS_GetDefaultRegistrationDomain are the equivalent calls to get the list
2214*48a54d36SAndroid Build Coastguard Worker // of one or more domains that should be offered to the user as choices for where they may register their service,
2215*48a54d36SAndroid Build Coastguard Worker // and the default domain in which to register in the case where the user has made no selection.
2216*48a54d36SAndroid Build Coastguard Worker 
2217*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_SetupResourceRecord(AuthRecord *rr, RData *RDataStorage, mDNSInterfaceID InterfaceID,
2218*48a54d36SAndroid Build Coastguard Worker                mDNSu16 rrtype, mDNSu32 ttl, mDNSu8 RecordType, AuthRecType artype, mDNSRecordCallback Callback, void *Context);
2219*48a54d36SAndroid Build Coastguard Worker 
2220*48a54d36SAndroid Build Coastguard Worker // mDNS_RegisterService() flags parameter bit definitions
2221*48a54d36SAndroid Build Coastguard Worker enum
2222*48a54d36SAndroid Build Coastguard Worker 	{
2223*48a54d36SAndroid Build Coastguard Worker 		regFlagIncludeP2P	= 0x1,	// include P2P interfaces when using mDNSInterface_Any
2224*48a54d36SAndroid Build Coastguard Worker 		regFlagKnownUnique	= 0x2	// client guarantees that SRV and TXT record names are unique
2225*48a54d36SAndroid Build Coastguard Worker 	};
2226*48a54d36SAndroid Build Coastguard Worker 
2227*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_RegisterService  (mDNS *const m, ServiceRecordSet *sr,
2228*48a54d36SAndroid Build Coastguard Worker                const domainlabel *const name, const domainname *const type, const domainname *const domain,
2229*48a54d36SAndroid Build Coastguard Worker                const domainname *const host, mDNSIPPort port, const mDNSu8 txtinfo[], mDNSu16 txtlen,
2230*48a54d36SAndroid Build Coastguard Worker                AuthRecord *SubTypes, mDNSu32 NumSubTypes,
2231*48a54d36SAndroid Build Coastguard Worker                mDNSInterfaceID InterfaceID, mDNSServiceCallback Callback, void *Context, mDNSu32 flags);
2232*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_AddRecordToService(mDNS *const m, ServiceRecordSet *sr, ExtraResourceRecord *extra, RData *rdata, mDNSu32 ttl,  mDNSu32 includeP2P);
2233*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_RemoveRecordFromService(mDNS *const m, ServiceRecordSet *sr, ExtraResourceRecord *extra, mDNSRecordCallback MemFreeCallback, void *Context);
2234*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_RenameAndReregisterService(mDNS *const m, ServiceRecordSet *const sr, const domainlabel *newname);
2235*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_DeregisterService_drt(mDNS *const m, ServiceRecordSet *sr, mDNS_Dereg_type drt);
2236*48a54d36SAndroid Build Coastguard Worker #define mDNS_DeregisterService(M,S) mDNS_DeregisterService_drt((M), (S), mDNS_Dereg_normal)
2237*48a54d36SAndroid Build Coastguard Worker 
2238*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_RegisterNoSuchService(mDNS *const m, AuthRecord *const rr,
2239*48a54d36SAndroid Build Coastguard Worker                const domainlabel *const name, const domainname *const type, const domainname *const domain,
2240*48a54d36SAndroid Build Coastguard Worker                const domainname *const host,
2241*48a54d36SAndroid Build Coastguard Worker                const mDNSInterfaceID InterfaceID, mDNSRecordCallback Callback, void *Context, mDNSBool includeP2P);
2242*48a54d36SAndroid Build Coastguard Worker #define        mDNS_DeregisterNoSuchService mDNS_Deregister
2243*48a54d36SAndroid Build Coastguard Worker 
2244*48a54d36SAndroid Build Coastguard Worker extern void mDNS_SetupQuestion(DNSQuestion *const q, const mDNSInterfaceID InterfaceID, const domainname *const name,
2245*48a54d36SAndroid Build Coastguard Worker                const mDNSu16 qtype, mDNSQuestionCallback *const callback, void *const context);
2246*48a54d36SAndroid Build Coastguard Worker 
2247*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StartBrowse(mDNS *const m, DNSQuestion *const question,
2248*48a54d36SAndroid Build Coastguard Worker                const domainname *const srv, const domainname *const domain,
2249*48a54d36SAndroid Build Coastguard Worker                const mDNSInterfaceID InterfaceID, mDNSBool ForceMCast, mDNSQuestionCallback *Callback, void *Context);
2250*48a54d36SAndroid Build Coastguard Worker #define        mDNS_StopBrowse mDNS_StopQuery
2251*48a54d36SAndroid Build Coastguard Worker 
2252*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_StartResolveService(mDNS *const m, ServiceInfoQuery *query, ServiceInfo *info, mDNSServiceInfoQueryCallback *Callback, void *Context);
2253*48a54d36SAndroid Build Coastguard Worker extern void    mDNS_StopResolveService (mDNS *const m, ServiceInfoQuery *query);
2254*48a54d36SAndroid Build Coastguard Worker 
2255*48a54d36SAndroid Build Coastguard Worker typedef enum
2256*48a54d36SAndroid Build Coastguard Worker 	{
2257*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeBrowse              = 0,
2258*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeBrowseDefault       = 1,
2259*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeBrowseAutomatic     = 2,
2260*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeRegistration        = 3,
2261*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeRegistrationDefault = 4,
2262*48a54d36SAndroid Build Coastguard Worker 
2263*48a54d36SAndroid Build Coastguard Worker 	mDNS_DomainTypeMax = 4
2264*48a54d36SAndroid Build Coastguard Worker 	} mDNS_DomainType;
2265*48a54d36SAndroid Build Coastguard Worker 
2266*48a54d36SAndroid Build Coastguard Worker extern const char *const mDNS_DomainTypeNames[];
2267*48a54d36SAndroid Build Coastguard Worker 
2268*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_GetDomains(mDNS *const m, DNSQuestion *const question, mDNS_DomainType DomainType, const domainname *dom,
2269*48a54d36SAndroid Build Coastguard Worker 								const mDNSInterfaceID InterfaceID, mDNSQuestionCallback *Callback, void *Context);
2270*48a54d36SAndroid Build Coastguard Worker #define        mDNS_StopGetDomains mDNS_StopQuery
2271*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr, mDNS_DomainType DomainType, const mDNSInterfaceID InterfaceID, char *domname);
2272*48a54d36SAndroid Build Coastguard Worker #define        mDNS_StopAdvertiseDomains mDNS_Deregister
2273*48a54d36SAndroid Build Coastguard Worker 
2274*48a54d36SAndroid Build Coastguard Worker extern mDNSOpaque16 mDNS_NewMessageID(mDNS *const m);
2275*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNS_AddressIsLocalSubnet(mDNS *const m, const mDNSInterfaceID InterfaceID, const mDNSAddr *addr);
2276*48a54d36SAndroid Build Coastguard Worker 
2277*48a54d36SAndroid Build Coastguard Worker extern DNSServer *GetServerForName(mDNS *m, const domainname *name, mDNSInterfaceID InterfaceID);
2278*48a54d36SAndroid Build Coastguard Worker extern DNSServer *GetServerForQuestion(mDNS *m, DNSQuestion *question);
2279*48a54d36SAndroid Build Coastguard Worker extern mDNSu32 SetValidDNSServers(mDNS *m, DNSQuestion *question);
2280*48a54d36SAndroid Build Coastguard Worker 
2281*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2282*48a54d36SAndroid Build Coastguard Worker #if 0
2283*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2284*48a54d36SAndroid Build Coastguard Worker #pragma mark - DNS name utility functions
2285*48a54d36SAndroid Build Coastguard Worker #endif
2286*48a54d36SAndroid Build Coastguard Worker 
2287*48a54d36SAndroid Build Coastguard Worker // In order to expose the full capabilities of the DNS protocol (which allows any arbitrary eight-bit values
2288*48a54d36SAndroid Build Coastguard Worker // in domain name labels, including unlikely characters like ascii nulls and even dots) all the mDNS APIs
2289*48a54d36SAndroid Build Coastguard Worker // work with DNS's native length-prefixed strings. For convenience in C, the following utility functions
2290*48a54d36SAndroid Build Coastguard Worker // are provided for converting between C's null-terminated strings and DNS's length-prefixed strings.
2291*48a54d36SAndroid Build Coastguard Worker 
2292*48a54d36SAndroid Build Coastguard Worker // Assignment
2293*48a54d36SAndroid Build Coastguard Worker // A simple C structure assignment of a domainname can cause a protection fault by accessing unmapped memory,
2294*48a54d36SAndroid Build Coastguard Worker // because that object is defined to be 256 bytes long, but not all domainname objects are truly the full size.
2295*48a54d36SAndroid Build Coastguard Worker // This macro uses mDNSPlatformMemCopy() to make sure it only touches the actual bytes that are valid.
2296*48a54d36SAndroid Build Coastguard Worker #define AssignDomainName(DST, SRC) do { mDNSu16 len__ = DomainNameLength((SRC)); \
2297*48a54d36SAndroid Build Coastguard Worker 	if (len__ <= MAX_DOMAIN_NAME) mDNSPlatformMemCopy((DST)->c, (SRC)->c, len__); else (DST)->c[0] = 0; } while(0)
2298*48a54d36SAndroid Build Coastguard Worker 
2299*48a54d36SAndroid Build Coastguard Worker // Comparison functions
2300*48a54d36SAndroid Build Coastguard Worker #define SameDomainLabelCS(A,B) ((A)[0] == (B)[0] && mDNSPlatformMemSame((A)+1, (B)+1, (A)[0]))
2301*48a54d36SAndroid Build Coastguard Worker extern mDNSBool SameDomainLabel(const mDNSu8 *a, const mDNSu8 *b);
2302*48a54d36SAndroid Build Coastguard Worker extern mDNSBool SameDomainName(const domainname *const d1, const domainname *const d2);
2303*48a54d36SAndroid Build Coastguard Worker extern mDNSBool SameDomainNameCS(const domainname *const d1, const domainname *const d2);
2304*48a54d36SAndroid Build Coastguard Worker typedef mDNSBool DomainNameComparisonFn(const domainname *const d1, const domainname *const d2);
2305*48a54d36SAndroid Build Coastguard Worker extern mDNSBool IsLocalDomain(const domainname *d);     // returns true for domains that by default should be looked up using link-local multicast
2306*48a54d36SAndroid Build Coastguard Worker 
2307*48a54d36SAndroid Build Coastguard Worker #define StripFirstLabel(X) ((const domainname *)&(X)->c[(X)->c[0] ? 1 + (X)->c[0] : 0])
2308*48a54d36SAndroid Build Coastguard Worker 
2309*48a54d36SAndroid Build Coastguard Worker #define FirstLabel(X)  ((const domainlabel *)(X))
2310*48a54d36SAndroid Build Coastguard Worker #define SecondLabel(X) ((const domainlabel *)StripFirstLabel(X))
2311*48a54d36SAndroid Build Coastguard Worker #define ThirdLabel(X)  ((const domainlabel *)StripFirstLabel(StripFirstLabel(X)))
2312*48a54d36SAndroid Build Coastguard Worker 
2313*48a54d36SAndroid Build Coastguard Worker extern const mDNSu8 *LastLabel(const domainname *d);
2314*48a54d36SAndroid Build Coastguard Worker 
2315*48a54d36SAndroid Build Coastguard Worker // Get total length of domain name, in native DNS format, including terminal root label
2316*48a54d36SAndroid Build Coastguard Worker //   (e.g. length of "com." is 5 (length byte, three data bytes, final zero)
2317*48a54d36SAndroid Build Coastguard Worker extern mDNSu16  DomainNameLengthLimit(const domainname *const name, const mDNSu8 *limit);
2318*48a54d36SAndroid Build Coastguard Worker #define DomainNameLength(name) DomainNameLengthLimit((name), (name)->c + MAX_DOMAIN_NAME)
2319*48a54d36SAndroid Build Coastguard Worker 
2320*48a54d36SAndroid Build Coastguard Worker // Append functions to append one or more labels to an existing native format domain name:
2321*48a54d36SAndroid Build Coastguard Worker //   AppendLiteralLabelString adds a single label from a literal C string, with no escape character interpretation.
2322*48a54d36SAndroid Build Coastguard Worker //   AppendDNSNameString      adds zero or more labels from a C string using conventional DNS dots-and-escaping interpretation
2323*48a54d36SAndroid Build Coastguard Worker //   AppendDomainLabel        adds a single label from a native format domainlabel
2324*48a54d36SAndroid Build Coastguard Worker //   AppendDomainName         adds zero or more labels from a native format domainname
2325*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *AppendLiteralLabelString(domainname *const name, const char *cstr);
2326*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *AppendDNSNameString     (domainname *const name, const char *cstr);
2327*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *AppendDomainLabel       (domainname *const name, const domainlabel *const label);
2328*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *AppendDomainName        (domainname *const name, const domainname *const append);
2329*48a54d36SAndroid Build Coastguard Worker 
2330*48a54d36SAndroid Build Coastguard Worker // Convert from null-terminated string to native DNS format:
2331*48a54d36SAndroid Build Coastguard Worker //   The DomainLabel form makes a single label from a literal C string, with no escape character interpretation.
2332*48a54d36SAndroid Build Coastguard Worker //   The DomainName form makes native format domain name from a C string using conventional DNS interpretation:
2333*48a54d36SAndroid Build Coastguard Worker //     dots separate labels, and within each label, '\.' represents a literal dot, '\\' represents a literal
2334*48a54d36SAndroid Build Coastguard Worker //     backslash and backslash with three decimal digits (e.g. \000) represents an arbitrary byte value.
2335*48a54d36SAndroid Build Coastguard Worker extern mDNSBool MakeDomainLabelFromLiteralString(domainlabel *const label, const char *cstr);
2336*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *MakeDomainNameFromDNSNameString (domainname  *const name,  const char *cstr);
2337*48a54d36SAndroid Build Coastguard Worker 
2338*48a54d36SAndroid Build Coastguard Worker // Convert native format domainlabel or domainname back to C string format
2339*48a54d36SAndroid Build Coastguard Worker // IMPORTANT:
2340*48a54d36SAndroid Build Coastguard Worker // When using ConvertDomainLabelToCString, the target buffer must be MAX_ESCAPED_DOMAIN_LABEL (254) bytes long
2341*48a54d36SAndroid Build Coastguard Worker // to guarantee there will be no buffer overrun. It is only safe to use a buffer shorter than this in rare cases
2342*48a54d36SAndroid Build Coastguard Worker // where the label is known to be constrained somehow (for example, if the label is known to be either "_tcp" or "_udp").
2343*48a54d36SAndroid Build Coastguard Worker // Similarly, when using ConvertDomainNameToCString, the target buffer must be MAX_ESCAPED_DOMAIN_NAME (1009) bytes long.
2344*48a54d36SAndroid Build Coastguard Worker // See definitions of MAX_ESCAPED_DOMAIN_LABEL and MAX_ESCAPED_DOMAIN_NAME for more detailed explanation.
2345*48a54d36SAndroid Build Coastguard Worker extern char    *ConvertDomainLabelToCString_withescape(const domainlabel *const name, char *cstr, char esc);
2346*48a54d36SAndroid Build Coastguard Worker #define         ConvertDomainLabelToCString_unescaped(D,C) ConvertDomainLabelToCString_withescape((D), (C), 0)
2347*48a54d36SAndroid Build Coastguard Worker #define         ConvertDomainLabelToCString(D,C)           ConvertDomainLabelToCString_withescape((D), (C), '\\')
2348*48a54d36SAndroid Build Coastguard Worker extern char    *ConvertDomainNameToCString_withescape(const domainname *const name, char *cstr, char esc);
2349*48a54d36SAndroid Build Coastguard Worker #define         ConvertDomainNameToCString_unescaped(D,C) ConvertDomainNameToCString_withescape((D), (C), 0)
2350*48a54d36SAndroid Build Coastguard Worker #define         ConvertDomainNameToCString(D,C)           ConvertDomainNameToCString_withescape((D), (C), '\\')
2351*48a54d36SAndroid Build Coastguard Worker 
2352*48a54d36SAndroid Build Coastguard Worker extern void     ConvertUTF8PstringToRFC1034HostLabel(const mDNSu8 UTF8Name[], domainlabel *const hostlabel);
2353*48a54d36SAndroid Build Coastguard Worker 
2354*48a54d36SAndroid Build Coastguard Worker extern mDNSu8  *ConstructServiceName(domainname *const fqdn, const domainlabel *name, const domainname *type, const domainname *const domain);
2355*48a54d36SAndroid Build Coastguard Worker extern mDNSBool DeconstructServiceName(const domainname *const fqdn, domainlabel *const name, domainname *const type, domainname *const domain);
2356*48a54d36SAndroid Build Coastguard Worker 
2357*48a54d36SAndroid Build Coastguard Worker // Note: Some old functions have been replaced by more sensibly-named versions.
2358*48a54d36SAndroid Build Coastguard Worker // You can uncomment the hash-defines below if you don't want to have to change your source code right away.
2359*48a54d36SAndroid Build Coastguard Worker // When updating your code, note that (unlike the old versions) *all* the new routines take the target object
2360*48a54d36SAndroid Build Coastguard Worker // as their first parameter.
2361*48a54d36SAndroid Build Coastguard Worker //#define ConvertCStringToDomainName(SRC,DST)  MakeDomainNameFromDNSNameString((DST),(SRC))
2362*48a54d36SAndroid Build Coastguard Worker //#define ConvertCStringToDomainLabel(SRC,DST) MakeDomainLabelFromLiteralString((DST),(SRC))
2363*48a54d36SAndroid Build Coastguard Worker //#define AppendStringLabelToName(DST,SRC)     AppendLiteralLabelString((DST),(SRC))
2364*48a54d36SAndroid Build Coastguard Worker //#define AppendStringNameToName(DST,SRC)      AppendDNSNameString((DST),(SRC))
2365*48a54d36SAndroid Build Coastguard Worker //#define AppendDomainLabelToName(DST,SRC)     AppendDomainLabel((DST),(SRC))
2366*48a54d36SAndroid Build Coastguard Worker //#define AppendDomainNameToName(DST,SRC)      AppendDomainName((DST),(SRC))
2367*48a54d36SAndroid Build Coastguard Worker 
2368*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2369*48a54d36SAndroid Build Coastguard Worker #if 0
2370*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2371*48a54d36SAndroid Build Coastguard Worker #pragma mark - Other utility functions and macros
2372*48a54d36SAndroid Build Coastguard Worker #endif
2373*48a54d36SAndroid Build Coastguard Worker 
2374*48a54d36SAndroid Build Coastguard Worker // mDNS_vsnprintf/snprintf return the number of characters written, excluding the final terminating null.
2375*48a54d36SAndroid Build Coastguard Worker // The output is always null-terminated: for example, if the output turns out to be exactly buflen long,
2376*48a54d36SAndroid Build Coastguard Worker // then the output will be truncated by one character to allow space for the terminating null.
2377*48a54d36SAndroid Build Coastguard Worker // Unlike standard C vsnprintf/snprintf, they return the number of characters *actually* written,
2378*48a54d36SAndroid Build Coastguard Worker // not the number of characters that *would* have been printed were buflen unlimited.
2379*48a54d36SAndroid Build Coastguard Worker extern mDNSu32 mDNS_vsnprintf(char *sbuffer, mDNSu32 buflen, const char *fmt, va_list arg);
2380*48a54d36SAndroid Build Coastguard Worker extern mDNSu32 mDNS_snprintf(char *sbuffer, mDNSu32 buflen, const char *fmt, ...) IS_A_PRINTF_STYLE_FUNCTION(3,4);
2381*48a54d36SAndroid Build Coastguard Worker extern mDNSu32 NumCacheRecordsForInterfaceID(const mDNS *const m, mDNSInterfaceID id);
2382*48a54d36SAndroid Build Coastguard Worker extern char *DNSTypeName(mDNSu16 rrtype);
2383*48a54d36SAndroid Build Coastguard Worker extern char *GetRRDisplayString_rdb(const ResourceRecord *const rr, const RDataBody *const rd1, char *const buffer);
2384*48a54d36SAndroid Build Coastguard Worker #define RRDisplayString(m, rr) GetRRDisplayString_rdb(rr, &(rr)->rdata->u, (m)->MsgBuffer)
2385*48a54d36SAndroid Build Coastguard Worker #define ARDisplayString(m, rr) GetRRDisplayString_rdb(&(rr)->resrec, &(rr)->resrec.rdata->u, (m)->MsgBuffer)
2386*48a54d36SAndroid Build Coastguard Worker #define CRDisplayString(m, rr) GetRRDisplayString_rdb(&(rr)->resrec, &(rr)->resrec.rdata->u, (m)->MsgBuffer)
2387*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSSameAddress(const mDNSAddr *ip1, const mDNSAddr *ip2);
2388*48a54d36SAndroid Build Coastguard Worker extern void IncrementLabelSuffix(domainlabel *name, mDNSBool RichText);
2389*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSv4AddrIsRFC1918(mDNSv4Addr *addr);  // returns true for RFC1918 private addresses
2390*48a54d36SAndroid Build Coastguard Worker #define mDNSAddrIsRFC1918(X) ((X)->type == mDNSAddrType_IPv4 && mDNSv4AddrIsRFC1918(&(X)->ip.v4))
2391*48a54d36SAndroid Build Coastguard Worker 
2392*48a54d36SAndroid Build Coastguard Worker #define mDNSSameIPPort(A,B)      ((A).NotAnInteger == (B).NotAnInteger)
2393*48a54d36SAndroid Build Coastguard Worker #define mDNSSameOpaque16(A,B)    ((A).NotAnInteger == (B).NotAnInteger)
2394*48a54d36SAndroid Build Coastguard Worker #define mDNSSameOpaque32(A,B)    ((A).NotAnInteger == (B).NotAnInteger)
2395*48a54d36SAndroid Build Coastguard Worker #define mDNSSameOpaque64(A,B)    ((A)->l[0] == (B)->l[0] && (A)->l[1] == (B)->l[1])
2396*48a54d36SAndroid Build Coastguard Worker 
2397*48a54d36SAndroid Build Coastguard Worker #define mDNSSameIPv4Address(A,B) ((A).NotAnInteger == (B).NotAnInteger)
2398*48a54d36SAndroid Build Coastguard Worker #define mDNSSameIPv6Address(A,B) ((A).l[0] == (B).l[0] && (A).l[1] == (B).l[1] && (A).l[2] == (B).l[2] && (A).l[3] == (B).l[3])
2399*48a54d36SAndroid Build Coastguard Worker #define mDNSSameEthAddress(A,B)  ((A)->w[0] == (B)->w[0] && (A)->w[1] == (B)->w[1] && (A)->w[2] == (B)->w[2])
2400*48a54d36SAndroid Build Coastguard Worker 
2401*48a54d36SAndroid Build Coastguard Worker #define mDNSIPPortIsZero(A)      ((A).NotAnInteger                            == 0)
2402*48a54d36SAndroid Build Coastguard Worker #define mDNSOpaque16IsZero(A)    ((A).NotAnInteger                            == 0)
2403*48a54d36SAndroid Build Coastguard Worker #define mDNSOpaque64IsZero(A)    (((A)->l[0] | (A)->l[1]                    ) == 0)
2404*48a54d36SAndroid Build Coastguard Worker #define mDNSIPv4AddressIsZero(A) ((A).NotAnInteger                            == 0)
2405*48a54d36SAndroid Build Coastguard Worker #define mDNSIPv6AddressIsZero(A) (((A).l[0] | (A).l[1] | (A).l[2] | (A).l[3]) == 0)
2406*48a54d36SAndroid Build Coastguard Worker #define mDNSEthAddressIsZero(A)  (((A).w[0] | (A).w[1] | (A).w[2]           ) == 0)
2407*48a54d36SAndroid Build Coastguard Worker 
2408*48a54d36SAndroid Build Coastguard Worker #define mDNSIPv4AddressIsOnes(A) ((A).NotAnInteger == 0xFFFFFFFF)
2409*48a54d36SAndroid Build Coastguard Worker #define mDNSIPv6AddressIsOnes(A) (((A).l[0] & (A).l[1] & (A).l[2] & (A).l[3]) == 0xFFFFFFFF)
2410*48a54d36SAndroid Build Coastguard Worker 
2411*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsAllDNSLinkGroup(X) (                                                            \
2412*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4 && mDNSSameIPv4Address((X)->ip.v4, AllDNSLinkGroup_v4.ip.v4)) || \
2413*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6 && mDNSSameIPv6Address((X)->ip.v6, AllDNSLinkGroup_v6.ip.v6))    )
2414*48a54d36SAndroid Build Coastguard Worker 
2415*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsZero(X) (                                                \
2416*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4 && mDNSIPv4AddressIsZero((X)->ip.v4))  || \
2417*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6 && mDNSIPv6AddressIsZero((X)->ip.v6))     )
2418*48a54d36SAndroid Build Coastguard Worker 
2419*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsValidNonZero(X) (                                        \
2420*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4 && !mDNSIPv4AddressIsZero((X)->ip.v4)) || \
2421*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6 && !mDNSIPv6AddressIsZero((X)->ip.v6))    )
2422*48a54d36SAndroid Build Coastguard Worker 
2423*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsOnes(X) (                                                \
2424*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4 && mDNSIPv4AddressIsOnes((X)->ip.v4))  || \
2425*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6 && mDNSIPv6AddressIsOnes((X)->ip.v6))     )
2426*48a54d36SAndroid Build Coastguard Worker 
2427*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsValid(X) (                                                                                             \
2428*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4) ? !(mDNSIPv4AddressIsZero((X)->ip.v4) || mDNSIPv4AddressIsOnes((X)->ip.v4)) :          \
2429*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6) ? !(mDNSIPv6AddressIsZero((X)->ip.v6) || mDNSIPv6AddressIsOnes((X)->ip.v6)) : mDNSfalse)
2430*48a54d36SAndroid Build Coastguard Worker 
2431*48a54d36SAndroid Build Coastguard Worker #define mDNSv4AddressIsLinkLocal(X) ((X)->b[0] ==  169 &&  (X)->b[1]         ==  254)
2432*48a54d36SAndroid Build Coastguard Worker #define mDNSv6AddressIsLinkLocal(X) ((X)->b[0] == 0xFE && ((X)->b[1] & 0xC0) == 0x80)
2433*48a54d36SAndroid Build Coastguard Worker 
2434*48a54d36SAndroid Build Coastguard Worker #define mDNSAddressIsLinkLocal(X)  (                                                    \
2435*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv4) ? mDNSv4AddressIsLinkLocal(&(X)->ip.v4) :          \
2436*48a54d36SAndroid Build Coastguard Worker 	((X)->type == mDNSAddrType_IPv6) ? mDNSv6AddressIsLinkLocal(&(X)->ip.v6) : mDNSfalse)
2437*48a54d36SAndroid Build Coastguard Worker 
2438*48a54d36SAndroid Build Coastguard Worker #define mDNSv4AddressIsLoopback(X) ((X)->b[0] == 127 && (X)->b[1] == 0 && (X)->b[2] == 0 && (X)->b[3] == 1)
2439*48a54d36SAndroid Build Coastguard Worker #define mDNSv6AddressIsLoopback(X) ((((X)->l[0] | (X)->l[1] | (X)->l[2]) == 0) && ((X)->b[12] == 0 && (X)->b[13] == 0 && (X)->b[14] == 0 && (X)->b[15] == 1))
2440*48a54d36SAndroid Build Coastguard Worker 
2441*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2442*48a54d36SAndroid Build Coastguard Worker #if 0
2443*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2444*48a54d36SAndroid Build Coastguard Worker #pragma mark - Authentication Support
2445*48a54d36SAndroid Build Coastguard Worker #endif
2446*48a54d36SAndroid Build Coastguard Worker 
2447*48a54d36SAndroid Build Coastguard Worker // Unicast DNS and Dynamic Update specific Client Calls
2448*48a54d36SAndroid Build Coastguard Worker //
2449*48a54d36SAndroid Build Coastguard Worker // mDNS_SetSecretForDomain tells the core to authenticate (via TSIG with an HMAC_MD5 hash of the shared secret)
2450*48a54d36SAndroid Build Coastguard Worker // when dynamically updating a given zone (and its subdomains).  The key used in authentication must be in
2451*48a54d36SAndroid Build Coastguard Worker // domain name format.  The shared secret must be a null-terminated base64 encoded string.  A minimum size of
2452*48a54d36SAndroid Build Coastguard Worker // 16 bytes (128 bits) is recommended for an MD5 hash as per RFC 2485.
2453*48a54d36SAndroid Build Coastguard Worker // Calling this routine multiple times for a zone replaces previously entered values.  Call with a NULL key
2454*48a54d36SAndroid Build Coastguard Worker // to disable authentication for the zone.  A non-NULL autoTunnelPrefix means this is an AutoTunnel domain,
2455*48a54d36SAndroid Build Coastguard Worker // and the value is prepended to the IPSec identifier (used for key lookup)
2456*48a54d36SAndroid Build Coastguard Worker 
2457*48a54d36SAndroid Build Coastguard Worker extern mStatus mDNS_SetSecretForDomain(mDNS *m, DomainAuthInfo *info,
2458*48a54d36SAndroid Build Coastguard Worker 	const domainname *domain, const domainname *keyname, const char *b64keydata, const domainname *hostname, mDNSIPPort *port, const char *autoTunnelPrefix);
2459*48a54d36SAndroid Build Coastguard Worker 
2460*48a54d36SAndroid Build Coastguard Worker extern void RecreateNATMappings(mDNS *const m);
2461*48a54d36SAndroid Build Coastguard Worker 
2462*48a54d36SAndroid Build Coastguard Worker // Hostname/Unicast Interface Configuration
2463*48a54d36SAndroid Build Coastguard Worker 
2464*48a54d36SAndroid Build Coastguard Worker // All hostnames advertised point to one IPv4 address and/or one IPv6 address, set via SetPrimaryInterfaceInfo.  Invoking this routine
2465*48a54d36SAndroid Build Coastguard Worker // updates all existing hostnames to point to the new address.
2466*48a54d36SAndroid Build Coastguard Worker 
2467*48a54d36SAndroid Build Coastguard Worker // A hostname is added via AddDynDNSHostName, which points to the primary interface's v4 and/or v6 addresss
2468*48a54d36SAndroid Build Coastguard Worker 
2469*48a54d36SAndroid Build Coastguard Worker // The status callback is invoked to convey success or failure codes - the callback should not modify the AuthRecord or free memory.
2470*48a54d36SAndroid Build Coastguard Worker // Added hostnames may be removed (deregistered) via mDNS_RemoveDynDNSHostName.
2471*48a54d36SAndroid Build Coastguard Worker 
2472*48a54d36SAndroid Build Coastguard Worker // Host domains added prior to specification of the primary interface address and computer name will be deferred until
2473*48a54d36SAndroid Build Coastguard Worker // these values are initialized.
2474*48a54d36SAndroid Build Coastguard Worker 
2475*48a54d36SAndroid Build Coastguard Worker // DNS servers used to resolve unicast queries are specified by mDNS_AddDNSServer.
2476*48a54d36SAndroid Build Coastguard Worker // For "split" DNS configurations, in which queries for different domains are sent to different servers (e.g. VPN and external),
2477*48a54d36SAndroid Build Coastguard Worker // a domain may be associated with a DNS server.  For standard configurations, specify the root label (".") or NULL.
2478*48a54d36SAndroid Build Coastguard Worker 
2479*48a54d36SAndroid Build Coastguard Worker extern void mDNS_AddDynDNSHostName(mDNS *m, const domainname *fqdn, mDNSRecordCallback *StatusCallback, const void *StatusContext);
2480*48a54d36SAndroid Build Coastguard Worker extern void mDNS_RemoveDynDNSHostName(mDNS *m, const domainname *fqdn);
2481*48a54d36SAndroid Build Coastguard Worker extern void mDNS_SetPrimaryInterfaceInfo(mDNS *m, const mDNSAddr *v4addr,  const mDNSAddr *v6addr, const mDNSAddr *router);
2482*48a54d36SAndroid Build Coastguard Worker extern DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, const mDNSAddr *addr, const mDNSIPPort port, mDNSBool scoped, mDNSu32 timeout);
2483*48a54d36SAndroid Build Coastguard Worker extern void PenalizeDNSServer(mDNS *const m, DNSQuestion *q);
2484*48a54d36SAndroid Build Coastguard Worker extern void mDNS_AddSearchDomain(const domainname *const domain, mDNSInterfaceID InterfaceID);
2485*48a54d36SAndroid Build Coastguard Worker 
2486*48a54d36SAndroid Build Coastguard Worker extern McastResolver *mDNS_AddMcastResolver(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, mDNSu32 timeout);
2487*48a54d36SAndroid Build Coastguard Worker 
2488*48a54d36SAndroid Build Coastguard Worker // We use ((void *)0) here instead of mDNSNULL to avoid compile warnings on gcc 4.2
2489*48a54d36SAndroid Build Coastguard Worker #define mDNS_AddSearchDomain_CString(X, I) \
2490*48a54d36SAndroid Build Coastguard Worker 	do { domainname d__; if (((X) != (void*)0) && MakeDomainNameFromDNSNameString(&d__, (X)) && d__.c[0]) mDNS_AddSearchDomain(&d__, I); } while(0)
2491*48a54d36SAndroid Build Coastguard Worker 
2492*48a54d36SAndroid Build Coastguard Worker // Routines called by the core, exported by DNSDigest.c
2493*48a54d36SAndroid Build Coastguard Worker 
2494*48a54d36SAndroid Build Coastguard Worker // Convert an arbitrary base64 encoded key key into an HMAC key (stored in AuthInfo struct)
2495*48a54d36SAndroid Build Coastguard Worker extern mDNSs32 DNSDigest_ConstructHMACKeyfromBase64(DomainAuthInfo *info, const char *b64key);
2496*48a54d36SAndroid Build Coastguard Worker 
2497*48a54d36SAndroid Build Coastguard Worker // sign a DNS message.  The message must be complete, with all values in network byte order.  end points to the end
2498*48a54d36SAndroid Build Coastguard Worker // of the message, and is modified by this routine.  numAdditionals is a pointer to the number of additional
2499*48a54d36SAndroid Build Coastguard Worker // records in HOST byte order, which is incremented upon successful completion of this routine.  The function returns
2500*48a54d36SAndroid Build Coastguard Worker // the new end pointer on success, and NULL on failure.
2501*48a54d36SAndroid Build Coastguard Worker extern void DNSDigest_SignMessage(DNSMessage *msg, mDNSu8 **end, DomainAuthInfo *info, mDNSu16 tcode);
2502*48a54d36SAndroid Build Coastguard Worker 
2503*48a54d36SAndroid Build Coastguard Worker #define SwapDNSHeaderBytes(M) do { \
2504*48a54d36SAndroid Build Coastguard Worker     (M)->h.numQuestions   = (mDNSu16)((mDNSu8 *)&(M)->h.numQuestions  )[0] << 8 | ((mDNSu8 *)&(M)->h.numQuestions  )[1]; \
2505*48a54d36SAndroid Build Coastguard Worker     (M)->h.numAnswers     = (mDNSu16)((mDNSu8 *)&(M)->h.numAnswers    )[0] << 8 | ((mDNSu8 *)&(M)->h.numAnswers    )[1]; \
2506*48a54d36SAndroid Build Coastguard Worker     (M)->h.numAuthorities = (mDNSu16)((mDNSu8 *)&(M)->h.numAuthorities)[0] << 8 | ((mDNSu8 *)&(M)->h.numAuthorities)[1]; \
2507*48a54d36SAndroid Build Coastguard Worker     (M)->h.numAdditionals = (mDNSu16)((mDNSu8 *)&(M)->h.numAdditionals)[0] << 8 | ((mDNSu8 *)&(M)->h.numAdditionals)[1]; \
2508*48a54d36SAndroid Build Coastguard Worker     } while (0)
2509*48a54d36SAndroid Build Coastguard Worker 
2510*48a54d36SAndroid Build Coastguard Worker #define DNSDigest_SignMessageHostByteOrder(M,E,INFO) \
2511*48a54d36SAndroid Build Coastguard Worker 	do { SwapDNSHeaderBytes(M); DNSDigest_SignMessage((M), (E), (INFO), 0); SwapDNSHeaderBytes(M); } while (0)
2512*48a54d36SAndroid Build Coastguard Worker 
2513*48a54d36SAndroid Build Coastguard Worker // verify a DNS message.  The message must be complete, with all values in network byte order.  end points to the
2514*48a54d36SAndroid Build Coastguard Worker // end of the record.  tsig is a pointer to the resource record that contains the TSIG OPT record.  info is
2515*48a54d36SAndroid Build Coastguard Worker // the matching key to use for verifying the message.  This function expects that the additionals member
2516*48a54d36SAndroid Build Coastguard Worker // of the DNS message header has already had one subtracted from it.
2517*48a54d36SAndroid Build Coastguard Worker extern mDNSBool DNSDigest_VerifyMessage(DNSMessage *msg, mDNSu8 *end, LargeCacheRecord *tsig, DomainAuthInfo *info, mDNSu16 *rcode, mDNSu16 *tcode);
2518*48a54d36SAndroid Build Coastguard Worker 
2519*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2520*48a54d36SAndroid Build Coastguard Worker #if 0
2521*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2522*48a54d36SAndroid Build Coastguard Worker #pragma mark - PlatformSupport interface
2523*48a54d36SAndroid Build Coastguard Worker #endif
2524*48a54d36SAndroid Build Coastguard Worker 
2525*48a54d36SAndroid Build Coastguard Worker // This section defines the interface to the Platform Support layer.
2526*48a54d36SAndroid Build Coastguard Worker // Normal client code should not use any of types defined here, or directly call any of the functions defined here.
2527*48a54d36SAndroid Build Coastguard Worker // The definitions are placed here because sometimes clients do use these calls indirectly, via other supported client operations.
2528*48a54d36SAndroid Build Coastguard Worker // For example, AssignDomainName is a macro defined using mDNSPlatformMemCopy()
2529*48a54d36SAndroid Build Coastguard Worker 
2530*48a54d36SAndroid Build Coastguard Worker // Every platform support module must provide the following functions.
2531*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformInit() typically opens a communication endpoint, and starts listening for mDNS packets.
2532*48a54d36SAndroid Build Coastguard Worker // When Setup is complete, the platform support layer calls mDNSCoreInitComplete().
2533*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformSendUDP() sends one UDP packet
2534*48a54d36SAndroid Build Coastguard Worker // When a packet is received, the PlatformSupport code calls mDNSCoreReceive()
2535*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformClose() tidies up on exit
2536*48a54d36SAndroid Build Coastguard Worker //
2537*48a54d36SAndroid Build Coastguard Worker // Note: mDNSPlatformMemAllocate/mDNSPlatformMemFree are only required for handling oversized resource records and unicast DNS.
2538*48a54d36SAndroid Build Coastguard Worker // If your target platform has a well-defined specialized application, and you know that all the records it uses
2539*48a54d36SAndroid Build Coastguard Worker // are InlineCacheRDSize or less, then you can just make a simple mDNSPlatformMemAllocate() stub that always returns
2540*48a54d36SAndroid Build Coastguard Worker // NULL. InlineCacheRDSize is a compile-time constant, which is set by default to 68. If you need to handle records
2541*48a54d36SAndroid Build Coastguard Worker // a little larger than this and you don't want to have to implement run-time allocation and freeing, then you
2542*48a54d36SAndroid Build Coastguard Worker // can raise the value of this constant to a suitable value (at the expense of increased memory usage).
2543*48a54d36SAndroid Build Coastguard Worker //
2544*48a54d36SAndroid Build Coastguard Worker // USE CAUTION WHEN CALLING mDNSPlatformRawTime: The m->timenow_adjust correction factor needs to be added
2545*48a54d36SAndroid Build Coastguard Worker // Generally speaking:
2546*48a54d36SAndroid Build Coastguard Worker // Code that's protected by the main mDNS lock should just use the m->timenow value
2547*48a54d36SAndroid Build Coastguard Worker // Code outside the main mDNS lock should use mDNS_TimeNow(m) to get properly adjusted time
2548*48a54d36SAndroid Build Coastguard Worker // In certain cases there may be reasons why it's necessary to get the time without taking the lock first
2549*48a54d36SAndroid Build Coastguard Worker // (e.g. inside the routines that are doing the locking and unlocking, where a call to get the lock would result in a
2550*48a54d36SAndroid Build Coastguard Worker // recursive loop); in these cases use mDNS_TimeNow_NoLock(m) to get mDNSPlatformRawTime with the proper correction factor added.
2551*48a54d36SAndroid Build Coastguard Worker //
2552*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformUTC returns the time, in seconds, since Jan 1st 1970 UTC and is required for generating TSIG records
2553*48a54d36SAndroid Build Coastguard Worker 
2554*48a54d36SAndroid Build Coastguard Worker extern mStatus  mDNSPlatformInit        (mDNS *const m);
2555*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformClose       (mDNS *const m);
2556*48a54d36SAndroid Build Coastguard Worker extern mStatus  mDNSPlatformSendUDP(const mDNS *const m, const void *const msg, const mDNSu8 *const end,
2557*48a54d36SAndroid Build Coastguard Worker mDNSInterfaceID InterfaceID, UDPSocket *src, const mDNSAddr *dst, mDNSIPPort dstport);
2558*48a54d36SAndroid Build Coastguard Worker 
2559*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformLock        (const mDNS *const m);
2560*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformUnlock      (const mDNS *const m);
2561*48a54d36SAndroid Build Coastguard Worker 
2562*48a54d36SAndroid Build Coastguard Worker mDNSexport void     mDNSPlatformStrCopy(      void *dst, const void *src);
2563*48a54d36SAndroid Build Coastguard Worker mDNSexport mDNSu32  mDNSPlatformStrLCopy(     void *dst, const void *src, mDNSu32 dstlen);
2564*48a54d36SAndroid Build Coastguard Worker mDNSexport mDNSu32  mDNSPlatformStrLen (                 const void *src);
2565*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformMemCopy     (      void *dst, const void *src, mDNSu32 len);
2566*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSPlatformMemSame     (const void *dst, const void *src, mDNSu32 len);
2567*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformMemZero     (      void *dst,                  mDNSu32 len);
2568*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder && MACOSX_MDNS_MALLOC_DEBUGGING
2569*48a54d36SAndroid Build Coastguard Worker #define         mDNSPlatformMemAllocate(X) mallocL(#X, X)
2570*48a54d36SAndroid Build Coastguard Worker #else
2571*48a54d36SAndroid Build Coastguard Worker extern void *   mDNSPlatformMemAllocate (mDNSu32 len);
2572*48a54d36SAndroid Build Coastguard Worker #endif
2573*48a54d36SAndroid Build Coastguard Worker extern void     mDNSPlatformMemFree     (void *mem);
2574*48a54d36SAndroid Build Coastguard Worker 
2575*48a54d36SAndroid Build Coastguard Worker // If the platform doesn't have a strong PRNG, we define a naive multiply-and-add based on a seed
2576*48a54d36SAndroid Build Coastguard Worker // from the platform layer.  Long-term, we should embed an arc4 implementation, but the strength
2577*48a54d36SAndroid Build Coastguard Worker // will still depend on the randomness of the seed.
2578*48a54d36SAndroid Build Coastguard Worker #if !defined(_PLATFORM_HAS_STRONG_PRNG_) && (_BUILDING_XCODE_PROJECT_ || defined(_WIN32))
2579*48a54d36SAndroid Build Coastguard Worker #define _PLATFORM_HAS_STRONG_PRNG_ 1
2580*48a54d36SAndroid Build Coastguard Worker #endif
2581*48a54d36SAndroid Build Coastguard Worker #if _PLATFORM_HAS_STRONG_PRNG_
2582*48a54d36SAndroid Build Coastguard Worker extern mDNSu32  mDNSPlatformRandomNumber(void);
2583*48a54d36SAndroid Build Coastguard Worker #else
2584*48a54d36SAndroid Build Coastguard Worker extern mDNSu32  mDNSPlatformRandomSeed  (void);
2585*48a54d36SAndroid Build Coastguard Worker #endif // _PLATFORM_HAS_STRONG_PRNG_
2586*48a54d36SAndroid Build Coastguard Worker 
2587*48a54d36SAndroid Build Coastguard Worker extern mStatus  mDNSPlatformTimeInit    (void);
2588*48a54d36SAndroid Build Coastguard Worker extern mDNSs32  mDNSPlatformRawTime     (void);
2589*48a54d36SAndroid Build Coastguard Worker extern mDNSs32  mDNSPlatformUTC         (void);
2590*48a54d36SAndroid Build Coastguard Worker #define mDNS_TimeNow_NoLock(m) (mDNSPlatformRawTime() + (m)->timenow_adjust)
2591*48a54d36SAndroid Build Coastguard Worker 
2592*48a54d36SAndroid Build Coastguard Worker #if MDNS_DEBUGMSGS
2593*48a54d36SAndroid Build Coastguard Worker extern void	mDNSPlatformWriteDebugMsg(const char *msg);
2594*48a54d36SAndroid Build Coastguard Worker #endif
2595*48a54d36SAndroid Build Coastguard Worker extern void	mDNSPlatformWriteLogMsg(const char *ident, const char *msg, mDNSLogLevel_t loglevel);
2596*48a54d36SAndroid Build Coastguard Worker 
2597*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
2598*48a54d36SAndroid Build Coastguard Worker // Utility function for ASL logging
2599*48a54d36SAndroid Build Coastguard Worker mDNSexport void mDNSASLLog(uuid_t *uuid, const char *subdomain, const char *result, const char *signature, const char *fmt, ...);
2600*48a54d36SAndroid Build Coastguard Worker #endif
2601*48a54d36SAndroid Build Coastguard Worker 
2602*48a54d36SAndroid Build Coastguard Worker // Platform support modules should provide the following functions to map between opaque interface IDs
2603*48a54d36SAndroid Build Coastguard Worker // and interface indexes in order to support the DNS-SD API. If your target platform does not support
2604*48a54d36SAndroid Build Coastguard Worker // multiple interfaces and/or does not support the DNS-SD API, these functions can be empty.
2605*48a54d36SAndroid Build Coastguard Worker extern mDNSInterfaceID mDNSPlatformInterfaceIDfromInterfaceIndex(mDNS *const m, mDNSu32 ifindex);
2606*48a54d36SAndroid Build Coastguard Worker extern mDNSu32 mDNSPlatformInterfaceIndexfromInterfaceID(mDNS *const m, mDNSInterfaceID id, mDNSBool suppressNetworkChange);
2607*48a54d36SAndroid Build Coastguard Worker 
2608*48a54d36SAndroid Build Coastguard Worker // Every platform support module must provide the following functions if it is to support unicast DNS
2609*48a54d36SAndroid Build Coastguard Worker // and Dynamic Update.
2610*48a54d36SAndroid Build Coastguard Worker // All TCP socket operations implemented by the platform layer MUST NOT BLOCK.
2611*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformTCPConnect initiates a TCP connection with a peer, adding the socket descriptor to the
2612*48a54d36SAndroid Build Coastguard Worker // main event loop.  The return value indicates whether the connection succeeded, failed, or is pending
2613*48a54d36SAndroid Build Coastguard Worker // (i.e. the call would block.)  On return, the descriptor parameter is set to point to the connected socket.
2614*48a54d36SAndroid Build Coastguard Worker // The TCPConnectionCallback is subsequently invoked when the connection
2615*48a54d36SAndroid Build Coastguard Worker // completes (in which case the ConnectionEstablished parameter is true), or data is available for
2616*48a54d36SAndroid Build Coastguard Worker // reading on the socket (indicated by the ConnectionEstablished parameter being false.)  If the connection
2617*48a54d36SAndroid Build Coastguard Worker // asynchronously fails, the TCPConnectionCallback should be invoked as usual, with the error being
2618*48a54d36SAndroid Build Coastguard Worker // returned in subsequent calls to PlatformReadTCP or PlatformWriteTCP.  (This allows for platforms
2619*48a54d36SAndroid Build Coastguard Worker // with limited asynchronous error detection capabilities.)  PlatformReadTCP and PlatformWriteTCP must
2620*48a54d36SAndroid Build Coastguard Worker // return the number of bytes read/written, 0 if the call would block, and -1 if an error.  PlatformReadTCP
2621*48a54d36SAndroid Build Coastguard Worker // should set the closed argument if the socket has been closed.
2622*48a54d36SAndroid Build Coastguard Worker // PlatformTCPCloseConnection must close the connection to the peer and remove the descriptor from the
2623*48a54d36SAndroid Build Coastguard Worker // event loop.  CloseConnectin may be called at any time, including in a ConnectionCallback.
2624*48a54d36SAndroid Build Coastguard Worker 
2625*48a54d36SAndroid Build Coastguard Worker typedef enum
2626*48a54d36SAndroid Build Coastguard Worker 	{
2627*48a54d36SAndroid Build Coastguard Worker 	kTCPSocketFlags_Zero   = 0,
2628*48a54d36SAndroid Build Coastguard Worker 	kTCPSocketFlags_UseTLS = (1 << 0)
2629*48a54d36SAndroid Build Coastguard Worker 	} TCPSocketFlags;
2630*48a54d36SAndroid Build Coastguard Worker 
2631*48a54d36SAndroid Build Coastguard Worker typedef void (*TCPConnectionCallback)(TCPSocket *sock, void *context, mDNSBool ConnectionEstablished, mStatus err);
2632*48a54d36SAndroid Build Coastguard Worker extern TCPSocket *mDNSPlatformTCPSocket(mDNS *const m, TCPSocketFlags flags, mDNSIPPort *port);	// creates a TCP socket
2633*48a54d36SAndroid Build Coastguard Worker extern TCPSocket *mDNSPlatformTCPAccept(TCPSocketFlags flags, int sd);
2634*48a54d36SAndroid Build Coastguard Worker extern int        mDNSPlatformTCPGetFD(TCPSocket *sock);
2635*48a54d36SAndroid Build Coastguard Worker extern mStatus    mDNSPlatformTCPConnect(TCPSocket *sock, const mDNSAddr *dst, mDNSOpaque16 dstport, domainname *hostname,
2636*48a54d36SAndroid Build Coastguard Worker 										mDNSInterfaceID InterfaceID, TCPConnectionCallback callback, void *context);
2637*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformTCPCloseConnection(TCPSocket *sock);
2638*48a54d36SAndroid Build Coastguard Worker extern long       mDNSPlatformReadTCP(TCPSocket *sock, void *buf, unsigned long buflen, mDNSBool *closed);
2639*48a54d36SAndroid Build Coastguard Worker extern long       mDNSPlatformWriteTCP(TCPSocket *sock, const char *msg, unsigned long len);
2640*48a54d36SAndroid Build Coastguard Worker extern UDPSocket *mDNSPlatformUDPSocket(mDNS *const m, const mDNSIPPort requestedport);
2641*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformUDPClose(UDPSocket *sock);
2642*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformReceiveBPF_fd(mDNS *const m, int fd);
2643*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformUpdateProxyList(mDNS *const m, const mDNSInterfaceID InterfaceID);
2644*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSendRawPacket(const void *const msg, const mDNSu8 *const end, mDNSInterfaceID InterfaceID);
2645*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSetLocalAddressCacheEntry(mDNS *const m, const mDNSAddr *const tpa, const mDNSEthAddr *const tha, mDNSInterfaceID InterfaceID);
2646*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSourceAddrForDest(mDNSAddr *const src, const mDNSAddr *const dst);
2647*48a54d36SAndroid Build Coastguard Worker 
2648*48a54d36SAndroid Build Coastguard Worker // mDNSPlatformTLSSetupCerts/mDNSPlatformTLSTearDownCerts used by dnsextd
2649*48a54d36SAndroid Build Coastguard Worker extern mStatus    mDNSPlatformTLSSetupCerts(void);
2650*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformTLSTearDownCerts(void);
2651*48a54d36SAndroid Build Coastguard Worker 
2652*48a54d36SAndroid Build Coastguard Worker // Platforms that support unicast browsing and dynamic update registration for clients who do not specify a domain
2653*48a54d36SAndroid Build Coastguard Worker // in browse/registration calls must implement these routines to get the "default" browse/registration list.
2654*48a54d36SAndroid Build Coastguard Worker 
2655*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSetDNSConfig(mDNS *const m, mDNSBool setservers, mDNSBool setsearch, domainname *const fqdn, DNameListElem **RegDomains, DNameListElem **BrowseDomains);
2656*48a54d36SAndroid Build Coastguard Worker extern mStatus    mDNSPlatformGetPrimaryInterface(mDNS *const m, mDNSAddr *v4, mDNSAddr *v6, mDNSAddr *router);
2657*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformDynDNSHostNameStatusChanged(const domainname *const dname, const mStatus status);
2658*48a54d36SAndroid Build Coastguard Worker 
2659*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSetAllowSleep(mDNS *const m, mDNSBool allowSleep, const char *reason);
2660*48a54d36SAndroid Build Coastguard Worker extern void       mDNSPlatformSendWakeupPacket(mDNS *const m, mDNSInterfaceID InterfaceID, char *EthAddr, char *IPAddr, int iteration);
2661*48a54d36SAndroid Build Coastguard Worker extern mDNSBool   mDNSPlatformValidRecordForInterface(AuthRecord *rr, const NetworkInterfaceInfo *intf);
2662*48a54d36SAndroid Build Coastguard Worker 
2663*48a54d36SAndroid Build Coastguard Worker #ifdef _LEGACY_NAT_TRAVERSAL_
2664*48a54d36SAndroid Build Coastguard Worker // Support for legacy NAT traversal protocols, implemented by the platform layer and callable by the core.
2665*48a54d36SAndroid Build Coastguard Worker extern void     LNT_SendDiscoveryMsg(mDNS *m);
2666*48a54d36SAndroid Build Coastguard Worker extern void     LNT_ConfigureRouterInfo(mDNS *m, const mDNSInterfaceID InterfaceID, const mDNSu8 *const data, const mDNSu16 len);
2667*48a54d36SAndroid Build Coastguard Worker extern mStatus  LNT_GetExternalAddress(mDNS *m);
2668*48a54d36SAndroid Build Coastguard Worker extern mStatus  LNT_MapPort(mDNS *m, NATTraversalInfo *n);
2669*48a54d36SAndroid Build Coastguard Worker extern mStatus  LNT_UnmapPort(mDNS *m, NATTraversalInfo *n);
2670*48a54d36SAndroid Build Coastguard Worker extern void     LNT_ClearState(mDNS *const m);
2671*48a54d36SAndroid Build Coastguard Worker #endif // _LEGACY_NAT_TRAVERSAL_
2672*48a54d36SAndroid Build Coastguard Worker 
2673*48a54d36SAndroid Build Coastguard Worker // The core mDNS code provides these functions, for the platform support code to call at appropriate times
2674*48a54d36SAndroid Build Coastguard Worker //
2675*48a54d36SAndroid Build Coastguard Worker // mDNS_SetFQDN() is called once on startup (typically from mDNSPlatformInit())
2676*48a54d36SAndroid Build Coastguard Worker // and then again on each subsequent change of the host name.
2677*48a54d36SAndroid Build Coastguard Worker //
2678*48a54d36SAndroid Build Coastguard Worker // mDNS_RegisterInterface() is used by the platform support layer to inform mDNSCore of what
2679*48a54d36SAndroid Build Coastguard Worker // physical and/or logical interfaces are available for sending and receiving packets.
2680*48a54d36SAndroid Build Coastguard Worker // Typically it is called on startup for each available interface, but register/deregister may be
2681*48a54d36SAndroid Build Coastguard Worker // called again later, on multiple occasions, to inform the core of interface configuration changes.
2682*48a54d36SAndroid Build Coastguard Worker // If set->Advertise is set non-zero, then mDNS_RegisterInterface() also registers the standard
2683*48a54d36SAndroid Build Coastguard Worker // resource records that should be associated with every publicised IP address/interface:
2684*48a54d36SAndroid Build Coastguard Worker // -- Name-to-address records (A/AAAA)
2685*48a54d36SAndroid Build Coastguard Worker // -- Address-to-name records (PTR)
2686*48a54d36SAndroid Build Coastguard Worker // -- Host information (HINFO)
2687*48a54d36SAndroid Build Coastguard Worker // IMPORTANT: The specified mDNSInterfaceID MUST NOT be 0, -1, or -2; these values have special meaning
2688*48a54d36SAndroid Build Coastguard Worker // mDNS_RegisterInterface does not result in the registration of global hostnames via dynamic update -
2689*48a54d36SAndroid Build Coastguard Worker // see mDNS_SetPrimaryInterfaceInfo, mDNS_AddDynDNSHostName, etc. for this purpose.
2690*48a54d36SAndroid Build Coastguard Worker // Note that the set may be deallocated immediately after it is deregistered via mDNS_DeegisterInterface.
2691*48a54d36SAndroid Build Coastguard Worker //
2692*48a54d36SAndroid Build Coastguard Worker // mDNS_RegisterDNS() is used by the platform support layer to provide the core with the addresses of
2693*48a54d36SAndroid Build Coastguard Worker // available domain name servers for unicast queries/updates.  RegisterDNS() should be called once for
2694*48a54d36SAndroid Build Coastguard Worker // each name server, typically at startup, or when a new name server becomes available.  DeregiterDNS()
2695*48a54d36SAndroid Build Coastguard Worker // must be called whenever a registered name server becomes unavailable.  DeregisterDNSList deregisters
2696*48a54d36SAndroid Build Coastguard Worker // all registered servers.  mDNS_DNSRegistered() returns true if one or more servers are registered in the core.
2697*48a54d36SAndroid Build Coastguard Worker //
2698*48a54d36SAndroid Build Coastguard Worker // mDNSCoreInitComplete() is called when the platform support layer is finished.
2699*48a54d36SAndroid Build Coastguard Worker // Typically this is at the end of mDNSPlatformInit(), but may be later
2700*48a54d36SAndroid Build Coastguard Worker // (on platforms like OT that allow asynchronous initialization of the networking stack).
2701*48a54d36SAndroid Build Coastguard Worker //
2702*48a54d36SAndroid Build Coastguard Worker // mDNSCoreReceive() is called when a UDP packet is received
2703*48a54d36SAndroid Build Coastguard Worker //
2704*48a54d36SAndroid Build Coastguard Worker // mDNSCoreMachineSleep() is called when the machine sleeps or wakes
2705*48a54d36SAndroid Build Coastguard Worker // (This refers to heavyweight laptop-style sleep/wake that disables network access,
2706*48a54d36SAndroid Build Coastguard Worker // not lightweight second-by-second CPU power management modes.)
2707*48a54d36SAndroid Build Coastguard Worker 
2708*48a54d36SAndroid Build Coastguard Worker extern void     mDNS_SetFQDN(mDNS *const m);
2709*48a54d36SAndroid Build Coastguard Worker extern void     mDNS_ActivateNetWake_internal  (mDNS *const m, NetworkInterfaceInfo *set);
2710*48a54d36SAndroid Build Coastguard Worker extern void     mDNS_DeactivateNetWake_internal(mDNS *const m, NetworkInterfaceInfo *set);
2711*48a54d36SAndroid Build Coastguard Worker extern mStatus  mDNS_RegisterInterface  (mDNS *const m, NetworkInterfaceInfo *set, mDNSBool flapping);
2712*48a54d36SAndroid Build Coastguard Worker extern void     mDNS_DeregisterInterface(mDNS *const m, NetworkInterfaceInfo *set, mDNSBool flapping);
2713*48a54d36SAndroid Build Coastguard Worker extern void     mDNSCoreInitComplete(mDNS *const m, mStatus result);
2714*48a54d36SAndroid Build Coastguard Worker extern void     mDNSCoreReceive(mDNS *const m, void *const msg, const mDNSu8 *const end,
2715*48a54d36SAndroid Build Coastguard Worker 								const mDNSAddr *const srcaddr, const mDNSIPPort srcport,
2716*48a54d36SAndroid Build Coastguard Worker 								const mDNSAddr *dstaddr, const mDNSIPPort dstport, const mDNSInterfaceID InterfaceID);
2717*48a54d36SAndroid Build Coastguard Worker extern void		mDNSCoreRestartQueries(mDNS *const m);
2718*48a54d36SAndroid Build Coastguard Worker typedef void    (*FlushCache)(mDNS *const m);
2719*48a54d36SAndroid Build Coastguard Worker typedef void    (*CallbackBeforeStartQuery)(mDNS *const m, void *context);
2720*48a54d36SAndroid Build Coastguard Worker extern void		mDNSCoreRestartAddressQueries(mDNS *const m, mDNSBool SearchDomainsChanged, FlushCache flushCacheRecords,
2721*48a54d36SAndroid Build Coastguard Worker 											  CallbackBeforeStartQuery beforeQueryStart, void *context);
2722*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSCoreHaveAdvertisedMulticastServices(mDNS *const m);
2723*48a54d36SAndroid Build Coastguard Worker extern void     mDNSCoreMachineSleep(mDNS *const m, mDNSBool wake);
2724*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSCoreReadyForSleep(mDNS *m, mDNSs32 now);
2725*48a54d36SAndroid Build Coastguard Worker extern mDNSs32  mDNSCoreIntervalToNextWake(mDNS *const m, mDNSs32 now);
2726*48a54d36SAndroid Build Coastguard Worker 
2727*48a54d36SAndroid Build Coastguard Worker extern void     mDNSCoreReceiveRawPacket  (mDNS *const m, const mDNSu8 *const p, const mDNSu8 *const end, const mDNSInterfaceID InterfaceID);
2728*48a54d36SAndroid Build Coastguard Worker 
2729*48a54d36SAndroid Build Coastguard Worker extern mDNSBool mDNSAddrIsDNSMulticast(const mDNSAddr *ip);
2730*48a54d36SAndroid Build Coastguard Worker 
2731*48a54d36SAndroid Build Coastguard Worker extern CacheRecord *CreateNewCacheEntry(mDNS *const m, const mDNSu32 slot, CacheGroup *cg, mDNSs32 delay);
2732*48a54d36SAndroid Build Coastguard Worker extern void ScheduleNextCacheCheckTime(mDNS *const m, const mDNSu32 slot, const mDNSs32 event);
2733*48a54d36SAndroid Build Coastguard Worker extern void GrantCacheExtensions(mDNS *const m, DNSQuestion *q, mDNSu32 lease);
2734*48a54d36SAndroid Build Coastguard Worker extern void MakeNegativeCacheRecord(mDNS *const m, CacheRecord *const cr,
2735*48a54d36SAndroid Build Coastguard Worker 	const domainname *const name, const mDNSu32 namehash, const mDNSu16 rrtype, const mDNSu16 rrclass, mDNSu32 ttl_seconds,
2736*48a54d36SAndroid Build Coastguard Worker 	mDNSInterfaceID InterfaceID, DNSServer *dnsserver);
2737*48a54d36SAndroid Build Coastguard Worker extern void CompleteDeregistration(mDNS *const m, AuthRecord *rr);
2738*48a54d36SAndroid Build Coastguard Worker extern void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheRecord *const rr, const QC_result AddRecord);
2739*48a54d36SAndroid Build Coastguard Worker extern char *InterfaceNameForID(mDNS *const m, const mDNSInterfaceID InterfaceID);
2740*48a54d36SAndroid Build Coastguard Worker extern void DNSServerChangeForQuestion(mDNS *const m, DNSQuestion *q, DNSServer *newServer);
2741*48a54d36SAndroid Build Coastguard Worker extern void ActivateUnicastRegistration(mDNS *const m, AuthRecord *const rr);
2742*48a54d36SAndroid Build Coastguard Worker extern void CheckSuppressUnusableQuestions(mDNS *const m);
2743*48a54d36SAndroid Build Coastguard Worker extern void RetrySearchDomainQuestions(mDNS *const m);
2744*48a54d36SAndroid Build Coastguard Worker 
2745*48a54d36SAndroid Build Coastguard Worker // Used only in logging to restrict the number of /etc/hosts entries printed
2746*48a54d36SAndroid Build Coastguard Worker extern void FreeEtcHosts(mDNS *const m, AuthRecord *const rr, mStatus result);
2747*48a54d36SAndroid Build Coastguard Worker // exported for using the hash for /etc/hosts AuthRecords
2748*48a54d36SAndroid Build Coastguard Worker extern AuthGroup *AuthGroupForName(AuthHash *r, const mDNSu32 slot, const mDNSu32 namehash, const domainname *const name);
2749*48a54d36SAndroid Build Coastguard Worker extern AuthGroup *AuthGroupForRecord(AuthHash *r, const mDNSu32 slot, const ResourceRecord *const rr);
2750*48a54d36SAndroid Build Coastguard Worker extern AuthGroup *InsertAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr);
2751*48a54d36SAndroid Build Coastguard Worker extern AuthGroup *RemoveAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr);
2752*48a54d36SAndroid Build Coastguard Worker 
2753*48a54d36SAndroid Build Coastguard Worker // For now this AutoTunnel stuff is specific to Mac OS X.
2754*48a54d36SAndroid Build Coastguard Worker // In the future, if there's demand, we may see if we can abstract it out cleanly into the platform layer
2755*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
2756*48a54d36SAndroid Build Coastguard Worker extern void AutoTunnelCallback(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord);
2757*48a54d36SAndroid Build Coastguard Worker extern void AddNewClientTunnel(mDNS *const m, DNSQuestion *const q);
2758*48a54d36SAndroid Build Coastguard Worker extern void SetupLocalAutoTunnelInterface_internal(mDNS *const m, mDNSBool servicesStarting);
2759*48a54d36SAndroid Build Coastguard Worker extern void UpdateAutoTunnelDomainStatuses(const mDNS *const m);
2760*48a54d36SAndroid Build Coastguard Worker extern mStatus ActivateLocalProxy(mDNS *const m, char *ifname);
2761*48a54d36SAndroid Build Coastguard Worker extern void RemoveAutoTunnel6Record(mDNS *const m);
2762*48a54d36SAndroid Build Coastguard Worker extern mDNSBool RecordReadyForSleep(mDNS *const m, AuthRecord *rr);
2763*48a54d36SAndroid Build Coastguard Worker #endif
2764*48a54d36SAndroid Build Coastguard Worker 
2765*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2766*48a54d36SAndroid Build Coastguard Worker #if 0
2767*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2768*48a54d36SAndroid Build Coastguard Worker #pragma mark - Sleep Proxy
2769*48a54d36SAndroid Build Coastguard Worker #endif
2770*48a54d36SAndroid Build Coastguard Worker 
2771*48a54d36SAndroid Build Coastguard Worker // Sleep Proxy Server Property Encoding
2772*48a54d36SAndroid Build Coastguard Worker //
2773*48a54d36SAndroid Build Coastguard Worker // Sleep Proxy Servers are advertised using a structured service name, consisting of four
2774*48a54d36SAndroid Build Coastguard Worker // metrics followed by a human-readable name. The metrics assist clients in deciding which
2775*48a54d36SAndroid Build Coastguard Worker // Sleep Proxy Server(s) to use when multiple are available on the network. Each metric
2776*48a54d36SAndroid Build Coastguard Worker // is a two-digit decimal number in the range 10-99. Lower metrics are generally better.
2777*48a54d36SAndroid Build Coastguard Worker //
2778*48a54d36SAndroid Build Coastguard Worker //   AA-BB-CC-DD Name
2779*48a54d36SAndroid Build Coastguard Worker //
2780*48a54d36SAndroid Build Coastguard Worker // Metrics:
2781*48a54d36SAndroid Build Coastguard Worker //
2782*48a54d36SAndroid Build Coastguard Worker // AA = Intent
2783*48a54d36SAndroid Build Coastguard Worker // BB = Portability
2784*48a54d36SAndroid Build Coastguard Worker // CC = Marginal Power
2785*48a54d36SAndroid Build Coastguard Worker // DD = Total Power
2786*48a54d36SAndroid Build Coastguard Worker //
2787*48a54d36SAndroid Build Coastguard Worker //
2788*48a54d36SAndroid Build Coastguard Worker // ** Intent Metric **
2789*48a54d36SAndroid Build Coastguard Worker //
2790*48a54d36SAndroid Build Coastguard Worker // 20 = Dedicated Sleep Proxy Server -- a device, permanently powered on,
2791*48a54d36SAndroid Build Coastguard Worker //      installed for the express purpose of providing Sleep Proxy Service.
2792*48a54d36SAndroid Build Coastguard Worker //
2793*48a54d36SAndroid Build Coastguard Worker // 30 = Primary Network Infrastructure Hardware -- a router, DHCP server, NAT gateway,
2794*48a54d36SAndroid Build Coastguard Worker //      or similar permanently installed device which is permanently powered on.
2795*48a54d36SAndroid Build Coastguard Worker //      This is hardware designed for the express purpose of being network
2796*48a54d36SAndroid Build Coastguard Worker //      infrastructure, and for most home users is typically a single point
2797*48a54d36SAndroid Build Coastguard Worker //      of failure for the local network -- e.g. most home users only have
2798*48a54d36SAndroid Build Coastguard Worker //      a single NAT gateway / DHCP server. Even though in principle the
2799*48a54d36SAndroid Build Coastguard Worker //      hardware might technically be capable of running different software,
2800*48a54d36SAndroid Build Coastguard Worker //      a typical user is unlikely to do that. e.g. AirPort base station.
2801*48a54d36SAndroid Build Coastguard Worker //
2802*48a54d36SAndroid Build Coastguard Worker // 40 = Primary Network Infrastructure Software -- a general-purpose computer
2803*48a54d36SAndroid Build Coastguard Worker //      (e.g. Mac, Windows, Linux, etc.) which is currently running DHCP server
2804*48a54d36SAndroid Build Coastguard Worker //      or NAT gateway software, but the user could choose to turn that off
2805*48a54d36SAndroid Build Coastguard Worker //      fairly easily. e.g. iMac running Internet Sharing
2806*48a54d36SAndroid Build Coastguard Worker //
2807*48a54d36SAndroid Build Coastguard Worker // 50 = Secondary Network Infrastructure Hardware -- like primary infrastructure
2808*48a54d36SAndroid Build Coastguard Worker //      hardware, except not a single point of failure for the entire local network.
2809*48a54d36SAndroid Build Coastguard Worker //      For example, an AirPort base station in bridge mode. This may have clients
2810*48a54d36SAndroid Build Coastguard Worker //      associated with it, and if it goes away those clients will be inconvenienced,
2811*48a54d36SAndroid Build Coastguard Worker //      but unlike the NAT gateway / DHCP server, the entire local network is not
2812*48a54d36SAndroid Build Coastguard Worker //      dependent on it.
2813*48a54d36SAndroid Build Coastguard Worker //
2814*48a54d36SAndroid Build Coastguard Worker // 60 = Secondary Network Infrastructure Software -- like 50, but in a general-
2815*48a54d36SAndroid Build Coastguard Worker //      purpose CPU.
2816*48a54d36SAndroid Build Coastguard Worker //
2817*48a54d36SAndroid Build Coastguard Worker // 70 = Incidentally Available Hardware -- a device which has no power switch
2818*48a54d36SAndroid Build Coastguard Worker //      and is generally left powered on all the time. Even though it is not a
2819*48a54d36SAndroid Build Coastguard Worker //      part of what we conventionally consider network infrastructure (router,
2820*48a54d36SAndroid Build Coastguard Worker //      DHCP, NAT, DNS, etc.), and the rest of the network can operate fine
2821*48a54d36SAndroid Build Coastguard Worker //      without it, since it's available and unlikely to be turned off, it is a
2822*48a54d36SAndroid Build Coastguard Worker //      reasonable candidate for providing Sleep Proxy Service e.g. Apple TV,
2823*48a54d36SAndroid Build Coastguard Worker //      or an AirPort base station in client mode, associated with an existing
2824*48a54d36SAndroid Build Coastguard Worker //      wireless network (e.g. AirPort Express connected to a music system, or
2825*48a54d36SAndroid Build Coastguard Worker //      being used to share a USB printer).
2826*48a54d36SAndroid Build Coastguard Worker //
2827*48a54d36SAndroid Build Coastguard Worker // 80 = Incidentally Available Software -- a general-purpose computer which
2828*48a54d36SAndroid Build Coastguard Worker //      happens at this time to be set to "never sleep", and as such could be
2829*48a54d36SAndroid Build Coastguard Worker //      useful as a Sleep Proxy Server, but has not been intentionally provided
2830*48a54d36SAndroid Build Coastguard Worker //      for this purpose. Of all the Intent Metric categories this is the
2831*48a54d36SAndroid Build Coastguard Worker //      one most likely to be shut down or put to sleep without warning.
2832*48a54d36SAndroid Build Coastguard Worker //      However, if nothing else is availalable, it may be better than nothing.
2833*48a54d36SAndroid Build Coastguard Worker //      e.g. Office computer in the workplace which has been set to "never sleep"
2834*48a54d36SAndroid Build Coastguard Worker //
2835*48a54d36SAndroid Build Coastguard Worker //
2836*48a54d36SAndroid Build Coastguard Worker // ** Portability Metric **
2837*48a54d36SAndroid Build Coastguard Worker //
2838*48a54d36SAndroid Build Coastguard Worker // Inversely related to mass of device, on the basis that, all other things
2839*48a54d36SAndroid Build Coastguard Worker // being equal, heavier devices are less likely to be moved than lighter devices.
2840*48a54d36SAndroid Build Coastguard Worker // E.g. A MacBook running Internet Sharing is probably more likely to be
2841*48a54d36SAndroid Build Coastguard Worker // put to sleep and taken away than a Mac Pro running Internet Sharing.
2842*48a54d36SAndroid Build Coastguard Worker // The Portability Metric is a logarithmic decibel scale, computed by taking the
2843*48a54d36SAndroid Build Coastguard Worker // (approximate) mass of the device in milligrammes, taking the base 10 logarithm
2844*48a54d36SAndroid Build Coastguard Worker // of that, multiplying by 10, and subtracting the result from 100:
2845*48a54d36SAndroid Build Coastguard Worker //
2846*48a54d36SAndroid Build Coastguard Worker //   Portability Metric = 100 - (log10(mg) * 10)
2847*48a54d36SAndroid Build Coastguard Worker //
2848*48a54d36SAndroid Build Coastguard Worker // The Portability Metric is not necessarily computed literally from the actual
2849*48a54d36SAndroid Build Coastguard Worker // mass of the device; the intent is just that lower numbers indicate more
2850*48a54d36SAndroid Build Coastguard Worker // permanent devices, and higher numbers indicate devices more likely to be
2851*48a54d36SAndroid Build Coastguard Worker // removed from the network, e.g., in order of increasing portability:
2852*48a54d36SAndroid Build Coastguard Worker //
2853*48a54d36SAndroid Build Coastguard Worker // Mac Pro < iMac < Laptop < iPhone
2854*48a54d36SAndroid Build Coastguard Worker //
2855*48a54d36SAndroid Build Coastguard Worker // Example values:
2856*48a54d36SAndroid Build Coastguard Worker //
2857*48a54d36SAndroid Build Coastguard Worker // 10 = 1 metric tonne
2858*48a54d36SAndroid Build Coastguard Worker // 40 = 1kg
2859*48a54d36SAndroid Build Coastguard Worker // 70 = 1g
2860*48a54d36SAndroid Build Coastguard Worker // 90 = 10mg
2861*48a54d36SAndroid Build Coastguard Worker //
2862*48a54d36SAndroid Build Coastguard Worker //
2863*48a54d36SAndroid Build Coastguard Worker // ** Marginal Power and Total Power Metrics **
2864*48a54d36SAndroid Build Coastguard Worker //
2865*48a54d36SAndroid Build Coastguard Worker // The Marginal Power Metric is the power difference between sleeping and staying awake
2866*48a54d36SAndroid Build Coastguard Worker // to be a Sleep Proxy Server.
2867*48a54d36SAndroid Build Coastguard Worker //
2868*48a54d36SAndroid Build Coastguard Worker // The Total Power Metric is the total power consumption when being Sleep Proxy Server.
2869*48a54d36SAndroid Build Coastguard Worker //
2870*48a54d36SAndroid Build Coastguard Worker // The Power Metrics use a logarithmic decibel scale, computed as ten times the
2871*48a54d36SAndroid Build Coastguard Worker // base 10 logarithm of the (approximate) power in microwatts:
2872*48a54d36SAndroid Build Coastguard Worker //
2873*48a54d36SAndroid Build Coastguard Worker //   Power Metric = log10(uW) * 10
2874*48a54d36SAndroid Build Coastguard Worker //
2875*48a54d36SAndroid Build Coastguard Worker // Higher values indicate higher power consumption. Example values:
2876*48a54d36SAndroid Build Coastguard Worker //
2877*48a54d36SAndroid Build Coastguard Worker // 10 =  10 uW
2878*48a54d36SAndroid Build Coastguard Worker // 20 = 100 uW
2879*48a54d36SAndroid Build Coastguard Worker // 30 =   1 mW
2880*48a54d36SAndroid Build Coastguard Worker // 60 =   1 W
2881*48a54d36SAndroid Build Coastguard Worker // 90 =   1 kW
2882*48a54d36SAndroid Build Coastguard Worker 
2883*48a54d36SAndroid Build Coastguard Worker typedef enum
2884*48a54d36SAndroid Build Coastguard Worker 	{
2885*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_Dedicated          = 20,
2886*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_PrimaryHardware    = 30,
2887*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_PrimarySoftware    = 40,
2888*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_SecondaryHardware  = 50,
2889*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_SecondarySoftware  = 60,
2890*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_IncidentalHardware = 70,
2891*48a54d36SAndroid Build Coastguard Worker 	mDNSSleepProxyMetric_IncidentalSoftware = 80
2892*48a54d36SAndroid Build Coastguard Worker 	} mDNSSleepProxyMetric;
2893*48a54d36SAndroid Build Coastguard Worker 
2894*48a54d36SAndroid Build Coastguard Worker extern void mDNSCoreBeSleepProxyServer_internal(mDNS *const m, mDNSu8 sps, mDNSu8 port, mDNSu8 marginalpower, mDNSu8 totpower);
2895*48a54d36SAndroid Build Coastguard Worker #define mDNSCoreBeSleepProxyServer(M,S,P,MP,TP) \
2896*48a54d36SAndroid Build Coastguard Worker 	do { mDNS_Lock(m); mDNSCoreBeSleepProxyServer_internal((M),(S),(P),(MP),(TP)); mDNS_Unlock(m); } while(0)
2897*48a54d36SAndroid Build Coastguard Worker 
2898*48a54d36SAndroid Build Coastguard Worker extern void FindSPSInCache(mDNS *const m, const DNSQuestion *const q, const CacheRecord *sps[3]);
2899*48a54d36SAndroid Build Coastguard Worker #define PrototypeSPSName(X) ((X)[0] >= 11 && (X)[3] == '-' && (X)[ 4] == '9' && (X)[ 5] == '9' && \
2900*48a54d36SAndroid Build Coastguard Worker                                              (X)[6] == '-' && (X)[ 7] == '9' && (X)[ 8] == '9' && \
2901*48a54d36SAndroid Build Coastguard Worker                                              (X)[9] == '-' && (X)[10] == '9' && (X)[11] == '9'    )
2902*48a54d36SAndroid Build Coastguard Worker #define ValidSPSName(X) ((X)[0] >= 5 && mDNSIsDigit((X)[1]) && mDNSIsDigit((X)[2]) && mDNSIsDigit((X)[4]) && mDNSIsDigit((X)[5]))
2903*48a54d36SAndroid Build Coastguard Worker #define SPSMetric(X) (!ValidSPSName(X) || PrototypeSPSName(X) ? 1000000 : \
2904*48a54d36SAndroid Build Coastguard Worker 	((X)[1]-'0') * 100000 + ((X)[2]-'0') * 10000 + ((X)[4]-'0') * 1000 + ((X)[5]-'0') * 100 + ((X)[7]-'0') * 10 + ((X)[8]-'0'))
2905*48a54d36SAndroid Build Coastguard Worker 
2906*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2907*48a54d36SAndroid Build Coastguard Worker #if 0
2908*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2909*48a54d36SAndroid Build Coastguard Worker #pragma mark - Compile-Time assertion checks
2910*48a54d36SAndroid Build Coastguard Worker #endif
2911*48a54d36SAndroid Build Coastguard Worker 
2912*48a54d36SAndroid Build Coastguard Worker // Some C compiler cleverness. We can make the compiler check certain things for
2913*48a54d36SAndroid Build Coastguard Worker // us, and report compile-time errors if anything is wrong. The usual way to do
2914*48a54d36SAndroid Build Coastguard Worker // this would be to use a run-time "if" statement, but then you don't find out
2915*48a54d36SAndroid Build Coastguard Worker // what's wrong until you run the software. This way, if the assertion condition
2916*48a54d36SAndroid Build Coastguard Worker // is false, the array size is negative, and the complier complains immediately.
2917*48a54d36SAndroid Build Coastguard Worker 
2918*48a54d36SAndroid Build Coastguard Worker struct CompileTimeAssertionChecks_mDNS
2919*48a54d36SAndroid Build Coastguard Worker 	{
2920*48a54d36SAndroid Build Coastguard Worker 	// Check that the compiler generated our on-the-wire packet format structure definitions
2921*48a54d36SAndroid Build Coastguard Worker 	// properly packed, without adding padding bytes to align fields on 32-bit or 64-bit boundaries.
2922*48a54d36SAndroid Build Coastguard Worker 	char assert0[(sizeof(rdataSRV)         == 262                          ) ? 1 : -1];
2923*48a54d36SAndroid Build Coastguard Worker 	char assert1[(sizeof(DNSMessageHeader) ==  12                          ) ? 1 : -1];
2924*48a54d36SAndroid Build Coastguard Worker 	char assert2[(sizeof(DNSMessage)       ==  12+AbsoluteMaxDNSMessageData) ? 1 : -1];
2925*48a54d36SAndroid Build Coastguard Worker 	char assert3[(sizeof(mDNSs8)           ==   1                          ) ? 1 : -1];
2926*48a54d36SAndroid Build Coastguard Worker 	char assert4[(sizeof(mDNSu8)           ==   1                          ) ? 1 : -1];
2927*48a54d36SAndroid Build Coastguard Worker 	char assert5[(sizeof(mDNSs16)          ==   2                          ) ? 1 : -1];
2928*48a54d36SAndroid Build Coastguard Worker 	char assert6[(sizeof(mDNSu16)          ==   2                          ) ? 1 : -1];
2929*48a54d36SAndroid Build Coastguard Worker 	char assert7[(sizeof(mDNSs32)          ==   4                          ) ? 1 : -1];
2930*48a54d36SAndroid Build Coastguard Worker 	char assert8[(sizeof(mDNSu32)          ==   4                          ) ? 1 : -1];
2931*48a54d36SAndroid Build Coastguard Worker 	char assert9[(sizeof(mDNSOpaque16)     ==   2                          ) ? 1 : -1];
2932*48a54d36SAndroid Build Coastguard Worker 	char assertA[(sizeof(mDNSOpaque32)     ==   4                          ) ? 1 : -1];
2933*48a54d36SAndroid Build Coastguard Worker 	char assertB[(sizeof(mDNSOpaque128)    ==  16                          ) ? 1 : -1];
2934*48a54d36SAndroid Build Coastguard Worker 	char assertC[(sizeof(CacheRecord  )    ==  sizeof(CacheGroup)          ) ? 1 : -1];
2935*48a54d36SAndroid Build Coastguard Worker 	char assertD[(sizeof(int)              >=  4                           ) ? 1 : -1];
2936*48a54d36SAndroid Build Coastguard Worker 	char assertE[(StandardAuthRDSize       >=  256                         ) ? 1 : -1];
2937*48a54d36SAndroid Build Coastguard Worker 	char assertF[(sizeof(EthernetHeader)   ==   14                         ) ? 1 : -1];
2938*48a54d36SAndroid Build Coastguard Worker 	char assertG[(sizeof(ARP_EthIP     )   ==   28                         ) ? 1 : -1];
2939*48a54d36SAndroid Build Coastguard Worker 	char assertH[(sizeof(IPv4Header    )   ==   20                         ) ? 1 : -1];
2940*48a54d36SAndroid Build Coastguard Worker 	char assertI[(sizeof(IPv6Header    )   ==   40                         ) ? 1 : -1];
2941*48a54d36SAndroid Build Coastguard Worker 	char assertJ[(sizeof(IPv6NDP       )   ==   24                         ) ? 1 : -1];
2942*48a54d36SAndroid Build Coastguard Worker 	char assertK[(sizeof(UDPHeader     )   ==    8                         ) ? 1 : -1];
2943*48a54d36SAndroid Build Coastguard Worker 	char assertL[(sizeof(IKEHeader     )   ==   28                         ) ? 1 : -1];
2944*48a54d36SAndroid Build Coastguard Worker 	char assertM[(sizeof(TCPHeader     )   ==   20                         ) ? 1 : -1];
2945*48a54d36SAndroid Build Coastguard Worker 
2946*48a54d36SAndroid Build Coastguard Worker 	// Check our structures are reasonable sizes. Including overly-large buffers, or embedding
2947*48a54d36SAndroid Build Coastguard Worker 	// other overly-large structures instead of having a pointer to them, can inadvertently
2948*48a54d36SAndroid Build Coastguard Worker 	// cause structure sizes (and therefore memory usage) to balloon unreasonably.
2949*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_RDataBody           [(sizeof(RDataBody)            ==   264) ? 1 : -1];
2950*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_ResourceRecord      [(sizeof(ResourceRecord)       <=    64) ? 1 : -1];
2951*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_AuthRecord          [(sizeof(AuthRecord)           <=  1208) ? 1 : -1];
2952*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_CacheRecord         [(sizeof(CacheRecord)          <=   184) ? 1 : -1];
2953*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_CacheGroup          [(sizeof(CacheGroup)           <=   184) ? 1 : -1];
2954*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_DNSQuestion         [(sizeof(DNSQuestion)          <=   786) ? 1 : -1];
2955*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_ZoneData            [(sizeof(ZoneData)             <=  1624) ? 1 : -1];
2956*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_NATTraversalInfo    [(sizeof(NATTraversalInfo)     <=   192) ? 1 : -1];
2957*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_HostnameInfo        [(sizeof(HostnameInfo)         <=  3050) ? 1 : -1];
2958*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_DNSServer           [(sizeof(DNSServer)            <=   320) ? 1 : -1];
2959*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_NetworkInterfaceInfo[(sizeof(NetworkInterfaceInfo) <=  6850) ? 1 : -1];
2960*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_ServiceRecordSet    [(sizeof(ServiceRecordSet)     <=  5500) ? 1 : -1];
2961*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_DomainAuthInfo      [(sizeof(DomainAuthInfo)       <=  7808) ? 1 : -1];
2962*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_ServiceInfoQuery    [(sizeof(ServiceInfoQuery)     <=  3200) ? 1 : -1];
2963*48a54d36SAndroid Build Coastguard Worker #if APPLE_OSX_mDNSResponder
2964*48a54d36SAndroid Build Coastguard Worker 	char sizecheck_ClientTunnel        [(sizeof(ClientTunnel)         <=  1148) ? 1 : -1];
2965*48a54d36SAndroid Build Coastguard Worker #endif
2966*48a54d36SAndroid Build Coastguard Worker 	};
2967*48a54d36SAndroid Build Coastguard Worker 
2968*48a54d36SAndroid Build Coastguard Worker // ***************************************************************************
2969*48a54d36SAndroid Build Coastguard Worker 
2970*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus
2971*48a54d36SAndroid Build Coastguard Worker 	}
2972*48a54d36SAndroid Build Coastguard Worker #endif
2973*48a54d36SAndroid Build Coastguard Worker 
2974*48a54d36SAndroid Build Coastguard Worker #endif
2975