Lines Matching defs: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));
986 AuthRecord rr;
987 ResourceRecord *opt = &rr.resrec;
997 // format opt rr (fields not specified are zero-valued)
998 mDNS_SetupResourceRecord(&rr, mDNSNULL, mDNSInterface_Any, kDNSType_OPT, kStandardTTL, kDNSRecordTypeKnownUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
1003 optRD = &rr.resrec.rdata->u.opt[0];
1254 tcpInfo->rr ? &tcpInfo->rr->tcp : mDNSNULL;
1256 LogMsg("tcpCallback: %d backpointer %p incorrect tcpInfo %p question %p rr %p",
1257 mDNSPlatformTCPGetFD(tcpInfo->sock), *backpointer, tcpInfo, q, tcpInfo->rr);
1268 if (tcpInfo->rr && tcpInfo->rr->resrec.name != &tcpInfo->rr->namestorage)
1269 LogMsg("tcpCallback: ERROR: tcpInfo->rr->resrec.name %p != &tcpInfo->rr->namestorage %p",
1270 tcpInfo->rr->resrec.name, &tcpInfo->rr->namestorage);
1271 if (tcpInfo->rr && tcpInfo->rr->resrec.name != &tcpInfo->rr->namestorage) return;
1273 AuthInfo = tcpInfo->rr ? GetAuthInfoForName(m, tcpInfo->rr->resrec.name) : mDNSNULL;
1426 // Note: Sleep code depends on us clearing *backpointer here -- it uses the clearing of rr->tcp
1527 DNSQuestion *const question, AuthRecord *const rr)
1547 info->rr = rr;
1696 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
1698 debugf("GetServiceTarget %##s", rr->resrec.name->c);
1700 if (!rr->AutoTarget) // If not automatically tracking this host's current name, just return the existing target
1701 return(&rr->resrec.rdata->u.srv.target);
1705 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
1716 const int srvcount = CountLabels(rr->resrec.name);
1725 if (SameDomainName(SkipLeadingLabels(rr->resrec.name, srvcount - x), SkipLeadingLabels(&hi->fqdn, hostcount - x)))
1733 LogInfo("GetServiceTarget: Returning NULL for %s", ARDisplayString(m, rr));
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));
2012 if (srvRR == rr)
2051 AuthRecord *rr = (AuthRecord *)n->clientContext;
2054 if (!rr) { LogMsg("CompleteRecordNatMap called with unknown AuthRecord object"); return; }
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; }
2066 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
2068 LogInfo("CompleteRecordNatMap called for %s but no zone information!", ARDisplayString(m, rr));
2071 if (rr->NATinfo.clientContext)
2073 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2074 rr->NATinfo.clientContext = mDNSNULL;
2076 rr->state = regState_Pending;
2077 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2078 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2085 target = GetServiceTarget(m, rr);
2086 srvt = GetRRDomainNameTarget(&rr->resrec);
2090 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2092 LogInfo("CompleteRecordNatMap - no target for %##s, ExternalPort %d", rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2094 rr->state = regState_NoTarget;
2095 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
2097 UpdateAllServiceRecords(m, rr, mDNSfalse);
2100 LogInfo("CompleteRecordNatMap - Target %##s for ResourceRecord %##s, ExternalPort %d", target->c, rr->resrec.name->c, mDNSVal16(n->ExternalPort));
2108 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
2121 rr->SRVChanged = mDNSfalse;
2127 rr->state = regState_Pending;
2128 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2129 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2130 if (IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME))
2133 rr->LastAPTime += MERGE_DELAY_TIME;
2140 UpdateAllServiceRecords(m, rr, mDNStrue);
2143 mDNSlocal void StartRecordNatMap(mDNS *m, AuthRecord *rr)
2148 if (rr->resrec.rrtype != kDNSType_SRV)
2150 LogInfo("StartRecordNatMap: Resource Record %##s type %d, not supported", rr->resrec.name->c, rr->resrec.rrtype);
2153 p = rr->resrec.name->c;
2160 else { LogMsg("StartRecordNatMap: could not determine transport protocol of service %##s", rr->resrec.name->c); return; }
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);
2165 rr->NATinfo.Protocol = protocol;
2169 rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
2170 rr->NATinfo.RequestedPort = rr->resrec.rdata->u.srv.port;
2171 rr->NATinfo.NATLease = 0; // Request default lease
2172 rr->NATinfo.clientCallback = CompleteRecordNatMap;
2173 rr->NATinfo.clientContext = rr;
2174 mDNS_StartNATOperation_internal(m, &rr->NATinfo);
2196 mDNSlocal mStatus UnlinkResourceRecord(mDNS *const m, AuthRecord *const rr)
2199 while (*list && *list != rr) list = &(*list)->next;
2202 *list = rr->next;
2203 rr->next = mDNSNULL;
2206 if (rr->NATinfo.clientContext)
2208 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
2209 rr->NATinfo.clientContext = mDNSNULL;
2210 if (rr->resrec.rrtype == kDNSType_SRV) rr->resrec.rdata->u.srv.port = rr->NATinfo.IntPort;
2215 LogMsg("UnlinkResourceRecord:ERROR!! - no such active record %##s", rr->resrec.name->c);
2222 mDNSlocal void RegisterAllServiceRecords(mDNS *const m, AuthRecord *rr)
2224 LogInfo("RegisterAllServiceRecords: Service Record %##s", rr->resrec.name->c);
2227 rr->SRVChanged = mDNSfalse;
2228 UnlinkResourceRecord(m, rr);
2229 mDNS_Register_internal(m, rr);
2231 UpdateAllServiceRecords(m, rr, mDNStrue);
2235 mDNSlocal void UpdateOneSRVRecord(mDNS *m, AuthRecord *rr)
2242 domainname *curtarget = &rr->resrec.rdata->u.srv.target;
2243 const domainname *const nt = GetServiceTarget(m, rr);
2245 mDNSBool TargetChanged = (newtarget->c[0] && rr->state == regState_NoTarget) || !SameDomainName(curtarget, newtarget);
2246 mDNSBool HaveZoneData = rr->nta && !mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4);
2253 mDNSIPPort port = rr->resrec.rdata->u.srv.port;
2254 mDNSBool NowNeedNATMAP = (rr->AutoTarget == Target_AutoHostAndNATMAP && !mDNSIPPortIsZero(port) && mDNSv4AddrIsRFC1918(&m->AdvertisedV4.ip.v4) && rr->nta && !mDNSAddrIsRFC1918(&rr->nta->Addr));
2255 mDNSBool WereBehindNAT = (rr->NATinfo.clientContext != mDNSNULL);
2256 mDNSBool PortWasMapped = (rr->NATinfo.clientContext && !mDNSSameIPPort(rr->NATinfo.RequestedPort, port)); // I think this is always false -- SC Sept 07
2261 LogInfo("UpdateOneSRVRecord: Resource Record %s TargetChanged %d, NewTarget %##s", ARDisplayString(m, rr), TargetChanged, nt->c);
2264 rr->resrec.name->c, newtarget,
2272 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2275 rr->resrec.name->c, rr->state);
2280 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, newtarget %##s", TargetChanged, NATChanged, rr->resrec.name->c, rr->state, newtarget->c);
2282 LogInfo("UpdateOneSRVRecord: TargetChanged %d, NATChanged %d for %##s, state %d, null newtarget", TargetChanged, NATChanged, rr->resrec.name->c, rr->state);
2283 switch(rr->state)
2303 LogInfo("UpdateOneSRVRecord: No target yet for Resource Record %s", ARDisplayString(m, rr));
2306 RegisterAllServiceRecords(m, rr);
2334 rr->SRVChanged = mDNStrue;
2335 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
2336 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
2340 rr->resrec.name->c, newtarget->c);
2341 rr->state = regState_Pending;
2345 LogInfo("UpdateOneSRVRecord: SRV record changed for service %##s de-registering", rr->resrec.name->c);
2346 rr->state = regState_DeregPending;
2347 UpdateAllServiceRecords(m, rr, mDNSfalse);
2351 default: LogMsg("UpdateOneSRVRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
2373 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
2443 mDNSlocal void HostnameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
2445 HostnameInfo *hi = (HostnameInfo *)rr->RecordContext;
2453 LogInfo("HostnameCallback: Got mStatus_MemFree for %p %p %s", hi, rr, ARDisplayString(m, rr));
2455 if (rr == &i->arv4 || rr == &i->arv6)
2473 if (rr->resrec.rrtype == kDNSType_A)
2474 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.4a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2476 LogMsg("HostnameCallback: Error %d for registration of %##s IP %.16a", result, rr->resrec.name->c, &rr->resrec.rdata->u.ipv6);
2477 if (!hi) { mDNSPlatformMemFree(rr); return; }
2478 if (rr->state != regState_Unregistered) LogMsg("Error: HostnameCallback invoked with error code for record not in regState_Unregistered!");
2484 rr->RecordContext = (void *)hi->StatusContext;
2486 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2487 rr->RecordContext = (void *)hi;
2499 if (rr->resrec.rrtype == kDNSType_A)
2500 LogInfo("Registered hostname %##s IP %.4a", rr->resrec.name->c, &rr->resrec.rdata->u.ipv4);
2502 LogInfo("Registered hostname %##s IP %.16a", rr->resrec.name->c, &rr->resrec.rdata->u.ipv6);
2504 rr->RecordContext = (void *)hi->StatusContext;
2506 hi->StatusCallback(m, rr, result); // client may NOT make API calls here
2507 rr->RecordContext = (void *)hi;
2882 mDNSlocal mDNSu8* BuildUpdateMessage(mDNS *const m, mDNSu8 *ptr, AuthRecord *rr, mDNSu8 *limit)
2885 if (rr->state == regState_DeregPending)
2887 rr->expire = 0; // Indicate that we have no active registration any more
2888 ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit);
2895 if (rr->state == regState_Registered) rr->state = regState_Refresh;
2896 if (rr->state != regState_Refresh && rr->state != regState_UpdatePending)
2897 rr->state = regState_Pending;
2901 if (rr->resrec.RecordType != kDNSRecordTypeAdvisory) rr->RequireGoodbye = mDNStrue;
2903 if ((rr->resrec.rrtype == kDNSType_SRV) && (rr->AutoTarget == Target_AutoHostAndNATMAP) &&
2904 !mDNSIPPortIsZero(rr->NATinfo.ExternalPort))
2906 rr->resrec.rdata->u.srv.port = rr->NATinfo.ExternalPort;
2909 if (rr->state == regState_UpdatePending)
2912 SetNewRData(&rr->resrec, rr->OrigRData, rr->OrigRDLen);
2913 if (!(ptr = putDeletionRecordWithLimit(&m->omsg, ptr, &rr->resrec, limit))) goto exit; // delete old rdata
2916 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
2917 if (!(ptr = PutResourceRecordTTLWithLimit(&m->omsg, ptr, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit))) goto exit;
2921 if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique || rr->resrec.RecordType == kDNSRecordTypeVerified)
2926 ptr = putDeleteRRSetWithLimit(&m->omsg, ptr, rr->resrec.name, rr->resrec.rrtype, limit);
2929 else if (rr->resrec.RecordType != kDNSRecordTypeShared)
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)
2958 AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
2963 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
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;
2979 if (rr->uselease)
2984 if (rr->Private)
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));
2988 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
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));
3005 rr->state = regState_NoTarget;
3008 // Is the given record "rr" eligible for merging ?
3009 mDNSlocal mDNSBool IsRecordMergeable(mDNS *const m, AuthRecord *rr, mDNSs32 time)
3029 if (!AuthRecord_uDNS(rr)) return mDNSfalse;
3031 if (rr->LastAPTime + rr->ThisAPInterval - time > 0)
3032 { debugf("IsRecordMergeable: Time %d not reached for %s", rr->LastAPTime + rr->ThisAPInterval - m->timenow, ARDisplayString(m, rr)); return mDNSfalse; }
3034 if (!rr->zone) return mDNSfalse;
3036 info = GetAuthInfoForName_internal(m, rr->zone);
3040 if (rr->state != regState_DeregPending && rr->state != regState_Pending && rr->state != regState_Registered && rr->state != regState_Refresh && rr->state != regState_UpdatePending)
3041 { debugf("IsRecordMergeable: state %d not right %s", rr->state, ARDisplayString(m, rr)); return mDNSfalse; }
3043 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4)) return mDNSfalse;
3045 if (!rr->uselease) 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));
3052 // Is the resource record "rr" eligible to merge to with "currentRR" ?
3053 mDNSlocal mDNSBool AreRecordsMergeable(mDNS *const m, AuthRecord *currentRR, AuthRecord *rr, mDNSs32 time)
3057 if (!IsRecordMergeable(m, rr, time)) return mDNSfalse;
3059 if (!SameDomainName(currentRR->zone, rr->zone))
3060 { debugf("AreRecordMergeable zone mismatch current rr Zone %##s, rr zone %##s", currentRR->zone->c, rr->zone->c); return mDNSfalse; }
3062 if (!mDNSSameIPv4Address(currentRR->nta->Addr.ip.v4, rr->nta->Addr.ip.v4)) return mDNSfalse;
3064 if (!mDNSSameIPPort(currentRR->nta->Port, rr->nta->Port)) return mDNSfalse;
3066 debugf("AreRecordsMergeable: Returning true for %s", ARDisplayString(m, rr));
3074 AuthRecord *rr;
3075 for (rr = m->ResourceRecords; rr; rr = rr->next)
3077 rr->mState = mergeState_DontMerge;
3078 rr->SendRNow = mDNSNULL;
3081 ActivateUnicastRegistration(m, rr);
3123 mDNSlocal mDNSu32 RREstimatedSize(AuthRecord *rr, int zoneSize)
3130 if (rr->state == regState_UpdatePending)
3133 rdlength = rr->OrigRDLen + rr->InFlightRDLen;
3135 rdlength = rr->resrec.rdestimate;
3137 if (rr->state == regState_DeregPending)
3140 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
3141 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
3145 if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique || rr->resrec.RecordType == kDNSRecordTypeVerified)
3151 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), DomainNameLength(rr->resrec.name), zoneSize, rdlength);
3152 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + 2 + 10 + rdlength;
3156 return DomainNameLength(rr->resrec.name) - zoneSize + 2 + 10 + rdlength;
3162 AuthRecord *rr;
3179 for (rr = m->ResourceRecords; rr; rr = rr->next)
3183 if (!IsRecordMergeable(m, rr, m->timenow + MERGE_DELAY_TIME)) continue;
3184 firstRR = rr;
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));
3189 rr->SendRNow = uDNSInterfaceMark;
3206 for (rr = m->ResourceRecords; rr; rr = rr->next)
3208 if ((rr->state != regState_Registered && rr->state != regState_Refresh) ||
3209 (rr->SendRNow == uDNSInterfaceMark) ||
3210 (!AreRecordsMergeable(m, firstRR, rr, m->timenow + rr->ThisAPInterval/2)))
3212 rr->SendRNow = uDNSInterfaceMark;
3227 AuthRecord *rr;
3256 for (rr = startRR; rr; rr = rr->next)
3258 if (rr->SendRNow != uDNSInterfaceMark) continue;
3260 rr->SendRNow = mDNSNULL;
3264 AuthInfo = GetAuthInfoForName_internal(m, rr->zone);
3289 zoneSize = DomainNameLength(rr->zone) + 4;
3297 next = putZone(&m->omsg, next, limit, rr->zone, mDNSOpaque16fromIntVal(rr->resrec.rrclass));
3304 anchorRR = rr;
3307 rrSize = RREstimatedSize(rr, zoneSize - 4);
3315 LogInfo("SendGroupUpdates: Skipping message %s, spaceleft %d, rrSize %d", ARDisplayString(m, rr), spaceleft, rrSize);
3317 rr->SendRNow = uDNSInterfaceMark;
3319 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3320 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3321 rr = rr->next;
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));
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);
3349 // We could have sent an update earlier with this "rr" as anchorRR for which we never got a response.
3351 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL;}
3352 rr->updateid = msgid;
3356 SetRecordRetry(m, rr, 0);
3358 // Either we have parsed all the records or stopped at "rr" above due to lack of space
3359 startRR = rr;
3374 AuthRecord *rr, *nextRR;
3381 for (rr = m->ResourceRecords; rr; rr = nextRR)
3383 // SendRecordRegistrtion might delete the rr from list, hence
3385 nextRR = rr->next;
3386 if (rr->SendRNow == uDNSInterfaceMark)
3390 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow > 0)
3391 { LogMsg("CheckGroupRecordUpdates: ERROR!! Resourcerecord %s not ready", ARDisplayString(m, rr)); continue; }
3392 rr->SendRNow = mDNSNULL;
3393 SendRecordRegistration(m, rr);
3403 mDNSlocal void hndlSRVChanged(mDNS *const m, AuthRecord *rr)
3408 const domainname *target = GetServiceTarget(m, rr);
3412 if (rr->state == regState_DeregPending)
3414 LogInfo("hndlSRVChanged: SRVChanged, No Target, SRV Deregistered for %##s, state %d", rr->resrec.name->c,
3415 rr->state);
3416 rr->SRVChanged = mDNSfalse;
3417 dt = GetRRDomainNameTarget(&rr->resrec);
3419 rr->state = regState_NoTarget; // Wait for the next target change
3420 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3425 if (rr->state == regState_Pending)
3427 LogInfo("hndlSRVChanged: SRVChanged, No Target, Deregistering again %##s, state %d", rr->resrec.name->c, rr->state);
3428 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3429 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3430 rr->state = regState_DeregPending;
3433 LogInfo("hndlSRVChanged: Not in DeregPending or RegPending state %##s, state %d", rr->resrec.name->c, rr->state);
3444 if ((rr->state == regState_DeregPending) ||
3445 (rr->state == regState_Pending && !SameDomainName(target, &rr->resrec.rdata->u.srv.target)))
3447 dt = GetRRDomainNameTarget(&rr->resrec);
3449 rr->state = regState_NoTarget; // NoTarget will allow us to pick up new target OR nat traversal state
3450 rr->resrec.rdlength = rr->resrec.rdestimate = 0;
3452 target->c, rr->resrec.name->c, rr->state);
3453 rr->SRVChanged = mDNSfalse;
3454 UpdateOneSRVRecord(m, rr);
3459 if (rr->state == regState_Pending) rr->state = regState_Registered;
3462 rr->SRVChanged = mDNSfalse;
3466 mDNSlocal void hndlRecordUpdateReply(mDNS *m, AuthRecord *rr, mStatus err, mDNSu32 random)
3473 LogInfo("hndlRecordUpdateReply: err %d ID %d state %d %s(%p)", err, mDNSVal16(rr->updateid), rr->state, ARDisplayString(m, rr), rr);
3475 rr->updateError = err;
3480 SetRecordRetry(m, rr, random);
3482 rr->updateid = zeroID; // Make sure that this is not considered as part of a group anymore
3493 if (rr->nta)
3498 if (rr->nta->question.ThisQInterval != -1)
3500 ARDisplayString(m, rr), rr->nta->question.qname.c, DNSTypeName(rr->nta->question.qtype), rr->nta->question.ThisQInterval);
3501 UpdatePort = rr->nta->Port;
3502 CancelGetZoneData(m, rr->nta);
3503 rr->nta = mDNSNULL;
3508 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->state == regState_DeregPending)
3510 debugf("hndlRecordUpdateReply: Received reply for deregister record %##s type %d", rr->resrec.name->c, rr->resrec.rrtype);
3512 rr->resrec.name->c, rr->resrec.rrtype, err);
3513 rr->state = regState_Unregistered;
3514 CompleteDeregistration(m, rr);
3526 if (rr->resrec.rrtype == kDNSType_SRV && rr->state == regState_DeregPending)
3527 rr->state = regState_NoTarget;
3531 if (rr->state == regState_UpdatePending)
3533 if (err) LogMsg("Update record failed for %##s (err %d)", rr->resrec.name->c, err);
3534 rr->state = regState_Registered;
3536 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
3537 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
3538 rr->OrigRData = mDNSNULL;
3539 rr->InFlightRData = mDNSNULL;
3542 if (rr->SRVChanged)
3544 if (rr->resrec.rrtype == kDNSType_SRV)
3545 hndlSRVChanged(m, rr);
3548 LogInfo("hndlRecordUpdateReply: Deregistered %##s (%s), state %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->state);
3549 rr->SRVChanged = mDNSfalse;
3550 if (rr->state != regState_DeregPending) LogMsg("hndlRecordUpdateReply: ResourceRecord %s not in DeregPending state %d", ARDisplayString(m, rr), rr->state);
3551 rr->state = regState_NoTarget; // Wait for the next target change
3556 if (rr->state == regState_Pending || rr->state == regState_Refresh)
3560 if (rr->state == regState_Refresh) InvokeCallback = mDNSfalse;
3561 rr->state = regState_Registered;
3566 LogMsg("hndlRecordUpdateReply: Registration of record %##s type %d failed with error %d", rr->resrec.name->c, rr->resrec.rrtype, err);
3567 if (!rr->Private && rr->uselease && err == mStatus_UnknownErr && mDNSSameIPPort(UpdatePort, UnicastDNSPort))
3569 LogMsg("hndlRecordUpdateReply: Will retry update of record %##s without lease option", rr->resrec.name->c);
3570 rr->uselease = mDNSfalse;
3571 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3572 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3573 SetNextuDNSEvent(m, rr);
3580 if (rr->QueuedRData && rr->state == regState_Registered)
3582 rr->state = regState_UpdatePending;
3583 rr->InFlightRData = rr->QueuedRData;
3584 rr->InFlightRDLen = rr->QueuedRDLen;
3585 rr->OrigRData = rr->resrec.rdata;
3586 rr->OrigRDLen = rr->resrec.rdlength;
3587 rr->QueuedRData = mDNSNULL;
3588 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
3589 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
3590 SetNextuDNSEvent(m, rr);
3597 if (!err && InvokeCallback && rr->RecordCallback)
3599 LogInfo("hndlRecordUpdateReply: Calling record callback on %##s", rr->resrec.name->c);
3601 rr->RecordCallback(m, rr, err);
3604 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
4413 mDNSlocal void SendRecordDeregistration(mDNS *m, AuthRecord *rr)
4421 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
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);
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);
4442 if (rr->Private)
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));
4446 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
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);
4471 switch (rr->state)
4489 LogInfo("uDNS_DeregisterRecord: State %d for %##s type %s", rr->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
4491 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) CompleteDeregistration(m, rr);
4509 if (rr->InFlightRData && rr->UpdateCallback)
4511 if (rr->InFlightRData != rr->resrec.rdata)
4513 LogInfo("uDNS_DeregisterRecord: Freeing InFlightRData for %s", ARDisplayString(m, rr));
4514 rr->UpdateCallback(m, rr, rr->InFlightRData, rr->InFlightRDLen);
4515 rr->InFlightRData = mDNSNULL;
4518 LogInfo("uDNS_DeregisterRecord: InFlightRData same as rdata for %s", ARDisplayString(m, rr));
4521 if (rr->QueuedRData && rr->UpdateCallback)
4523 if (rr->QueuedRData == rr->resrec.rdata)
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);
4529 rr->QueuedRData = mDNSNULL;
4546 if (!mDNSOpaque16IsZero(rr->updateid))
4552 if (AuthRecord_uDNS(rr) && mDNSSameOpaque16(anchorRR->updateid, rr->updateid) && anchorRR->tcp)
4562 if (!found) LogInfo("uDNSDeregisterRecord: Cannot find the anchor Resource Record for %s, not an error", ARDisplayString(m, rr));
4567 rr->state = regState_DeregPending;
4568 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
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))
4577 if (info && info->deltime) rr->LastAPTime += (2 * MERGE_DELAY_TIME);
4578 else rr->LastAPTime += 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)
4592 LogInfo("uDNS_UpdateRecord: Resource Record %##s, state %d", rr->resrec.name->c, rr->state);
4593 switch(rr->state)
4603 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->resrec.rdata, rr->resrec.rdlength);
4604 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
4605 rr->NewRData = mDNSNULL;
4612 if (rr->QueuedRData && rr->UpdateCallback)
4614 rr->UpdateCallback(m, rr, rr->QueuedRData, rr->QueuedRDLen);
4615 rr->QueuedRData = rr->NewRData;
4616 rr->QueuedRDLen = rr->newrdlength;
4617 rr->NewRData = mDNSNULL;
4621 rr->OrigRData = rr->resrec.rdata;
4622 rr->OrigRDLen = rr->resrec.rdlength;
4623 rr->InFlightRData = rr->NewRData;
4624 rr->InFlightRDLen = rr->newrdlength;
4625 rr->NewRData = mDNSNULL;
4626 rr->state = regState_UpdatePending;
4627 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
4628 rr->LastAPTime = m->timenow - INIT_RECORD_REG_INTERVAL;
4629 SetNextuDNSEvent(m, rr);
4633 LogMsg("ERROR: uDNS_UpdateRecord called for record %##s with bad state regState_NATError", rr->resrec.name->c);
4636 default: LogMsg("uDNS_UpdateRecord: Unknown state %d for %##s", rr->state, rr->resrec.name->c);
4641 rr->resrec.name->c, rr->resrec.rrtype, rr->state);
4853 CacheRecord *rr;
4902 for (rr = cg->members; rr; rr=rr->next)
4904 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
4906 LogInfo("uDNS_CheckCurrentQuestion: Purged resourcerecord %s", CRDisplayString(m, rr));
4907 mDNS_PurgeCacheResourceRecord(m, rr);
4919 // To solve this problem we set rr->DelayDelivery to a nonzero value (which happens to be 'now') so that we
5070 AuthRecord *rr;
5075 for (rr = m->ResourceRecords; rr; rr = rr->next)
5077 if (!AuthRecord_uDNS(rr)) continue;
5078 if (rr->state == regState_NoTarget) {debugf("CheckRecordUpdates: Record %##s in NoTarget", rr->resrec.name->c); continue;}
5081 if (rr->state == regState_NATMap) {debugf("CheckRecordUpdates: Record %##s in NATMap", rr->resrec.name->c); continue;}
5082 if (rr->state == regState_Pending || rr->state == regState_DeregPending || rr->state == regState_UpdatePending ||
5083 rr->state == regState_Refresh || rr->state == regState_Registered)
5085 if (rr->LastAPTime + rr->ThisAPInterval - m->timenow <= 0)
5087 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
5088 if (!rr->nta || mDNSIPv4AddressIsZero(rr->nta->Addr.ip.v4))
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);
5118 if (nextevent - (rr->LastAPTime + rr->ThisAPInterval) > 0)
5119 nextevent = (rr->LastAPTime + rr->ThisAPInterval);
5177 AuthRecord *rr;
5178 for (rr = m->ResourceRecords; rr; rr=rr->next)
5180 if (AuthRecord_uDNS(rr))
5184 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
5186 if (rr->NATinfo.clientContext)
5188 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
5189 rr->NATinfo.clientContext = mDNSNULL;
5194 if (rr->state == regState_UpdatePending)
5197 rr->state = regState_Registered;
5199 if (rr->UpdateCallback) rr->UpdateCallback(m, rr, rr->OrigRData, rr->OrigRDLen);
5200 SetNewRData(&rr->resrec, rr->InFlightRData, rr->InFlightRDLen);
5201 rr->OrigRData = mDNSNULL;
5202 rr->InFlightRData = mDNSNULL;
5207 uDNS_DeregisterRecord(m, rr);
5251 mDNSlocal void FreeARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
5254 if (result == mStatus_MemFree) mDNSPlatformMemFree(rr->RecordContext);
5797 mDNSexport const domainname *GetServiceTarget(mDNS *m, AuthRecord *const rr)
5800 (void) rr;