• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10.1/mDNSResponder-561.1.1/mDNSCore/

Lines Matching refs:rr

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;
72 if (rr->expire && rr->refreshCount < MAX_UPDATE_REFRESH_COUNT)
74 mDNSs32 remaining = rr->expire - m->timenow;
75 rr->refreshCount++;
79 rr->ThisAPInterval = 7 * (remaining/10) + (random ? random : mDNSRandom(remaining/10));
81 if (rr->ThisAPInterval < MIN_UPDATE_REFRESH_TIME)
82 rr->ThisAPInterval = MIN_UPDATE_REFRESH_TIME;
84 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
88 rr->ThisAPInterval = MIN_UPDATE_REFRESH_TIME;
90 rr->ThisAPInterval/mDNSPlatformOneSecond, (rr->expire - m->timenow)/mDNSPlatformOneSecond, ARDisplayString(m, rr));
95 rr->expire = 0;
97 rr->ThisAPInterval = rr->ThisAPInterval * QuestionIntervalStep; // Same Retry logic as Unicast Queries
98 if (rr->ThisAPInterval < INIT_RECORD_REG_INTERVAL)
99 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
100 if (rr->ThisAPInterval > MAX_RECORD_REG_INTERVAL)
101 rr->ThisAPInterval = MAX_RECORD_REG_INTERVAL;
103 LogInfo("SetRecordRetry retry in %d ms for %s", rr->ThisAPInterval, ARDisplayString(m, rr));
985 AuthRecord rr;
986 ResourceRecord *opt = &rr.resrec;
996 // format opt rr (fields not specified are zero-valued)
997 mDNS_SetupResourceRecord(&rr, mDNSNULL, mDNSInterface_Any, kDNSType_OPT, kStandardTTL, kDNSRecordTypeKnownUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
1002 optRD = &rr.resrec.rdata->u.opt[0];
1253 tcpInfo->rr ? &tcpInfo->rr->tcp : mDNSNULL;
1255 LogMsg("tcpCallback: %d backpointer %p incorrect tcpInfo %p question %p rr %p",
1256 mDNSPlatformTCPGetFD(tcpInfo->sock), *backpointer, tcpInfo, q, tcpInfo->rr);
1267 if (tcpInfo->rr && tcpInfo->rr->resrec.name != &tcpInfo->rr->namestorage)
1268 LogMsg("tcpCallback: ERROR: tcpInfo->rr->resrec.name %p != &tcpInfo->rr->namestorage %p",
1269 tcpInfo->rr->resrec.name, &tcpInfo->rr->namestorage);
1270 if (tcpInfo->rr && tcpInfo->rr->resrec.name != &tcpInfo->rr->namestorage) return;
1272 AuthInfo = tcpInfo->rr ? GetAuthInfoForName(m, tcpInfo->rr->resrec.name) : mDNSNULL;
1419 // Note: Sleep code depends on us clearing *backpointer here -- it uses the clearing of rr->tcp
1520 DNSQuestion *const question, AuthRecord *const rr)
1540 info->rr = rr;
1689 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
1691 debugf("GetServiceTarget %##s", rr->resrec.name->c);
1693 if (!rr->AutoTarget) // If not automatically tracking this host's current name, just return the existing target
1694 return(&rr->resrec.rdata->u.srv.target);
1698 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
1709 const int srvcount = CountLabels(rr->resrec.name);
1718 if (SameDomainName(SkipLeadingLabels(rr->resrec.name, srvcount - x), SkipLeadingLabels(&hi->fqdn, hostcount - x)))
1726 LogInfo("GetServiceTarget: Returning NULL for %s", ARDisplayString(m, rr));
1974 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr);
1975 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr);
1976 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time);
1980 mDNSlocal void UpdateAllServiceRecords(mDNS *const m, AuthRecord *rr, mDNSBool reg)
1984 if (rr->resrec.rrtype != kDNSType_SRV) { LogMsg("UpdateAllServiceRecords:ERROR!! ResourceRecord not a service record %s", ARDisplayString(m, rr)); return; }
1986 if (reg && rr->state == regState_NoTarget) { LogMsg("UpdateAllServiceRecords:ERROR!! SRV record %s in noTarget state during registration", ARDisplayString(m, rr)); return; }
1988 LogInfo("UpdateAllServiceRecords: ResourceRecord %s", ARDisplayString(m, rr));
2000 if (srvRR == rr)
2039 AuthRecord *rr = (AuthRecord *)n->clientContext;
2042 if (!rr) { LogMsg("CompleteRecordNatMap called with unknown AuthRecord object"); return; }
2043 if (!n->NATLease) { LogMsg("CompleteRecordNatMap No NATLease for %s", ARDisplayString(m, rr)); return; }
2045 if (rr->resrec.rrtype != kDNSType_SRV) {LogMsg("CompleteRecordNatMap: Not a service record %s", ARDisplayString(m, rr)); return; }
2047 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) { LogInfo("CompleteRecordNatMap called for %s, Service deregistering", ARDisplayString(m, rr)); return; }
2049 if (rr->state == regState_DeregPending) { LogInfo("CompleteRecordNatMap called for %s, record in DeregPending", ARDisplayString(m, rr)); return; }
2054 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
2056 LogInfo("CompleteRecordNatMap called for %s but no zone information!", ARDisplayString(m, rr));
2059 if (rr->NATinfo.clientContext)
2061 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2062 rr->NATinfo.clientContext = mDNSNULL;
2064 rr->state = regState_Pending;
2065 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2066 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2073 target = GetServiceTarget(m, rr);
2074 srvt = GetRRDomainNameTarget(&rr->resrec);
2078 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2080 LogInfo("CompleteRecordNatMap - no target for %##s, ExternalPort %d", rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2082 rr->state = regState_NoTarget;
2083 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
2085 UpdateAllServiceRecords(m, rr, mDNSfalse);
2088 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2096 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
2109 rr->SRVChanged = mDNSfalse;
2115 rr->state = regState_Pending;
2116 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2117 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2118 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
2121 rr->LastAPTime += MERGE_DELAY_TIME;
2128 UpdateAllServiceRecords(m, rr, mDNStrue);
2131 mDNSlocal void StartRecordNatMap(mDNS *m, AuthRecord *rr)
2136 if (rr->resrec.rrtype != kDNSType_SRV)
2138 LogInfo("StartRecordNatMap: Resource Record %##s type %d, not supported", rr->resrec.name->c, rr->resrec.rrtype);
2141 p = rr->resrec.name->c;
2148 else { LogMsg("StartRecordNatMap: could not determine transport protocol of service %##s", rr->resrec.name->c); return; }
2151 // rr->NATinfo.clientContext, mDNSVal16(rr->NATinfo.IntPort), mDNSVal16(rr->resrec.rdata->u.srv.port), ARDisplayString(m, rr));
2152 if (rr->NATinfo.clientContext) mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2153 rr->NATinfo.Protocol = protocol;
2157 rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
2158 rr->NATinfo.RequestedPort = rr->resrec.rdata->u.srv.port;
2159 rr->NATinfo.NATLease = 0; // Request default lease
2160 rr->NATinfo.clientCallback = CompleteRecordNatMap;
2161 rr->NATinfo.clientContext = rr;
2162 mDNS_StartNATOperation_internal(m, &rr->NATinfo);
2184 mDNSlocal mStatus UnlinkResourceRecord(mDNS *const m, AuthRecord *const rr)
2187 while (*list && *list != rr) list = &(*list)->next;
2190 *list = rr->next;
2191 rr->next = mDNSNULL;
2194 if (rr->NATinfo.clientContext)
2196 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2197 rr->NATinfo.clientContext = mDNSNULL;
2198 if (rr->resrec.rrtype == kDNSType_SRV) rr->resrec.rdata->u.srv.port = rr->NATinfo.IntPort;
2203 LogMsg("UnlinkResourceRecord:ERROR!! - no such active record %##s", rr->resrec.name->c);
2210 mDNSlocal void RegisterAllServiceRecords(mDNS *const m, AuthRecord *rr)
2212 LogInfo("RegisterAllServiceRecords: Service Record %##s", rr->resrec.name->c);
2215 rr->SRVChanged = mDNSfalse;
2216 UnlinkResourceRecord(m, rr);
2217 mDNS_Register_internal(m, rr);
2219 UpdateAllServiceRecords(m, rr, mDNStrue);
2223 mDNSlocal void UpdateOneSRVRecord(mDNS *m, AuthRecord *rr)
2230 domainname *curtarget = &rr->resrec.rdata->u.srv.target;
2231 const domainname *const nt = GetServiceTarget(m, rr);
2233 mDNSBool TargetChanged = (newtarget->c[0] && rr->state == regState_NoTarget) || !SameDomainName(curtarget, newtarget);
2234 mDNSBool HaveZoneData = rr->nta && !mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4);
2241 mDNSIPPort port = rr->resrec.rdata->u.srv.port;
2242 mDNSBool NowNeedNATMAP = (rr->AutoTarget == Target_AutoHostAndNATMAP && !mDNSIPPortIsZero(port) && mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) && rr->nta && !mDNSAddrIsRFC1918(&rr->nta->Addr));
2243 mDNSBool WereBehindNAT = (rr->NATinfo.clientContext != mDNSNULL);
2244 mDNSBool PortWasMapped = (rr->NATinfo.clientContext && !mDNSSameIPPort(rr->NATinfo.RequestedPort, port)); // I think this is always false -- SC Sept 07
2249 LogInfo("UpdateOneSRVRecord: Resource Record %s TargetChanged %d, NewTarget %##s", ARDisplayString(m, rr), TargetChanged, nt->c);
2252 rr->resrec.name->c, newtarget,
2260 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2263 rr->resrec.name->c, rr->state);
2268 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, newtarget %##s", TargetChanged, NATChanged, rr->resrec.name->c, rr->state, newtarget->c);
2270 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, null newtarget", TargetChanged, NATChanged, rr->resrec.name->c, rr->state);
2271 switch(rr->state)
2291 LogInfo("UpdateOneSRVRecord: No target yet for Resource Record %s", ARDisplayString(m, rr));
2294 RegisterAllServiceRecords(m, rr);
2322 rr->SRVChanged = mDNStrue;
2323 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2324 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2328 rr->resrec.name->c, newtarget->c);
2329 rr->state = regState_Pending;
2333 LogInfo("UpdateOneSRVRecord: SRV record changed for service %##s de-registering", rr->resrec.name->c);
2334 rr->state = regState_DeregPending;
2335 UpdateAllServiceRecords(m, rr, mDNSfalse);
2339 default: LogMsg("UpdateOneSRVRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
2361 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
2431 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
2433 HostnameInfo *hi = (HostnameInfo *)rr->RecordContext;
2441 LogInfo("HostnameCallback: Got mStatus_MemFree for %p %p %s", hi, rr, ARDisplayString(m, rr));
2443 if (rr == &i->arv4 || rr == &i->arv6)
2461 if (rr->resrec.rrtype == kDNSType_A)
2462 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.4a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2464 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.16a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv6);
2465 if (!hi) { mDNSPlatformMemFree(rr); return; }
2466 if (rr->state != regState_Unregistered) LogMsg("Error: HostnameCallback invoked with error code for record not in regState_Unregistered!");
2472 rr->RecordContext = (void *)hi->StatusContext;
2474 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2475 rr->RecordContext = (void *)hi;
2487 if (rr->resrec.rrtype == kDNSType_A)
2488 LogInfo("Registered hostname %##s IP %.4a", rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2490 LogInfo("Registered hostname %##s IP %.16a", rr->resrec.name->c, &rr->resrec.rdata->u.ipv6);
2492 rr->RecordContext = (void *)hi->StatusContext;
2494 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2495 rr->RecordContext = (void *)hi;
2863 mDNSlocal mDNSu8* BuildUpdateMessage(mDNS *const m, mDNSu8 *ptr, AuthRecord *rr, mDNSu8 *limit)
2866 if (rr->state == regState_DeregPending)
2868 rr->expire = 0; // Indicate that we have no active registration any more
2869 ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit);
2876 if (rr->state == regState_Registered) rr->state = regState_Refresh;
2877 if (rr->state != regState_Refresh && rr->state != regState_UpdatePending)
2878 rr->state = regState_Pending;
2882 if (rr->resrec.RecordType != kDNSRecordTypeAdvisory) rr->RequireGoodbye = mDNStrue;
2884 if ((rr->resrec.rrtype == kDNSType_SRV) && (rr->AutoTarget == Target_AutoHostAndNATMAP) &&
2885 !mDNSIPPortIsZero(rr->NATinfo.ExternalPort))
2887 rr->resrec.rdata->u.srv.port = rr->NATinfo.ExternalPort;
2890 if (rr->state == regState_UpdatePending)
2893 SetNewRData(&rr->resrec, rr->OrigRData, rr->OrigRDLen);
2894 if (!(ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit))) goto exit; // delete old rdata
2897 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
2898 if (!(ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit))) goto exit;
2902 if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique || rr->resrec.RecordType == kDNSRecordTypeVerified)
2907 ptr = putDeleteRRSetWithLimit(&m->omsg, ptr, rr->resrec.name, rr->resrec.rrtype, limit);
2910 else if (rr->resrec.RecordType != kDNSRecordTypeShared)
2913 //ptr = putPrereqNameNotInUse(rr->resrec.name, &m->omsg, ptr, end);
2917 ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
2923 LogMsg("BuildUpdateMessage: Error formatting message for %s", ARDisplayString(m, rr));
2928 mDNSlocal void SendRecordRegistration(mDNS *const m, AuthRecord *rr)
2939 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
2944 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
2947 LogMsg("SendRecordRegistration: No Zone information, should not happen %s", ARDisplayString(m, rr));
2951 rr->updateid = mDNS_NewMessageID(m);
2952 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
2955 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
2958 if (!(ptr = BuildUpdateMessage(m, ptr, rr, limit))) goto exit;
2960 if (rr->uselease)
2965 if (rr->Private)
2967 LogInfo("SendRecordRegistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
2968 if (rr->tcp) LogInfo("SendRecordRegistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
2969 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
2970 if (!rr->nta) { LogMsg("SendRecordRegistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2971 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
2975 LogInfo("SendRecordRegistration UDP %s", ARDisplayString(m, rr));
2976 if (!rr->nta) { LogMsg("SendRecordRegistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
2977 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name), mDNSfalse);
2981 SetRecordRetry(m, rr, 0);
2984 LogMsg("SendRecordRegistration: Error formatting message for %s, disabling further updates", ARDisplayString(m, rr));
2986 rr->state = regState_NoTarget;
2989 // Is the given record "rr" eligible for merging ?
2990 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time)
3010 if (!AuthRecord_uDNS(rr)) return mDNSfalse;
3012 if (rr->LastAPTime + rr->ThisAPInterval - time > 0)
3013 { debugf("IsRecordMergeable: Time %d not reached for %s", rr->LastAPTime + rr->ThisAPInterval - m->timenow, ARDisplayString(m, rr)); return mDNSfalse; }
3015 if (!rr->zone) return mDNSfalse;
3017 info = GetAuthInfoForName_internal(m, rr->zone);
3021 if (rr->state != regState_DeregPending && rr->state != regState_Pending && rr->state != regState_Registered && rr->state != regState_Refresh && rr->state != regState_UpdatePending)
3022 { debugf("IsRecordMergeable: state %d not right %s", rr->state, ARDisplayString(m, rr)); return mDNSfalse; }
3024 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4)) return mDNSfalse;
3026 if (!rr->uselease) return mDNSfalse;
3028 if (rr->mState == mergeState_DontMerge) {debugf("IsRecordMergeable Dontmerge true %s", ARDisplayString(m, rr)); return mDNSfalse;}
3029 debugf("IsRecordMergeable: Returning true for %s", ARDisplayString(m, rr));
3033 // Is the resource record "rr" eligible to merge to with "currentRR" ?
3034 mDNSlocal mDNSBool AreRecordsMergeable(mDNS *const m, AuthRecord *currentRR, AuthRecord *rr, mDNSs32 time)
3038 if (!IsRecordMergeable(m, rr, time)) return mDNSfalse;
3040 if (!SameDomainName(currentRR->zone, rr->zone))
3041 { debugf("AreRecordMergeable zone mismatch current rr Zone %##s, rr zone %##s", currentRR->zone->c, rr->zone->c); return mDNSfalse; }
3043 if (!mDNSSameIPv4Address(currentRR->nta->Addr.ip.v4, rr->nta->Addr.ip.v4)) return mDNSfalse;
3045 if (!mDNSSameIPPort(currentRR->nta->Port, rr->nta->Port)) return mDNSfalse;
3047 debugf("AreRecordsMergeable: Returning true for %s", ARDisplayString(m, rr));
3055 AuthRecord *rr;
3056 for (rr = m->ResourceRecords; rr; rr = rr->next)
3058 rr->mState = mergeState_DontMerge;
3059 rr->SendRNow = mDNSNULL;
3062 ActivateUnicastRegistration(m, rr);
3104 mDNSlocal mDNSu32 RREstimatedSize(AuthRecord *rr, int zoneSize)
3111 if (rr->state == regState_UpdatePending)
3114 rdlength = rr->OrigRDLen + rr->InFlightRDLen;
3116 rdlength = rr->resrec.rdestimate;
3118 if (rr->state == regState_DeregPending)
3121 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
3122 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
3126 if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique || rr->resrec.RecordType == kDNSRecordTypeVerified)
3132 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
3133 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + 2 + 10 + rdlength;
3137 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
3143 AuthRecord *rr;
3160 for (rr = m->ResourceRecords; rr; rr = rr->next)
3164 if (!IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME)) continue;
3165 firstRR = rr;
3167 else if (!AreRecordsMergeable(m, firstRR, rr, m->timenow + MERGE_DELAY_TIME)) continue;
3169 if (rr->SendRNow) LogMsg("MarkRRForSending: Resourcerecord %s already marked for sending", ARDisplayString(m, rr));
3170 rr->SendRNow = uDNSInterfaceMark;
3187 for (rr = m->ResourceRecords; rr; rr = rr->next)
3189 if ((rr->state != regState_Registered && rr->state != regState_Refresh) ||
3190 (rr->SendRNow == uDNSInterfaceMark) ||
3191 (!AreRecordsMergeable(m, firstRR, rr, m->timenow + rr->ThisAPInterval/2)))
3193 rr->SendRNow = uDNSInterfaceMark;
3208 AuthRecord *rr;
3237 for (rr = startRR; rr; rr = rr->next)
3239 if (rr->SendRNow != uDNSInterfaceMark) continue;
3241 rr->SendRNow = mDNSNULL;
3245 AuthInfo = GetAuthInfoForName_internal(m, rr->zone);
3270 zoneSize = DomainNameLength(rr->zone) + 4;
3278 next = putZone(&m->omsg, next, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
3285 anchorRR = rr;
3288 rrSize = RREstimatedSize(rr, zoneSize - 4);
3296 LogInfo("SendGroupUpdates: Skipping message %s, spaceleft %d, rrSize %d", ARDisplayString(m, rr), spaceleft, rrSize);
3298 rr->SendRNow = uDNSInterfaceMark;
3300 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3301 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3302 rr = rr->next;
3315 LogInfo("SendGroupUpdates: Building a message with resource record %s, next %p, state %d, ttl %d", ARDisplayString(m, rr), next, rr->state, rr->resrec.rroriginalttl);
3316 if (!(next = BuildUpdateMessage(m, next, rr, limit)))
3320 LogMsg("SendGroupUpdates: ptr NULL while building message with %s", ARDisplayString(m, rr));
3326 LogMsg("SendGroupUpdates: ERROR!! Record size estimation is wrong for %s, Estimate %d, Actual %d, state %d", ARDisplayString(m, rr), rrSize, next - oldnext, rr->state);
3330 // We could have sent an update earlier with this "rr" as anchorRR for which we never got a response.
3332 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL;}
3333 rr->updateid = msgid;
3337 SetRecordRetry(m, rr, 0);
3339 // Either we have parsed all the records or stopped at "rr" above due to lack of space
3340 startRR = rr;
3355 AuthRecord *rr, *nextRR;
3362 for (rr = m->ResourceRecords; rr; rr = nextRR)
3364 // SendRecordRegistrtion might delete the rr from list, hence
3366 nextRR = rr->next;
3367 if (rr->SendRNow == uDNSInterfaceMark)
3371 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow > 0)
3372 { LogMsg("CheckGroupRecordUpdates: ERROR!! Resourcerecord %s not ready", ARDisplayString(m, rr)); continue; }
3373 rr->SendRNow = mDNSNULL;
3374 SendRecordRegistration(m, rr);
3384 mDNSlocal void hndlSRVChanged(mDNS *const m, AuthRecord *rr)
3389 const domainname *target = GetServiceTarget(m, rr);
3393 if (rr->state == regState_DeregPending)
3395 LogInfo("hndlSRVChanged: SRVChanged, No Target, SRV Deregistered for %##s, state %d", rr->resrec.name->c,
3396 rr->state);
3397 rr->SRVChanged = mDNSfalse;
3398 dt = GetRRDomainNameTarget(&rr->resrec);
3400 rr->state = regState_NoTarget; // Wait for the next target change
3401 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3406 if (rr->state == regState_Pending)
3408 LogInfo("hndlSRVChanged: SRVChanged, No Target, Deregistering again %##s, state %d", rr->resrec.name->c, rr->state);
3409 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3410 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3411 rr->state = regState_DeregPending;
3414 LogInfo("hndlSRVChanged: Not in DeregPending or RegPending state %##s, state %d", rr->resrec.name->c, rr->state);
3425 if ((rr->state == regState_DeregPending) ||
3426 (rr->state == regState_Pending && !SameDomainName(target, &rr->resrec.rdata->u.srv.target)))
3428 dt = GetRRDomainNameTarget(&rr->resrec);
3430 rr->state = regState_NoTarget; // NoTarget will allow us to pick up new target OR nat traversal state
3431 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3433 target->c, rr->resrec.name->c, rr->state);
3434 rr->SRVChanged = mDNSfalse;
3435 UpdateOneSRVRecord(m, rr);
3440 if (rr->state == regState_Pending) rr->state = regState_Registered;
3443 rr->SRVChanged = mDNSfalse;
3447 mDNSlocal void hndlRecordUpdateReply(mDNS *m, AuthRecord *rr, mStatus err, mDNSu32 random)
3454 LogInfo("hndlRecordUpdateReply: err %d ID %d state %d %s(%p)", err, mDNSVal16(rr->updateid), rr->state, ARDisplayString(m, rr), rr);
3456 rr->updateError = err;
3461 SetRecordRetry(m, rr, random);
3463 rr->updateid = zeroID; // Make sure that this is not considered as part of a group anymore
3474 if (rr->nta)
3479 if (rr->nta->question.ThisQInterval != -1)
3481 ARDisplayString(m, rr), rr->nta->question.qname.c, DNSTypeName(rr->nta->question.qtype), rr->nta->question.ThisQInterval);
3482 UpdatePort = rr->nta->Port;
3483 CancelGetZoneData(m, rr->nta);
3484 rr->nta = mDNSNULL;
3489 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->state == regState_DeregPending)
3491 debugf("hndlRecordUpdateReply: Received reply for deregister record %##s type %d", rr->resrec.name->c, rr->resrec.rrtype);
3493 rr->resrec.name->c, rr->resrec.rrtype, err);
3494 rr->state = regState_Unregistered;
3495 CompleteDeregistration(m, rr);
3507 if (rr->resrec.rrtype == kDNSType_SRV && rr->state == regState_DeregPending)
3508 rr->state = regState_NoTarget;
3512 if (rr->state == regState_UpdatePending)
3514 if (err) LogMsg("Update record failed for %##s (err %d)", rr->resrec.name->c, err);
3515 rr->state = regState_Registered;
3517 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
3518 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
3519 rr->OrigRData = mDNSNULL;
3520 rr->InFlightRData = mDNSNULL;
3523 if (rr->SRVChanged)
3525 if (rr->resrec.rrtype == kDNSType_SRV)
3526 hndlSRVChanged(m, rr);
3529 LogInfo("hndlRecordUpdateReply: Deregistered %##s (%s), state %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->state);
3530 rr->SRVChanged = mDNSfalse;
3531 if (rr->state != regState_DeregPending) LogMsg("hndlRecordUpdateReply: ResourceRecord %s not in DeregPending state %d", ARDisplayString(m, rr), rr->state);
3532 rr->state = regState_NoTarget; // Wait for the next target change
3537 if (rr->state == regState_Pending || rr->state == regState_Refresh)
3541 if (rr->state == regState_Refresh) InvokeCallback = mDNSfalse;
3542 rr->state = regState_Registered;
3547 LogMsg("hndlRecordUpdateReply: Registration of record %##s type %d failed with error %d", rr->resrec.name->c, rr->resrec.rrtype, err);
3548 if (!rr->Private && rr->uselease && err == mStatus_UnknownErr && mDNSSameIPPort(UpdatePort, UnicastDNSPort))
3550 LogMsg("hndlRecordUpdateReply: Will retry update of record %##s without lease option", rr->resrec.name->c);
3551 rr->uselease = mDNSfalse;
3552 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3553 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3554 SetNextuDNSEvent(m, rr);
3561 if (rr->QueuedRData && rr->state == regState_Registered)
3563 rr->state = regState_UpdatePending;
3564 rr->InFlightRData = rr->QueuedRData;
3565 rr->InFlightRDLen = rr->QueuedRDLen;
3566 rr->OrigRData = rr->resrec.rdata;
3567 rr->OrigRDLen = rr->resrec.rdlength;
3568 rr->QueuedRData = mDNSNULL;
3569 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3570 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3571 SetNextuDNSEvent(m, rr);
3578 if (!err && InvokeCallback && rr->RecordCallback)
3580 LogInfo("hndlRecordUpdateReply: Calling record callback on %##s", rr->resrec.name->c);
3582 rr->RecordCallback(m, rr, err);
3585 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
4394 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr)
4402 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
4404 LogMsg("SendRecordDeRegistration: No zone info for Resource record %s RecordType %d", ARDisplayString(m, rr), rr->resrec.RecordType);
4409 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
4412 rr->updateid = mDNS_NewMessageID(m);
4413 InitializeDNSMessage(&m->omsg.h, rr->updateid, UpdateReqFlags);
4416 ptr = putZone(&m->omsg, ptr, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
4419 ptr = BuildUpdateMessage(m, ptr, rr, limit);
4423 if (rr->Private)
4425 LogInfo("SendRecordDeregistration TCP %p %s", rr->tcp, ARDisplayString(m, rr));
4426 if (rr->tcp) LogInfo("SendRecordDeregistration: Disposing existing TCP connection for %s", ARDisplayString(m, rr));
4427 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
4428 if (!rr->nta) { LogMsg("SendRecordDeregistration:Private:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
4429 rr->tcp = MakeTCPConn(m, &m->omsg, ptr, kTCPSocketFlags_UseTLS, &rr->nta->Addr, rr->nta->Port, &rr->nta->Host, mDNSNULL, rr);
4434 LogInfo("SendRecordDeregistration UDP %s", ARDisplayString(m, rr));
4435 if (!rr->nta) { LogMsg("SendRecordDeregistration:ERROR!! nta is NULL for %s", ARDisplayString(m, rr)); return; }
4436 err = mDNSSendDNSMessage(m, &m->omsg, ptr, mDNSInterface_Any, mDNSNULL, &rr->nta->Addr, rr->nta->Port, mDNSNULL, GetAuthInfoForName_internal(m, rr->resrec.name), mDNSfalse);
4438 //if (rr->state == regState_DeregPending) CompleteDeregistration(m, rr); // Don't touch rr after this
4440 SetRecordRetry(m, rr, 0);
4443 LogMsg("SendRecordDeregistration: Error formatting message for %s", ARDisplayString(m, rr));
4446 mDNSexport mStatus uDNS_DeregisterRecord(mDNS *const m, AuthRecord *const rr)
4450 LogInfo("uDNS_DeregisterRecord: Resource Record %s, state %d", ARDisplayString(m, rr), rr->state);
4452 switch (rr->state)
4470 LogInfo("uDNS_DeregisterRecord: State %d for %##s type %s", rr->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
4472 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) CompleteDeregistration(m, rr);
4490 if (rr->InFlightRData && rr->UpdateCallback)
4492 if (rr->InFlightRData != rr->resrec.rdata)
4494 LogInfo("uDNS_DeregisterRecord: Freeing InFlightRData for %s", ARDisplayString(m, rr));
4495 rr->UpdateCallback(m, rr, rr->InFlightRData, rr->InFlightRDLen);
4496 rr->InFlightRData = mDNSNULL;
4499 LogInfo("uDNS_DeregisterRecord: InFlightRData same as rdata for %s", ARDisplayString(m, rr));
4502 if (rr->QueuedRData && rr->UpdateCallback)
4504 if (rr->QueuedRData == rr->resrec.rdata)
4505 LogMsg("uDNS_DeregisterRecord: ERROR!! QueuedRData same as rdata for %s", ARDisplayString(m, rr));
4508 LogInfo("uDNS_DeregisterRecord: Freeing QueuedRData for %s", ARDisplayString(m, rr));
4509 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4510 rr->QueuedRData = mDNSNULL;
4527 if (!mDNSOpaque16IsZero(rr->updateid))
4533 if (AuthRecord_uDNS(rr) && mDNSSameOpaque16(anchorRR->updateid, rr->updateid) && anchorRR->tcp)
4543 if (!found) LogInfo("uDNSDeregisterRecord: Cannot find the anchor Resource Record for %s, not an error", ARDisplayString(m, rr));
4548 rr->state = regState_DeregPending;
4549 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
4550 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4551 info = GetAuthInfoForName_internal(m, rr->resrec.name);
4552 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
4558 if (info && info->deltime) rr->LastAPTime += (2 * MERGE_DELAY_TIME);
4559 else rr->LastAPTime += MERGE_DELAY_TIME;
4565 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
4566 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
4571 mDNSexport mStatus uDNS_UpdateRecord(mDNS *m, AuthRecord *rr)
4573 LogInfo("uDNS_UpdateRecord: Resource Record %##s, state %d", rr->resrec.name->c, rr->state);
4574 switch(rr->state)
4584 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->resrec.rdata, rr->resrec.rdlength);
4585 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
4586 rr->NewRData = mDNSNULL;
4593 if (rr->QueuedRData && rr->UpdateCallback)
4595 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4596 rr->QueuedRData = rr->NewRData;
4597 rr->QueuedRDLen = rr->newrdlength;
4598 rr->NewRData = mDNSNULL;
4602 rr->OrigRData = rr->resrec.rdata;
4603 rr->OrigRDLen = rr->resrec.rdlength;
4604 rr->InFlightRData = rr->NewRData;
4605 rr->InFlightRDLen = rr->newrdlength;
4606 rr->NewRData = mDNSNULL;
4607 rr->state = regState_UpdatePending;
4608 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
4609 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4610 SetNextuDNSEvent(m, rr);
4614 LogMsg("ERROR: uDNS_UpdateRecord called for record %##s with bad state regState_NATError", rr->resrec.name->c);
4617 default: LogMsg("uDNS_UpdateRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
4622 rr->resrec.name->c, rr->resrec.rrtype, rr->state);
4833 CacheRecord *rr;
4879 for (rr = cg->members; rr; rr=rr->next)
4881 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
4883 LogInfo("uDNS_CheckCurrentQuestion: Purged resourcerecord %s", CRDisplayString(m, rr));
4884 mDNS_PurgeCacheResourceRecord(m, rr);
4896 // To solve this problem we set rr->DelayDelivery to a nonzero value (which happens to be 'now') so that we
5042 AuthRecord *rr;
5047 for (rr = m->ResourceRecords; rr; rr = rr->next)
5049 if (!AuthRecord_uDNS(rr)) continue;
5050 if (rr->state == regState_NoTarget) {debugf("CheckRecordUpdates: Record %##s in NoTarget", rr->resrec.name->c); continue;}
5053 if (rr->state == regState_NATMap) {debugf("CheckRecordUpdates: Record %##s in NATMap", rr->resrec.name->c); continue;}
5054 if (rr->state == regState_Pending || rr->state == regState_DeregPending || rr->state == regState_UpdatePending ||
5055 rr->state == regState_Refresh || rr->state == regState_Registered)
5057 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow <= 0)
5059 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
5060 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
5064 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
5065 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
5084 SetRecordRetry(m, rr, 0);
5086 else if (rr->state == regState_DeregPending) SendRecordDeregistration(m, rr);
5087 else SendRecordRegistration(m, rr);
5090 if (nextevent - (rr->LastAPTime + rr->ThisAPInterval) > 0)
5091 nextevent = (rr->LastAPTime + rr->ThisAPInterval);
5149 AuthRecord *rr;
5150 for (rr = m->ResourceRecords; rr; rr=rr->next)
5152 if (AuthRecord_uDNS(rr))
5156 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
5158 if (rr->NATinfo.clientContext)
5160 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
5161 rr->NATinfo.clientContext = mDNSNULL;
5166 if (rr->state == regState_UpdatePending)
5169 rr->state = regState_Registered;
5171 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
5172 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
5173 rr->OrigRData = mDNSNULL;
5174 rr->InFlightRData = mDNSNULL;
5179 uDNS_DeregisterRecord(m, rr);
5223 mDNSlocal void FreeARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
5226 if (result == mStatus_MemFree) mDNSPlatformMemFree(rr->RecordContext);
5769 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
5772 (void) rr;