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