1*472cd20dSToomas Soome /*
2*472cd20dSToomas Soome  * Copyright (c) 2002-2020 Apple Inc. All rights reserved.
34b22b933Srs  *
44b22b933Srs  * Licensed under the Apache License, Version 2.0 (the "License");
54b22b933Srs  * you may not use this file except in compliance with the License.
64b22b933Srs  * You may obtain a copy of the License at
75ffb0c9bSToomas Soome  *
84b22b933Srs  *     http://www.apache.org/licenses/LICENSE-2.0
95ffb0c9bSToomas Soome  *
104b22b933Srs  * Unless required by applicable law or agreed to in writing, software
114b22b933Srs  * distributed under the License is distributed on an "AS IS" BASIS,
124b22b933Srs  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b22b933Srs  * See the License for the specific language governing permissions and
144b22b933Srs  * limitations under the License.
154b22b933Srs  */
164b22b933Srs 
174b22b933Srs #ifndef __UDNS_H_
184b22b933Srs #define __UDNS_H_
194b22b933Srs 
204b22b933Srs #include "mDNSEmbeddedAPI.h"
214b22b933Srs #include "DNSCommon.h"
22*472cd20dSToomas Soome #include <sys/types.h>
23*472cd20dSToomas Soome #include "dns_sd.h"
24*472cd20dSToomas Soome 
25*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(COMMON, DNS_PUSH)
26*472cd20dSToomas Soome #include "dso.h"
27*472cd20dSToomas Soome #include "dso-transport.h"
28*472cd20dSToomas Soome #endif
294b22b933Srs 
305ffb0c9bSToomas Soome #ifdef  __cplusplus
315ffb0c9bSToomas Soome extern "C" {
324b22b933Srs #endif
334b22b933Srs 
344b22b933Srs #define RESTART_GOODBYE_DELAY    (6 * mDNSPlatformOneSecond) // delay after restarting LLQ before nuking previous known answers (avoids flutter if we restart before we have networking up)
354b22b933Srs #define INIT_UCAST_POLL_INTERVAL (3 * mDNSPlatformOneSecond) // this interval is used after send failures on network transitions
365ffb0c9bSToomas Soome                                                              // which typically heal quickly, so we start agressively and exponentially back off
374b22b933Srs #define MAX_UCAST_POLL_INTERVAL (60 * 60 * mDNSPlatformOneSecond)
385ffb0c9bSToomas Soome //#define MAX_UCAST_POLL_INTERVAL (1 * 60 * mDNSPlatformOneSecond)
394b22b933Srs #define LLQ_POLL_INTERVAL       (15 * 60 * mDNSPlatformOneSecond) // Polling interval for zones w/ an advertised LLQ port (ie not static zones) if LLQ fails due to NAT, etc.
404b22b933Srs #define RESPONSE_WINDOW (60 * mDNSPlatformOneSecond)         // require server responses within one minute of request
415ffb0c9bSToomas Soome #define MAX_UCAST_UNANSWERED_QUERIES 2                       // number of unanswered queries from any one uDNS server before trying another server
425ffb0c9bSToomas Soome #define DNSSERVER_PENALTY_TIME (60 * mDNSPlatformOneSecond)  // number of seconds for which new questions don't pick this server
435ffb0c9bSToomas Soome 
445ffb0c9bSToomas Soome // On some interfaces, we want to delay the first retransmission to a minimum of 2 seconds
455ffb0c9bSToomas Soome // rather than the default (1 second).
465ffb0c9bSToomas Soome #define MIN_UCAST_RETRANS_TIMEOUT (2 * mDNSPlatformOneSecond)
475ffb0c9bSToomas Soome 
484b22b933Srs #define DEFAULT_UPDATE_LEASE 7200
495ffb0c9bSToomas Soome 
505ffb0c9bSToomas Soome #define QuestionIntervalStep 3
515ffb0c9bSToomas Soome #define QuestionIntervalStep2 (QuestionIntervalStep*QuestionIntervalStep)
525ffb0c9bSToomas Soome #define QuestionIntervalStep3 (QuestionIntervalStep*QuestionIntervalStep*QuestionIntervalStep)
535ffb0c9bSToomas Soome #define InitialQuestionInterval ((mDNSPlatformOneSecond + QuestionIntervalStep-1) / QuestionIntervalStep)
545ffb0c9bSToomas Soome #define MaxQuestionInterval         (3600 * mDNSPlatformOneSecond)
55c65ebfc7SToomas Soome #define UDNSBackOffMultiplier 2
56c65ebfc7SToomas Soome #define MinQuestionInterval (1 * mDNSPlatformOneSecond)
575ffb0c9bSToomas Soome 
585ffb0c9bSToomas Soome // For Unicast record registrations, we initialize the interval to 1 second. When we send any query for
595ffb0c9bSToomas Soome // the record registration e.g., GetZoneData, we always back off by QuestionIntervalStep
605ffb0c9bSToomas Soome // so that the first retry does not happen until 3 seconds which should be enough for TCP/TLS to be done.
615ffb0c9bSToomas Soome #define INIT_RECORD_REG_INTERVAL (1 * mDNSPlatformOneSecond)
625ffb0c9bSToomas Soome #define MAX_RECORD_REG_INTERVAL (15 * 60 * mDNSPlatformOneSecond)
635ffb0c9bSToomas Soome #define MERGE_DELAY_TIME    (1 * mDNSPlatformOneSecond)
645ffb0c9bSToomas Soome 
655ffb0c9bSToomas Soome // If we are refreshing, we do it at least 5 times with a min update frequency of
665ffb0c9bSToomas Soome // 5 minutes
675ffb0c9bSToomas Soome #define MAX_UPDATE_REFRESH_COUNT    5
685ffb0c9bSToomas Soome #define MIN_UPDATE_REFRESH_TIME     (5 * 60 * mDNSPlatformOneSecond)
695ffb0c9bSToomas Soome 
705ffb0c9bSToomas Soome // For questions that use kDNSServiceFlagsTimeout and we don't have a matching resolver e.g., no dns servers,
715ffb0c9bSToomas Soome // then use the default value of 30 seconds
725ffb0c9bSToomas Soome #define DEFAULT_UDNS_TIMEOUT    30 // in seconds
735ffb0c9bSToomas Soome 
74*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(COMMON, DNS_PUSH)
75*472cd20dSToomas Soome // Push notification structures
76*472cd20dSToomas Soome struct mDNS_DNSPushNotificationServer
77*472cd20dSToomas Soome {
78*472cd20dSToomas Soome     dso_connect_state_t       *connectInfo;       // DSO Connection state information
79*472cd20dSToomas Soome     dso_state_t               *connection;        // DNS Stateful Operations/TCP Connection pointer, might be null.
80*472cd20dSToomas Soome     mDNSu32                    numberOfQuestions; // Number of questions for this server
81*472cd20dSToomas Soome     DNSPushServer_ConnectState connectState;      // Current status of connection attempt to this server
82*472cd20dSToomas Soome     mDNSs32                    lastDisconnect;    // Last time we got a disconnect, used to avoid constant reconnects
83*472cd20dSToomas Soome     domainname                 serverName;        // The hostname returned by the _dns-push-tls._tcp.<zone> SRV lookup
84*472cd20dSToomas Soome     mDNSIPPort                 port;              // The port from the SRV lookup
85*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(APPLE, QUERIER)
86*472cd20dSToomas Soome     mdns_dns_service_t         dnsservice;
87*472cd20dSToomas Soome #else
88*472cd20dSToomas Soome     DNSServer                 *qDNSServer;        // DNS server stolen from the question that created this server structure.
89*472cd20dSToomas Soome #endif
90*472cd20dSToomas Soome     mDNS                      *m;
91*472cd20dSToomas Soome     DNSPushNotificationServer *next;
92*472cd20dSToomas Soome } ;
935ffb0c9bSToomas Soome 
94*472cd20dSToomas Soome struct mDNS_DNSPushNotificationZone
95*472cd20dSToomas Soome {
96*472cd20dSToomas Soome     domainname zoneName;
97*472cd20dSToomas Soome     DNSPushNotificationServer *server; // DNS Push Notification Servers for this zone
98*472cd20dSToomas Soome     mDNSu32 numberOfQuestions;          // Number of questions for this zone
99*472cd20dSToomas Soome     DNSPushNotificationZone *next;
100*472cd20dSToomas Soome } ;
101*472cd20dSToomas Soome #endif
1025ffb0c9bSToomas Soome 
1034b22b933Srs // Entry points into unicast-specific routines
1044b22b933Srs 
1055ffb0c9bSToomas Soome extern void LLQGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneInfo);
1065ffb0c9bSToomas Soome extern void startLLQHandshake(mDNS *m, DNSQuestion *q);
1075ffb0c9bSToomas Soome extern void sendLLQRefresh(mDNS *m, DNSQuestion *q);
1085ffb0c9bSToomas Soome 
109*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(COMMON, DNS_PUSH)
110c65ebfc7SToomas Soome extern void DNSPushNotificationGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneInfo);
111c65ebfc7SToomas Soome extern void DiscoverDNSPushNotificationServer(mDNS *m, DNSQuestion *q);
112*472cd20dSToomas Soome extern DNSPushNotificationServer *GetConnectionToDNSPushNotificationServer(mDNS *m, DNSQuestion *q);
113*472cd20dSToomas Soome extern DNSPushNotificationServer *SubscribeToDNSPushNotificationServer(mDNS *m, DNSQuestion *q);
114c65ebfc7SToomas Soome extern void UnSubscribeToDNSPushNotificationServer(mDNS *m, DNSQuestion *q);
115*472cd20dSToomas Soome extern void DNSPushReconcileConnection(mDNS *m, DNSQuestion *q);
116*472cd20dSToomas Soome extern void DNSPushServerDrop(DNSPushNotificationServer *server);
117*472cd20dSToomas Soome #endif
118c65ebfc7SToomas Soome 
1195ffb0c9bSToomas Soome extern void SleepRecordRegistrations(mDNS *m);
1205ffb0c9bSToomas Soome 
1214b22b933Srs // uDNS_UpdateRecord
1224b22b933Srs // following fields must be set, and the update validated, upon entry.
1234b22b933Srs // rr->NewRData
1244b22b933Srs // rr->newrdlength
1254b22b933Srs // rr->UpdateCallback
1264b22b933Srs 
1274b22b933Srs extern mStatus uDNS_UpdateRecord(mDNS *m, AuthRecord *rr);
1284b22b933Srs 
1295ffb0c9bSToomas Soome extern void SetNextQueryTime(mDNS *const m, const DNSQuestion *const q);
1305ffb0c9bSToomas Soome extern mStatus mDNS_Register_internal(mDNS *const m, AuthRecord *const rr);
1315ffb0c9bSToomas Soome extern mStatus mDNS_Deregister_internal(mDNS *const m, AuthRecord *const rr, mDNS_Dereg_type drt);
1325ffb0c9bSToomas Soome extern mStatus mDNS_StartQuery_internal(mDNS *const m, DNSQuestion *const question);
1335ffb0c9bSToomas Soome extern mStatus mDNS_StopQuery_internal(mDNS *const m, DNSQuestion *const question);
1345ffb0c9bSToomas Soome extern mStatus mDNS_StartNATOperation_internal(mDNS *const m, NATTraversalInfo *traversal);
1355ffb0c9bSToomas Soome 
1365ffb0c9bSToomas Soome extern void RecordRegistrationGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneData);
1375ffb0c9bSToomas Soome extern mStatus uDNS_DeregisterRecord(mDNS *const m, AuthRecord *const rr);
1385ffb0c9bSToomas Soome extern const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr);
1394b22b933Srs 
1404b22b933Srs // integer fields of msg header must be in HOST byte order before calling this routine
1414b22b933Srs extern void uDNS_ReceiveMsg(mDNS *const m, DNSMessage *const msg, const mDNSu8 *const end,
1425ffb0c9bSToomas Soome                             const mDNSAddr *const srcaddr, const mDNSIPPort srcport);
1435ffb0c9bSToomas Soome 
1445ffb0c9bSToomas Soome extern void uDNS_Tasks(mDNS *const m);
1455ffb0c9bSToomas Soome extern void UpdateAllSRVRecords(mDNS *m);
1465ffb0c9bSToomas Soome extern void CheckNATMappings(mDNS *m);
1475ffb0c9bSToomas Soome 
1485ffb0c9bSToomas Soome extern mStatus         uDNS_SetupDNSConfig(mDNS *const m);
1495ffb0c9bSToomas Soome 
1505ffb0c9bSToomas Soome // uDNS_SetupWABQueries reads search domains from the platform layer and starts the Wide Area Bonjour
1515ffb0c9bSToomas Soome // (WAB) domain enumeration queries if necessary.
1525ffb0c9bSToomas Soome 
1535ffb0c9bSToomas Soome #define UDNS_WAB_BROWSE_QUERY    0x00000001 // Browse queries (b, db)
1545ffb0c9bSToomas Soome #define UDNS_WAB_LBROWSE_QUERY   0x00000002 // Browse queries (lb)
1555ffb0c9bSToomas Soome #define UDNS_WAB_REG_QUERY       0x00000004 // Registration queries (r and dr)
1565ffb0c9bSToomas Soome 
1575ffb0c9bSToomas Soome extern void uDNS_SetupWABQueries(mDNS *const m);
1585ffb0c9bSToomas Soome extern void uDNS_StartWABQueries(mDNS *const m, int queryType);
1595ffb0c9bSToomas Soome extern void uDNS_StopWABQueries(mDNS *const m, int queryType);
160*472cd20dSToomas Soome extern domainname      *uDNS_GetNextSearchDomain(mDNSInterfaceID InterfaceID, int *searchIndex, mDNSBool ignoreDotLocal);
1613b436d06SToomas Soome 
1623b436d06SToomas Soome extern void uDNS_RestartQuestionAsTCP(mDNS *m, DNSQuestion *const q, const mDNSAddr *const srcaddr, const mDNSIPPort srcport);
1635ffb0c9bSToomas Soome 
1645ffb0c9bSToomas Soome typedef enum
1655ffb0c9bSToomas Soome {
1665ffb0c9bSToomas Soome     uDNS_LLQ_Not = 0,   // Normal uDNS answer: Flush any stale records from cache, and respect record TTL
1675ffb0c9bSToomas Soome     uDNS_LLQ_Ignore,    // LLQ initial challenge packet: ignore -- has no useful records for us
1685ffb0c9bSToomas Soome     uDNS_LLQ_Entire,    // LLQ initial set of answers: Flush any stale records from cache, but assume TTL is 2 x LLQ refresh interval
1695ffb0c9bSToomas Soome     uDNS_LLQ_Events     // LLQ event packet: don't flush cache; assume TTL is 2 x LLQ refresh interval
1705ffb0c9bSToomas Soome } uDNS_LLQType;
1715ffb0c9bSToomas Soome 
1725ffb0c9bSToomas Soome extern uDNS_LLQType    uDNS_recvLLQResponse(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end, const mDNSAddr *const srcaddr, const mDNSIPPort srcport, DNSQuestion **matchQuestion);
1735ffb0c9bSToomas Soome extern DomainAuthInfo *GetAuthInfoForName_internal(mDNS *m, const domainname *const name);
1745ffb0c9bSToomas Soome extern DomainAuthInfo *GetAuthInfoForQuestion(mDNS *m, const DNSQuestion *const q);
1755ffb0c9bSToomas Soome extern void DisposeTCPConn(struct tcpInfo_t *tcp);
1765ffb0c9bSToomas Soome 
1775ffb0c9bSToomas Soome // NAT traversal
1785ffb0c9bSToomas Soome extern void uDNS_ReceiveNATPacket(mDNS *m, const mDNSInterfaceID InterfaceID, mDNSu8 *pkt, mDNSu16 len); // Called for each received PCP or NAT-PMP packet
1795ffb0c9bSToomas Soome extern void natTraversalHandleAddressReply(mDNS *const m, mDNSu16 err, mDNSv4Addr ExtAddr);
1805ffb0c9bSToomas Soome extern void natTraversalHandlePortMapReply(mDNS *const m, NATTraversalInfo *n, const mDNSInterfaceID InterfaceID, mDNSu16 err, mDNSIPPort extport, mDNSu32 lease, NATTProtocol protocol);
1815ffb0c9bSToomas Soome 
182*472cd20dSToomas Soome #if MDNSRESPONDER_SUPPORTS(COMMON, DNS_PUSH)
183c65ebfc7SToomas Soome // DNS Push Notification
184c65ebfc7SToomas Soome extern void SubscribeToDNSPushNotification(mDNS *m, DNSQuestion *q);
185*472cd20dSToomas Soome #endif
186c65ebfc7SToomas Soome 
187*472cd20dSToomas Soome extern CacheRecord* mDNSCoreReceiveCacheCheck(mDNS *const m, const DNSMessage *const response, uDNS_LLQType LLQType,
188*472cd20dSToomas Soome 											  const mDNSu32 slot, CacheGroup *cg,
189*472cd20dSToomas Soome                                               CacheRecord ***cfp, mDNSInterfaceID InterfaceID);
1905ffb0c9bSToomas Soome #ifdef  __cplusplus
1915ffb0c9bSToomas Soome }
1924b22b933Srs #endif
1934b22b933Srs 
194c65ebfc7SToomas Soome #endif // __UDNS_H
195