54 #ifndef __mDNSClientAPI_h
55 #define __mDNSClientAPI_h
57 #if defined(EFI32) || defined(EFI64) || defined(EFIX64)
60 #if !defined(__GNUC__)
61 #define va_list VA_LIST
62 #define va_start(a, b) VA_START(a, b)
63 #define va_end(a) VA_END(a)
64 #define va_arg(a, b) VA_ARG(a, b)
70 #include "mDNSDebug.h"
71 #if APPLE_OSX_mDNSResponder
72 #include <uuid/uuid.h>
84 #define mDNSlocal static
115 #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
116 #define packedstruct struct __attribute__((__packed__))
117 #define packedunion union __attribute__((__packed__))
119 #define packedstruct struct
120 #define packedunion union
126 #pragma mark - DNS Resource Record class and type constants
135 kDNSClass_NONE = 254,
137 kDNSClass_Mask = 0x7FFF,
138 kDNSClass_UniqueRRSet = 0x8000,
140 kDNSQClass_ANY = 255,
141 kDNSQClass_UnicastResponse = 0x8000
218 #pragma mark - Simple types
223 typedef int mDNSBool;
224 typedef signed char mDNSs8;
225 typedef unsigned char mDNSu8;
226 typedef signed short mDNSs16;
227 typedef unsigned short mDNSu16;
237 #if defined(_ILP64) || defined(__ILP64__)
238 typedef signed int32 mDNSs32;
239 typedef unsigned int32 mDNSu32;
240 #elif defined(_LP64) || defined(__LP64__)
241 typedef signed int mDNSs32;
242 typedef unsigned int mDNSu32;
244 typedef signed long mDNSs32;
245 typedef unsigned long mDNSu32;
267 typedef packedunion { mDNSu8 b[ 6]; mDNSu16 w[3]; mDNSu32 l[1]; } mDNSOpaque48;
268 typedef union { mDNSu8 b[ 8]; mDNSu16 w[4]; mDNSu32 l[2]; }
mDNSOpaque64;
277 typedef mDNSOpaque48 mDNSEthAddr;
281 #define bit_set_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] |= (1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
282 #define bit_clr_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] &= ~(1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
283 #define bit_get_opaque64(op64, index) (op64.l[((index))/(sizeof(mDNSu32) * mDNSNBBY)] & (1 << ((index) % (sizeof(mDNSu32) * mDNSNBBY))))
287 mDNSAddrType_None = 0,
288 mDNSAddrType_IPv4 = 4,
289 mDNSAddrType_IPv6 = 6,
290 mDNSAddrType_Unknown = ~0
295 mDNSTransport_None = 0,
296 mDNSTransport_UDP = 1,
297 mDNSTransport_TCP = 2
303 union { mDNSv6Addr v6; mDNSv4Addr v4; } ip;
306 enum { mDNSfalse = 0, mDNStrue = 1 };
320 mStatus_UnknownErr = -65537,
321 mStatus_NoSuchNameErr = -65538,
322 mStatus_NoMemoryErr = -65539,
323 mStatus_BadParamErr = -65540,
324 mStatus_BadReferenceErr = -65541,
325 mStatus_BadStateErr = -65542,
326 mStatus_BadFlagsErr = -65543,
327 mStatus_UnsupportedErr = -65544,
328 mStatus_NotInitializedErr = -65545,
329 mStatus_NoCache = -65546,
330 mStatus_AlreadyRegistered = -65547,
331 mStatus_NameConflict = -65548,
332 mStatus_Invalid = -65549,
333 mStatus_Firewall = -65550,
334 mStatus_Incompatible = -65551,
335 mStatus_BadInterfaceErr = -65552,
336 mStatus_Refused = -65553,
337 mStatus_NoSuchRecord = -65554,
338 mStatus_NoAuth = -65555,
339 mStatus_NoSuchKey = -65556,
340 mStatus_NATTraversal = -65557,
341 mStatus_DoubleNAT = -65558,
342 mStatus_BadTime = -65559,
343 mStatus_BadSig = -65560,
344 mStatus_BadKey = -65561,
345 mStatus_TransientErr = -65562,
346 mStatus_ServiceNotRunning = -65563,
347 mStatus_NATPortMappingUnsupported = -65564,
348 mStatus_NATPortMappingDisabled = -65565,
349 mStatus_NoRouter = -65566,
350 mStatus_PollingMode = -65567,
351 mStatus_Timeout = -65568,
352 mStatus_NullPointer = -65569,
356 mStatus_ConnPending = -65787,
357 mStatus_ConnFailed = -65788,
358 mStatus_ConnEstablished = -65789,
361 mStatus_GrowCache = -65790,
362 mStatus_ConfigChanged = -65791,
363 mStatus_MemFree = -65792
367 typedef mDNSs32 mStatus;
370 #define MAX_DOMAIN_LABEL 63
375 #define MAX_DOMAIN_NAME 256
392 #define MAX_ESCAPED_DOMAIN_LABEL 254
393 #define MAX_ESCAPED_DOMAIN_NAME 1009
399 #define MAX_REVERSE_MAPPING_NAME_V4 30
400 #define MAX_REVERSE_MAPPING_NAME_V6 74
401 #define MAX_REVERSE_MAPPING_NAME 74
408 #define kStandardTTL (3600UL * 100 / 80)
409 #define kHostNameTTL 600UL // seconds
415 #define kHostNameSmallTTL 10UL
428 #define kStaticCacheTTL 10
430 #define DefaultTTLforRRType(X) (((X) == kDNSType_A || (X) == kDNSType_AAAA || (X) == kDNSType_SRV) ? kHostNameTTL : kStandardTTL)
451 #pragma mark - DNS Message structures
454 #define mDNS_numZones numQuestions
455 #define mDNS_numPrereqs numAnswers
456 #define mDNS_numUpdates numAuthorities
462 mDNSu16 numQuestions;
464 mDNSu16 numAuthorities;
465 mDNSu16 numAdditionals;
471 #define AbsoluteMaxDNSMessageData 8940
472 #define NormalMaxDNSMessageData 1440
476 mDNSu8 data[AbsoluteMaxDNSMessageData];
499 #pragma mark - Other Packet Format Structures
596 #define NDP_Router 0x80
597 #define NDP_Solicited 0x40
598 #define NDP_Override 0x20
626 #pragma mark - Resource Record structures
684 kDNSRecordTypeUnregistered = 0x00,
685 kDNSRecordTypeDeregistering = 0x01,
687 kDNSRecordTypeUnique = 0x02,
689 kDNSRecordTypeAdvisory = 0x04,
690 kDNSRecordTypeShared = 0x08,
692 kDNSRecordTypeVerified = 0x10,
693 kDNSRecordTypeKnownUnique = 0x20,
695 kDNSRecordTypeUniqueMask = (kDNSRecordTypeUnique | kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique),
696 kDNSRecordTypeActiveSharedMask = (kDNSRecordTypeAdvisory | kDNSRecordTypeShared),
697 kDNSRecordTypeActiveUniqueMask = (kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique),
698 kDNSRecordTypeActiveMask = (kDNSRecordTypeActiveSharedMask | kDNSRecordTypeActiveUniqueMask),
700 kDNSRecordTypePacketAdd = 0x80,
701 kDNSRecordTypePacketAddUnique = 0x90,
702 kDNSRecordTypePacketAuth = 0xA0,
703 kDNSRecordTypePacketAuthUnique = 0xB0,
704 kDNSRecordTypePacketAns = 0xC0,
705 kDNSRecordTypePacketAnsUnique = 0xD0,
707 kDNSRecordTypePacketNegative = 0xF0,
709 kDNSRecordTypePacketUniqueMask = 0x10
712 typedef packedstruct { mDNSu16 priority; mDNSu16 weight; mDNSIPPort port;
domainname target; } rdataSRV;
713 typedef packedstruct { mDNSu16 preference;
domainname exchange; } rdataMX;
731 #define kDNSOpt_LLQ 1
732 #define kDNSOpt_Lease 2
733 #define kDNSOpt_NSID 3
734 #define kDNSOpt_Owner 4
752 mDNSOpaque48 password;
769 #define DNSOpt_Header_Space 11
770 #define DNSOpt_LLQData_Space (4 + 2 + 2 + 2 + 8 + 4)
771 #define DNSOpt_LeaseData_Space (4 + 4)
772 #define DNSOpt_OwnerData_ID_Space (4 + 2 + 6)
773 #define DNSOpt_OwnerData_ID_Wake_Space (4 + 2 + 6 + 6)
774 #define DNSOpt_OwnerData_ID_Wake_PW4_Space (4 + 2 + 6 + 6 + 4)
775 #define DNSOpt_OwnerData_ID_Wake_PW6_Space (4 + 2 + 6 + 6 + 6)
777 #define ValidOwnerLength(X) ( (X) == DNSOpt_OwnerData_ID_Space - 4 || \
778 (X) == DNSOpt_OwnerData_ID_Wake_Space - 4 || \
779 (X) == DNSOpt_OwnerData_ID_Wake_PW4_Space - 4 || \
780 (X) == DNSOpt_OwnerData_ID_Wake_PW6_Space - 4 )
782 #define DNSOpt_Owner_Space(A,B) (mDNSSameEthAddress((A),(B)) ? DNSOpt_OwnerData_ID_Space : DNSOpt_OwnerData_ID_Wake_Space)
784 #define DNSOpt_Data_Space(O) ( \
785 (O)->opt == kDNSOpt_LLQ ? DNSOpt_LLQData_Space : \
786 (O)->opt == kDNSOpt_Lease ? DNSOpt_LeaseData_Space : \
787 (O)->opt == kDNSOpt_Owner ? DNSOpt_Owner_Space(&(O)->u.owner.HMAC, &(O)->u.owner.IMAC) : 0x10000)
802 #define StandardAuthRDSize 264
803 #define MaximumRDSize 8192
817 #define InlineCacheRDSize 68
820 #if ENABLE_MULTI_PACKET_QUERY_SNOOPING
821 #if defined(_ILP64) || defined(__ILP64__) || defined(_LP64) || defined(__LP64__) || defined(_WIN64)
822 #define InlineCacheGroupNameSize 160
824 #define InlineCacheGroupNameSize 148
827 #if defined(_ILP64) || defined(__ILP64__) || defined(_LP64) || defined(__LP64__) || defined(_WIN64)
828 #define InlineCacheGroupNameSize 144
830 #define InlineCacheGroupNameSize 132
837 mDNSu8 data[StandardAuthRDSize];
851 mDNSu8 data[StandardAuthRDSize];
873 #define sizeofRDataHeader (sizeof(RData) - sizeof(RDataBody))
880 mDNSu8 data[InlineCacheRDSize];
884 typedef void mDNSRecordCallback(
mDNS *
const m,
AuthRecord *
const rr, mStatus result);
890 typedef void mDNSRecordUpdateCallback(
mDNS *
const m,
AuthRecord *
const rr,
RData *OldRData, mDNSu16 OldRDLen);
895 #pragma mark - NAT Traversal structures and constants
898 #define NATMAP_MAX_RETRY_INTERVAL ((mDNSPlatformOneSecond * 60) * 15) // Max retry interval is 15 minutes
899 #define NATMAP_MIN_RETRY_INTERVAL (mDNSPlatformOneSecond * 2) // Min retry interval is 2 seconds
900 #define NATMAP_INIT_RETRY (mDNSPlatformOneSecond / 4) // start at 250ms w/ exponential decay
901 #define NATMAP_DEFAULT_LEASE (60 * 60 * 2) // 2 hour lease life in seconds
902 #define NATMAP_VERS 0
906 NATOp_AddrRequest = 0,
910 NATOp_AddrResponse = 0x80 | 0,
911 NATOp_MapUDPResponse = 0x80 | 1,
912 NATOp_MapTCPResponse = 0x80 | 2
925 typedef mDNSu16 NATErr_t;
949 mDNSu32 NATReq_lease;
960 mDNSu32 NATRep_lease;
966 LNTExternalAddrOp = 2,
968 LNTPortMapDeleteOp = 4
971 #define LNT_MAXBUFSIZE 8192
1001 mDNSs32 retryInterval;
1002 mDNSs32 retryPortMap;
1005 #ifdef _LEGACY_NAT_TRAVERSAL_
1021 mDNSv4Addr ExternalAddress;
1022 mDNSIPPort ExternalPort;
1029 mDNSIPPort RequestedPort;
1031 NATTraversalClientCallback clientCallback;
1032 void *clientContext;
1037 DNSServer_Untested = 0,
1038 DNSServer_Passed = 1,
1039 DNSServer_Failed = 2,
1040 DNSServer_Disabled = 3
1045 DNSServer_FlagDelete = 1,
1046 DNSServer_FlagNew = 2
1051 McastResolver_FlagDelete = 1,
1052 McastResolver_FlagNew = 2
1075 mDNSs32 penaltyTime;
1087 mDNSu32 rroriginalttl;
1114 regState_Pending = 1,
1115 regState_Registered = 2,
1116 regState_DeregPending = 3,
1117 regState_Unregistered = 4,
1118 regState_Refresh = 5,
1119 regState_NATMap = 6,
1120 regState_UpdatePending = 7,
1121 regState_NoTarget = 8,
1122 regState_NATError = 9
1128 Target_AutoHost = 1,
1129 Target_AutoHostAndNATMAP = 2
1134 mergeState_Zero = 0,
1135 mergeState_DontMerge = 1
1147 mDNSu8 namestorage[InlineCacheGroupNameSize];
1150 #define AUTH_HASH_SLOTS 499
1151 #define FORALL_AUTHRECORDS(SLOT,AG,AR) \
1152 for ((SLOT) = 0; (SLOT) < AUTH_HASH_SLOTS; (SLOT)++) \
1153 for ((AG)=m->rrauth.rrauth_hash[(SLOT)]; (AG); (AG)=(AG)->next) \
1154 for ((AR) = (AG)->members; (AR); (AR)=(AR)->next)
1159 mDNSu32 rrauth_size;
1160 mDNSu32 rrauth_totalused;
1161 mDNSu32 rrauth_report;
1164 AuthGroup *rrauth_hash[AUTH_HASH_SLOTS];
1172 AuthRecordAnyIncludeP2P,
1173 AuthRecordLocalOnly,
1193 mDNSRecordCallback *RecordCallback;
1194 void *RecordContext;
1196 mDNSu8 AllowRemoteQuery;
1206 mDNSu8 Acknowledged;
1208 mDNSu8 AnnounceCount;
1209 mDNSu8 RequireGoodbye;
1210 mDNSu8 AnsweredLocalQ;
1211 mDNSu8 IncludeInProbe;
1212 mDNSu8 ImmedUnicast;
1215 #if MDNS_LOG_ANSWER_SUPPRESSION_TIMES
1216 mDNSs32 ImmedAnswerMarkTime;
1220 mDNSv4Addr v4Requester;
1221 mDNSv6Addr v6Requester;
1223 const mDNSu8 *NR_AnswerTo;
1225 mDNSs32 ThisAPInterval;
1230 mDNSu16 newrdlength;
1231 mDNSRecordUpdateCallback *UpdateCallback;
1232 mDNSu32 UpdateCredits;
1233 mDNSs32 NextUpdateCredit;
1234 mDNSs32 UpdateBlocked;
1249 mDNSBool SRVChanged;
1250 mergeState_t mState;
1251 mDNSu8 refreshCount;
1252 mStatus updateError;
1256 void *UpdateContext;
1258 mDNSu16 InFlightRDLen;
1259 mDNSu16 QueuedRDLen;
1261 RData *InFlightRData;
1284 #define AuthRecord_uDNS(R) ((R)->resrec.InterfaceID == mDNSInterface_Any && !(R)->ForceMCast && !IsLocalDomain((R)->resrec.name))
1285 #define Question_uDNS(Q) ((Q)->InterfaceID == mDNSInterface_Unicast || \
1286 ((Q)->InterfaceID != mDNSInterface_LocalOnly && (Q)->InterfaceID != mDNSInterface_P2P && !(Q)->ForceMCast && !IsLocalDomain(&(Q)->qname)))
1288 #define RRLocalOnly(rr) ((rr)->ARType == AuthRecordLocalOnly || (rr)->ARType == AuthRecordP2P)
1290 #define RRAny(rr) ((rr)->ARType == AuthRecordAny || (rr)->ARType == AuthRecordAnyIncludeP2P)
1294 #define QuerySuppressed(Q) ((Q)->SuppressUnusable && (Q)->SuppressQuery)
1296 #define PrivateQuery(Q) ((Q)->AuthInfo && (Q)->AuthInfo->AutoTunnel)
1301 #define ApplySearchDomainsFirst(q) ((q)->AppendSearchDomains && (CountLabels(&((q)->qname))) == 1)
1318 mDNSu8 namestorage[InlineCacheGroupNameSize];
1330 mDNSs32 DelayDelivery;
1331 mDNSs32 NextRequiredQuery;
1334 mDNSu32 UnansweredQueries;
1335 mDNSs32 LastUnansweredTime;
1336 #if ENABLE_MULTI_PACKET_QUERY_SNOOPING
1337 mDNSu32 MPUnansweredQ;
1338 mDNSs32 MPLastUnansweredQT;
1339 mDNSu32 MPUnansweredKA;
1340 mDNSBool MPExpectingKA;
1355 mDNSu8 _extradata[MaximumRDSize-InlineCacheRDSize];
1366 mDNSRecordCallback *StatusCallback;
1367 const void *StatusContext;
1399 mDNSServiceCallback *ServiceCallback;
1400 void *ServiceContext;
1404 mDNSu32 NumSubTypes;
1417 #pragma mark - Question structures
1424 #define DupSuppressInfoSize 8
1435 LLQ_InitialRequest = 1,
1436 LLQ_SecondaryRequest = 2,
1437 LLQ_Established = 3,
1443 #define kLLQ_DefLease 7200 // 2 hours
1444 #define kLLQ_MAX_TRIES 3 // retry an operation 3 times max
1445 #define kLLQ_INIT_RESEND 2 // resend an un-ack'd packet after 2 seconds, then double for each additional
1447 #define kLLQOp_Setup 1
1448 #define kLLQOp_Refresh 2
1449 #define kLLQOp_Event 3
1455 LLQErr_ServFull = 1,
1458 LLQErr_NoSuchLLQ = 4,
1460 LLQErr_UnknownErr = 6
1463 enum { NoAnswer_Normal = 0, NoAnswer_Suspended = 1, NoAnswer_Fail = 2 };
1466 #define HMAC_IPAD 0x36
1467 #define HMAC_OPAD 0x5c
1470 #define AutoTunnelUnregistered(X) ( \
1471 (X)->AutoTunnelHostRecord.resrec.RecordType == kDNSRecordTypeUnregistered && \
1472 (X)->AutoTunnelDeviceInfo.resrec.RecordType == kDNSRecordTypeUnregistered && \
1473 (X)->AutoTunnelService. resrec.RecordType == kDNSRecordTypeUnregistered && \
1474 (X)->AutoTunnel6Record. resrec.RecordType == kDNSRecordTypeUnregistered )
1481 const char* AutoTunnel;
1492 char b64keydata[32];
1493 mDNSu8 keydata_ipad[HMAC_LEN];
1494 mDNSu8 keydata_opad[HMAC_LEN];
1498 typedef enum { QC_rmv = 0, QC_add = 1, QC_addnocache = 2 } QC_result;
1501 #define NextQSendTime(Q) ((Q)->LastQTime + (Q)->ThisQInterval)
1502 #define ActiveQuestion(Q) ((Q)->ThisQInterval > 0 && !(Q)->DuplicateOf)
1503 #define TimeToSendThisQuestion(Q,time) (ActiveQuestion(Q) && (time) - NextQSendTime(Q) >= 0)
1510 mDNSs32 DelayAnswering;
1512 mDNSs32 ThisQInterval;
1516 mDNSs32 ExpectUnicastResp;
1517 mDNSs32 LastAnswerPktNum;
1518 mDNSu32 RecentAnswerPkts;
1519 mDNSu32 CurrentAnswers;
1520 mDNSu32 LargeAnswers;
1521 mDNSu32 UniqueAnswers;
1530 mDNSu32 RequestUnicast;
1531 mDNSs32 LastQTxTime;
1532 mDNSu32 CNAMEReferrals;
1533 mDNSBool SuppressQuery;
1534 mDNSu8 LOAddressAnswers;
1536 mDNSu8 WakeOnResolveCount;
1541 mDNSBool deliverAddEvents;
1544 mDNSu16 noServerResponse;
1545 mDNSu16 triedAllServersOnce;
1546 mDNSu8 unansweredQueries;
1550 mDNSIPPort servPort;
1552 mDNSIPPort tcpSrcPort;
1569 mDNSIPPort TargetPort;
1575 mDNSBool ExpectUnique;
1576 mDNSBool ForceMCast;
1577 mDNSBool ReturnIntermed;
1578 mDNSBool SuppressUnusable;
1579 mDNSBool RetryWithSearchDomains;
1580 mDNSu8 TimeoutQuestion;
1581 mDNSu8 WakeOnResolve;
1582 mDNSs8 SearchListIndex;
1583 mDNSs8 AppendSearchDomains;
1584 mDNSs8 AppendLocalSearchDomains;
1586 mDNSQuestionCallback *QuestionCallback;
1587 void *QuestionContext;
1599 mDNSu8 TXTinfo[2048];
1622 mDNSServiceInfoQueryCallback *ServiceInfoQueryCallback;
1623 void *ServiceInfoQueryContext;
1626 typedef enum { ZoneServiceUpdate, ZoneServiceQuery, ZoneServiceLLQ } ZoneService;
1628 typedef void ZoneDataCallback(
mDNS *
const m, mStatus err,
const ZoneData *result);
1633 ZoneService ZoneService;
1640 mDNSBool ZonePrivate;
1641 ZoneDataCallback *ZoneDataCallback;
1642 void *ZoneDataContext;
1646 extern ZoneData *StartGetZoneData(
mDNS *
const m,
const domainname *
const name,
const ZoneService target, ZoneDataCallback callback,
void *callbackInfo);
1647 extern void CancelGetZoneData(
mDNS *
const m,
ZoneData *nta);
1648 extern mDNSBool IsGetZoneDataQuestion(
DNSQuestion *q);
1657 #if APPLE_OSX_mDNSResponder
1659 #define TC_STATE_AAAA_PEER 0x000000001
1660 #define TC_STATE_AAAA_PEER_RELAY 0x000000002
1661 #define TC_STATE_SRV_PEER 0x000000003
1662 #define TC_STATE_ADDR_PEER 0x000000004
1664 typedef struct ClientTunnel
1666 struct ClientTunnel *next;
1669 mDNSBool MarkedForDeletion;
1670 mDNSv6Addr loc_inner;
1671 mDNSv4Addr loc_outer;
1672 mDNSv6Addr loc_outer6;
1673 mDNSv6Addr rmt_inner;
1674 mDNSv4Addr rmt_outer;
1675 mDNSv6Addr rmt_outer6;
1676 mDNSIPPort rmt_outer_port;
1685 #pragma mark - NetworkInterfaceInfo_struct
1704 mDNSu8 InterfaceActive;
1705 mDNSu8 IPv4Available;
1706 mDNSu8 IPv6Available;
1711 mDNSIPPort SPSPort[3];
1712 mDNSs32 NextSPSAttempt;
1713 mDNSs32 NextSPSAttemptTime;
1732 #define SLE_DELETE 0x00000001
1733 #define SLE_WAB_QUERY_STARTED 0x00000002
1760 #pragma mark - Main mDNS object, used to hold all the mDNS state
1763 typedef void mDNSCallback(
mDNS *
const m, mStatus result);
1765 #define CACHE_HASH_SLOTS 499
1769 mDNS_KnownBug_LimitedIPv6 = 1,
1770 mDNS_KnownBug_LossySyslog = 2
1775 SleepState_Awake = 0,
1776 SleepState_Transferring = 1,
1777 SleepState_Sleeping = 2
1789 mDNSBool CanReceiveUnicastOn5353;
1790 mDNSBool AdvertiseLocalAddresses;
1791 mDNSBool DivertMulticastAdvertisements;
1792 mStatus mDNSPlatformStatus;
1793 mDNSIPPort UnicastPort4;
1794 mDNSIPPort UnicastPort6;
1795 mDNSEthAddr PrimaryMAC;
1796 mDNSCallback *MainCallback;
1801 mDNSu32 mDNS_reentrancy;
1802 mDNSu8 lock_rrcache;
1803 mDNSu8 lock_Questions;
1804 mDNSu8 lock_Records;
1808 char MsgBuffer[MaxMsg];
1811 mDNSs32 timenow_adjust;
1813 mDNSs32 timenow_last;
1814 mDNSs32 NextScheduledEvent;
1815 mDNSs32 ShutdownTime;
1816 mDNSs32 SuppressSending;
1817 mDNSs32 NextCacheCheck;
1818 mDNSs32 NextScheduledQuery;
1819 mDNSs32 NextScheduledProbe;
1820 mDNSs32 NextScheduledResponse;
1821 mDNSs32 NextScheduledNATOp;
1822 mDNSs32 NextScheduledSPS;
1823 mDNSs32 RandomQueryDelay;
1824 mDNSu32 RandomReconfirmDelay;
1826 mDNSu8 LocalRemoveEvents;
1829 mDNSu8 SystemWakeOnLANEnabled;
1830 mDNSu8 SentSleepProxyRegistration;
1831 mDNSu8 SystemSleepOnlyIfWakeOnLAN;
1832 mDNSs32 AnnounceOwner;
1836 mDNSs32 NextScheduledSPRetry;
1839 mDNSs32 NextScheduledStopTime;
1848 mDNSu32 rrcache_size;
1849 mDNSu32 rrcache_totalused;
1850 mDNSu32 rrcache_active;
1851 mDNSu32 rrcache_report;
1854 mDNSs32 rrcache_nextcheck[CACHE_HASH_SLOTS];
1869 mDNSBool NewLocalOnlyRecords;
1871 mDNSs32 ProbeFailTime;
1872 mDNSu32 NumFailedProbes;
1873 mDNSs32 SuppressProbes;
1876 mDNSs32 NextuDNSEvent;
1877 mDNSs32 NextSRVUpdate;
1893 mDNSv6Addr AutoTunnelHostAddr;
1894 mDNSBool AutoTunnelHostAddrActive;
1899 mDNSv6Addr AutoTunnelRelayAddrIn;
1900 mDNSv6Addr AutoTunnelRelayAddrOut;
1903 mDNSBool StartWABQueries;
1904 mDNSBool RegisterAutoTunnel6;
1910 mDNSs32 retryIntervalGetAddr;
1911 mDNSs32 retryGetAddr;
1912 mDNSv4Addr ExternalAddress;
1915 mDNSu32 LastNATupseconds;
1916 mDNSs32 LastNATReplyLocalTime;
1917 mDNSu16 LastNATMapResultCode;
1924 mDNSBool SSDPWANPPPConnection;
1925 mDNSIPPort UPnPRouterPort;
1926 mDNSIPPort UPnPSOAPPort;
1927 mDNSu8 *UPnPRouterURL;
1928 mDNSBool UPnPWANPPPConnection;
1929 mDNSu8 *UPnPSOAPURL;
1930 mDNSu8 *UPnPRouterAddressString;
1931 mDNSu8 *UPnPSOAPAddressString;
1935 mDNSu8 SPSPortability;
1936 mDNSu8 SPSMarginalPower;
1937 mDNSu8 SPSTotalPower;
1942 mDNSQuestionCallback *SPSBrowseCallback;
1944 #define MAX_PROXY_RECORDS 10000
1946 #if APPLE_OSX_mDNSResponder
1947 ClientTunnel *TunnelClients;
1954 union { DNSMessage m;
void *p; } imsg;
1959 #define FORALL_CACHERECORDS(SLOT,CG,CR) \
1960 for ((SLOT) = 0; (SLOT) < CACHE_HASH_SLOTS; (SLOT)++) \
1961 for ((CG)=m->rrcache_hash[(SLOT)]; (CG); (CG)=(CG)->next) \
1962 for ((CR) = (CG)->members; (CR); (CR)=(CR)->next)
1967 #pragma mark - Useful Static Constants
1976 extern const mDNSIPPort DiscardPort;
1977 extern const mDNSIPPort SSHPort;
1978 extern const mDNSIPPort UnicastDNSPort;
1979 extern const mDNSIPPort SSDPPort;
1980 extern const mDNSIPPort IPSECPort;
1981 extern const mDNSIPPort NSIPCPort;
1982 extern const mDNSIPPort NATPMPAnnouncementPort;
1983 extern const mDNSIPPort NATPMPPort;
1984 extern const mDNSIPPort DNSEXTPort;
1985 extern const mDNSIPPort MulticastDNSPort;
1986 extern const mDNSIPPort LoopbackIPCPort;
1987 extern const mDNSIPPort PrivateDNSPort;
1991 extern const mDNSIPPort zeroIPPort;
1992 extern const mDNSv4Addr zerov4Addr;
1993 extern const mDNSv6Addr zerov6Addr;
1994 extern const mDNSEthAddr zeroEthAddr;
1995 extern const mDNSv4Addr onesIPv4Addr;
1996 extern const mDNSv6Addr onesIPv6Addr;
1997 extern const mDNSEthAddr onesEthAddr;
2000 extern const mDNSv4Addr AllDNSAdminGroup;
2001 extern const mDNSv4Addr AllHosts_v4;
2002 extern const mDNSv6Addr AllHosts_v6;
2003 extern const mDNSv6Addr NDP_prefix;
2004 extern const mDNSEthAddr AllHosts_v6_Eth;
2005 extern const mDNSAddr AllDNSLinkGroup_v4;
2006 extern const mDNSAddr AllDNSLinkGroup_v6;
2018 extern mDNSBool StrictUnicastOrdering;
2019 extern mDNSu8 NumUnicastDNSServers;
2021 #define localdomain (*(const domainname *)"\x5" "local")
2022 #define DeviceInfoName (*(const domainname *)"\xC" "_device-info" "\x4" "_tcp")
2023 #define SleepProxyServiceType (*(const domainname *)"\xC" "_sleep-proxy" "\x4" "_udp")
2028 #pragma mark - Inline functions
2031 #if (defined(_MSC_VER))
2032 #define mDNSinline static __inline
2033 #elif ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
2034 #define mDNSinline static inline
2038 #if !defined(mDNSinline)
2039 extern mDNSs32 NonZeroTime(mDNSs32 t);
2046 #if (!defined(mDNSinline) && mDNS_InstantiateInlines)
2052 mDNSinline mDNSs32 NonZeroTime(mDNSs32 t) {
if (t)
return(t);
else return(1); }
2054 mDNSinline mDNSu16 mDNSVal16(
mDNSOpaque16 x) {
return((mDNSu16)((mDNSu16)x.b[0] << 8 | (mDNSu16)x.b[1])); }
2056 mDNSinline
mDNSOpaque16 mDNSOpaque16fromIntVal(mDNSu16 v)
2059 x.b[0] = (mDNSu8)(v >> 8);
2060 x.b[1] = (mDNSu8)(v & 0xFF);
2069 #pragma mark - Main Client Functions
2124 mDNSBool AdvertiseLocalAddresses,
2125 mDNSCallback *Callback,
void *Context);
2127 #define mDNS_Init_NoCache mDNSNULL
2128 #define mDNS_Init_ZeroCacheSize 0
2130 #define mDNS_Init_AdvertiseLocalAddresses mDNStrue
2131 #define mDNS_Init_DontAdvertiseLocalAddresses mDNSfalse
2132 #define mDNS_Init_NoInitCallback mDNSNULL
2133 #define mDNS_Init_NoInitCallbackContext mDNSNULL
2135 extern void mDNS_ConfigChanged(
mDNS *
const m);
2136 extern void mDNS_GrowCache (
mDNS *
const m,
CacheEntity *storage, mDNSu32 numrecords);
2137 extern void mDNS_GrowAuth (
mDNS *
const m,
AuthEntity *storage, mDNSu32 numrecords);
2138 extern void mDNS_StartExit (
mDNS *
const m);
2139 extern void mDNS_FinalExit (
mDNS *
const m);
2140 #define mDNS_Close(m) do { mDNS_StartExit(m); mDNS_FinalExit(m); } while(0)
2141 #define mDNS_ExitNow(m, now) ((now) - (m)->ShutdownTime >= 0 || (!(m)->ResourceRecords))
2143 extern mDNSs32 mDNS_Execute (
mDNS *
const m);
2145 extern mStatus mDNS_Register (
mDNS *
const m,
AuthRecord *
const rr);
2146 extern mStatus mDNS_Update (
mDNS *
const m,
AuthRecord *
const rr, mDNSu32 newttl,
2147 const mDNSu16 newrdlength,
RData *
const newrdata, mDNSRecordUpdateCallback *Callback);
2148 extern mStatus mDNS_Deregister(
mDNS *
const m,
AuthRecord *
const rr);
2150 extern mStatus mDNS_StartQuery(
mDNS *
const m,
DNSQuestion *
const question);
2151 extern mStatus mDNS_StopQuery (
mDNS *
const m,
DNSQuestion *
const question);
2152 extern mStatus mDNS_StopQueryWithRemoves(
mDNS *
const m,
DNSQuestion *
const question);
2153 extern mStatus mDNS_Reconfirm (
mDNS *
const m,
CacheRecord *
const cacherr);
2155 extern void mDNS_PurgeCacheResourceRecord(
mDNS *
const m,
CacheRecord *rr);
2156 extern mDNSs32 mDNS_TimeNow(
const mDNS *
const m);
2164 extern void mDNS_UpdateAllowSleep(
mDNS *
const m);
2169 #pragma mark - Platform support functions that are accessible to the client layer too
2172 extern mDNSs32 mDNSPlatformOneSecond;
2177 #pragma mark - General utility and helper functions
2184 typedef enum { mDNS_Dereg_normal, mDNS_Dereg_rapid, mDNS_Dereg_conflict, mDNS_Dereg_repeat } mDNS_Dereg_type;
2209 mDNSu16 rrtype, mDNSu32 ttl, mDNSu8 RecordType, AuthRecType artype, mDNSRecordCallback Callback,
void *Context);
2214 regFlagIncludeP2P = 0x1,
2215 regFlagKnownUnique = 0x2
2220 const domainname *
const host, mDNSIPPort port,
const mDNSu8 txtinfo[], mDNSu16 txtlen,
2222 mDNSInterfaceID InterfaceID, mDNSServiceCallback Callback,
void *Context, mDNSu32 flags);
2226 extern mStatus mDNS_DeregisterService_drt(
mDNS *
const m,
ServiceRecordSet *sr, mDNS_Dereg_type drt);
2227 #define mDNS_DeregisterService(M,S) mDNS_DeregisterService_drt((M), (S), mDNS_Dereg_normal)
2229 extern mStatus mDNS_RegisterNoSuchService(
mDNS *
const m,
AuthRecord *
const rr,
2232 const mDNSInterfaceID InterfaceID, mDNSRecordCallback Callback,
void *Context, mDNSBool includeP2P);
2233 #define mDNS_DeregisterNoSuchService mDNS_Deregister
2236 const mDNSu16 qtype, mDNSQuestionCallback *
const callback,
void *
const context);
2238 extern mStatus mDNS_StartBrowse(
mDNS *
const m,
DNSQuestion *
const question,
2240 const mDNSInterfaceID InterfaceID, mDNSBool ForceMCast, mDNSQuestionCallback *Callback,
void *Context);
2241 #define mDNS_StopBrowse mDNS_StopQuery
2243 extern mStatus mDNS_StartResolveService(
mDNS *
const m,
ServiceInfoQuery *query,
ServiceInfo *info, mDNSServiceInfoQueryCallback *Callback,
void *Context);
2248 mDNS_DomainTypeBrowse = 0,
2249 mDNS_DomainTypeBrowseDefault = 1,
2250 mDNS_DomainTypeBrowseAutomatic = 2,
2251 mDNS_DomainTypeRegistration = 3,
2252 mDNS_DomainTypeRegistrationDefault = 4,
2254 mDNS_DomainTypeMax = 4
2257 extern const char *
const mDNS_DomainTypeNames[];
2259 extern mStatus mDNS_GetDomains(
mDNS *
const m,
DNSQuestion *
const question, mDNS_DomainType DomainType,
const domainname *dom,
2260 const mDNSInterfaceID InterfaceID, mDNSQuestionCallback *Callback,
void *Context);
2261 #define mDNS_StopGetDomains mDNS_StopQuery
2262 extern mStatus mDNS_AdvertiseDomains(
mDNS *
const m,
AuthRecord *rr, mDNS_DomainType DomainType,
const mDNSInterfaceID InterfaceID,
char *domname);
2263 #define mDNS_StopAdvertiseDomains mDNS_Deregister
2275 #pragma mark - DNS name utility functions
2287 #define AssignDomainName(DST, SRC) do { mDNSu16 len__ = DomainNameLength((SRC)); \
2288 if (len__ <= MAX_DOMAIN_NAME) mDNSPlatformMemCopy((DST)->c, (SRC)->c, len__); else (DST)->c[0] = 0; } while(0)
2291 #define SameDomainLabelCS(A,B) ((A)[0] == (B)[0] && mDNSPlatformMemSame((A)+1, (B)+1, (A)[0]))
2292 extern mDNSBool SameDomainLabel(
const mDNSu8 *a,
const mDNSu8 *b);
2295 typedef mDNSBool DomainNameComparisonFn(
const domainname *
const d1,
const domainname *
const d2);
2296 extern mDNSBool IsLocalDomain(
const domainname *d);
2298 #define StripFirstLabel(X) ((const domainname *)&(X)->c[(X)->c[0] ? 1 + (X)->c[0] : 0])
2300 #define FirstLabel(X) ((const domainlabel *)(X))
2301 #define SecondLabel(X) ((const domainlabel *)StripFirstLabel(X))
2302 #define ThirdLabel(X) ((const domainlabel *)StripFirstLabel(StripFirstLabel(X)))
2304 extern const mDNSu8 *LastLabel(
const domainname *d);
2308 extern mDNSu16 DomainNameLengthLimit(
const domainname *
const name,
const mDNSu8 *limit);
2309 #define DomainNameLength(name) DomainNameLengthLimit((name), (name)->c + MAX_DOMAIN_NAME)
2316 extern mDNSu8 *AppendLiteralLabelString(
domainname *
const name,
const char *cstr);
2317 extern mDNSu8 *AppendDNSNameString (
domainname *
const name,
const char *cstr);
2326 extern mDNSBool MakeDomainLabelFromLiteralString(
domainlabel *
const label,
const char *cstr);
2327 extern mDNSu8 *MakeDomainNameFromDNSNameString (
domainname *
const name,
const char *cstr);
2336 extern char *ConvertDomainLabelToCString_withescape(
const domainlabel *
const name,
char *cstr,
char esc);
2337 #define ConvertDomainLabelToCString_unescaped(D,C) ConvertDomainLabelToCString_withescape((D), (C), 0)
2338 #define ConvertDomainLabelToCString(D,C) ConvertDomainLabelToCString_withescape((D), (C), '\\')
2339 extern char *ConvertDomainNameToCString_withescape(
const domainname *
const name,
char *cstr,
char esc);
2340 #define ConvertDomainNameToCString_unescaped(D,C) ConvertDomainNameToCString_withescape((D), (C), 0)
2341 #define ConvertDomainNameToCString(D,C) ConvertDomainNameToCString_withescape((D), (C), '\\')
2343 extern void ConvertUTF8PstringToRFC1034HostLabel(
const mDNSu8 UTF8Name[],
domainlabel *
const hostlabel);
2362 #pragma mark - Other utility functions and macros
2370 extern mDNSu32 mDNS_vsnprintf(
char *sbuffer, mDNSu32 buflen,
const char *fmt, va_list arg);
2371 extern mDNSu32 mDNS_snprintf(
char *sbuffer, mDNSu32 buflen,
const char *fmt, ...) IS_A_PRINTF_STYLE_FUNCTION(3,4);
2373 extern
char *DNSTypeName(mDNSu16 rrtype);
2374 extern
char *GetRRDisplayString_rdb(const
ResourceRecord *const rr, const
RDataBody *const rd1,
char *const buffer);
2375 #define RRDisplayString(m, rr) GetRRDisplayString_rdb(rr, &(rr)->rdata->u, (m)->MsgBuffer)
2376 #define ARDisplayString(m, rr) GetRRDisplayString_rdb(&(rr)->resrec, &(rr)->resrec.rdata->u, (m)->MsgBuffer)
2377 #define CRDisplayString(m, rr) GetRRDisplayString_rdb(&(rr)->resrec, &(rr)->resrec.rdata->u, (m)->MsgBuffer)
2379 extern void IncrementLabelSuffix(
domainlabel *name, mDNSBool RichText);
2380 extern mDNSBool mDNSv4AddrIsRFC1918(mDNSv4Addr *addr);
2381 #define mDNSAddrIsRFC1918(X) ((X)->type == mDNSAddrType_IPv4 && mDNSv4AddrIsRFC1918(&(X)->ip.v4))
2383 #define mDNSSameIPPort(A,B) ((A).NotAnInteger == (B).NotAnInteger)
2384 #define mDNSSameOpaque16(A,B) ((A).NotAnInteger == (B).NotAnInteger)
2385 #define mDNSSameOpaque32(A,B) ((A).NotAnInteger == (B).NotAnInteger)
2386 #define mDNSSameOpaque64(A,B) ((A)->l[0] == (B)->l[0] && (A)->l[1] == (B)->l[1])
2388 #define mDNSSameIPv4Address(A,B) ((A).NotAnInteger == (B).NotAnInteger)
2389 #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])
2390 #define mDNSSameEthAddress(A,B) ((A)->w[0] == (B)->w[0] && (A)->w[1] == (B)->w[1] && (A)->w[2] == (B)->w[2])
2392 #define mDNSIPPortIsZero(A) ((A).NotAnInteger == 0)
2393 #define mDNSOpaque16IsZero(A) ((A).NotAnInteger == 0)
2394 #define mDNSOpaque64IsZero(A) (((A)->l[0] | (A)->l[1] ) == 0)
2395 #define mDNSIPv4AddressIsZero(A) ((A).NotAnInteger == 0)
2396 #define mDNSIPv6AddressIsZero(A) (((A).l[0] | (A).l[1] | (A).l[2] | (A).l[3]) == 0)
2397 #define mDNSEthAddressIsZero(A) (((A).w[0] | (A).w[1] | (A).w[2] ) == 0)
2399 #define mDNSIPv4AddressIsOnes(A) ((A).NotAnInteger == 0xFFFFFFFF)
2400 #define mDNSIPv6AddressIsOnes(A) (((A).l[0] & (A).l[1] & (A).l[2] & (A).l[3]) == 0xFFFFFFFF)
2402 #define mDNSAddressIsAllDNSLinkGroup(X) ( \
2403 ((X)->type == mDNSAddrType_IPv4 && mDNSSameIPv4Address((X)->ip.v4, AllDNSLinkGroup_v4.ip.v4)) || \
2404 ((X)->type == mDNSAddrType_IPv6 && mDNSSameIPv6Address((X)->ip.v6, AllDNSLinkGroup_v6.ip.v6)) )
2406 #define mDNSAddressIsZero(X) ( \
2407 ((X)->type == mDNSAddrType_IPv4 && mDNSIPv4AddressIsZero((X)->ip.v4)) || \
2408 ((X)->type == mDNSAddrType_IPv6 && mDNSIPv6AddressIsZero((X)->ip.v6)) )
2410 #define mDNSAddressIsValidNonZero(X) ( \
2411 ((X)->type == mDNSAddrType_IPv4 && !mDNSIPv4AddressIsZero((X)->ip.v4)) || \
2412 ((X)->type == mDNSAddrType_IPv6 && !mDNSIPv6AddressIsZero((X)->ip.v6)) )
2414 #define mDNSAddressIsOnes(X) ( \
2415 ((X)->type == mDNSAddrType_IPv4 && mDNSIPv4AddressIsOnes((X)->ip.v4)) || \
2416 ((X)->type == mDNSAddrType_IPv6 && mDNSIPv6AddressIsOnes((X)->ip.v6)) )
2418 #define mDNSAddressIsValid(X) ( \
2419 ((X)->type == mDNSAddrType_IPv4) ? !(mDNSIPv4AddressIsZero((X)->ip.v4) || mDNSIPv4AddressIsOnes((X)->ip.v4)) : \
2420 ((X)->type == mDNSAddrType_IPv6) ? !(mDNSIPv6AddressIsZero((X)->ip.v6) || mDNSIPv6AddressIsOnes((X)->ip.v6)) : mDNSfalse)
2422 #define mDNSv4AddressIsLinkLocal(X) ((X)->b[0] == 169 && (X)->b[1] == 254)
2423 #define mDNSv6AddressIsLinkLocal(X) ((X)->b[0] == 0xFE && ((X)->b[1] & 0xC0) == 0x80)
2425 #define mDNSAddressIsLinkLocal(X) ( \
2426 ((X)->type == mDNSAddrType_IPv4) ? mDNSv4AddressIsLinkLocal(&(X)->ip.v4) : \
2427 ((X)->type == mDNSAddrType_IPv6) ? mDNSv6AddressIsLinkLocal(&(X)->ip.v6) : mDNSfalse)
2429 #define mDNSv4AddressIsLoopback(X) ((X)->b[0] == 127 && (X)->b[1] == 0 && (X)->b[2] == 0 && (X)->b[3] == 1)
2430 #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))
2435 #pragma mark - Authentication Support
2449 const domainname *domain,
const domainname *keyname,
const char *b64keydata,
const domainname *hostname, mDNSIPPort *port,
const char *autoTunnelPrefix);
2451 extern void RecreateNATMappings(
mDNS *
const m);
2470 extern void mDNS_AddDynDNSHostName(
mDNS *m,
const domainname *fqdn, mDNSRecordCallback *StatusCallback,
const void *StatusContext);
2471 extern void mDNS_RemoveDynDNSHostName(
mDNS *m,
const domainname *fqdn);
2480 #define mDNS_AddSearchDomain_CString(X, I) \
2481 do { domainname d__; if (((X) != (void*)0) && MakeDomainNameFromDNSNameString(&d__, (X)) && d__.c[0]) mDNS_AddSearchDomain(&d__, I); } while(0)
2486 extern mDNSs32 DNSDigest_ConstructHMACKeyfromBase64(
DomainAuthInfo *info,
const char *b64key);
2492 extern void DNSDigest_SignMessage(DNSMessage *msg, mDNSu8 **end,
DomainAuthInfo *info, mDNSu16 tcode);
2494 #define SwapDNSHeaderBytes(M) do { \
2495 (M)->h.numQuestions = (mDNSu16)((mDNSu8 *)&(M)->h.numQuestions )[0] << 8 | ((mDNSu8 *)&(M)->h.numQuestions )[1]; \
2496 (M)->h.numAnswers = (mDNSu16)((mDNSu8 *)&(M)->h.numAnswers )[0] << 8 | ((mDNSu8 *)&(M)->h.numAnswers )[1]; \
2497 (M)->h.numAuthorities = (mDNSu16)((mDNSu8 *)&(M)->h.numAuthorities)[0] << 8 | ((mDNSu8 *)&(M)->h.numAuthorities)[1]; \
2498 (M)->h.numAdditionals = (mDNSu16)((mDNSu8 *)&(M)->h.numAdditionals)[0] << 8 | ((mDNSu8 *)&(M)->h.numAdditionals)[1]; \
2501 #define DNSDigest_SignMessageHostByteOrder(M,E,INFO) \
2502 do { SwapDNSHeaderBytes(M); DNSDigest_SignMessage((M), (E), (INFO), 0); SwapDNSHeaderBytes(M); } while (0)
2508 extern mDNSBool DNSDigest_VerifyMessage(DNSMessage *msg, mDNSu8 *end,
LargeCacheRecord *tsig,
DomainAuthInfo *info, mDNSu16 *rcode, mDNSu16 *tcode);
2513 #pragma mark - PlatformSupport interface
2545 extern mStatus mDNSPlatformInit (
mDNS *
const m);
2546 extern void mDNSPlatformClose (
mDNS *
const m);
2547 extern mStatus mDNSPlatformSendUDP(
const mDNS *
const m,
const void *
const msg,
const mDNSu8 *
const end,
2550 void mDNSPlatformLock (
const mDNS *
const m);
2551 extern void mDNSPlatformUnlock(
const mDNS *
const inMDNS );
2553 extern void mDNSPlatformStrCopy (
void *dst,
const void *src);
2554 extern mDNSu32 mDNSPlatformStrLen (
const void *src);
2555 extern void mDNSPlatformMemCopy (
void *dst,
const void *src, mDNSu32 len);
2556 extern mDNSBool mDNSPlatformMemSame (
const void *dst,
const void *src, mDNSu32 len);
2557 extern void mDNSPlatformMemZero (
void *dst, mDNSu32 len);
2558 #if APPLE_OSX_mDNSResponder && MACOSX_MDNS_MALLOC_DEBUGGING
2559 #define mDNSPlatformMemAllocate(X) mallocL(#X, X)
2561 extern void * mDNSPlatformMemAllocate (mDNSu32 len);
2563 extern void mDNSPlatformMemFree (
void *mem);
2568 #if !defined(_PLATFORM_HAS_STRONG_PRNG_) && (_BUILDING_XCODE_PROJECT_ || defined(_WIN32))
2569 #define _PLATFORM_HAS_STRONG_PRNG_ 1
2571 #if _PLATFORM_HAS_STRONG_PRNG_
2572 extern mDNSu32 mDNSPlatformRandomNumber(
void);
2574 extern mDNSu32 mDNSPlatformRandomSeed (
void);
2575 #endif // _PLATFORM_HAS_STRONG_PRNG_
2577 extern mStatus mDNSPlatformTimeInit (
void);
2578 extern mDNSs32 mDNSPlatformRawTime (
void);
2579 extern mDNSs32 mDNSPlatformUTC (
void);
2580 #define mDNS_TimeNow_NoLock(m) (mDNSPlatformRawTime() + (m)->timenow_adjust)
2583 extern void mDNSPlatformWriteDebugMsg(
const char *msg);
2585 extern void mDNSPlatformWriteLogMsg(
const char *ident,
const char *msg, mDNSLogLevel_t loglevel);
2587 #if APPLE_OSX_mDNSResponder
2589 mDNSexport
void mDNSASLLog(uuid_t *uuid,
const char *subdomain,
const char *result,
const char *signature,
const char *fmt, ...);
2595 extern mDNSInterfaceID mDNSPlatformInterfaceIDfromInterfaceIndex(
mDNS *
const m, mDNSu32 ifindex);
2596 extern mDNSu32 mDNSPlatformInterfaceIndexfromInterfaceID(
mDNS *
const m,
mDNSInterfaceID id, mDNSBool suppressNetworkChange);
2617 kTCPSocketFlags_Zero = 0,
2618 kTCPSocketFlags_UseTLS = (1 << 0)
2621 typedef void (*TCPConnectionCallback)(
TCPSocket *sock,
void *context, mDNSBool ConnectionEstablished, mStatus err);
2622 extern TCPSocket *mDNSPlatformTCPSocket(
mDNS *
const m, TCPSocketFlags flags, mDNSIPPort *port);
2623 extern TCPSocket *mDNSPlatformTCPAccept(TCPSocketFlags flags,
int sd);
2624 extern int mDNSPlatformTCPGetFD(
TCPSocket *sock);
2626 mDNSInterfaceID inInterfaceID, TCPConnectionCallback inCallback,
void * inContext );
2627 extern void mDNSPlatformTCPCloseConnection(
TCPSocket *sock);
2628 extern long mDNSPlatformReadTCP(
TCPSocket *sock,
void *buf,
unsigned long buflen, mDNSBool *closed);
2629 extern long mDNSPlatformWriteTCP(
TCPSocket *sock,
const char *msg,
unsigned long len);
2630 extern UDPSocket *mDNSPlatformUDPSocket(
mDNS *
const m,
const mDNSIPPort requestedport);
2631 extern void mDNSPlatformUDPClose(
UDPSocket *sock);
2632 extern void mDNSPlatformReceiveBPF_fd(
mDNS *
const m,
int fd);
2633 extern void mDNSPlatformUpdateProxyList(
mDNS *
const m,
const mDNSInterfaceID InterfaceID);
2634 extern void mDNSPlatformSendRawPacket(
const void *
const msg,
const mDNSu8 *
const end,
mDNSInterfaceID InterfaceID);
2635 extern void mDNSPlatformSetLocalAddressCacheEntry(
mDNS *
const m,
const mDNSAddr *
const tpa,
const mDNSEthAddr *
const tha,
mDNSInterfaceID InterfaceID);
2636 extern void mDNSPlatformSourceAddrForDest(
mDNSAddr *
const src,
const mDNSAddr *
const dst);
2639 extern mStatus mDNSPlatformTLSSetupCerts(
void);
2640 extern void mDNSPlatformTLSTearDownCerts(
void);
2647 extern void mDNSPlatformDynDNSHostNameStatusChanged(
const domainname *
const dname,
const mStatus status);
2649 extern void mDNSPlatformSetAllowSleep(
mDNS *
const m, mDNSBool allowSleep,
const char *reason);
2650 extern void mDNSPlatformSendWakeupPacket(
mDNS *
const m,
mDNSInterfaceID InterfaceID,
char *EthAddr,
char *IPAddr,
int iteration);
2653 #ifdef _LEGACY_NAT_TRAVERSAL_
2655 extern void LNT_SendDiscoveryMsg(
mDNS *m);
2656 extern void LNT_ConfigureRouterInfo(
mDNS *m,
const mDNSInterfaceID InterfaceID,
const mDNSu8 *
const data,
const mDNSu16 len);
2657 extern mStatus LNT_GetExternalAddress(
mDNS *m);
2660 extern void LNT_ClearState(
mDNS *
const m);
2661 #endif // _LEGACY_NAT_TRAVERSAL_
2698 extern void mDNS_SetFQDN(
mDNS *
const m);
2703 extern void mDNSCoreInitComplete(
mDNS *
const m, mStatus result);
2704 extern void mDNSCoreReceive(
mDNS *
const m,
void *
const msg,
const mDNSu8 *
const end,
2705 const mDNSAddr *
const srcaddr,
const mDNSIPPort srcport,
2707 extern void mDNSCoreRestartQueries(
mDNS *
const m);
2708 typedef void (*FlushCache)(
mDNS *
const m);
2709 typedef void (*CallbackBeforeStartQuery)(
mDNS *
const m,
void *context);
2710 extern void mDNSCoreRestartAddressQueries(
mDNS *
const m, mDNSBool SearchDomainsChanged, FlushCache flushCacheRecords,
2711 CallbackBeforeStartQuery beforeQueryStart,
void *context);
2712 extern mDNSBool mDNSCoreHaveAdvertisedMulticastServices(
mDNS *
const m);
2713 extern void mDNSCoreMachineSleep(
mDNS *
const m, mDNSBool wake);
2714 extern mDNSBool mDNSCoreReadyForSleep(
mDNS *m, mDNSs32 now);
2715 extern mDNSs32 mDNSCoreIntervalToNextWake(
mDNS *
const m, mDNSs32 now);
2717 extern void mDNSCoreReceiveRawPacket (
mDNS *
const m,
const mDNSu8 *
const p,
const mDNSu8 *
const end,
const mDNSInterfaceID InterfaceID);
2719 extern mDNSBool mDNSAddrIsDNSMulticast(
const mDNSAddr *ip);
2722 extern void ScheduleNextCacheCheckTime(
mDNS *
const m,
const mDNSu32 slot,
const mDNSs32 event);
2723 extern void GrantCacheExtensions(
mDNS *
const m,
DNSQuestion *q, mDNSu32 lease);
2724 extern void MakeNegativeCacheRecord(
mDNS *
const m,
CacheRecord *
const cr,
2725 const domainname *
const name,
const mDNSu32 namehash,
const mDNSu16 rrtype,
const mDNSu16 rrclass, mDNSu32 ttl_seconds,
2727 extern void CompleteDeregistration(
mDNS *
const m,
AuthRecord *rr);
2728 extern void AnswerCurrentQuestionWithResourceRecord(
mDNS *
const m,
CacheRecord *
const rr,
const QC_result AddRecord);
2731 extern void ActivateUnicastRegistration(
mDNS *
const m,
AuthRecord *
const rr);
2732 extern void CheckSuppressUnusableQuestions(
mDNS *
const m);
2733 extern void RetrySearchDomainQuestions(
mDNS *
const m);
2734 extern mDNSBool DomainEnumQuery(
const domainname *qname);
2737 extern void FreeEtcHosts(
mDNS *
const m,
AuthRecord *
const rr, mStatus result);
2746 #if APPLE_OSX_mDNSResponder
2749 extern void SetupLocalAutoTunnelInterface_internal(
mDNS *
const m, mDNSBool servicesStarting);
2750 extern void UpdateAutoTunnelDomainStatuses(
const mDNS *
const m);
2751 extern mStatus ActivateLocalProxy(
mDNS *
const m,
char *ifname);
2752 extern void RemoveAutoTunnel6Record(
mDNS *
const m);
2753 extern mDNSBool RecordReadyForSleep(
mDNS *
const m,
AuthRecord *rr);
2759 #pragma mark - Sleep Proxy
2876 mDNSSleepProxyMetric_Dedicated = 20,
2877 mDNSSleepProxyMetric_PrimaryHardware = 30,
2878 mDNSSleepProxyMetric_PrimarySoftware = 40,
2879 mDNSSleepProxyMetric_SecondaryHardware = 50,
2880 mDNSSleepProxyMetric_SecondarySoftware = 60,
2881 mDNSSleepProxyMetric_IncidentalHardware = 70,
2882 mDNSSleepProxyMetric_IncidentalSoftware = 80
2883 } mDNSSleepProxyMetric;
2885 extern void mDNSCoreBeSleepProxyServer_internal(
mDNS *
const m, mDNSu8 sps, mDNSu8 port, mDNSu8 marginalpower, mDNSu8 totpower);
2886 #define mDNSCoreBeSleepProxyServer(M,S,P,MP,TP) \
2887 do { mDNS_Lock(m); mDNSCoreBeSleepProxyServer_internal((M),(S),(P),(MP),(TP)); mDNS_Unlock(m); } while(0)
2890 #define PrototypeSPSName(X) ((X)[0] >= 11 && (X)[3] == '-' && (X)[ 4] == '9' && (X)[ 5] == '9' && \
2891 (X)[6] == '-' && (X)[ 7] == '9' && (X)[ 8] == '9' && \
2892 (X)[9] == '-' && (X)[10] == '9' && (X)[11] == '9' )
2893 #define ValidSPSName(X) ((X)[0] >= 5 && mDNSIsDigit((X)[1]) && mDNSIsDigit((X)[2]) && mDNSIsDigit((X)[4]) && mDNSIsDigit((X)[5]))
2894 #define SPSMetric(X) (!ValidSPSName(X) || PrototypeSPSName(X) ? 1000000 : \
2895 ((X)[1]-'0') * 100000 + ((X)[2]-'0') * 10000 + ((X)[4]-'0') * 1000 + ((X)[5]-'0') * 100 + ((X)[7]-'0') * 10 + ((X)[8]-'0'))
2900 #pragma mark - Compile-Time assertion checks
2913 char assert0[(
sizeof(rdataSRV) == 262 ) ? 1 : -1];
2914 char assert1[(
sizeof(DNSMessageHeader) == 12 ) ? 1 : -1];
2915 char assert2[(
sizeof(DNSMessage) == 12+AbsoluteMaxDNSMessageData) ? 1 : -1];
2916 char assert3[(
sizeof(mDNSs8) == 1 ) ? 1 : -1];
2917 char assert4[(
sizeof(mDNSu8) == 1 ) ? 1 : -1];
2918 char assert5[(
sizeof(mDNSs16) == 2 ) ? 1 : -1];
2919 char assert6[(
sizeof(mDNSu16) == 2 ) ? 1 : -1];
2920 char assert7[(
sizeof(mDNSs32) == 4 ) ? 1 : -1];
2921 char assert8[(
sizeof(mDNSu32) == 4 ) ? 1 : -1];
2926 char assertD[(
sizeof(int) >= 4 ) ? 1 : -1];
2927 char assertE[(StandardAuthRDSize >= 256 ) ? 1 : -1];
2928 #warning "I have removed the structure padding checking for the two elements below"
2931 char assertH[(
sizeof(IPv4Header ) == 20 ) ? 1 : -1];
2932 char assertI[(
sizeof(IPv6Header ) == 40 ) ? 1 : -1];
2933 char assertJ[(
sizeof(IPv6NDP ) == 24 ) ? 1 : -1];
2934 char assertK[(
sizeof(UDPHeader ) == 8 ) ? 1 : -1];
2935 char assertL[(
sizeof(IKEHeader ) == 28 ) ? 1 : -1];
2936 char assertM[(
sizeof(TCPHeader ) == 20 ) ? 1 : -1];
2941 char sizecheck_RDataBody [(
sizeof(
RDataBody) == 264) ? 1 : -1];
2942 char sizecheck_ResourceRecord [(
sizeof(
ResourceRecord) <= 64) ? 1 : -1];
2943 char sizecheck_AuthRecord [(
sizeof(
AuthRecord) <= 1208) ? 1 : -1];
2944 char sizecheck_CacheRecord [(
sizeof(
CacheRecord) <= 184) ? 1 : -1];
2945 char sizecheck_CacheGroup [(
sizeof(
CacheGroup) <= 184) ? 1 : -1];
2946 char sizecheck_DNSQuestion [(
sizeof(
DNSQuestion) <= 786) ? 1 : -1];
2947 char sizecheck_ZoneData [(
sizeof(
ZoneData) <= 1624) ? 1 : -1];
2948 char sizecheck_NATTraversalInfo [(
sizeof(
NATTraversalInfo) <= 192) ? 1 : -1];
2949 char sizecheck_HostnameInfo [(
sizeof(
HostnameInfo) <= 3050) ? 1 : -1];
2950 char sizecheck_DNSServer [(
sizeof(
DNSServer) <= 328) ? 1 : -1];
2952 char sizecheck_ServiceRecordSet [(
sizeof(
ServiceRecordSet) <= 5500) ? 1 : -1];
2953 char sizecheck_DomainAuthInfo [(
sizeof(
DomainAuthInfo) <= 7808) ? 1 : -1];
2954 char sizecheck_ServiceInfoQuery [(
sizeof(
ServiceInfoQuery) <= 3200) ? 1 : -1];
2955 #if APPLE_OSX_mDNSResponder
2956 char sizecheck_ClientTunnel [(
sizeof(ClientTunnel) <= 1148) ? 1 : -1];
Definition: mDNSEmbeddedAPI.h:268
Definition: mDNSEmbeddedAPI.h:746
Definition: mDNSEmbeddedAPI.h:603
Definition: mDNSEmbeddedAPI.h:1082
Definition: mDNSVxWorks.h:60
Definition: mDNSEmbeddedAPI.h:1304
Definition: mDNSEmbeddedAPI.h:1650
Definition: mDNSEmbeddedAPI.h:1359
Definition: mDNSEmbeddedAPI.h:1064
Definition: mDNSEmbeddedAPI.h:479
Definition: mDNSEmbeddedAPI.h:835
Definition: mDNSEmbeddedAPI.h:1158
Definition: mDNSEmbeddedAPI.h:865
Definition: mDNSEmbeddedAPI.h:1394
Definition: mDNSEmbeddedAPI.h:253
Definition: mDNSVxWorks.h:49
Definition: mDNSEmbeddedAPI.h:1605
Definition: mDNSEmbeddedAPI.h:1780
Definition: mDNSEmbeddedAPI.h:1177
Definition: mDNSEmbeddedAPI.h:795
Definition: mDNSEmbeddedAPI.h:1138
Definition: mDNSEmbeddedAPI.h:736
Definition: mDNSEmbeddedAPI.h:1699
Definition: mDNSEmbeddedAPI.h:1477
Definition: mDNSEmbeddedAPI.h:995
Definition: mDNSEmbeddedAPI.h:1352
Definition: mDNSEmbeddedAPI.h:266
Definition: mDNSEmbeddedAPI.h:269
Definition: mDNSEmbeddedAPI.h:378
Definition: mDNSEmbeddedAPI.h:973
Definition: mDNSEmbeddedAPI.h:376
Definition: mDNSEmbeddedAPI.h:1590
Definition: mDNSEmbeddedAPI.h:1310
Definition: mDNSEmbeddedAPI.h:265
Definition: mDNSEmbeddedAPI.h:1350
Definition: mDNSEmbeddedAPI.h:1735
Definition: mDNSEmbeddedAPI.h:1630
Definition: mDNSEmbeddedAPI.h:554
Definition: mDNSEmbeddedAPI.h:1322
Definition: mDNSEmbeddedAPI.h:849
Definition: mDNSEmbeddedAPI.h:1055
Definition: mDNSEmbeddedAPI.h:371
Definition: mDNSEmbeddedAPI.h:876
Definition: mDNSEmbeddedAPI.h:2909
Definition: mDNSEmbeddedAPI.h:1157
Definition: mDNSEmbeddedAPI.h:300
Definition: mDNSEmbeddedAPI.h:1426
Definition: mDNSEmbeddedAPI.h:1505