Lines Matching defs:m
55 #define SetNextuDNSEvent(m, rr) { \
56 if ((m)->NextuDNSEvent - ((rr)->LastAPTime + (rr)->ThisAPInterval) >= 0) \
57 (m)->NextuDNSEvent = ((rr)->LastAPTime + (rr)->ThisAPInterval); \
68 mDNSlocal void SetRecordRetry(mDNS *const m, AuthRecord *rr, mDNSu32 random)
70 rr->LastAPTime = m->timenow;
74 mDNSs32 remaining = rr->expire - m->timenow;
84 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
90 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
103 LogInfo("SetRecordRetry retry in %d ms for %s", rr->ThisAPInterval, ARDisplayString(m, rr));
111 mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, const mDNSs32 serviceID, const mDNSAddr *addr,
115 DNSServer **p = &m->DNSServers;
185 (*p)->lasttest = m->timenow - INIT_UCAST_POLL_INTERVAL;
211 mDNSexport void PenalizeDNSServer(mDNS *const m, DNSQuestion *q, mDNSOpaque16 responseFlags)
216 mDNS_CheckLock(m);
250 q->qDNSServer->penaltyTime = NonZeroTime(m->timenow + DNSSERVER_PENALTY_TIME);
259 new = GetServerForQuestion(m, q);
282 DNSServerChangeForQuestion(m, q, new);
295 q->LastQTime = m->timenow - q->ThisQInterval;
296 SetNextQueryTime(m, q);
327 mDNSlocal DomainAuthInfo *GetAuthInfoForName_direct(mDNS *m, const domainname *const name)
333 for (ptr = m->AuthInfoList; ptr; ptr = ptr->next)
346 mDNSexport DomainAuthInfo *GetAuthInfoForName_internal(mDNS *m, const domainname *const name)
348 DomainAuthInfo **p = &m->AuthInfoList;
350 mDNS_CheckLock(m);
355 if ((*p)->deltime && m->timenow - (*p)->deltime >= 0 && AutoTunnelUnregistered(*p))
361 for (q = m->Questions; q; q=q->next)
364 q->AuthInfo = GetAuthInfoForName_direct(m, &q->qname);
379 return(GetAuthInfoForName_direct(m, name));
382 mDNSexport DomainAuthInfo *GetAuthInfoForName(mDNS *m, const domainname *const name)
385 mDNS_Lock(m);
386 d = GetAuthInfoForName_internal(m, name);
387 mDNS_Unlock(m);
392 mDNSexport mStatus mDNS_SetSecretForDomain(mDNS *m, DomainAuthInfo *info,
396 DomainAuthInfo **p = &m->AuthInfoList;
440 for (q = m->Questions; q; q=q->next)
442 DomainAuthInfo *newinfo = GetAuthInfoForQuestion(m, q);
463 mDNSlocal mStatus uDNS_RequestAddress(mDNS *m)
467 if (!m->NATTraversals)
469 m->retryGetAddr = NonZeroTime(m->timenow + 0x78000000);
472 else if (m->timenow - m->retryGetAddr >= 0)
474 if (mDNSv4AddrIsRFC1918(&m->Router.ip.v4))
479 err = mDNSPlatformSendUDP(m, start, end, 0, mDNSNULL, &m->Router, NATPMPPort, mDNSfalse);
483 if (mDNSIPPortIsZero(m->UPnPRouterPort) || mDNSIPPortIsZero(m->UPnPSOAPPort))
485 LNT_SendDiscoveryMsg(m);
490 mStatus lnterr = LNT_GetExternalAddress(m);
501 if (m->retryIntervalGetAddr < NATMAP_INIT_RETRY)
503 m->retryIntervalGetAddr = NATMAP_INIT_RETRY;
505 else if (m->retryIntervalGetAddr < NATMAP_MAX_RETRY_INTERVAL / 2)
507 m->retryIntervalGetAddr *= 2;
511 m->retryIntervalGetAddr = NATMAP_MAX_RETRY_INTERVAL;
514 m->retryGetAddr = NonZeroTime(m->timenow + m->retryIntervalGetAddr);
523 if (m->NextScheduledNATOp - m->retryGetAddr > 0)
524 m->NextScheduledNATOp = m->retryGetAddr;
529 mDNSlocal mStatus uDNS_SendNATMsg(mDNS *m, NATTraversalInfo *info, mDNSBool usePCP)
540 if (mDNSv4AddrIsRFC1918(&m->Router.ip.v4))
562 err = mDNSPlatformSendUDP(m, (mDNSu8 *)&NATPortReq, end, 0, mDNSNULL, &m->Router, NATPMPPort, mDNSfalse);
569 info->NewAddress = m->ExtAddress;
598 mDNSAddrMapIPv4toIPv6(&m->AdvertisedV4.ip.v4, &req.clientAddr);
600 req.nonce[0] = m->PCPNonce[0];
601 req.nonce[1] = m->PCPNonce[1];
602 req.nonce[2] = m->PCPNonce[2];
620 err = mDNSPlatformSendUDP(m, start, end, 0, mDNSNULL, &m->Router, NATPMPPort, mDNSfalse);
631 if (mDNSIPPortIsZero(m->UPnPRouterPort) || mDNSIPPortIsZero(m->UPnPSOAPPort))
633 LNT_SendDiscoveryMsg(m);
638 mStatus lnterr = LNT_MapPort(m, info);
651 mDNSexport void RecreateNATMappings(mDNS *const m, const mDNSu32 waitTicks)
653 mDNSu32 when = NonZeroTime(m->timenow + waitTicks);
655 for (n = m->NATTraversals; n; n=n->next)
667 m->PCPNonce[0] = mDNSRandom(-1);
668 m->PCPNonce[1] = mDNSRandom(-1);
669 m->PCPNonce[2] = mDNSRandom(-1);
670 m->retryIntervalGetAddr = 0;
671 m->retryGetAddr = when;
674 LNT_ClearState(m);
677 m->NextScheduledNATOp = m->timenow; // Need to send packets immediately
680 mDNSexport void natTraversalHandleAddressReply(mDNS *const m, mDNSu16 err, mDNSv4Addr ExtAddr)
701 m->ExtAddress = ExtAddr;
704 m->retryIntervalGetAddr = NATMAP_MAX_RETRY_INTERVAL;
706 m->retryIntervalGetAddr = NATMAP_INIT_RETRY;
709 m->retryGetAddr = m->timenow + m->retryIntervalGetAddr;
710 if (m->NextScheduledNATOp - m->retryGetAddr > 0)
711 m->NextScheduledNATOp = m->retryGetAddr;
715 for (n = m->NATTraversals; n; n=n->next)
736 n->retryPortMap = m->timenow;
741 m->NextScheduledNATOp = m->timenow; // Need to send packets immediately
746 // Both places that call NATSetNextRenewalTime() update m->NextScheduledNATOp correctly afterwards
747 mDNSlocal void NATSetNextRenewalTime(mDNS *const m, NATTraversalInfo *n)
749 n->retryInterval = (n->ExpiryTime - m->timenow)/2;
752 n->retryPortMap = m->timenow + n->retryInterval;
755 mDNSlocal void natTraversalHandlePortMapReplyWithAddress(mDNS *const m, NATTraversalInfo *n, const mDNSInterfaceID InterfaceID, mDNSu16 err, mDNSv4Addr extaddr, mDNSIPPort extport, mDNSu32 lease, NATTProtocol protocol)
765 n->retryPortMap = m->timenow + NATMAP_MAX_RETRY_INTERVAL;
766 // No need to set m->NextScheduledNATOp here, since we're only ever extending the m->retryPortMap time
774 n->ExpiryTime = NonZeroTime(m->timenow + lease * mDNSPlatformOneSecond);
792 NATSetNextRenewalTime(m, n); // Got our port mapping; now set timer to renew it at halfway point
793 m->NextScheduledNATOp = m->timenow; // May need to invoke client callback immediately
798 mDNSexport void natTraversalHandlePortMapReply(mDNS *const m, NATTraversalInfo *n, const mDNSInterfaceID InterfaceID, mDNSu16 err, mDNSIPPort extport, mDNSu32 lease, NATTProtocol protocol)
800 natTraversalHandlePortMapReplyWithAddress(m, n, InterfaceID, err, m->ExtAddress, extport, lease, protocol);
804 mDNSexport mStatus mDNS_StartNATOperation_internal(mDNS *const m, NATTraversalInfo *traversal)
812 for (n = &m->NATTraversals; *n; n=&(*n)->next)
835 traversal->retryPortMap = m->timenow;
852 if (!m->NATTraversals) // If this is our first NAT request, kick off an address request too
854 m->retryGetAddr = m->timenow;
855 m->retryIntervalGetAddr = NATMAP_INIT_RETRY;
863 traversal->NewAddress = m->ExtAddress;
866 m->NextScheduledNATOp = m->timenow; // This will always trigger sending the packet ASAP, and generate client callback if necessary
874 mDNSexport mStatus mDNS_StopNATOperation_internal(mDNS *m, NATTraversalInfo *traversal)
878 NATTraversalInfo **ptr = &m->NATTraversals;
891 if (m->CurrentNATTraversal == traversal)
892 m->CurrentNATTraversal = m->CurrentNATTraversal->next;
895 for (p = m->NATTraversals; p; p=p->next)
931 uDNS_SendNATMsg(m, traversal, traversal->lastSuccessfulProtocol != NATTProtocolNATPMP);
937 mStatus err = LNT_UnmapPort(m, traversal);
945 mDNSexport mStatus mDNS_StartNATOperation(mDNS *const m, NATTraversalInfo *traversal)
948 mDNS_Lock(m);
949 status = mDNS_StartNATOperation_internal(m, traversal);
950 mDNS_Unlock(m);
954 mDNSexport mStatus mDNS_StopNATOperation(mDNS *const m, NATTraversalInfo *traversal)
957 mDNS_Lock(m);
958 status = mDNS_StopNATOperation_internal(m, traversal);
959 mDNS_Unlock(m);
969 // Lock must be held -- otherwise m->timenow is undefined
970 mDNSlocal void StartLLQPolling(mDNS *const m, DNSQuestion *q)
977 q->LastQTime = m->timenow - q->ThisQInterval + 1;
978 SetNextQueryTime(m, q);
980 UpdateAutoTunnelDomainStatuses(m);
1012 // Normally we'd just request event packets be sent directly to m->LLQNAT.ExternalPort, except...
1020 mDNSlocal mDNSu16 GetLLQEventPort(const mDNS *const m, const mDNSAddr *const dst)
1024 //LogMsg("GetLLQEventPort: src %#a for dst %#a (%d)", &src, dst, mDNSv4AddrIsRFC1918(&src.ip.v4) ? mDNSVal16(m->LLQNAT.ExternalPort) : 0);
1025 return(mDNSv4AddrIsRFC1918(&src.ip.v4) ? mDNSVal16(m->LLQNAT.ExternalPort) : mDNSVal16(MulticastDNSPort));
1030 mDNSlocal void sendChallengeResponse(mDNS *const m, DNSQuestion *const q, const LLQOptData *llq)
1032 mDNSu8 *responsePtr = m->omsg.data;
1042 StartLLQPolling(m,q);
1056 q->LastQTime = m->timenow;
1058 SetNextQueryTime(m, q);
1063 InitializeDNSMessage(&m->omsg.h, q->TargetQID, uQueryFlags);
1064 responsePtr = putLLQ(&m->omsg, responsePtr, q, llq);
1067 mStatus err = mDNSSendDNSMessage(m, &m->omsg, responsePtr, mDNSInterface_Any, q->LocalSocket, &q->servAddr, q->servPort, mDNSNULL, mDNSNULL, mDNSfalse);
1070 else StartLLQPolling(m,q);
1073 mDNSlocal void SetLLQTimer(mDNS *const m, DNSQuestion *const q, const LLQOptData *const llq)
1077 q->LastQTime = m->timenow;
1078 q->expire = m->timenow + lease;
1081 SetNextQueryTime(m, q);
1084 mDNSlocal void recvSetupResponse(mDNS *const m, mDNSu8 rcode, DNSQuestion *const q, const LLQOptData *const llq)
1099 if (llq->err) { LogMsg("recvSetupResponse - received llq->err %d from server", llq->err); StartLLQPolling(m,q); return; }
1106 q->expire = m->timenow + ((mDNSs32)llq->llqlease * mDNSPlatformOneSecond);
1112 sendChallengeResponse(m, q, llq);
1128 if (llq->err) { LogMsg("ERROR: recvSetupResponse %##s (%s) code %d from server", q->qname.c, DNSTypeName(q->qtype), llq->err); StartLLQPolling(m,q); return; }
1133 SetLLQTimer(m, q, llq);
1135 UpdateAutoTunnelDomainStatuses(m);
1140 mDNSexport uDNS_LLQType uDNS_recvLLQResponse(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end,
1146 const rdataOPT *opt = GetLLQOptData(m, msg, end);
1148 for (q = m->Questions; q; q = q->next)
1158 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
1172 if (!mDNSAddressIsOnes(&q->servAddr) && !mDNSIPPortIsZero(m->LLQNAT.ExternalPort) &&
1173 !m->LLQNAT.Result)
1180 q->LastQTime = m->timenow;
1181 SetNextQueryTime(m, q);
1190 InitializeDNSMessage(&m->omsg.h, msg->h.id, ResponseFlags);
1191 ackEnd = putLLQ(&m->omsg, m->omsg.data, q, &opt->u.llq);
1192 if (ackEnd) mDNSSendDNSMessage(m, &m->omsg, ackEnd, mDNSInterface_Any, q->LocalSocket, srcaddr, srcport, mDNSNULL, mDNSNULL, mDNSfalse);
1193 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
1208 if (opt->u.llq.llqlease == 0 && m->SleepLimit) m->NextScheduledSPRetry = m->timenow;
1209 GrantCacheExtensions(m, q, opt->u.llq.llqlease);
1210 SetLLQTimer(m, q, &opt->u.llq);
1213 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
1220 recvSetupResponse(m, msg->h.flags.b[1] & kDNSFlag1_RC_Mask, q, &opt->u.llq);
1221 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
1235 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
1250 mDNS *m = tcpInfo->m;
1273 AuthInfo = tcpInfo->rr ? GetAuthInfoForName(m, tcpInfo->rr->resrec.name) : mDNSNULL;
1281 else if (q && q->LongLived && q->state != LLQ_Poll && !mDNSIPPortIsZero(m->LLQNAT.ExternalPort) && !mDNSIPPortIsZero(q->servPort))
1290 llqData.err = GetLLQEventPort(m, &tcpInfo->Addr); // We're using TCP; tell server what UDP port to send notifications to
1316 err = mDNSSendDNSMessage(m, &tcpInfo->request, end, mDNSInterface_Any, mDNSNULL, &tcpInfo->Addr, tcpInfo->Port, sock, AuthInfo, mDNSfalse);
1322 mDNS_Lock(m);
1323 q->LastQTime = m->timenow;
1326 SetNextQueryTime(m, q);
1327 mDNS_Unlock(m);
1438 if (!q || !q->LongLived || m->SleepState)
1441 mDNSCoreReceive(m, reply, end, &Addr, Port, tls ? (mDNSAddr *)1 : mDNSNULL, srcPort, 0);
1457 mDNS_Lock(m); // Need to grab the lock to get m->timenow
1465 q->LastQTime = m->timenow;
1491 SetNextQueryTime(m, q);
1493 else if (NextQSendTime(q) - m->timenow > (q->LongLived ? LLQ_POLL_INTERVAL : MAX_UCAST_POLL_INTERVAL))
1497 q->LastQTime = m->timenow;
1499 SetNextQueryTime(m, q);
1515 if (q->LongLived && q->state != LLQ_Poll) StartLLQPolling(m, q);
1519 mDNS_Unlock(m);
1525 mDNSlocal tcpInfo_t *MakeTCPConn(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end,
1543 info->m = m;
1544 info->sock = mDNSPlatformTCPSocket(m, flags, &srcport, useBackgroundTrafficClass);
1585 mDNSexport void startLLQHandshake(mDNS *m, DNSQuestion *q)
1587 if (m->LLQNAT.clientContext != mDNSNULL) // LLQNAT just started, give it some time
1591 q->LastQTime = m->timenow;
1592 SetNextQueryTime(m, q);
1598 if (mDNSIPPortIsZero(m->LLQNAT.ExternalPort) || m->LLQNAT.Result)
1601 q->qname.c, DNSTypeName(q->qtype), mDNSVal16(m->LLQNAT.ExternalPort), m->LLQNAT.Result);
1602 StartLLQPolling(m, q);
1610 q->LastQTime = m->timenow;
1611 SetNextQueryTime(m, q);
1614 if (q->nta) CancelGetZoneData(m, q->nta);
1615 q->nta = StartGetZoneData(m, &q->qname, ZoneServiceLLQ, LLQGotZoneData, q);
1633 q->nta = StartGetZoneData(m, &q->qname, ZoneServiceLLQ, LLQGotZoneData, q);
1641 q->tcp = MakeTCPConn(m, mDNSNULL, mDNSNULL, kTCPSocketFlags_UseTLS, &q->servAddr, q->servPort, &q->nta->Host, q, mDNSNULL);
1650 q->LastQTime = m->timenow;
1651 SetNextQueryTime(m, q);
1655 debugf("startLLQHandshake: m->AdvertisedV4 %#a%s Server %#a:%d%s %##s (%s)",
1656 &m->AdvertisedV4, mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) ? " (RFC 1918)" : "",
1663 StartLLQPolling(m, q);
1677 InitializeDNSMessage(&m->omsg.h, q->TargetQID, uQueryFlags);
1678 end = putLLQ(&m->omsg, m->omsg.data, q, &llqData);
1679 if (!end) { LogMsg("ERROR: startLLQHandshake - putLLQ"); StartLLQPolling(m,q); return; }
1681 mDNSSendDNSMessage(m, &m->omsg, end, mDNSInterface_Any, q->LocalSocket, &q->servAddr, q->servPort, mDNSNULL, mDNSNULL, mDNSfalse);
1687 q->LastQTime = m->timenow;
1688 SetNextQueryTime(m, q);
1694 mDNSlocal void GetStaticHostname(mDNS *m);
1696 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
1705 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
1708 StartServerTunnel(m, AuthInfo);
1719 for (hi = m->Hostnames; hi; hi = hi->next)
1731 if (m->StaticHostname.c[0]) return(&m->StaticHostname);
1732 else GetStaticHostname(m); // asynchronously do reverse lookup for primary IPv4 address
1733 LogInfo("GetServiceTarget: Returning NULL for %s", ARDisplayString(m, rr));
1752 mDNSlocal mStatus GetZoneData_StartQuery(mDNS *const m, ZoneData *zd, mDNSu16 qtype);
1755 mDNSlocal void GetZoneData_QuestionCallback(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord)
1759 debugf("GetZoneData_QuestionCallback: %s %s", AddRecord ? "Add" : "Rmv", RRDisplayString(m, answer));
1767 debugf("GetZoneData GOT SOA %s", RRDisplayString(m, answer));
1768 mDNS_StopQuery(m, question);
1776 GetZoneData_StartQuery(m, zd, kDNSType_SRV);
1780 DomainAuthInfo *AuthInfo = GetAuthInfoForName(m, zd->CurrentSOA);
1786 zd->ZoneDataCallback(m, mStatus_NoSuchNameErr, zd);
1792 GetZoneData_StartQuery(m, zd, kDNSType_SOA);
1798 zd->ZoneDataCallback(m, mStatus_NoSuchNameErr, zd);
1803 debugf("GetZoneData GOT SRV %s", RRDisplayString(m, answer));
1804 mDNS_StopQuery(m, question);
1814 GetZoneData_StartQuery(m, zd, kDNSType_SRV); // Try again, non-private this time
1824 GetZoneData_StartQuery(m, zd, kDNSType_A);
1832 zd->ZoneDataCallback(m, mStatus_NoError, zd);
1838 debugf("GetZoneData GOT A %s", RRDisplayString(m, answer));
1839 mDNS_StopQuery(m, question);
1858 zd->ZoneDataCallback(m, mStatus_NoError, zd);
1863 mDNSlocal mStatus GetZoneData_StartQuery(mDNS *const m, ZoneData *zd, mDNSu16 qtype)
1905 return(mDNS_StartQuery(m, &zd->question));
1909 mDNSexport ZoneData *StartGetZoneData(mDNS *const m, const domainname *const name, const ZoneService target, ZoneDataCallback callback, void *ZoneDataContext)
1911 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, name);
1948 GetZoneData_StartQuery(m, zd, kDNSType_A);
1954 GetZoneData_StartQuery(m, zd, kDNSType_SOA);
1974 mDNSexport DomainAuthInfo *GetAuthInfoForQuestion(mDNS *m, const DNSQuestion *const q) // Must be called with lock held
1978 return(GetAuthInfoForName_internal(m, &q->qname));
1986 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr);
1987 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr);
1988 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time);
1992 mDNSlocal void UpdateAllServiceRecords(mDNS *const m, AuthRecord *rr, mDNSBool reg)
1996 if (rr->resrec.rrtype != kDNSType_SRV) { LogMsg("UpdateAllServiceRecords:ERROR!! ResourceRecord not a service record %s", ARDisplayString(m, rr)); return; }
1998 if (reg && rr->state == regState_NoTarget) { LogMsg("UpdateAllServiceRecords:ERROR!! SRV record %s in noTarget state during registration", ARDisplayString(m, rr)); return; }
2000 LogInfo("UpdateAllServiceRecords: ResourceRecord %s", ARDisplayString(m, rr));
2002 for (r = m->ResourceRecords; r; r=r->next)
2011 LogMsg("UpdateAllServiceRecords: ERROR!! Resource record %s wrong, expecting SRV type", ARDisplayString(m, srvRR));
2016 LogInfo("UpdateAllServiceRecords: deregistering %s", ARDisplayString(m, r));
2019 r->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2034 LogInfo("UpdateAllServiceRecords: not registering %s, state %d", ARDisplayString(m, r), r->state);
2037 LogInfo("UpdateAllServiceRecords: registering %s, state %d", ARDisplayString(m, r), r->state);
2038 ActivateUnicastRegistration(m, r);
2047 mDNSlocal void CompleteRecordNatMap(mDNS *m, NATTraversalInfo *n)
2055 if (!n->NATLease) { LogMsg("CompleteRecordNatMap No NATLease for %s", ARDisplayString(m, rr)); return; }
2057 if (rr->resrec.rrtype != kDNSType_SRV) {LogMsg("CompleteRecordNatMap: Not a service record %s", ARDisplayString(m, rr)); return; }
2059 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) { LogInfo("CompleteRecordNatMap called for %s, Service deregistering", ARDisplayString(m, rr)); return; }
2061 if (rr->state == regState_DeregPending) { LogInfo("CompleteRecordNatMap called for %s, record in DeregPending", ARDisplayString(m, rr)); return; }
2068 LogInfo("CompleteRecordNatMap called for %s but no zone information!", ARDisplayString(m, rr));
2073 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2078 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2082 mDNS_Lock(m);
2085 target = GetServiceTarget(m, rr);
2096 mDNS_Unlock(m);
2097 UpdateAllServiceRecords(m, rr, mDNSfalse);
2129 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2130 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
2134 mDNS_Unlock(m);
2140 UpdateAllServiceRecords(m, rr, mDNStrue);
2143 mDNSlocal void StartRecordNatMap(mDNS *m, AuthRecord *rr)
2163 // rr->NATinfo.clientContext, mDNSVal16(rr->NATinfo.IntPort), mDNSVal16(rr->resrec.rdata->u.srv.port), ARDisplayString(m, rr));
2164 if (rr->NATinfo.clientContext) mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2174 mDNS_StartNATOperation_internal(m, &rr->NATinfo);
2177 // Unlink an Auth Record from the m->ResourceRecords list.
2196 mDNSlocal mStatus UnlinkResourceRecord(mDNS *const m, AuthRecord *const rr)
2198 AuthRecord **list = &m->ResourceRecords;
2208 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2222 mDNSlocal void RegisterAllServiceRecords(mDNS *const m, AuthRecord *rr)
2228 UnlinkResourceRecord(m, rr);
2229 mDNS_Register_internal(m, rr);
2231 UpdateAllServiceRecords(m, rr, mDNStrue);
2235 mDNSlocal void UpdateOneSRVRecord(mDNS *m, AuthRecord *rr)
2243 const domainname *const nt = GetServiceTarget(m, rr);
2254 mDNSBool NowNeedNATMAP = (rr->AutoTarget == Target_AutoHostAndNATMAP && !mDNSIPPortIsZero(port) && mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) && rr->nta && !mDNSAddrIsRFC1918(&rr->nta->Addr));
2261 LogInfo("UpdateOneSRVRecord: Resource Record %s TargetChanged %d, NewTarget %##s", ARDisplayString(m, rr), TargetChanged, nt->c);
2267 mDNS_CheckLock(m);
2303 LogInfo("UpdateOneSRVRecord: No target yet for Resource Record %s", ARDisplayString(m, rr));
2306 RegisterAllServiceRecords(m, rr);
2336 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2347 UpdateAllServiceRecords(m, rr, mDNSfalse);
2355 mDNSexport void UpdateAllSRVRecords(mDNS *m)
2357 m->NextSRVUpdate = 0;
2358 LogInfo("UpdateAllSRVRecords %d", m->SleepState);
2360 if (m->CurrentRecord)
2361 LogMsg("UpdateAllSRVRecords ERROR m->CurrentRecord already set %s", ARDisplayString(m, m->CurrentRecord));
2362 m->CurrentRecord = m->ResourceRecords;
2363 while (m->CurrentRecord)
2365 AuthRecord *rptr = m->CurrentRecord;
2366 m->CurrentRecord = m->CurrentRecord->next;
2368 UpdateOneSRVRecord(m, rptr);
2373 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
2376 mDNSlocal void hostnameGetPublicAddressCallback(mDNS *m, NATTraversalInfo *n)
2391 mDNS_Deregister(m, &h->arv4); // mStatus_MemFree callback will re-register with new address
2398 mDNS_Register(m, &h->arv4);
2404 mDNSlocal void AdvertiseHostname(mDNS *m, HostnameInfo *h)
2406 if (!mDNSIPv4AddressIsZero(m->AdvertisedV4.ip.v4) && h->arv4.resrec.RecordType == kDNSRecordTypeUnregistered)
2410 h->arv4.resrec.rdata->u.ipv4 = m->AdvertisedV4.ip.v4;
2412 if (mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4))
2415 if (h->natinfo.clientContext) mDNS_StopNATOperation_internal(m, &h->natinfo);
2422 mDNS_StartNATOperation_internal(m, &h->natinfo);
2426 LogInfo("Advertising hostname %##s IPv4 %.4a", h->arv4.resrec.name->c, &m->AdvertisedV4.ip.v4);
2428 mDNS_Register_internal(m, &h->arv4);
2432 if (!mDNSIPv6AddressIsZero(m->AdvertisedV6.ip.v6) && h->arv6.resrec.RecordType == kDNSRecordTypeUnregistered)
2436 h->arv6.resrec.rdata->u.ipv6 = m->AdvertisedV6.ip.v6;
2438 LogInfo("Advertising hostname %##s IPv6 %.16a", h->arv6.resrec.name->c, &m->AdvertisedV6.ip.v6);
2439 mDNS_Register_internal(m, &h->arv6);
2443 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
2453 LogInfo("HostnameCallback: Got mStatus_MemFree for %p %p %s", hi, rr, ARDisplayString(m, rr));
2454 for (i = m->Hostnames; i; i = i->next)
2456 { mDNS_Lock(m); AdvertiseHostname(m, i); mDNS_Unlock(m); return; }
2462 if (hi->natinfo.clientContext) mDNS_StopNATOperation_internal(m, &hi->natinfo);
2486 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2493 mDNS_Lock(m);
2494 m->NextSRVUpdate = NonZeroTime(m->timenow);
2495 mDNS_Unlock(m);
2506 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2510 mDNSlocal void FoundStaticHostname(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord)
2513 domainname *storedname = &m->StaticHostname;
2514 HostnameInfo *h = m->Hostnames;
2531 m->NextSRVUpdate = NonZeroTime(m->timenow + 5 * mDNSPlatformOneSecond);
2532 debugf("FoundStaticHostname: NextSRVUpdate in %d %d", m->NextSRVUpdate - m->timenow, m->timenow);
2537 mDNS_Lock(m);
2538 m->NextSRVUpdate = NonZeroTime(m->timenow);
2539 mDNS_Unlock(m);
2543 mDNS_Lock(m);
2545 m->NextSRVUpdate = NonZeroTime(m->timenow);
2546 mDNS_Unlock(m);
2551 mDNSlocal void GetStaticHostname(mDNS *m)
2554 DNSQuestion *q = &m->ReverseMap;
2555 mDNSu8 *ip = m->AdvertisedV4.ip.v4.b;
2558 if (m->ReverseMap.ThisQInterval != -1) return; // already running
2559 if (mDNSIPv4AddressIsZero(m->AdvertisedV4.ip.v4)) return;
2594 err = mDNS_StartQuery_internal(m, q);
2598 mDNSexport void mDNS_AddDynDNSHostName(mDNS *m, const domainname *fqdn, mDNSRecordCallback *StatusCallback, const void *StatusContext)
2600 HostnameInfo **ptr = &m->Hostnames;
2618 AdvertiseHostname(m, *ptr);
2621 mDNSexport void mDNS_RemoveDynDNSHostName(mDNS *m, const domainname *fqdn)
2623 HostnameInfo **ptr = &m->Hostnames;
2632 // We do it this way because, if we have no active v6 record, the "mDNS_Deregister_internal(m, &hi->arv4);"
2639 if (f4) mDNS_Deregister_internal(m, &hi->arv4, mDNS_Dereg_normal);
2640 if (f6) mDNS_Deregister_internal(m, &hi->arv6, mDNS_Dereg_normal);
2643 mDNS_CheckLock(m);
2644 m->NextSRVUpdate = NonZeroTime(m->timenow);
2649 mDNSexport void mDNS_SetPrimaryInterfaceInfo(mDNS *m, const mDNSAddr *v4addr, const mDNSAddr *v6addr, const mDNSAddr *router)
2654 if (m->mDNS_busy != m->mDNS_reentrancy)
2655 LogMsg("mDNS_SetPrimaryInterfaceInfo: mDNS_busy (%ld) != mDNS_reentrancy (%ld)", m->mDNS_busy, m->mDNS_reentrancy);
2661 mDNS_Lock(m);
2663 v4Changed = !mDNSSameIPv4Address(m->AdvertisedV4.ip.v4, v4addr ? v4addr->ip.v4 : zerov4Addr);
2668 v6Changed = !mDNSSameIPv6Address(m->AdvertisedV6.ip.v6, v6);
2669 RouterChanged = !mDNSSameIPv4Address(m->Router.ip.v4, router ? router->ip.v4 : zerov4Addr);
2672 debugf("mDNS_SetPrimaryInterfaceInfo: address changed from %#a to %#a", &m->AdvertisedV4, v4addr);
2674 if (v4addr) m->AdvertisedV4 = *v4addr;else m->AdvertisedV4.ip.v4 = zerov4Addr;
2675 if (v6addr) m->AdvertisedV6 = *v6addr;else m->AdvertisedV6.ip.v6 = zerov6Addr;
2676 if (router) m->Router = *router;else m->Router.ip.v4 = zerov4Addr;
2687 for (i = m->Hostnames; i; i = i->next)
2692 !mDNSSameIPv4Address(i->arv4.resrec.rdata->u.ipv4, m->AdvertisedV4.ip.v4))
2694 LogInfo("mDNS_SetPrimaryInterfaceInfo deregistering %s", ARDisplayString(m, &i->arv4));
2695 mDNS_Deregister_internal(m, &i->arv4, mDNS_Dereg_normal);
2699 !mDNSSameIPv6Address(i->arv6.resrec.rdata->u.ipv6, m->AdvertisedV6.ip.v6))
2701 LogInfo("mDNS_SetPrimaryInterfaceInfo deregistering %s", ARDisplayString(m, &i->arv6));
2702 mDNS_Deregister_internal(m, &i->arv6, mDNS_Dereg_normal);
2707 AdvertiseHostname(m, i);
2717 m->ExtAddress = zerov4Addr;
2718 m->LastNATMapResultCode = NATErr_None;
2720 RecreateNATMappings(m, mDNSPlatformOneSecond * waitSeconds);
2722 for (n = m->NATTraversals; n; n=n->next)
2731 if (m->ReverseMap.ThisQInterval != -1) mDNS_StopQuery_internal(m, &m->ReverseMap);
2732 m->StaticHostname.c[0] = 0;
2734 m->NextSRVUpdate = NonZeroTime(m->timenow);
2737 if (RouterChanged) uuid_generate(m->asl_uuid);
2738 UpdateAutoTunnelDomainStatuses(m);
2742 mDNS_Unlock(m);
2750 mDNSlocal mStatus ParseTSIGError(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end, const domainname *const displayname)
2761 ptr = GetLargeResourceRecord(m, msg, ptr, end, 0, kDNSRecordTypePacketAdd, &m->rec);
2763 if (m->rec.r.resrec.RecordType != kDNSRecordTypePacketNegative && m->rec.r.resrec.rrtype == kDNSType_TSIG)
2766 mDNSu8 *rd = m->rec.r.resrec.rdata->u.data;
2767 mDNSu8 *rdend = rd + m->rec.r.resrec.rdlength;
2768 int alglen = DomainNameLengthLimit(&m->rec.r.resrec.rdata->u.name, rdend);
2791 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
2795 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
2799 mDNSlocal mStatus checkUpdateResult(mDNS *const m, const domainname *const displayname, const mDNSu8 rcode, const DNSMessage *const msg, const mDNSu8 *const end)
2821 mStatus tsigerr = ParseTSIGError(m, msg, end, displayname);
2831 mStatus tsigerr = ParseTSIGError(m, msg, end, displayname);
2848 mDNSlocal mDNSu32 RRAdditionalSize(mDNS *const m, DomainAuthInfo *AuthInfo)
2860 hinfoSize = (m->hostlabel.c[0] + 1) + DomainNameLength(&AuthInfo->domain) +
2861 rr_base_size + (2 + m->HIHardware.c[0] + m->HISoftware.c[0]);
2882 mDNSlocal mDNSu8* BuildUpdateMessage(mDNS *const m, mDNSu8 *ptr, AuthRecord *rr, mDNSu8 *limit)
2888 ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit);
2913 if (!(ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit))) goto exit; // delete old rdata
2917 if (!(ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit))) goto exit;
2926 ptr = putDeleteRRSetWithLimit(&m->omsg, ptr, rr->resrec.name, rr->resrec.rrtype, limit);
2932 //ptr = putPrereqNameNotInUse(rr->resrec.name, &m->omsg, ptr, end);
2936 ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
2942 LogMsg("BuildUpdateMessage: Error formatting message for %s", ARDisplayString(m, rr));
2947 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr)
2949 mDNSu8 *ptr = m->omsg.data;
2958 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
2959 limit -= RRAdditionalSize(m, AuthInfo);
2961 mDNS_CheckLock(m);
2966 LogMsg("SendRecordRegistration: No Zone information, should not happen %s", ARDisplayString(m, rr));
2970 rr->updateid = mDNS_NewMessageID(m);
2971 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
2974 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
2977 if (!(ptr = BuildUpdateMessage(m, ptr, rr, limit))) goto exit;
2981 ptr = putUpdateLeaseWithLimit(&m->omsg, ptr, DEFAULT_UPDATE_LEASE, limit);
2986 LogInfo("SendRecordRegistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
2987 if (rr->tcp) LogInfo("SendRecordRegistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
2989 if (!rr->nta) { LogMsg("SendRecordRegistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2990 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
2994 LogInfo("SendRecordRegistration UDP %s", ARDisplayString(m, rr));
2995 if (!rr->nta) { LogMsg("SendRecordRegistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2996 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name), mDNSfalse);
3000 SetRecordRetry(m, rr, 0);
3003 LogMsg("SendRecordRegistration: Error formatting message for %s, disabling further updates", ARDisplayString(m, rr));
3009 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time)
3012 (void) m; //unused
3032 { debugf("IsRecordMergeable: Time %d not reached for %s", rr->LastAPTime + rr->ThisAPInterval - m->timenow, ARDisplayString(m, rr)); return mDNSfalse; }
3036 info = GetAuthInfoForName_internal(m, rr->zone);
3038 if (info && info->deltime && m->timenow - info->deltime >= 0) {debugf("IsRecordMergeable: Domain %##s will be deleted soon", info->domain.c); return mDNSfalse;}
3041 { debugf("IsRecordMergeable: state %d not right %s", rr->state, ARDisplayString(m, rr)); return mDNSfalse; }
3047 if (rr->mState == mergeState_DontMerge) {debugf("IsRecordMergeable Dontmerge true %s", ARDisplayString(m, rr)); return mDNSfalse;}
3048 debugf("IsRecordMergeable: Returning true for %s", ARDisplayString(m, rr));
3053 mDNSlocal mDNSBool AreRecordsMergeable(mDNS *const m, AuthRecord *currentRR, AuthRecord *rr, mDNSs32 time)
3057 if (!IsRecordMergeable(m, rr, time)) return mDNSfalse;
3066 debugf("AreRecordsMergeable: Returning true for %s", ARDisplayString(m, rr));
3072 mDNSlocal void RRMergeFailure(mDNS *const m)
3075 for (rr = m->ResourceRecords; rr; rr = rr->next)
3081 ActivateUnicastRegistration(m, rr);
3085 mDNSlocal void SendGroupRRMessage(mDNS *const m, AuthRecord *anchorRR, mDNSu8 *ptr, DomainAuthInfo *info)
3090 if (info && info->AutoTunnel) limit = m->omsg.data + AbsoluteMaxDNSMessageData;
3091 else limit = m->omsg.data + NormalMaxDNSMessageData;
3094 ptr = putUpdateLeaseWithLimit(&m->omsg, ptr, DEFAULT_UPDATE_LEASE, limit);
3099 RRMergeFailure(m);
3104 if (anchorRR->tcp) debugf("SendGroupRRMessage: Disposing existing TCP connection for %s", ARDisplayString(m, anchorRR));
3106 if (!anchorRR->nta) { LogMsg("SendGroupRRMessage:ERROR!! nta is NULL for %s", ARDisplayString(m, anchorRR)); return; }
3107 anchorRR->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &anchorRR->nta->Addr, anchorRR->nta->Port, &anchorRR->nta->Host, mDNSNULL, anchorRR);
3108 if (!anchorRR->tcp) LogInfo("SendGroupRRMessage: Cannot establish TCP connection for %s", ARDisplayString(m, anchorRR));
3109 else LogInfo("SendGroupRRMessage: Sent a group update ID: %d start %p, end %p, limit %p", mDNSVal16(m->omsg.h.id), m->omsg.data, ptr, limit);
3113 mStatus err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &anchorRR->nta->Addr, anchorRR->nta->Port, mDNSNULL, info, mDNSfalse);
3114 if (err) LogInfo("SendGroupRRMessage: Cannot send UDP message for %s", ARDisplayString(m, anchorRR));
3115 else LogInfo("SendGroupRRMessage: Sent a group UDP update ID: %d start %p, end %p, limit %p", mDNSVal16(m->omsg.h.id), m->omsg.data, ptr, limit);
3160 mDNSlocal AuthRecord *MarkRRForSending(mDNS *const m)
3172 // By looking for 1 second into the future (m->timenow + MERGE_DELAY_TIME below does that) we have merged both
3179 for (rr = m->ResourceRecords; rr; rr = rr->next)
3183 if (!IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME)) continue;
3186 else if (!AreRecordsMergeable(m, firstRR, rr, m->timenow + MERGE_DELAY_TIME)) continue;
3188 if (rr->SendRNow) LogMsg("MarkRRForSending: Resourcerecord %s already marked for sending", ARDisplayString(m, rr));
3206 for (rr = m->ResourceRecords; rr; rr = rr->next)
3210 (!AreRecordsMergeable(m, firstRR, rr, m->timenow + rr->ThisAPInterval/2)))
3220 mDNSlocal mDNSBool SendGroupUpdates(mDNS *const m)
3226 mDNSu8 *next = m->omsg.data;
3230 AuthRecord *startRR = m->ResourceRecords;
3264 AuthInfo = GetAuthInfoForName_internal(m, rr->zone);
3272 next = m->omsg.data;
3273 spaceleft -= RRAdditionalSize(m, AuthInfo);
3277 RRMergeFailure(m);
3283 msgid = mDNS_NewMessageID(m);
3284 InitializeDNSMessage(&m->omsg.h, msgid, UpdateReqFlags);
3294 RRMergeFailure(m);
3297 next = putZone(&m->omsg, next, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
3301 RRMergeFailure(m);
3315 LogInfo("SendGroupUpdates: Skipping message %s, spaceleft %d, rrSize %d", ARDisplayString(m, rr), spaceleft, rrSize);
3320 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3327 LogInfo("SendGroupUpdates:1: Parsed %d records and sending using %s, spaceleft %d, rrSize %d", nrecords, ARDisplayString(m, anchorRR), spaceleft, rrSize);
3328 SendGroupRRMessage(m, anchorRR, next, AuthInfo);
3334 LogInfo("SendGroupUpdates: Building a message with resource record %s, next %p, state %d, ttl %d", ARDisplayString(m, rr), next, rr->state, rr->resrec.rroriginalttl);
3335 if (!(next = BuildUpdateMessage(m, next, rr, limit)))
3339 LogMsg("SendGroupUpdates: ptr NULL while building message with %s", ARDisplayString(m, rr));
3340 RRMergeFailure(m);
3345 LogMsg("SendGroupUpdates: ERROR!! Record size estimation is wrong for %s, Estimate %d, Actual %d, state %d", ARDisplayString(m, rr), rrSize, next - oldnext, rr->state);
3356 SetRecordRetry(m, rr, 0);
3364 LogInfo("SendGroupUpdates: Parsed %d records and sending using %s", nrecords, ARDisplayString(m, anchorRR));
3365 SendGroupRRMessage(m, anchorRR, next, AuthInfo);
3372 mDNSlocal void CheckGroupRecordUpdates(mDNS *const m)
3376 while (MarkRRForSending(m))
3378 if (!SendGroupUpdates(m))
3381 for (rr = m->ResourceRecords; rr; rr = nextRR)
3390 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow > 0)
3391 { LogMsg("CheckGroupRecordUpdates: ERROR!! Resourcerecord %s not ready", ARDisplayString(m, rr)); continue; }
3393 SendRecordRegistration(m, rr);
3403 mDNSlocal void hndlSRVChanged(mDNS *const m, AuthRecord *rr)
3408 const domainname *target = GetServiceTarget(m, rr);
3429 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3454 UpdateOneSRVRecord(m, rr);
3466 mDNSlocal void hndlRecordUpdateReply(mDNS *m, AuthRecord *rr, mStatus err, mDNSu32 random)
3471 mDNS_CheckLock(m);
3473 LogInfo("hndlRecordUpdateReply: err %d ID %d state %d %s(%p)", err, mDNSVal16(rr->updateid), rr->state, ARDisplayString(m, rr), rr);
3477 if (err == mStatus_BadSig || err == mStatus_BadKey || err == mStatus_BadTime) UpdateAutoTunnelDomainStatuses(m);
3480 SetRecordRetry(m, rr, random);
3500 ARDisplayString(m, rr), rr->nta->question.qname.c, DNSTypeName(rr->nta->question.qtype), rr->nta->question.ThisQInterval);
3502 CancelGetZoneData(m, rr->nta);
3514 CompleteDeregistration(m, rr);
3522 if (m->SleepState)
3536 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
3545 hndlSRVChanged(m, rr);
3550 if (rr->state != regState_DeregPending) LogMsg("hndlRecordUpdateReply: ResourceRecord %s not in DeregPending state %d", ARDisplayString(m, rr), rr->state);
3572 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3573 SetNextuDNSEvent(m, rr);
3589 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3590 SetNextuDNSEvent(m, rr);
3601 rr->RecordCallback(m, rr, err);
3608 mDNSlocal void uDNS_ReceiveNATPMPPacket(mDNS *m, const mDNSInterfaceID InterfaceID, mDNSu8 *pkt, mDNSu16 len)
3625 for (n = m->NATTraversals; n; n=n->next)
3629 uDNS_SendNATMsg(m, n, mDNSfalse);
3632 m->NextScheduledNATOp = m->timenow;
3649 nat_elapsed = AddrReply->upseconds - m->LastNATupseconds;
3650 our_elapsed = (m->timenow - m->LastNATReplyLocalTime) / mDNSPlatformOneSecond;
3663 if (AddrReply->upseconds < m->LastNATupseconds || nat_elapsed + 2 < our_elapsed - our_elapsed/8)
3664 { LogMsg("NAT-PMP epoch time check failed: assuming NAT gateway %#a rebooted", &m->Router); RecreateNATMappings(m, 0); }
3666 m->LastNATupseconds = AddrReply->upseconds;
3667 m->LastNATReplyLocalTime = m->timenow;
3669 LNT_ClearState(m);
3677 mDNSASLLog((uuid_t *)&m->asl_uuid, "natt.natpmp.AddressRequest", AddrReply->err ? "failure" : "success", msgbuf, "");
3680 natTraversalHandleAddressReply(m, AddrReply->err, AddrReply->ExtAddr);
3688 mDNSASLLog((uuid_t *)&m->asl_uuid, "natt.natpmp.PortMapRequest", PortMapReply->err ? "failure" : "success", msgbuf, "");
3699 m->LastNATMapResultCode = PortMapReply->err;
3701 for (ptr = m->NATTraversals; ptr; ptr=ptr->next)
3703 natTraversalHandlePortMapReply(m, ptr, InterfaceID, PortMapReply->err, PortMapReply->extport, PortMapReply->NATRep_lease, NATTProtocolNATPMP);
3708 if (m->SSDPSocket) { debugf("uDNS_ReceiveNATPMPPacket destroying SSDPSocket %p", &m->SSDPSocket); mDNSPlatformUDPClose(m->SSDPSocket); m->SSDPSocket = mDNSNULL; }
3711 mDNSlocal void uDNS_ReceivePCPPacket(mDNS *m, const mDNSInterfaceID InterfaceID, mDNSu8 *pkt, mDNSu16 len)
3716 mDNSBool checkEpochValidity = m->LastNATupseconds != 0;
3742 client_delta = (m->timenow - m->LastNATReplyLocalTime) / mDNSPlatformOneSecond;
3743 server_delta = reply->epoch - m->LastNATupseconds;
3747 m->LastNATupseconds = reply->epoch ? reply->epoch : 1;
3748 m->LastNATReplyLocalTime = m->timenow;
3751 LNT_ClearState(m);
3755 if (m->SSDPSocket) { debugf("uDNS_ReceivePCPPacket: destroying SSDPSocket %p", &m->SSDPSocket); mDNSPlatformUDPClose(m->SSDPSocket); m->SSDPSocket = mDNSNULL; }
3762 LogMsg("uDNS_ReceivePCPPacket: Epoch invalid, %#a likely rebooted, waiting %u ticks", &m->Router, waitTicks);
3763 RecreateNATMappings(m, waitTicks);
3773 m->LastNATMapResultCode = reply->result;
3784 if (reply->nonce[0] != m->PCPNonce[0] || reply->nonce[1] != m->PCPNonce[1] || reply->nonce[2] != m->PCPNonce[2])
3788 m->PCPNonce[0], m->PCPNonce[1], m->PCPNonce[2]);
3831 for (ptr = m->NATTraversals; ptr; ptr=ptr->next)
3837 natTraversalHandlePortMapReplyWithAddress(m, ptr, InterfaceID, reply->result ? NATErr_NetFail : NATErr_None, mappedAddress, extport, reply->lifetime, NATTProtocolPCP);
3842 mDNSexport void uDNS_ReceiveNATPacket(mDNS *m, const mDNSInterfaceID InterfaceID, mDNSu8 *pkt, mDNSu16 len)
3847 uDNS_ReceivePCPPacket(m, InterfaceID, pkt, len);
3849 uDNS_ReceiveNATPMPPacket(m, InterfaceID, pkt, len);
3922 mDNSlocal mDNSBool uDNS_ReceiveTestQuestionResponse(mDNS *const m, DNSMessage *const msg, const mDNSu8 *const end,
3945 for (s = m->DNSServers; s; s = s->next)
3969 for (q = m->Questions; q; q=q->next)
3974 q->LastQTime = m->timenow - q->ThisQInterval;
3975 m->NextScheduledQuery = m->timenow;
3984 mDNSexport void uDNS_ReceiveMsg(mDNS *const m, DNSMessage *const msg, const mDNSu8 *const end, const mDNSAddr *const srcaddr, const mDNSIPPort srcport)
4006 //if (srcaddr && recvLLQResponse(m, msg, end, srcaddr, srcport)) return;
4007 if (uDNS_ReceiveTestQuestionResponse(m, msg, end, srcaddr, srcport)) return;
4008 for (qptr = m->Questions; qptr; qptr = qptr->next)
4009 if (msg->h.flags.b[0] & kDNSFlag0_TC && mDNSSameOpaque16(qptr->TargetQID, msg->h.id) && m->timenow - qptr->LastQTime < RESPONSE_WINDOW)
4018 qptr->tcp = MakeTCPConn(m, mDNSNULL, mDNSNULL, kTCPSocketFlags_Zero, srcaddr, srcport, mDNSNULL, qptr, mDNSNULL);
4025 mDNSu32 lease = GetPktLease(m, msg, end);
4026 mDNSs32 expire = m->timenow + (mDNSs32)lease * mDNSPlatformOneSecond;
4033 if (m->CurrentRecord)
4034 LogMsg("uDNS_ReceiveMsg ERROR m->CurrentRecord already set %s", ARDisplayString(m, m->CurrentRecord));
4035 m->CurrentRecord = m->ResourceRecords;
4036 while (m->CurrentRecord)
4038 AuthRecord *rptr = m->CurrentRecord;
4039 m->CurrentRecord = m->CurrentRecord->next;
4042 err = checkUpdateResult(m, rptr->resrec.name, rcode, msg, end);
4051 hndlRecordUpdateReply(m, rptr, err, random);
4063 mDNSexport void sendLLQRefresh(mDNS *m, DNSQuestion *q)
4067 mDNSu8 *limit = m->omsg.data + AbsoluteMaxDNSMessageData;
4070 if ((q->state == LLQ_Established && q->ntries >= kLLQ_MAX_TRIES) || q->expire - m->timenow < 0)
4073 StartLLQPolling(m,q);
4079 llq.err = q->tcp ? GetLLQEventPort(m, &q->servAddr) : LLQErr_NoError; // If using TCP tell server what UDP port to send notifications to
4083 InitializeDNSMessage(&m->omsg.h, q->TargetQID, uQueryFlags);
4084 end = putLLQ(&m->omsg, m->omsg.data, q, &llq);
4089 end = putHINFO(m, &m->omsg, end, q->AuthInfo, limit);
4094 DNSDigest_SignMessageHostByteOrder(&m->omsg, &end, q->AuthInfo);
4108 q->nta = StartGetZoneData(m, &q->qname, ZoneServiceLLQ, LLQGotZoneData, q);
4114 q->tcp = MakeTCPConn(m, &m->omsg, end, kTCPSocketFlags_UseTLS, &q->servAddr, q->servPort, &q->nta->Host, q, mDNSNULL);
4125 err = mDNSSendDNSMessage(m, &m->omsg, end, mDNSInterface_Any, q->LocalSocket, &q->servAddr, q->servPort, q->tcp ? q->tcp->sock : mDNSNULL, mDNSNULL, mDNSfalse);
4137 q->LastQTime = m->timenow;
4138 SetNextQueryTime(m, q);
4141 mDNSexport void LLQGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneInfo)
4145 mDNS_Lock(m);
4164 CancelGetZoneData(m, q->nta);
4170 startLLQHandshake(m, q);
4177 CancelGetZoneData(m, q->nta);
4180 StartLLQPolling(m,q);
4189 mDNS_Unlock(m);
4193 mDNSlocal void PrivateQueryGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneInfo)
4207 CancelGetZoneData(m, q->nta);
4217 q->LastQTime = m->timenow - q->ThisQInterval;
4218 CancelGetZoneData(m, q->nta);
4220 mDNS_Lock(m);
4221 SetNextQueryTime(m, q);
4222 mDNS_Unlock(m);
4230 CancelGetZoneData(m, q->nta);
4235 q->TargetQID = mDNS_NewMessageID(m);
4238 q->tcp = MakeTCPConn(m, mDNSNULL, mDNSNULL, kTCPSocketFlags_UseTLS, &zoneInfo->Addr, zoneInfo->Port, &q->nta->Host, q, mDNSNULL);
4239 if (q->nta) { CancelGetZoneData(m, q->nta); q->nta = mDNSNULL; }
4248 mDNSexport void RecordRegistrationGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneData)
4257 if (m->mDNS_busy != m->mDNS_reentrancy)
4258 LogMsg("RecordRegistrationGotZoneData: mDNS_busy (%ld) != mDNS_reentrancy (%ld)", m->mDNS_busy, m->mDNS_reentrancy);
4261 for (ptr = m->ResourceRecords; ptr; ptr = ptr->next) if (ptr == newRR) break;
4265 CancelGetZoneData(m, newRR->nta);
4274 CancelGetZoneData(m, newRR->nta);
4284 CancelGetZoneData(m, newRR->nta);
4295 CancelGetZoneData(m, newRR->nta);
4306 CancelGetZoneData(m, newRR->nta);
4314 CancelGetZoneData(m, newRR->nta);
4322 CancelGetZoneData(m, newRR->nta);
4334 mDNS_Lock(m);
4335 uDNS_DeregisterRecord(m, newRR);
4336 mDNS_Unlock(m);
4345 mDNS_Lock(m);
4346 target = GetServiceTarget(m, newRR);
4347 mDNS_Unlock(m);
4355 CancelGetZoneData(m, newRR->nta);
4365 mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) && newRR->nta && !mDNSAddrIsRFC1918(&newRR->nta->Addr) &&
4369 AuthInfo = GetAuthInfoForName(m, newRR->resrec.name);
4373 LogMsg("RecordRegistrationGotZoneData: ERROR!! AutoTunnel has Target_AutoHostAndNATMAP for %s", ARDisplayString(m, newRR));
4377 CancelGetZoneData(m, newRR->nta);
4385 LogInfo("RecordRegistrationGotZoneData StartRecordNatMap %s", ARDisplayString(m, newRR));
4387 StartRecordNatMap(m, newRR);
4390 else LogInfo("RecordRegistrationGotZoneData: StartRecordNatMap for %s, state %d, context %p", ARDisplayString(m, newRR), newRR->state, newRR->NATinfo.clientContext);
4392 mDNS_Lock(m);
4401 newRR->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4403 if (IsRecordMergeable(m, newRR, m->timenow + MERGE_DELAY_TIME))
4407 LogInfo("RecordRegistrationGotZoneData: Delayed registration for %s", ARDisplayString(m, newRR));
4410 mDNS_Unlock(m);
4413 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr)
4415 mDNSu8 *ptr = m->omsg.data;
4419 mDNS_CheckLock(m);
4423 LogMsg("SendRecordDeRegistration: No zone info for Resource record %s RecordType %d", ARDisplayString(m, rr), rr->resrec.RecordType);
4428 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
4429 limit -= RRAdditionalSize(m, AuthInfo);
4431 rr->updateid = mDNS_NewMessageID(m);
4432 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
4435 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
4438 ptr = BuildUpdateMessage(m, ptr, rr, limit);
4444 LogInfo("SendRecordDeregistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
4445 if (rr->tcp) LogInfo("SendRecordDeregistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
4447 if (!rr->nta) { LogMsg("SendRecordDeregistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
4448 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
4453 LogInfo("SendRecordDeregistration UDP %s", ARDisplayString(m, rr));
4454 if (!rr->nta) { LogMsg("SendRecordDeregistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
4455 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name), mDNSfalse);
4457 //if (rr->state == regState_DeregPending) CompleteDeregistration(m, rr); // Don't touch rr after this
4459 SetRecordRetry(m, rr, 0);
4462 LogMsg("SendRecordDeregistration: Error formatting message for %s", ARDisplayString(m, rr));
4465 mDNSexport mStatus uDNS_DeregisterRecord(mDNS *const m, AuthRecord *const rr)
4469 LogInfo("uDNS_DeregisterRecord: Resource Record %s, state %d", ARDisplayString(m, rr), rr->state);
4491 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) CompleteDeregistration(m, rr);
4513 LogInfo("uDNS_DeregisterRecord: Freeing InFlightRData for %s", ARDisplayString(m, rr));
4514 rr->UpdateCallback(m, rr, rr->InFlightRData, rr->InFlightRDLen);
4518 LogInfo("uDNS_DeregisterRecord: InFlightRData same as rdata for %s", ARDisplayString(m, rr));
4524 LogMsg("uDNS_DeregisterRecord: ERROR!! QueuedRData same as rdata for %s", ARDisplayString(m, rr));
4527 LogInfo("uDNS_DeregisterRecord: Freeing QueuedRData for %s", ARDisplayString(m, rr));
4528 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4550 for (anchorRR = m->ResourceRecords; anchorRR; anchorRR = anchorRR->next)
4554 LogInfo("uDNS_DeregisterRecord: Found Anchor RR %s terminated", ARDisplayString(m, anchorRR));
4556 LogMsg("uDNS_DeregisterRecord: ERROR: Another anchorRR %s found", ARDisplayString(m, anchorRR));
4562 if (!found) LogInfo("uDNSDeregisterRecord: Cannot find the anchor Resource Record for %s, not an error", ARDisplayString(m, rr));
4569 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4570 info = GetAuthInfoForName_internal(m, rr->resrec.name);
4571 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
4584 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
4585 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
4590 mDNSexport mStatus uDNS_UpdateRecord(mDNS *m, AuthRecord *rr)
4603 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->resrec.rdata, rr->resrec.rdlength);
4614 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4628 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4629 SetNextuDNSEvent(m, rr);
4650 mDNSlocal void handle_unanswered_query(mDNS *const m)
4652 DNSQuestion *q = m->CurrentQuestion;
4692 // instead it is implicit that the question to be checked is m->CurrentQuestion.
4693 mDNSexport void uDNS_CheckCurrentQuestion(mDNS *const m)
4695 DNSQuestion *q = m->CurrentQuestion;
4696 if (m->timenow - NextQSendTime(q) < 0) return;
4702 case LLQ_InitialRequest: startLLQHandshake(m, q); break;
4706 startLLQHandshake(m, q);
4708 sendChallengeResponse(m, q, mDNSNULL);
4710 case LLQ_Established: sendLLQRefresh(m, q); break;
4715 handle_unanswered_query(m);
4726 PenalizeDNSServer(m, q, zeroID);
4749 SetValidDNSServers(m, q);
4750 new = GetServerForQuestion(m, q);
4756 DNSServerChangeForQuestion(m, q, new);
4763 mDNSu8 *end = m->omsg.data;
4767 InitializeDNSMessage(&m->omsg.h, q->TargetQID, (DNSSECQuestion(q) ? DNSSecQFlags : uQueryFlags));
4771 end = putQuestion(&m->omsg, m->omsg.data, m->omsg.data + AbsoluteMaxDNSMessageData, &q->qname, q->qtype, q->qclass);
4775 end = DNSProxySetAttributes(q, &m->omsg.h, &m->omsg, end, m->omsg.data + AbsoluteMaxDNSMessageData);
4777 end = putDNSSECOption(&m->omsg, end, m->omsg.data + AbsoluteMaxDNSMessageData);
4781 else if (m->timenow - q->qDNSServer->lasttest >= INIT_UCAST_POLL_INTERVAL) // Make sure at least three seconds has elapsed since last test query
4785 q->qDNSServer->lasttest = m->timenow;
4786 end = putQuestion(&m->omsg, m->omsg.data, m->omsg.data + AbsoluteMaxDNSMessageData, DNSRelayTestQuestion, kDNSType_PTR, kDNSClass_IN);
4787 q->qDNSServer->testid = m->omsg.h.id;
4790 if (end > m->omsg.data && (q->qDNSServer->teststate != DNSServer_Failed || NoTestQuery(q)))
4792 //LogMsg("uDNS_CheckCurrentQuestion %p %d %p %##s (%s)", q, NextQSendTime(q) - m->timenow, private, q->qname.c, DNSTypeName(q->qtype));
4795 if (q->nta) CancelGetZoneData(m, q->nta);
4796 q->nta = StartGetZoneData(m, &q->qname, q->LongLived ? ZoneServiceLLQ : ZoneServiceQuery, PrivateQueryGotZoneData, q);
4806 q->LocalSocket = mDNSPlatformUDPSocket(m, zeroIPPort);
4811 else err = mDNSSendDNSMessage(m, &m->omsg, end, q->qDNSServer->interface, q->LocalSocket, &q->qDNSServer->addr, q->qDNSServer->port, mDNSNULL, mDNSNULL, q->UseBackgroundTrafficClass);
4840 q->LastQTime = m->timenow;
4841 SetNextQueryTime(m, q);
4855 CacheGroup *const cg = CacheGroupForName(m, slot, q->qnamehash, &q->qname);
4866 SetValidDNSServers(m, q);
4879 q->LastQTime = m->timenow;
4880 SetNextQueryTime(m, q);
4883 q->qDNSServer = GetServerForQuestion(m, q);
4906 LogInfo("uDNS_CheckCurrentQuestion: Purged resourcerecord %s", CRDisplayString(m, rr));
4907 mDNS_PurgeCacheResourceRecord(m, rr);
4914 MakeNegativeCacheRecord(m, &m->rec.r, &q->qname, q->qnamehash, q->qtype, q->qclass, (DomainEnumQuery(&q->qname) ? 60 * 15 : 60), mDNSInterface_Any, q->qDNSServer);
4917 m->rec.r.responseFlags = q->responseFlags;
4918 // We're already using the m->CurrentQuestion pointer, so CacheRecordAdd can't use it to walk the question list.
4921 CreateNewCacheEntry(m, slot, cg, NonZeroTime(m->timenow), mDNStrue, mDNSNULL);
4922 ScheduleNextCacheCheckTime(m, slot, NonZeroTime(m->timenow));
4923 m->rec.r.responseFlags = zeroID;
4924 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it
4925 // MUST NOT touch m->CurrentQuestion (or q) after this -- client callback could have deleted it
4930 mDNSexport void CheckNATMappings(mDNS *m)
4932 mDNSBool rfc1918 = mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4);
4933 mDNSBool HaveRoutable = !rfc1918 && !mDNSIPv4AddressIsZero(m->AdvertisedV4.ip.v4);
4934 m->NextScheduledNATOp = m->timenow + 0x3FFFFFFF;
4936 if (HaveRoutable) m->ExtAddress = m->AdvertisedV4.ip.v4;
4938 if (m->NATTraversals && rfc1918) // Do we need to open a socket to receive multicast announcements from router?
4940 if (m->NATMcastRecvskt == mDNSNULL) // If we are behind a NAT and the socket hasn't been opened yet, open it
4944 m->NATMcastRecvskt = mDNSPlatformUDPSocket(m, NATPMPAnnouncementPort);
4945 if (!m->NATMcastRecvskt)
4959 if (m->NATMcastRecvskt) { mDNSPlatformUDPClose(m->NATMcastRecvskt); m->NATMcastRecvskt = mDNSNULL; }
4960 if (m->SSDPSocket) { debugf("CheckNATMappings destroying SSDPSocket %p", &m->SSDPSocket); mDNSPlatformUDPClose(m->SSDPSocket); m->SSDPSocket = mDNSNULL; }
4963 uDNS_RequestAddress(m);
4965 if (m->CurrentNATTraversal) LogMsg("WARNING m->CurrentNATTraversal already in use");
4966 m->CurrentNATTraversal = m->NATTraversals;
4968 while (m->CurrentNATTraversal)
4970 NATTraversalInfo *cur = m->CurrentNATTraversal;
4971 mDNSv4Addr EffectiveAddress = HaveRoutable ? m->AdvertisedV4.ip.v4 : cur->NewAddress;
4972 m->CurrentNATTraversal = m->CurrentNATTraversal->next;
4981 if (m->timenow - cur->retryPortMap >= 0) // Time to send a mapping request for this packet
4983 if (cur->ExpiryTime && cur->ExpiryTime - m->timenow < 0) // Mapping has expired
4989 (void)uDNS_SendNATMsg(m, cur, mDNStrue); // Will also do UPnP discovery for us, if necessary
4992 NATSetNextRenewalTime(m, cur);
4998 cur->retryPortMap = m->timenow + cur->retryInterval;
5002 if (m->NextScheduledNATOp - cur->retryPortMap > 0)
5004 m->NextScheduledNATOp = cur->retryPortMap;
5042 if (cur->Protocol && mDNSIPPortIsZero(ExternalPort) && !mDNSIPv4AddressIsZero(m->Router.ip.v4))
5046 cur, &m->Router, &EffectiveAddress, mDNSVal16(cur->IntPort), cur->retryInterval, EffectiveResult);
5049 cur, &m->Router, &EffectiveAddress, mDNSVal16(cur->IntPort), cur->retryInterval, EffectiveResult);
5055 (cur->ExpiryTime - m->timenow + mDNSPlatformOneSecond/2) / mDNSPlatformOneSecond : 0;
5059 cur->clientCallback(m, cur);
5068 mDNSlocal mDNSs32 CheckRecordUpdates(mDNS *m)
5071 mDNSs32 nextevent = m->timenow + 0x3FFFFFFF;
5073 CheckGroupRecordUpdates(m);
5075 for (rr = m->ResourceRecords; rr; rr = rr->next)
5085 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow <= 0)
5092 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
5093 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
5112 SetRecordRetry(m, rr, 0);
5114 else if (rr->state == regState_DeregPending) SendRecordDeregistration(m, rr);
5115 else SendRecordRegistration(m, rr);
5124 mDNSexport void uDNS_Tasks(mDNS *const m)
5129 m->NextuDNSEvent = m->timenow + 0x3FFFFFFF;
5131 nexte = CheckRecordUpdates(m);
5132 if (m->NextuDNSEvent - nexte > 0)
5133 m->NextuDNSEvent = nexte;
5135 for (d = m->DNSServers; d; d=d->next)
5138 if (m->timenow - d->penaltyTime >= 0)
5144 if (m->NextuDNSEvent - d->penaltyTime > 0)
5145 m->NextuDNSEvent = d->penaltyTime;
5148 if (m->CurrentQuestion)
5149 LogMsg("uDNS_Tasks ERROR m->CurrentQuestion already set: %##s (%s)", m->CurrentQuestion->qname.c, DNSTypeName(m->CurrentQuestion->qtype));
5150 m->CurrentQuestion = m->Questions;
5151 while (m->CurrentQuestion && m->CurrentQuestion != m->NewQuestions)
5153 DNSQuestion *const q = m->CurrentQuestion;
5156 uDNS_CheckCurrentQuestion(m);
5157 if (q == m->CurrentQuestion)
5158 if (m->NextuDNSEvent - NextQSendTime(q) > 0)
5159 m->NextuDNSEvent = NextQSendTime(q);
5161 // If m->CurrentQuestion wasn't modified out from under us, advance it now
5163 // depends on having m->CurrentQuestion point to the right question
5164 if (m->CurrentQuestion == q)
5165 m->CurrentQuestion = q->next;
5167 m->CurrentQuestion = mDNSNULL;
5175 mDNSexport void SleepRecordRegistrations(mDNS *m)
5178 for (rr = m->ResourceRecords; rr; rr=rr->next)
5184 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
5188 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
5199 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
5207 uDNS_DeregisterRecord(m, rr);
5251 mDNSlocal void FreeARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
5253 (void)m; // unused
5257 mDNSlocal void FoundDomain(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord)
5274 LogInfo("FoundDomain: %p %s %s Q %##s A %s", answer->InterfaceID, AddRecord ? "Add" : "Rmv", name, question->qname.c, RRDisplayString(m, answer));
5284 LogInfo("FoundDomain: Registering %s", ARDisplayString(m, &arElem->ar));
5285 err = mDNS_Register(m, &arElem->ar);
5299 LogInfo("FoundDomain: Deregistering %s", ARDisplayString(m, &dereg->ar));
5300 err = mDNS_Deregister(m, &dereg->ar);
5313 mDNS *const m = v;
5316 for (n = m->NATTraversals; n; n=n->next)
5318 LogMemCorruption("m->NATTraversals: %p is garbage", n);
5321 for (d = m->DNSServers; d; d=d->next)
5323 LogMemCorruption("m->DNSServers: %p is garbage (%d)", d, d->teststate);
5326 for (info = m->AuthInfoList; info; info = info->next)
5328 LogMemCorruption("m->AuthInfoList: %p is garbage", info);
5331 for (hi = m->Hostnames; hi; hi = hi->next)
5333 LogMemCorruption("m->Hostnames: %p is garbage", n);
5345 mDNSlocal void uDNS_DeleteWABQueries(mDNS *const m, SearchListElem *ptr, int delete)
5357 mDNS_StopGetDomains(m, &ptr->BrowseQ);
5358 mDNS_StopGetDomains(m, &ptr->DefBrowseQ);
5363 mDNS_StopGetDomains(m, &ptr->AutomaticBrowseQ);
5367 mDNS_StopGetDomains(m, &ptr->RegisterQ);
5368 mDNS_StopGetDomains(m, &ptr->DefRegisterQ);
5399 err = mDNS_Deregister(m, &dereg->ar);
5411 mDNSexport void uDNS_SetupWABQueries(mDNS *const m)
5423 mDNS_Lock(m);
5424 if (!mDNSPlatformSetDNSConfig(m, mDNSfalse, mDNStrue, mDNSNULL, mDNSNULL, mDNSNULL, mDNSfalse))
5433 mDNS_Unlock(m);
5435 if (m->WABBrowseQueriesCount)
5437 if (m->WABLBrowseQueriesCount)
5439 if (m->WABRegQueriesCount)
5470 mDNS_StopGetDomains(m, &ptr->BrowseQ);
5471 mDNS_StopGetDomains(m, &ptr->DefBrowseQ);
5477 mDNS_StopGetDomains(m, &ptr->AutomaticBrowseQ);
5483 mDNS_StopGetDomains(m, &ptr->RegisterQ);
5484 mDNS_StopGetDomains(m, &ptr->DefRegisterQ);
5495 err = mDNS_Deregister(m, &dereg->ar);
5510 uDNS_DeleteWABQueries(m, ptr, UDNS_WAB_BROWSE_QUERY);
5518 uDNS_DeleteWABQueries(m, ptr, UDNS_WAB_LBROWSE_QUERY);
5526 uDNS_DeleteWABQueries(m, ptr, UDNS_WAB_REG_QUERY);
5539 err1 = mDNS_GetDomains(m, &ptr->BrowseQ, mDNS_DomainTypeBrowse, &ptr->domain, ptr->InterfaceID, FoundDomain, ptr);
5549 err2 = mDNS_GetDomains(m, &ptr->DefBrowseQ, mDNS_DomainTypeBrowseDefault, &ptr->domain, ptr->InterfaceID, FoundDomain, ptr);
5576 err1 = mDNS_GetDomains(m, &ptr->AutomaticBrowseQ, mDNS_DomainTypeBrowseAutomatic, &ptr->domain, ptr->InterfaceID, FoundDomain, ptr);
5597 err1 = mDNS_GetDomains(m, &ptr->RegisterQ, mDNS_DomainTypeRegistration, &ptr->domain, ptr->InterfaceID, FoundDomain, ptr);
5607 err2 = mDNS_GetDomains(m, &ptr->DefRegisterQ, mDNS_DomainTypeRegistrationDefault, &ptr->domain, ptr->InterfaceID, FoundDomain, ptr);
5630 mDNSexport void uDNS_StartWABQueries(mDNS *const m, int queryType)
5634 m->WABBrowseQueriesCount++;
5635 LogInfo("uDNS_StartWABQueries: Browse query count %d", m->WABBrowseQueriesCount);
5639 m->WABLBrowseQueriesCount++;
5640 LogInfo("uDNS_StartWABQueries: Legacy Browse query count %d", m->WABLBrowseQueriesCount);
5644 m->WABRegQueriesCount++;
5645 LogInfo("uDNS_StartWABQueries: Reg query count %d", m->WABRegQueriesCount);
5647 uDNS_SetupWABQueries(m);
5652 mDNSexport void uDNS_StopWABQueries(mDNS *const m, int queryType)
5656 m->WABBrowseQueriesCount--;
5657 LogInfo("uDNS_StopWABQueries: Browse query count %d", m->WABBrowseQueriesCount);
5661 m->WABLBrowseQueriesCount--;
5662 LogInfo("uDNS_StopWABQueries: Legacy Browse query count %d", m->WABLBrowseQueriesCount);
5666 m->WABRegQueriesCount--;
5667 LogInfo("uDNS_StopWABQueries: Reg query count %d", m->WABRegQueriesCount);
5669 uDNS_SetupWABQueries(m);
5672 mDNSexport domainname *uDNS_GetNextSearchDomain(mDNS *const m, mDNSInterfaceID InterfaceID, mDNSs8 *searchIndex, mDNSBool ignoreDotLocal)
5676 (void) m; // unused
5727 mDNSlocal void FlushAddressCacheRecords(mDNS *const m)
5741 LogInfo("FlushAddressCacheRecords: Purging Resourcerecord %s", CRDisplayString(m, cr));
5742 mDNS_PurgeCacheResourceRecord(m, cr);
5748 mDNSexport void RetrySearchDomainQuestions(mDNS *const m)
5755 for (q = m->Questions; q; q = q->next)
5773 mDNSCoreRestartAddressQueries(m, mDNStrue, FlushAddressCacheRecords, mDNSNULL, mDNSNULL);
5797 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
5799 (void) m;
5805 mDNSexport DomainAuthInfo *GetAuthInfoForName_internal(mDNS *m, const domainname *const name)
5807 (void) m;
5813 mDNSexport DomainAuthInfo *GetAuthInfoForQuestion(mDNS *m, const DNSQuestion *const q)
5815 (void) m;
5821 mDNSexport void startLLQHandshake(mDNS *m, DNSQuestion *q)
5823 (void) m;
5832 mDNSexport mStatus mDNS_StartNATOperation_internal(mDNS *m, NATTraversalInfo *traversal)
5834 (void) m;
5840 mDNSexport mStatus mDNS_StopNATOperation_internal(mDNS *m, NATTraversalInfo *traversal)
5842 (void) m;
5848 mDNSexport void sendLLQRefresh(mDNS *m, DNSQuestion *q)
5850 (void) m;
5854 mDNSexport ZoneData *StartGetZoneData(mDNS *const m, const domainname *const name, const ZoneService target, ZoneDataCallback callback, void *ZoneDataContext)
5856 (void) m;
5865 mDNSexport void RecordRegistrationGotZoneData(mDNS *const m, mStatus err, const ZoneData *zoneData)
5867 (void) m;
5872 mDNSexport uDNS_LLQType uDNS_recvLLQResponse(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end,
5875 (void) m;
5885 mDNSexport void PenalizeDNSServer(mDNS *const m, DNSQuestion *q, mDNSOpaque16 responseFlags)
5887 (void) m;
5898 mDNSexport void RetrySearchDomainQuestions(mDNS *const m)
5900 (void) m;
5903 mDNSexport mStatus mDNS_SetSecretForDomain(mDNS *m, DomainAuthInfo *info, const domainname *domain, const domainname *keyname, const char *b64keydata, const domainname *hostname, mDNSIPPort *port, mDNSBool autoTunnel)
5905 (void) m;
5917 mDNSexport domainname *uDNS_GetNextSearchDomain(mDNS *const m, mDNSInterfaceID InterfaceID, mDNSs8 *searchIndex, mDNSBool ignoreDotLocal)
5919 (void) m;
5927 mDNSexport DomainAuthInfo *GetAuthInfoForName(mDNS *m, const domainname *const name)
5929 (void) m;
5935 mDNSexport mStatus mDNS_StartNATOperation(mDNS *const m, NATTraversalInfo *traversal)
5937 (void) m;
5943 mDNSexport mStatus mDNS_StopNATOperation(mDNS *const m, NATTraversalInfo *traversal)
5945 (void) m;
5951 mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, const mDNSs32 serviceID, const mDNSAddr *addr,
5955 (void) m;
5972 mDNSexport void uDNS_SetupWABQueries(mDNS *const m)
5974 (void) m;
5977 mDNSexport void uDNS_StartWABQueries(mDNS *const m, int queryType)
5979 (void) m;
5983 mDNSexport void uDNS_StopWABQueries(mDNS *const m, int queryType)
5985 (void) m;
5989 mDNSexport void mDNS_AddDynDNSHostName(mDNS *m, const domainname *fqdn, mDNSRecordCallback *StatusCallback, const void *StatusContext)
5991 (void) m;
5996 mDNSexport void mDNS_SetPrimaryInterfaceInfo(mDNS *m, const mDNSAddr *v4addr, const mDNSAddr *v6addr, const mDNSAddr *router)
5998 (void) m;
6004 mDNSexport void mDNS_RemoveDynDNSHostName(mDNS *m, const domainname *fqdn)
6006 (void) m;
6010 mDNSexport void RecreateNATMappings(mDNS *const m, const mDNSu32 waitTicks)
6012 (void) m;