Home | History | Annotate | Download | only in mDNSCore

Lines Matching refs:rr

61 mDNSlocal void SetRecordRetry(mDNS *const m, AuthRecord *rr, mDNSu32 random)
63 rr->LastAPTime = m->timenow;
65 if (rr->expire && rr->refreshCount < MAX_UPDATE_REFRESH_COUNT)
67 mDNSs32 remaining = rr->expire - m->timenow;
68 rr->refreshCount++;
72 rr->ThisAPInterval = 7 * (remaining/10) + (random ? random : mDNSRandom(remaining/10));
74 if (rr->ThisAPInterval < MIN_UPDATE_REFRESH_TIME)
75 rr->ThisAPInterval = MIN_UPDATE_REFRESH_TIME;
77 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
81 rr->ThisAPInterval = MIN_UPDATE_REFRESH_TIME;
83 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
88 rr->expire = 0;
90 rr->ThisAPInterval = rr->ThisAPInterval * QuestionIntervalStep; // Same Retry logic as Unicast Queries
91 if (rr->ThisAPInterval < INIT_RECORD_REG_INTERVAL)
92 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
93 if (rr->ThisAPInterval > MAX_RECORD_REG_INTERVAL)
94 rr->ThisAPInterval = MAX_RECORD_REG_INTERVAL;
96 LogInfo("SetRecordRetry retry in %d ms for %s", rr->ThisAPInterval, ARDisplayString(m, rr));
704 AuthRecord rr;
705 ResourceRecord *opt = &rr.resrec;
715 // format opt rr (fields not specified are zero-valued)
716 mDNS_SetupResourceRecord(&rr, mDNSNULL, mDNSInterface_Any, kDNSType_OPT, kStandardTTL, kDNSRecordTypeKnownUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
721 optRD = &rr.resrec.rdata->u.opt[0];
972 tcpInfo->rr ? &tcpInfo->rr ->tcp : mDNSNULL;
974 LogMsg("tcpCallback: %d backpointer %p incorrect tcpInfo %p question %p rr %p",
975 mDNSPlatformTCPGetFD(tcpInfo->sock), *backpointer, tcpInfo, q, tcpInfo->rr);
986 if (tcpInfo->rr && tcpInfo->rr->resrec.name != &tcpInfo->rr->namestorage)
987 LogMsg("tcpCallback: ERROR: tcpInfo->rr->resrec.name %p != &tcpInfo->rr->namestorage %p",
988 tcpInfo->rr->resrec.name, &tcpInfo->rr->namestorage);
989 if (tcpInfo->rr && tcpInfo->rr-> resrec.name != &tcpInfo->rr-> namestorage) return;
991 AuthInfo = tcpInfo->rr ? GetAuthInfoForName(m, tcpInfo->rr->resrec.name) : mDNSNULL;
1130 // Note: Sleep code depends on us clearing *backpointer here -- it uses the clearing of rr->tcp
1231 DNSQuestion *const question, AuthRecord *const rr)
1248 info->rr = rr;
1397 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
1399 debugf("GetServiceTarget %##s", rr->resrec.name->c);
1401 if (!rr->AutoTarget) // If not automatically tracking this host's current name, just return the existing target
1402 return(&rr->resrec.rdata->u.srv.target);
1406 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
1423 const int srvcount = CountLabels(rr->resrec.name);
1432 if (SameDomainName(SkipLeadingLabels(rr->resrec.name, srvcount - x), SkipLeadingLabels(&hi->fqdn, hostcount - x)))
1440 LogInfo("GetServiceTarget: Returning NULL for %s", ARDisplayString(m, rr));
1681 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr);
1682 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr);
1683 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time);
1687 mDNSlocal void UpdateAllServiceRecords(mDNS *const m, AuthRecord *rr, mDNSBool reg)
1691 if (rr->resrec.rrtype != kDNSType_SRV) { LogMsg("UpdateAllServiceRecords:ERROR!! ResourceRecord not a service record %s", ARDisplayString(m, rr)); return; }
1693 if (reg && rr->state == regState_NoTarget) { LogMsg("UpdateAllServiceRecords:ERROR!! SRV record %s in noTarget state during registration", ARDisplayString(m, rr)); return; }
1695 LogInfo("UpdateAllServiceRecords: ResourceRecord %s", ARDisplayString(m, rr));
1707 if (srvRR == rr)
1746 AuthRecord *rr = (AuthRecord *)n->clientContext;
1749 if (!rr) { LogMsg("CompleteRecordNatMap called with unknown AuthRecord object"); return; }
1750 if (!n->NATLease) { LogMsg("CompleteRecordNatMap No NATLease for %s", ARDisplayString(m, rr)); return; }
1752 if (rr->resrec.rrtype != kDNSType_SRV) {LogMsg("CompleteRecordNatMap: Not a service record %s", ARDisplayString(m, rr)); return; }
1754 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) { LogInfo("CompleteRecordNatMap called for %s, Service deregistering", ARDisplayString(m, rr)); return; }
1756 if (rr->state == regState_DeregPending) { LogInfo("CompleteRecordNatMap called for %s, record in DeregPending", ARDisplayString(m, rr)); return; }
1761 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
1763 LogInfo("CompleteRecordNatMap called for %s but no zone information!", ARDisplayString(m, rr));
1766 if (rr->NATinfo.clientContext)
1768 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1769 rr->NATinfo.clientContext = mDNSNULL;
1771 rr->state = regState_Pending;
1772 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
1773 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
1780 target = GetServiceTarget(m, rr);
1781 srvt = GetRRDomainNameTarget(&rr->resrec);
1785 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
1787 LogInfo("CompleteRecordNatMap - no target for %##s, ExternalPort %d", rr->resrec.name->c, mDNSVal16(n->ExternalPort));
1789 rr->state = regState_NoTarget;
1790 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
1792 UpdateAllServiceRecords(m, rr, mDNSfalse);
1795 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
1803 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
1816 rr->SRVChanged = mDNSfalse;
1822 rr->state = regState_Pending;
1823 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
1824 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
1825 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
1828 rr->LastAPTime += MERGE_DELAY_TIME;
1835 UpdateAllServiceRecords(m, rr, mDNStrue);
1838 mDNSlocal void StartRecordNatMap(mDNS *m, AuthRecord *rr)
1843 if (rr->resrec.rrtype != kDNSType_SRV)
1845 LogInfo("StartRecordNatMap: Resource Record %##s type %d, not supported", rr->resrec.name->c, rr->resrec.rrtype);
1848 p = rr->resrec.name->c;
1855 else { LogMsg("StartRecordNatMap: could not determine transport protocol of service %##s", rr->resrec.name->c); return; }
1858 // rr->NATinfo.clientContext, mDNSVal16(rr->NATinfo.IntPort), mDNSVal16(rr->resrec.rdata->u.srv.port), ARDisplayString(m, rr));
1859 if (rr->NATinfo.clientContext) mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1860 rr->NATinfo.Protocol = protocol;
1864 rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
1865 rr->NATinfo.RequestedPort = rr->resrec.rdata->u.srv.port;
1866 rr->NATinfo.NATLease = 0; // Request default lease
1867 rr->NATinfo.clientCallback = CompleteRecordNatMap;
1868 rr->NATinfo.clientContext = rr;
1869 mDNS_StartNATOperation_internal(m, &rr->NATinfo);
1891 mDNSlocal mStatus UnlinkResourceRecord(mDNS *const m, AuthRecord *const rr)
1894 while (*list && *list != rr) list = &(*list)->next;
1897 *list = rr->next;
1898 rr->next = mDNSNULL;
1901 if (rr->NATinfo.clientContext)
1903 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1904 rr->NATinfo.clientContext = mDNSNULL;
1905 if (rr->resrec.rrtype == kDNSType_SRV) rr->resrec.rdata->u.srv.port = rr->NATinfo.IntPort;
1910 LogMsg("UnlinkResourceRecord:ERROR!! - no such active record %##s", rr->resrec.name->c);
1917 mDNSlocal void RegisterAllServiceRecords(mDNS *const m, AuthRecord *rr)
1919 LogInfo("RegisterAllServiceRecords: Service Record %##s", rr->resrec.name->c);
1922 rr->SRVChanged = mDNSfalse;
1923 UnlinkResourceRecord(m, rr);
1924 mDNS_Register_internal(m, rr);
1926 UpdateAllServiceRecords(m, rr, mDNStrue);
1930 mDNSlocal void UpdateOneSRVRecord(mDNS *m, AuthRecord *rr)
1937 domainname *curtarget = &rr->resrec.rdata->u.srv.target;
1938 const domainname *const nt = GetServiceTarget(m, rr);
1940 mDNSBool TargetChanged = (newtarget->c[0] && rr->state == regState_NoTarget) || !SameDomainName(curtarget, newtarget);
1941 mDNSBool HaveZoneData = rr->nta && !mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4);
1948 mDNSIPPort port = rr->resrec.rdata->u.srv.port;
1949 mDNSBool NowNeedNATMAP = (rr->AutoTarget == Target_AutoHostAndNATMAP && !mDNSIPPortIsZero(port) && mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) && rr->nta && !mDNSAddrIsRFC1918(&rr->nta->Addr));
1950 mDNSBool WereBehindNAT = (rr->NATinfo.clientContext != mDNSNULL);
1951 mDNSBool PortWasMapped = (rr->NATinfo.clientContext && !mDNSSameIPPort(rr->NATinfo.RequestedPort, port)); // I think this is always false -- SC Sept 07
1956 LogInfo("UpdateOneSRVRecord: Resource Record %s TargetChanged %d, NewTarget %##s", ARDisplayString(m, rr), TargetChanged, nt->c);
1959 rr->resrec.name->c, newtarget,
1968 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
1971 rr->resrec.name->c, rr->state);
1976 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, newtarget %##s", TargetChanged, NATChanged, rr->resrec.name->c, rr->state, newtarget->c);
1978 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, null newtarget", TargetChanged, NATChanged, rr->resrec.name->c, rr->state);
1979 switch(rr->state)
1999 LogInfo("UpdateOneSRVRecord: No target yet for Resource Record %s", ARDisplayString(m, rr));
2002 RegisterAllServiceRecords(m , rr);
2030 rr->SRVChanged = mDNStrue;
2031 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2032 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2036 rr->resrec.name->c, newtarget->c);
2037 rr->state = regState_Pending;
2041 LogInfo("UpdateOneSRVRecord: SRV record changed for service %##s de-registering", rr->resrec.name->c);
2042 rr->state = regState_DeregPending;
2043 UpdateAllServiceRecords(m, rr, mDNSfalse);
2047 default: LogMsg("UpdateOneSRVRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
2069 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
2139 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
2141 HostnameInfo *hi = (HostnameInfo *)rr->RecordContext;
2149 LogInfo("HostnameCallback: Got mStatus_MemFree for %p %p %s", hi, rr, ARDisplayString(m, rr));
2151 if (rr == &i->arv4 || rr == &i->arv6)
2169 if (rr->resrec.rrtype == kDNSType_A)
2170 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.4a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2172 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.16a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv6);
2173 if (!hi) { mDNSPlatformMemFree(rr); return; }
2174 if (rr->state != regState_Unregistered) LogMsg("Error: HostnameCallback invoked with error code for record not in regState_Unregistered!");
2180 rr->RecordContext = (void *)hi->StatusContext;
2182 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2183 rr->RecordContext = (void *)hi;
2195 if (rr->resrec.rrtype == kDNSType_A)
2196 LogInfo("Registered hostname %##s IP %.4a", rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2198 LogInfo("Registered hostname %##s IP %.16a", rr->resrec.name->c, &rr
2200 rr->RecordContext = (void *)hi->StatusContext;
2202 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2203 rr->RecordContext = (void *)hi;
2533 // OPT RR : Emptyname(.) + base size + rdataOPT
2562 mDNSlocal mDNSu8* BuildUpdateMessage(mDNS *const m, mDNSu8 *ptr, AuthRecord *rr, mDNSu8 *limit)
2565 if (rr->state == regState_DeregPending)
2567 rr->expire = 0; // Indicate that we have no active registration any more
2568 ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit);
2575 if (rr->state == regState_Registered) rr->state = regState_Refresh;
2576 if (rr->state != regState_Refresh && rr->state != regState_UpdatePending)
2577 rr->state = regState_Pending;
2581 if (rr->resrec.RecordType != kDNSRecordTypeAdvisory) rr->RequireGoodbye = mDNStrue;
2583 if ((rr->resrec.rrtype == kDNSType_SRV) && (rr->AutoTarget == Target_AutoHostAndNATMAP) &&
2584 !mDNSIPPortIsZero(rr->NATinfo.ExternalPort))
2586 rr->resrec.rdata->u.srv.port = rr->NATinfo.ExternalPort;
2589 if (rr->state == regState_UpdatePending)
2592 SetNewRData(&rr->resrec, rr->OrigRData, rr->OrigRDLen);
2593 if (!(ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit))) goto exit; // delete old rdata
2596 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
2597 if (!(ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit))) goto exit;
2601 if (rrrr->resrec.RecordType == kDNSRecordTypeVerified)
2606 ptr = putDeleteRRSetWithLimit(&m->omsg, ptr, rr->resrec.name, rr->resrec.rrtype, limit);
2609 else if (rr->resrec.RecordType != kDNSRecordTypeShared)
2612 //ptr = putPrereqNameNotInUse(rr->resrec.name, &m->omsg, ptr, end);
2616 ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
2622 LogMsg("BuildUpdateMessage: Error formatting message for %s", ARDisplayString(m, rr));
2627 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr)
2638 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
2644 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
2647 LogMsg("SendRecordRegistration: No Zone information, should not happen %s", ARDisplayString(m, rr));
2651 rr->updateid = mDNS_NewMessageID(m);
2652 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
2655 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
2658 if (!(ptr = BuildUpdateMessage(m, ptr, rr, limit))) goto exit;
2660 if (rr->uselease)
2665 if (rr->Private)
2667 LogInfo("SendRecordRegistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
2668 if (rr->tcp) LogInfo("SendRecordRegistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
2669 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
2670 if (!rr->nta) { LogMsg("SendRecordRegistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2671 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
2675 LogInfo("SendRecordRegistration UDP %s", ARDisplayString(m, rr));
2676 if (!rr->nta) { LogMsg("SendRecordRegistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2677 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name));
2681 SetRecordRetry(m, rr, 0);
2684 LogMsg("SendRecordRegistration: Error formatting message for %s, disabling further updates", ARDisplayString(m, rr));
2686 rr->state = regState_NoTarget;
2689 // Is the given record "rr" eligible for merging ?
2690 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time)
2710 if (!AuthRecord_uDNS(rr)) return mDNSfalse;
2712 if (rr->LastAPTime + rr->ThisAPInterval - time > 0)
2713 { debugf("IsRecordMergeable: Time %d not reached for %s", rr->LastAPTime + rr->ThisAPInterval - m->timenow, ARDisplayString(m, rr)); return mDNSfalse; }
2715 if (!rr->zone) return mDNSfalse;
2717 info = GetAuthInfoForName_internal(m, rr->zone);
2721 if (rr->state != regState_DeregPending && rr->state != regState_Pending && rr->state != regState_Registered && rr->state != regState_Refresh && rr->state != regState_UpdatePending)
2722 { debugf("IsRecordMergeable: state %d not right %s", rr->state, ARDisplayString(m, rr)); return mDNSfalse; }
2724 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4)) return mDNSfalse;
2726 if (!rr->uselease) return mDNSfalse;
2728 if (rr->mState == mergeState_DontMerge) {debugf("IsRecordMergeable Dontmerge true %s", ARDisplayString(m, rr));return mDNSfalse;}
2729 debugf("IsRecordMergeable: Returning true for %s", ARDisplayString(m, rr));
2733 // Is the resource record "rr" eligible to merge to with "currentRR" ?
2734 mDNSlocal mDNSBool AreRecordsMergeable(mDNS *const m, AuthRecord *currentRR, AuthRecord *rr, mDNSs32 time)
2738 if (!IsRecordMergeable(m, rr, time)) return mDNSfalse;
2740 if (!SameDomainName(currentRR->zone, rr->zone))
2741 { debugf("AreRecordMergeable zone mismatch current rr Zone %##s, rr zone %##s", currentRR->zone->c, rr->zone->c); return mDNSfalse; }
2743 if (!mDNSSameIPv4Address(currentRR->nta->Addr.ip.v4, rr->nta->Addr.ip.v4)) return mDNSfalse;
2745 if (!mDNSSameIPPort(currentRR->nta->Port, rr->nta->Port)) return mDNSfalse;
2747 debugf("AreRecordsMergeable: Returning true for %s", ARDisplayString(m, rr));
2755 AuthRecord *rr;
2756 for (rr = m->ResourceRecords; rr; rr = rr->next)
2758 rr->mState = mergeState_DontMerge;
2759 rr->SendRNow = mDNSNULL;
2762 ActivateUnicastRegistration(m, rr);
2804 mDNSlocal mDNSu32 RREstimatedSize(AuthRecord *rr, int zoneSize)
2811 if (rr->state == regState_UpdatePending)
2814 rdlength = rr->OrigRDLen + rr->InFlightRDLen;
2816 rdlength = rr->resrec.rdestimate;
2818 if (rr->state == regState_DeregPending)
2821 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
2822 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
2826 if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique || rr->resrec.RecordType == kDNSRecordTypeVerified)
2832 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
2833 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + 2 + 10 + rdlength;
2837 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
2843 AuthRecord *rr;
2860 for (rr = m->ResourceRecords; rr; rr = rr->next)
2864 if (!IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME)) continue;
2865 firstRR = rr;
2867 else if (!AreRecordsMergeable(m, firstRR, rr, m->timenow + MERGE_DELAY_TIME)) continue;
2869 if (rr->SendRNow) LogMsg("MarkRRForSending: Resourcerecord %s already marked for sending", ARDisplayString(m, rr));
2870 rr->SendRNow = mDNSInterfaceMark;
2887 for (rr = m->ResourceRecords; rr; rr = rr->next)
2889 if ((rr->state != regState_Registered && rr->state != regState_Refresh) ||
2890 (rr->SendRNow == mDNSInterfaceMark) ||
2891 (!AreRecordsMergeable(m, firstRR, rr, m->timenow + rr->ThisAPInterval/2)))
2893 rr->SendRNow = mDNSInterfaceMark;
2908 AuthRecord *rr;
2937 for (rr = startRR; rr; rr = rr->next)
2939 if (rr->SendRNow != mDNSInterfaceMark) continue;
2941 rr->SendRNow = mDNSNULL;
2945 AuthInfo = GetAuthInfoForName_internal(m, rr->zone);
2970 zoneSize = DomainNameLength(rr->zone) + 4;
2978 next = putZone(&m->omsg, next, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
2985 anchorRR = rr;
2988 rrSize = RREstimatedSize(rr, zoneSize - 4);
2996 LogInfo("SendGroupUpdates: Skipping message %s, spaceleft %d, rrSize %d", ARDisplayString(m, rr), spaceleft, rrSize);
2998 rr->SendRNow = mDNSInterfaceMark;
3000 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3001 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3002 rr = rr->next;
3015 LogInfo("SendGroupUpdates: Building a message with resource record %s, next %p, state %d, ttl %d", ARDisplayString(m, rr), next, rr->state, rr->resrec.rroriginalttl);
3016 if (!(next = BuildUpdateMessage(m, next, rr, limit)))
3020 LogMsg("SendGroupUpdates: ptr NULL while building message with %s", ARDisplayString(m, rr));
3026 LogMsg("SendGroupUpdates: ERROR!! Record size estimation is wrong for %s, Estimate %d, Actual %d, state %d", ARDisplayString(m, rr), rrSize, next - oldnext, rr->state);
3030 // We could have sent an update earlier with this "rr" as anchorRR for which we never got a response.
3032 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL;}
3033 rr->updateid = msgid;
3037 SetRecordRetry(m, rr, 0);
3039 // Either we have parsed all the records or stopped at "rr" above due to lack of space
3040 startRR = rr;
3055 AuthRecord *rr, *nextRR;
3062 for (rr = m->ResourceRecords; rr; rr = nextRR)
3064 // SendRecordRegistrtion might delete the rr from list, hence
3066 nextRR = rr->next;
3067 if (rr->SendRNow == mDNSInterfaceMark)
3071 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow > 0)
3072 { LogMsg("CheckGroupRecordUpdates: ERROR!! Resourcerecord %s not ready", ARDisplayString(m, rr)); continue; }
3073 rr->SendRNow = mDNSNULL;
3074 SendRecordRegistration(m, rr);
3084 mDNSlocal void hndlSRVChanged(mDNS *const m, AuthRecord *rr)
3089 const domainname *target = GetServiceTarget(m, rr);
3093 if (rr->state == regState_DeregPending)
3095 LogInfo("hndlSRVChanged: SRVChanged, No Target, SRV Deregistered for %##s, state %d", rr->resrec.name->c,
3096 rr->state);
3097 rr->SRVChanged = mDNSfalse;
3098 dt = GetRRDomainNameTarget(&rr->resrec);
3100 rr->state = regState_NoTarget; // Wait for the next target change
3101 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3106 if (rr->state == regState_Pending)
3108 LogInfo("hndlSRVChanged: SRVChanged, No Target, Deregistering again %##s, state %d", rr->resrec.name->c, rr->state);
3109 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3110 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3111 rr->state = regState_DeregPending;
3114 LogInfo("hndlSRVChanged: Not in DeregPending or RegPending state %##s, state %d", rr->resrec.name->c, rr->state);
3125 if ((rr->state == regState_DeregPending) ||
3126 (rr->state == regState_Pending && !SameDomainName(target, &rr->resrec.rdata->u.srv.target)))
3128 dt = GetRRDomainNameTarget(&rr->resrec);
3130 rr->state = regState_NoTarget; // NoTarget will allow us to pick up new target OR nat traversal state
3131 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3133 target->c, rr->resrec.name->c, rr->state);
3134 rr->SRVChanged = mDNSfalse;
3135 UpdateOneSRVRecord(m, rr);
3140 if (rr->state == regState_Pending) rr->state = regState_Registered;
3143 rr->SRVChanged = mDNSfalse;
3147 mDNSlocal void hndlRecordUpdateReply(mDNS *m, AuthRecord *rr, mStatus err, mDNSu32 random)
3155 LogInfo("hndlRecordUpdateReply: err %d ID %d state %d %s(%p)", err, mDNSVal16(rr->updateid), rr->state, ARDisplayString(m, rr), rr);
3157 rr->updateError = err;
3162 SetRecordRetry(m, rr, random);
3164 rr->updateid = zeroID; // Make sure that this is not considered as part of a group anymore
3175 if (rr->nta)
3180 if (rr->nta->question.ThisQInterval != -1)
3182 ARDisplayString(m, rr), rr->nta->question.qname.c, DNSTypeName(rr->nta->question.qtype), rr->nta->question.ThisQInterval);
3183 UpdatePort = rr->nta->Port;
3184 CancelGetZoneData(m, rr->nta);
3185 rr->nta = mDNSNULL;
3190 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->state == regState_DeregPending)
3192 debugf("hndlRecordUpdateReply: Received reply for deregister record %##s type %d", rr->resrec.name->c, rr->resrec.rrtype);
3194 rr->resrec.name->c, rr->resrec.rrtype, err);
3195 rr->state = regState_Unregistered;
3196 CompleteDeregistration(m, rr);
3208 if (rr->resrec.rrtype == kDNSType_SRV && rr->state == regState_DeregPending)
3209 rr->state = regState_NoTarget;
3213 if (rr->state == regState_UpdatePending)
3215 if (err) LogMsg("Update record failed for %##s (err %d)", rr->resrec.name->c, err);
3216 rr->state = regState_Registered;
3218 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
3219 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
3220 rr->OrigRData = mDNSNULL;
3221 rr->InFlightRData = mDNSNULL;
3224 if (rr->SRVChanged)
3226 if (rr->resrec.rrtype == kDNSType_SRV)
3227 hndlSRVChanged(m, rr);
3230 LogInfo("hndlRecordUpdateReply: Deregistered %##s (%s), state %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->state);
3231 rr->SRVChanged = mDNSfalse;
3232 if (rr->state != regState_DeregPending) LogMsg("hndlRecordUpdateReply: ResourceRecord %s not in DeregPending state %d", ARDisplayString(m, rr), rr->state);
3233 rr->state = regState_NoTarget; // Wait for the next target change
3238 if (rr->state == regState_Pending || rr->state == regState_Refresh)
3242 if (rr->state == regState_Refresh) InvokeCallback = mDNSfalse;
3243 rr->state = regState_Registered;
3248 LogMsg("hndlRecordUpdateReply: Registration of record %##s type %d failed with error %d", rr->resrec.name->c, rr->resrec.rrtype, err);
3249 if (!rr->Private && rr->uselease && err == mStatus_UnknownErr && mDNSSameIPPort(UpdatePort, UnicastDNSPort))
3251 LogMsg("hndlRecordUpdateReply: Will retry update of record %##s without lease option", rr->resrec.name->c);
3252 rr->uselease = mDNSfalse;
3253 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3254 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3261 if (rr->QueuedRData && rr->state == regState_Registered)
3263 rr->state = regState_UpdatePending;
3264 rr->InFlightRData = rr->QueuedRData;
3265 rr->InFlightRDLen = rr->QueuedRDLen;
3266 rr->OrigRData = rr->resrec.rdata;
3267 rr->OrigRDLen = rr->resrec.rdlength;
3268 rr->QueuedRData = mDNSNULL;
3269 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3270 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3277 if (!err && InvokeCallback && rr->RecordCallback)
3279 LogInfo("hndlRecordUpdateReply: Calling record callback on %##s", rr->resrec.name->c);
3281 rr->RecordCallback(m, rr, err);
3284 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
3763 LogMsg("RecordRegistrationGotZoneData - RR no longer in list. Discarding.");
3912 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr)
3921 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
3923 LogMsg("SendRecordDeRegistration: No zone info for Resource record %s RecordType %d", ARDisplayString(m, rr), rr->resrec.RecordType);
3928 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
3931 rr->updateid = mDNS_NewMessageID(m);
3932 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
3935 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
3938 ptr = BuildUpdateMessage(m, ptr, rr, limit);
3942 if (rr->Private)
3944 LogInfo("SendRecordDeregistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
3945 if (rr->tcp) LogInfo("SendRecordDeregistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
3946 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
3947 if (!rr->nta) { LogMsg("SendRecordDeregistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
3948 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
3953 LogInfo("SendRecordDeregistration UDP %s", ARDisplayString(m, rr));
3954 if (!rr->nta) { LogMsg("SendRecordDeregistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
3955 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name));
3957 //if (rr->state == regState_DeregPending) CompleteDeregistration(m, rr); // Don't touch rr after this
3959 SetRecordRetry(m, rr, 0);
3962 LogMsg("SendRecordDeregistration: Error formatting message for %s", ARDisplayString(m, rr));
3965 mDNSexport mStatus uDNS_DeregisterRecord(mDNS *const m, AuthRecord *const rr)
3969 LogInfo("uDNS_DeregisterRecord: Resource Record %s, state %d", ARDisplayString(m, rr), rr->state);
3971 switch (rr->state)
3989 LogInfo("uDNS_DeregisterRecord: State %d for %##s type %s", rr->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
3991 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) CompleteDeregistration(m, rr);
4008 if (!mDNSOpaque16IsZero(rr->updateid))
4014 if (AuthRecord_uDNS(rr) && mDNSSameOpaque16(anchorRR->updateid, rr->updateid) && anchorRR->tcp)
4016 LogInfo("uDNS_DeregisterRecord: Found Anchor RR %s terminated", ARDisplayString(m, anchorRR));
4024 if (!found) LogInfo("uDNSDeregisterRecord: Cannot find the anchor Resource Record for %s, not an error", ARDisplayString(m, rr));
4029 rr->state = regState_DeregPending;
4030 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
4031 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4032 info = GetAuthInfoForName_internal(m, rr->resrec.name);
4033 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
4039 if (info && info->deltime) rr->LastAPTime += (2 * MERGE_DELAY_TIME);
4040 else rr->LastAPTime += MERGE_DELAY_TIME;
4046 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
4047 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
4052 mDNSexport mStatus uDNS_UpdateRecord(mDNS *m, AuthRecord *rr)
4054 LogInfo("uDNS_UpdateRecord: Resource Record %##s, state %d", rr->resrec.name->c, rr->state);
4055 switch(rr->state)
4065 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->resrec.rdata, rr->resrec.rdlength);
4066 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
4067 rr->NewRData = mDNSNULL;
4074 if (rr->QueuedRData && rr->UpdateCallback)
4076 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4077 rr->QueuedRData = rr->NewRData;
4078 rr->QueuedRDLen = rr->newrdlength;
4079 rr->NewRData = mDNSNULL;
4083 rr->OrigRData = rr->resrec.rdata;
4084 rr->OrigRDLen = rr->resrec.rdlength;
4085 rr->InFlightRData = rr->NewRData;
4086 rr->InFlightRDLen = rr->newrdlength;
4087 rr->NewRData = mDNSNULL;
4088 rr->state = regState_UpdatePending;
4089 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
4090 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4094 LogMsg("ERROR: uDNS_UpdateRecord called for record %##s with bad state regState_NATError", rr->resrec.name->c);
4097 default: LogMsg("uDNS_UpdateRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
4102 rrrr->resrec.rrtype, rr->state);
4304 CacheRecord *rr;
4308 for (rr = cg->members; rr; rr=rr->next)
4309 if (SameNameRecordAnswersQuestion(&rr->resrec, q)) mDNS_PurgeCacheResourceRecord(m, rr);
4357 // To solve this problem we set rr->DelayDelivery to a nonzero value (which happens to be 'now') so that we
4512 AuthRecord *rr;
4517 for (rr = m->ResourceRecords; rr; rr = rr->next)
4519 if (!AuthRecord_uDNS(rr)) continue;
4520 if (rr->state == regState_NoTarget) {debugf("CheckRecordUpdates: Record %##s in NoTarget", rr->resrec.name->c); continue;}
4523 if (rr->state == regState_NATMap) {debugf("CheckRecordUpdates: Record %##s in NATMap", rr->resrec.name->c); continue;}
4524 if (rr->state == regState_Pending || rr->state == regState_DeregPending || rr->state == regState_UpdatePending ||
4525 rr->state == regState_Refresh || rr->state == regState_Registered)
4527 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow <= 0)
4529 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
4530 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
4534 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
4535 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
4554 SetRecordRetry(m, rr, 0);
4556 else if (rr->state == regState_DeregPending) SendRecordDeregistration(m, rr);
4557 else SendRecordRegistration(m, rr);
4560 if (nextevent - (rr->LastAPTime + rr->ThisAPInterval) > 0)
4561 nextevent = (rr->LastAPTime + rr->ThisAPInterval);
4619 AuthRecord *rr;
4620 for (rr = m->ResourceRecords; rr; rr=rr->next)
4622 if (AuthRecord_uDNS(rr))
4626 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
4628 if (rr->NATinfo.clientContext)
4630 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
4631 rr->NATinfo.clientContext = mDNSNULL;
4636 if (rr->state == regState_UpdatePending)
4639 rr->state = regState_Registered;
4641 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
4642 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
4643 rr->OrigRData = mDNSNULL;
4644 rr->InFlightRData = mDNSNULL;
4649 uDNS_DeregisterRecord(m, rr);
4693 mDNSlocal void FreeARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
4696 if (result == mStatus_MemFree) mDNSPlatformMemFree(rr->RecordContext);