1 /*
2  * Copyright (c) 2018-2019 Apple Inc. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __ClientRequests_h
18 #define __ClientRequests_h
19 
20 #include "mDNSEmbeddedAPI.h"
21 #include "dns_sd_internal.h"
22 
23 typedef void (*QueryRecordResultHandler)(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord,
24     DNSServiceErrorType error, void *context);
25 
26 typedef struct
27 {
28     DNSQuestion                 q;                      // DNSQuestion for record query.
29     domainname *                qname;                  // Name of the original record.
30     mDNSInterfaceID             interfaceID;            // Interface over which to perform query.
31     QueryRecordResultHandler    resultHandler;          // Handler for query record operation results.
32     void *                      resultContext;          // Context to pass to result handler.
33     mDNSu32                     reqID;                  //
34     int                         searchListIndex;        // Index that indicates the next search domain to try.
35 #if MDNSRESPONDER_SUPPORTS(APPLE, UNICAST_DOTLOCAL)
36     DNSQuestion *               q2;                     // DNSQuestion for unicast version of a record with a dot-local name.
37     mDNSu16                     q2Type;                 // q2's original qtype value.
38     mDNSBool                    q2LongLived;            // q2's original LongLived value.
39     mDNSBool                    q2ReturnIntermed;       // q2's original ReturnIntermed value.
40     mDNSBool                    q2TimeoutQuestion;      // q2's original TimeoutQuestion value.
41     mDNSBool                    q2AppendSearchDomains;  // q2's original AppendSearchDomains value.
42 #endif
43 #if MDNSRESPONDER_SUPPORTS(APPLE, REACHABILITY_TRIGGER)
44     mDNSBool                    answered;               // True if the query was answered.
45 #endif
46 
47 }   QueryRecordOp;
48 
49 typedef struct
50 {
51     mDNSInterfaceID     interfaceID;    // InterfaceID being used for query record operations.
52     mDNSu32             protocols;      // Protocols (IPv4, IPv6) specified by client.
53     QueryRecordOp *     op4;            // Query record operation object for A record.
54     QueryRecordOp *     op6;            // Query record operation object for AAAA record.
55 
56 }   GetAddrInfoClientRequest;
57 
58 typedef struct
59 {
60     QueryRecordOp       op; // Query record operation object.
61 
62 }   QueryRecordClientRequest;
63 
64 typedef struct
65 {
66     mDNSu32                 requestID;
67     const char *            hostnameStr;
68     mDNSu32                 interfaceIndex;
69     DNSServiceFlags         flags;
70     mDNSu32                 protocols;
71     mDNSs32                 effectivePID;
72     const mDNSu8 *          effectiveUUID;
73     mDNSu32                 peerUID;
74 #if MDNSRESPONDER_SUPPORTS(APPLE, QUERIER)
75     mDNSBool                needEncryption;
76     const mDNSu8 *          resolverUUID;
77     mdns_dns_service_id_t   customID;
78 #endif
79 #if MDNSRESPONDER_SUPPORTS(APPLE, AUDIT_TOKEN)
80     const audit_token_t *   peerAuditToken;
81     const audit_token_t *   delegatorAuditToken;
82     mDNSBool                isInAppBrowserRequest;
83 #endif
84 
85 }   GetAddrInfoClientRequestParams;
86 
87 typedef struct
88 {
89     mDNSu32                 requestID;
90     const char *            qnameStr;
91     mDNSu32                 interfaceIndex;
92     DNSServiceFlags         flags;
93     mDNSu16                 qtype;
94     mDNSu16                 qclass;
95     mDNSs32                 effectivePID;
96     const mDNSu8 *          effectiveUUID;
97     mDNSu32                 peerUID;
98 #if MDNSRESPONDER_SUPPORTS(APPLE, QUERIER)
99     mDNSBool                needEncryption;
100     const mDNSu8 *          resolverUUID;
101 	mdns_dns_service_id_t	customID;
102 #endif
103 #if MDNSRESPONDER_SUPPORTS(APPLE, AUDIT_TOKEN)
104     const audit_token_t *   peerAuditToken;
105     const audit_token_t *   delegatorAuditToken;
106     mDNSBool                isInAppBrowserRequest;
107 #endif
108 
109 }   QueryRecordClientRequestParams;
110 
111 #ifdef __cplusplus
112 extern "C" {
113 #endif
114 
115 mDNSexport void GetAddrInfoClientRequestParamsInit(GetAddrInfoClientRequestParams *inParams);
116 mDNSexport mStatus GetAddrInfoClientRequestStart(GetAddrInfoClientRequest *inRequest,
117     const GetAddrInfoClientRequestParams *inParams, QueryRecordResultHandler inResultHandler, void *inResultContext);
118 mDNSexport void GetAddrInfoClientRequestStop(GetAddrInfoClientRequest *inRequest);
119 mDNSexport const domainname * GetAddrInfoClientRequestGetQName(const GetAddrInfoClientRequest *inRequest);
120 mDNSexport mDNSBool GetAddrInfoClientRequestIsMulticast(const GetAddrInfoClientRequest *inRequest);
121 
122 mDNSexport void QueryRecordClientRequestParamsInit(QueryRecordClientRequestParams *inParams);
123 mDNSexport mStatus QueryRecordClientRequestStart(QueryRecordClientRequest *inRequest,
124     const QueryRecordClientRequestParams *inParams, QueryRecordResultHandler inResultHandler, void *inResultContext);
125 mDNSexport void QueryRecordClientRequestStop(QueryRecordClientRequest *inRequest);
126 mDNSexport const domainname * QueryRecordClientRequestGetQName(const QueryRecordClientRequest *inRequest);
127 mDNSexport mDNSu16 QueryRecordClientRequestGetType(const QueryRecordClientRequest *inRequest);
128 mDNSexport mDNSBool QueryRecordClientRequestIsMulticast(QueryRecordClientRequest *inRequest);
129 
130 #if MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2)
131 // This is a "mDNSexport" wrapper around the "static" QueryRecordOpStart that cannot be called by outside, which can be
132 // called by the outside(dnssec related function).
133 mDNSexport mStatus QueryRecordOpStartForClientRequest(
134     QueryRecordOp *             inOp,
135     mDNSu32                     inReqID,
136     const domainname *          inQName,
137     mDNSu16                     inQType,
138     mDNSu16                     inQClass,
139     mDNSInterfaceID             inInterfaceID,
140     mDNSs32                     inServiceID,
141     mDNSu32                     inFlags,
142     mDNSBool                    inAppendSearchDomains,
143     mDNSs32                     inPID,
144     const mDNSu8                inUUID[UUID_SIZE],
145     mDNSu32                     inUID,
146 #if MDNSRESPONDER_SUPPORTS(APPLE, AUDIT_TOKEN)
147     const audit_token_t *       inPeerAuditTokenPtr,
148     const audit_token_t *       inDelegateAuditTokenPtr,
149 #endif
150 #if MDNSRESPONDER_SUPPORTS(APPLE, QUERIER)
151     const mDNSu8                inResolverUUID[UUID_SIZE],
152     mDNSBool                    inNeedEncryption,
153     const mdns_dns_service_id_t inCustomID,
154 #endif
155     QueryRecordResultHandler    inResultHandler,
156     void *                      inResultContext);
157 
158 mDNSexport void QueryRecordOpStopForClientRequest(QueryRecordOp *op);
159 #endif // MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2)
160 
161 #ifdef __cplusplus
162 }
163 #endif
164 
165 #endif  // __ClientRequests_h
166