Lines Matching defs:rr
139 #define UniqueLocalOnlyRecord(rr) ((rr)->ARType == AuthRecordLocalOnly && \
140 (rr)->resrec.RecordType & kDNSRecordTypeUniqueMask && \
141 ((rr)->resrec.rrtype == kDNSType_A || (rr)->resrec.rrtype == kDNSType_AAAA || \
142 (rr)->resrec.rrtype == kDNSType_CNAME || \
143 (rr)->resrec.rrtype == kDNSType_PTR))
264 mDNSexport AuthGroup *AuthGroupForRecord(AuthHash *r, const mDNSu32 slot, const ResourceRecord *const rr)
266 return(AuthGroupForName(r, slot, rr->namehash, rr->name));
269 mDNSlocal AuthGroup *GetAuthGroup(AuthHash *r, const mDNSu32 slot, const ResourceRecord *const rr)
271 mDNSu16 namelen = DomainNameLength(rr->name);
273 if (!ag) { LogMsg("GetAuthGroup: Failed to allocate memory for %##s", rr->name->c); return(mDNSNULL); }
275 ag->namehash = rr->namehash;
285 LogMsg("GetAuthGroup: Failed to allocate name storage for %##s", rr->name->c);
289 AssignDomainName(ag->name, rr->name);
291 if (AuthGroupForRecord(r, slot, rr)) LogMsg("GetAuthGroup: Already have AuthGroup for %##s", rr->name->c);
293 if (AuthGroupForRecord(r, slot, rr) != ag) LogMsg("GetAuthGroup: Not finding AuthGroup for %##s", rr->name->c);
299 mDNSexport AuthGroup *InsertAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr)
302 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
303 ag = AuthGroupForRecord(r, slot, &rr->resrec);
304 if (!ag) ag = GetAuthGroup(r, slot, &rr->resrec); // If we don't have a AuthGroup for this name, make one now
307 LogInfo("InsertAuthRecord: inserting auth record %s from table", ARDisplayString(m, rr));
308 *(ag->rrauth_tail) = rr; // Append this record to tail of cache slot list
309 ag->rrauth_tail = &(rr->next); // Advance tail pointer
314 mDNSexport AuthGroup *RemoveAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr)
319 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
321 a = AuthGroupForRecord(r, slot, &rr->resrec);
322 if (!a) { LogMsg("RemoveAuthRecord: ERROR!! AuthGroup not found for %s", ARDisplayString(m, rr)); return mDNSNULL; }
326 if (*rp != rr)
332 LogInfo("RemoveAuthRecord: removing auth record %s from table", ARDisplayString(m, rr));
350 mDNSlocal CacheGroup *CacheGroupForRecord(const mDNS *const m, const mDNSu32 slot, const ResourceRecord *const rr)
352 return(CacheGroupForName(m, slot, rr->namehash, rr->name));
465 mDNSexport void AnswerQuestionByFollowingCNAME(mDNS *const m, DNSQuestion *q, ResourceRecord *rr)
467 const mDNSBool selfref = SameDomainName(&q->qname, &rr->rdata->u.name);
471 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, selfref ? " (Self-Referential)" : "", RRDisplayString(m, rr));
509 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, RRDisplayString(m, rr));
512 AssignDomainName(&q->qname, &rr->rdata->u.name); // Update qname
520 q, q->qname.c, DNSTypeName(q->qtype), RRDisplayString(m, rr));
540 mDNSlocal void AnswerLocalQuestionWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
547 LogMsg("AnswerLocalQuestionWithLocalAuthRecord: ERROR!! CurrentQuestion NULL while answering with %s", ARDisplayString(m, rr));
551 followcname = FollowCNAME(q, &rr->resrec, AddRecord);
554 if (!(rr->resrec.RecordType & kDNSRecordTypeActiveMask))
557 AddRecord ? "Add" : "Rmv", rr->resrec.RecordType, ARDisplayString(m, rr));
562 if (AddRecord) rr->AnsweredLocalQ = mDNStrue;
567 if (UniqueLocalOnlyRecord(rr))
574 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
580 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
585 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
591 mDNSlocal void AnswerInterfaceAnyQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
601 if (RRAny(rr))
602 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
604 answered = LocalOnlyRecordAnswersQuestion(rr, q);
606 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
624 mDNSlocal void AnswerAllLocalQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
636 if (RRAny(rr))
637 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
639 answered = LocalOnlyRecordAnswersQuestion(rr, q);
641 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
649 if (rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P)
650 AnswerInterfaceAnyQuestionsWithLocalAuthRecord(m, rr, AddRecord);
769 // AuthRecord *rr is the answer we are proposing to give, if not suppressed.
774 mDNSlocal mDNSBool ShouldSuppressKnownAnswer(const CacheRecord *const ka, const AuthRecord *const rr)
777 if (!IdenticalResourceRecord(&ka->resrec, &rr->resrec)) return(mDNSfalse);
788 return (mDNSBool)(ka->resrec.rroriginalttl >= rr->resrec.rroriginalttl / 2);
791 mDNSlocal void SetNextAnnounceProbeTime(mDNS *const m, const AuthRecord *const rr)
793 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
795 if ((rr->LastAPTime + rr->ThisAPInterval) - m->timenow > mDNSPlatformOneSecond * 10)
797 LogMsg("SetNextAnnounceProbeTime: ProbeCount %d Next in %d %s", rr->ProbeCount, (rr->LastAPTime + rr->ThisAPInterval) - m->timenow, ARDisplayString(m, rr));
800 if (m->NextScheduledProbe - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
801 m->NextScheduledProbe = (rr->LastAPTime + rr->ThisAPInterval);
803 // If (rr->LastAPTime + rr->ThisAPInterval) happens to be far in the past, we don't want to allow
809 else if (rr->AnnounceCount && (ResourceRecordIsValidAnswer(rr) || rr->resrec.RecordType == kDNSRecordTypeDeregistering))
811 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
812 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
816 mDNSlocal void InitializeLastAPTime(mDNS *const m, AuthRecord *const rr)
819 rr->ThisAPInterval = rr->AddressProxy.type ? mDNSPlatformOneSecond : DefaultAPIntervalForRecordType(rr->resrec.RecordType);
832 if (rr->ProbeCount)
872 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval;
875 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval + DefaultProbeIntervalForTypeUnique * DefaultProbeCountForTypeUnique + rr->ThisAPInterval / 2;
877 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
885 if (rr->AddressProxy.type)
886 rr->LastAPTime = m->timenow;
890 rr->LastMCTime = m->timenow;
891 rr->LastMCInterface = mDNSInterfaceMark;
893 SetNextAnnounceProbeTime(m, rr);
896 mDNSlocal const domainname *SetUnicastTargetToHostName(mDNS *const m, AuthRecord *rr)
899 if (rr->AutoTarget)
904 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
905 if (!AuthInfo || !AuthInfo->AutoTunnel) rr->AutoTarget = Target_AutoHostAndNATMAP;
908 target = GetServiceTarget(m, rr);
912 LogInfo("SetUnicastTargetToHostName No target for %s", ARDisplayString(m, rr));
913 rr->state = regState_NoTarget;
918 LogInfo("SetUnicastTargetToHostName target %##s for resource record %s", target->c, ARDisplayString(m,rr));
925 mDNSlocal void SetTargetToHostName(mDNS *const m, AuthRecord *const rr)
927 domainname *const target = GetRRDomainNameTarget(&rr->resrec);
930 if (!target) LogInfo("SetTargetToHostName: Don't know how to set the target of rrtype %s", DNSTypeName(rr->resrec.rrtype));
932 if (!(rr->ForceMCast || rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P || IsLocalDomain(&rr->namestorage)))
934 const domainname *const n = SetUnicastTargetToHostName(m, rr);
936 else { target->c[0] = 0; SetNewRData(&rr->resrec, mDNSNULL, 0); return; }
940 debugf("SetTargetToHostName: Target of %##s is already %##s", rr->resrec.name->c, target->c);
945 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
950 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
955 if (rr->RequireGoodbye && rr->resrec.RecordType == kDNSRecordTypeShared)
957 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
959 rr->AnnounceCount = InitialAnnounceCount;
960 rr->RequireGoodbye = mDNSfalse;
961 rr->ProbeRestartCount = 0;
962 InitializeLastAPTime(m, rr);
966 mDNSlocal void AcknowledgeRecord(mDNS *const m, AuthRecord *const rr)
968 if (rr->RecordCallback)
970 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
972 rr->Acknowledged = mDNStrue;
974 rr->RecordCallback(m, rr, mStatus_NoError);
979 mDNSexport void ActivateUnicastRegistration(mDNS *const m, AuthRecord *const rr)
985 if (rr->resrec.rrtype != kDNSType_SRV)
988 if (rr->resrec.rrtype == kDNSType_PTR)
989 srvRR = rr->Additional1;
990 else if (rr->resrec.rrtype == kDNSType_TXT)
991 srvRR = rr->DependentOn;
1001 ARDisplayString(m, srvRR), srvRR->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1002 rr->state = srvRR->state;
1007 if (rr->state == regState_NoTarget)
1009 LogInfo("ActivateUnicastRegistration record %s in regState_NoTarget, not activating", ARDisplayString(m, rr));
1017 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
1019 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to DeregPending", ARDisplayString(m, rr), rr->state);
1020 rr->state = regState_DeregPending;
1024 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to Pending", ARDisplayString(m, rr), rr->state);
1025 rr->state = regState_Pending;
1027 rr->ProbeCount = 0;
1028 rr->ProbeRestartCount = 0;
1029 rr->AnnounceCount = 0;
1030 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
1031 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
1032 rr->expire = 0; // Forget about all the leases, start fresh
1033 rr->uselease = mDNStrue;
1034 rr->updateid = zeroID;
1035 rr->SRVChanged = mDNSfalse;
1036 rr->updateError = mStatus_NoError;
1039 if (rr->NATinfo.clientContext)
1041 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1042 rr->NATinfo.clientContext = mDNSNULL;
1044 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
1045 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1046 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
1047 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
1061 mDNSlocal AuthRecord *CheckAuthIdenticalRecord(AuthHash *r, AuthRecord *rr)
1066 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1068 a = AuthGroupForRecord(r, slot, &rr->resrec);
1073 if (!RecordIsLocalDuplicate(*rp, rr))
1088 mDNSlocal mDNSBool CheckAuthRecordConflict(AuthHash *r, AuthRecord *rr)
1093 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1095 a = AuthGroupForRecord(r, slot, &rr->resrec);
1100 const AuthRecord *s1 = rr->RRSet ? rr->RRSet : rr;
1102 if (s1 != s2 && SameResourceRecordSignature((*rp), rr) && !IdenticalSameNameRecord(&(*rp)->resrec, &rr->resrec))
1110 // checks to see if "rr" is already present
1111 mDNSlocal AuthRecord *CheckAuthSameRecord(AuthHash *r, AuthRecord *rr)
1116 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1118 a = AuthGroupForRecord(r, slot, &rr->resrec);
1123 if (*rp != rr)
1134 mDNSlocal void DecrementAutoTargetServices(mDNS *const m, AuthRecord *const rr)
1136 if (!AuthRecord_uDNS(rr) && rr->resrec.rrtype == kDNSType_SRV && rr->AutoTarget == Target_AutoHost)
1139 LogInfo("DecrementAutoTargetServices: AutoService Record %s, AutoTargetServices %d", ARDisplayString(m, rr), m->AutoTargetServices);
1145 mDNSlocal void IncrementAutoTargetServices(mDNS *const m, AuthRecord *const rr)
1147 if (!AuthRecord_uDNS(rr) && rr->resrec.rrtype == kDNSType_SRV && rr->AutoTarget == Target_AutoHost)
1154 LogInfo("IncrementAutoTargetServices: AutoService Record %s, AutoTargetServices %d", ARDisplayString(m, rr), m->AutoTargetServices);
1160 mDNSlocal void getKeepaliveRaddr(mDNS *const m, AuthRecord *rr, mDNSAddr *raddr)
1168 if (mDNS_KeepaliveRecord(&rr->resrec))
1170 mDNS_ExtractKeepaliveInfo(rr, &timeout, &laddr, raddr, ð, &seq, &ack, &lport, &rport, &win);
1173 LogMsg("getKeepaliveRaddr: not a valid record %s for keepalive %#a:%d %#a:%d", ARDisplayString(m, rr), &laddr, lport.NotAnInteger, raddr, rport.NotAnInteger);
1180 mDNSexport mStatus mDNS_Register_internal(mDNS *const m, AuthRecord *const rr)
1182 domainname *target = GetRRDomainNameTarget(&rr->resrec);
1187 if ((mDNSs32)rr->resrec.rroriginalttl <= 0)
1188 { LogMsg("mDNS_Register_internal: TTL %X should be 1 - 0x7FFFFFFF %s", rr->resrec.rroriginalttl, ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1190 if (!rr->resrec.RecordType)
1191 { LogMsg("mDNS_Register_internal: RecordType must be non-zero %s", ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1194 { LogMsg("mDNS_Register_internal: Shutting down, can't register %s", ARDisplayString(m, rr)); return(mStatus_ServiceNotRunning); }
1196 if (m->DivertMulticastAdvertisements && !AuthRecord_uDNS(rr))
1198 mDNSInterfaceID previousID = rr->resrec.InterfaceID;
1199 if (rr->resrec.InterfaceID == mDNSInterface_Any || rr->resrec.InterfaceID == mDNSInterface_P2P)
1201 rr->resrec.InterfaceID = mDNSInterface_LocalOnly;
1202 rr->ARType = AuthRecordLocalOnly;
1204 if (rr->resrec.InterfaceID != mDNSInterface_LocalOnly)
1206 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1207 if (intf && !intf->Advertise) { rr->resrec.InterfaceID = mDNSInterface_LocalOnly; rr->ARType = AuthRecordLocalOnly; }
1209 if (rr->resrec.InterfaceID != previousID)
1210 LogInfo("mDNS_Register_internal: Diverting record to local-only %s", ARDisplayString(m, rr));
1213 if (RRLocalOnly(rr))
1215 if (CheckAuthSameRecord(&m->rrauth, rr))
1218 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1224 while (*p && *p != rr) p=&(*p)->next;
1228 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1233 while (*d && *d != rr) d=&(*d)->next;
1237 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1241 if (rr->DependentOn)
1243 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
1244 rr->resrec.RecordType = kDNSRecordTypeVerified;
1247 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn && RecordType != kDNSRecordTypeUnique",
1248 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1251 if (!(rr->DependentOn->resrec.RecordType & (kDNSRecordTypeUnique | kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique)))
1253 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn->RecordType bad type %X",
1254 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->DependentOn->resrec.RecordType);
1259 rr->next = mDNSNULL;
1265 // rr->Additional1 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1266 // rr->Additional2 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1267 // rr->DependentOn = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1268 // rr->RRSet = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1269 // rr->Callback = already set in mDNS_SetupResourceRecord
1270 // rr->Context = already set in mDNS_SetupResourceRecord
1271 // rr->RecordType = already set in mDNS_SetupResourceRecord
1272 // rr->HostTarget = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1273 // rr->AllowRemoteQuery = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1275 if (rr->AutoTarget && target) target->c[0] = 0;
1278 rr->Acknowledged = mDNSfalse;
1279 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
1280 rr->ProbeRestartCount = 0;
1281 rr->AnnounceCount = InitialAnnounceCount;
1282 rr->RequireGoodbye = mDNSfalse;
1283 rr->AnsweredLocalQ = mDNSfalse;
1284 rr->IncludeInProbe = mDNSfalse;
1285 rr->ImmedUnicast = mDNSfalse;
1286 rr->SendNSECNow = mDNSNULL;
1287 rr->ImmedAnswer = mDNSNULL;
1288 rr->ImmedAdditional = mDNSNULL;
1289 rr->SendRNow = mDNSNULL;
1290 rr->v4Requester = zerov4Addr;
1291 rr->v6Requester = zerov6Addr;
1292 rr->NextResponse = mDNSNULL;
1293 rr->NR_AnswerTo = mDNSNULL;
1294 rr->NR_AdditionalTo = mDNSNULL;
1295 if (!rr->AutoTarget) InitializeLastAPTime(m, rr);
1296 // rr->LastAPTime = Set for us in InitializeLastAPTime()
1297 // rr->LastMCTime = Set for us in InitializeLastAPTime()
1298 // rr->LastMCInterface = Set for us in InitializeLastAPTime()
1299 rr->NewRData = mDNSNULL;
1300 rr->newrdlength = 0;
1301 rr->UpdateCallback = mDNSNULL;
1302 rr->UpdateCredits = kMaxUpdateCredits;
1303 rr->NextUpdateCredit = 0;
1304 rr->UpdateBlocked = 0;
1307 if (rr->WakeUp.HMAC.l[0] && !rr->AddressProxy.type) rr->AnnounceCount = 2;
1310 rr->state = regState_Zero;
1311 rr->uselease = 0;
1312 rr->expire = 0;
1313 rr->Private = 0;
1314 rr->updateid = zeroID;
1315 rr->updateIntID = zeroOpaque64;
1316 rr->zone = rr->resrec.name;
1317 rr->nta = mDNSNULL;
1318 rr->tcp = mDNSNULL;
1319 rr->OrigRData = 0;
1320 rr->OrigRDLen = 0;
1321 rr->InFlightRData = 0;
1322 rr->InFlightRDLen = 0;
1323 rr->QueuedRData = 0;
1324 rr->QueuedRDLen = 0;
1325 //mDNSPlatformMemZero(&rr->NATinfo, sizeof(rr->NATinfo));
1329 //if (rr->resrec.rrtype == kDNSType_SRV) rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
1331 // rr->resrec.interface = already set in mDNS_SetupResourceRecord
1332 // rr->resrec.name->c = MUST be set by client
1333 // rr->resrec.rrtype = already set in mDNS_SetupResourceRecord
1334 // rr->resrec.rrclass = already set in mDNS_SetupResourceRecord
1335 // rr->resrec.rroriginalttl = already set in mDNS_SetupResourceRecord
1336 // rr->resrec.rdata = MUST be set by client, unless record type is CNAME or PTR and rr->HostTarget is set
1341 if (rr->resrec.rrtype == kDNSType_TXT && rr->resrec.rdlength == 0) { rr->resrec.rdlength = 1; rr->resrec.rdata->u.txt.c[0] = 0; }
1343 if (rr->AutoTarget)
1345 SetTargetToHostName(m, rr); // Also sets rdlength and rdestimate for us, and calls InitializeLastAPTime();
1347 // If we have no target record yet, SetTargetToHostName will set rr->state == regState_NoTarget
1349 if (rr->state == regState_NoTarget)
1352 domainname *tar = GetRRDomainNameTarget(&rr->resrec);
1354 LogInfo("mDNS_Register_internal: record %s in NoTarget state", ARDisplayString(m, rr));
1360 rr->resrec.rdlength = GetRDLength(&rr->resrec, mDNSfalse);
1361 rr->resrec.rdestimate = GetRDLength(&rr->resrec, mDNStrue);
1364 if (!ValidateDomainName(rr->resrec.name))
1365 { LogMsg("Attempt to register record with invalid name: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1367 // Don't do this until *after* we've set rr->resrec.rdlength
1368 if (!ValidateRData(rr->resrec.rrtype, rr->resrec.rdlength, rr->resrec.rdata))
1369 { LogMsg("Attempt to register record with invalid rdata: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1371 rr->resrec.namehash = DomainNameHashValue(rr->resrec.name);
1372 rr->resrec.rdatahash = target ? DomainNameHashValue(target) : RDataHashValue(&rr->resrec);
1374 if (RRLocalOnly(rr))
1381 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1383 if (CheckAuthRecordConflict(&m->rrauth, rr))
1385 LogInfo("mDNS_Register_internal: Name conflict %s (%p), InterfaceID %p", ARDisplayString(m, rr), rr, rr->resrec.InterfaceID);
1393 if (AuthRecord_uDNS(rr))
1395 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1400 *p = rr;
1401 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1402 rr->ProbeCount = 0;
1403 rr->ProbeRestartCount = 0;
1404 rr->AnnounceCount = 0;
1405 if (rr->state != regState_NoTarget) ActivateUnicastRegistration(m, rr);
1411 if (RRLocalOnly(rr))
1413 rr->ProbeCount = 0;
1414 rr->ProbeRestartCount = 0;
1415 rr->AnnounceCount = 0;
1416 r = CheckAuthIdenticalRecord(&m->rrauth, rr);
1421 if (RecordIsLocalDuplicate(r, rr))
1430 debugf("mDNS_Register_internal:Adding to duplicate list %s", ARDisplayString(m,rr));
1431 *d = rr;
1436 if (rr->resrec.RecordType == kDNSRecordTypeUnique && r->resrec.RecordType == kDNSRecordTypeVerified)
1437 rr->ProbeCount = 0;
1441 debugf("mDNS_Register_internal: Adding to active record list %s", ARDisplayString(m,rr));
1442 if (RRLocalOnly(rr))
1445 ag = InsertAuthRecord(m, &m->rrauth, rr);
1448 ag->NewLocalOnlyRecords = rr;
1451 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1452 AcknowledgeRecord(m, rr);
1457 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1458 *p = rr;
1464 if (mDNS_KeepaliveRecord(&rr->resrec))
1468 rr->resrec.RecordType = kDNSRecordTypeKnownUnique;
1469 rr->AnnounceCount = 0;
1471 getKeepaliveRaddr(m, rr, &raddr);
1477 if (!AuthRecord_uDNS(rr)) // This check is superfluous, given that for unicast records we (currently) bail out above
1480 IncrementAutoTargetServices(m, rr);
1482 if (rr->resrec.RecordType != kDNSRecordTypeUnique && rr->resrec.RecordType != kDNSRecordTypeDeregistering)
1483 AcknowledgeRecord(m, rr);
1492 mDNSlocal void RecordProbeFailure(mDNS *const m, const AuthRecord *const rr)
1507 m->NumFailedProbes, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1511 mDNSlocal void CompleteRDataUpdate(mDNS *const m, AuthRecord *const rr)
1513 RData *OldRData = rr->resrec.rdata;
1514 mDNSu16 OldRDLen = rr->resrec.rdlength;
1515 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength); // Update our rdata
1516 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
1517 if (rr->UpdateCallback)
1518 rr->UpdateCallback(m, rr, OldRData, OldRDLen); // ... and let the client know
1524 mDNSexport mStatus mDNS_Deregister_internal(mDNS *const m, AuthRecord *const rr, mDNS_Dereg_type drt)
1527 mDNSu8 RecordType = rr->resrec.RecordType;
1531 if (RRLocalOnly(rr))
1536 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1538 a = AuthGroupForRecord(&m->rrauth, slot, &rr->resrec);
1541 while (*rp && *rp != rr) rp=&(*rp)->next;
1546 while (*p && *p != rr) p=&(*p)->next;
1554 // Scan for duplicates of rr, and mark them for deregistration at the end of this routine, after we've finished
1555 // deregistering rr. We need to do this scan *before* we give the client the chance to free and reuse the rr memory.
1556 for (r2 = m->DuplicateRecords; r2; r2=r2->next) if (RecordIsLocalDuplicate(r2, rr)) r2->ProbeCount = 0xFF;
1563 while (*d && !RecordIsLocalDuplicate(*d, rr)) d=&(*d)->next;
1568 dup, rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1570 if (RRLocalOnly(rr))
1577 dup->next = rr->next; // And then...
1578 rr->next = dup; // ... splice it in right after the record we're about to delete
1580 dup->resrec.RecordType = rr->resrec.RecordType;
1581 dup->ProbeCount = rr->ProbeCount;
1582 dup->ProbeRestartCount = rr->ProbeRestartCount;
1583 dup->AnnounceCount = rr->AnnounceCount;
1584 dup->RequireGoodbye = rr->RequireGoodbye;
1585 dup->AnsweredLocalQ = rr->AnsweredLocalQ;
1586 dup->ImmedAnswer = rr->ImmedAnswer;
1587 dup->ImmedUnicast = rr->ImmedUnicast;
1588 dup->ImmedAdditional = rr->ImmedAdditional;
1589 dup->v4Requester = rr->v4Requester;
1590 dup->v6Requester = rr->v6Requester;
1591 dup->ThisAPInterval = rr->ThisAPInterval;
1592 dup->LastAPTime = rr->LastAPTime;
1593 dup->LastMCTime = rr->LastMCTime;
1594 dup->LastMCInterface = rr->LastMCInterface;
1595 dup->Private = rr->Private;
1596 dup->state = rr->state;
1597 rr->RequireGoodbye = mDNSfalse;
1598 rr->AnsweredLocalQ = mDNSfalse;
1606 while (*p && *p != rr) p=&(*p)->next;
1616 rr->WakeUp.HMAC = zeroEthAddr;
1617 rr->RequireGoodbye = mDNSfalse;
1618 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1622 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1629 LogMsg("mDNS_Deregister_internal: Record %p not found in list %s", rr, ARDisplayString(m,rr));
1637 // it's tempting to just do "AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse)" here, but that would not not be safe.
1648 if (AuthRecord_uDNS(rr))
1650 if (rr->RequireGoodbye)
1652 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1653 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1655 uDNS_DeregisterRecord(m, rr);
1665 rr->updateid = zeroID;
1674 if (rr->NATinfo.clientContext)
1676 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1677 rr->NATinfo.clientContext = mDNSNULL;
1679 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
1680 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1685 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeUnregistered", ARDisplayString(m, rr));
1688 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeDeregistering", ARDisplayString(m, rr));
1698 if (rr->WakeUp.HMAC.l[0] ||
1699 (RecordType == kDNSRecordTypeShared && (rr->RequireGoodbye || rr->AnsweredLocalQ)))
1701 verbosedebugf("mDNS_Deregister_internal: Starting deregistration for %s", ARDisplayString(m, rr));
1702 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1703 rr->resrec.rroriginalttl = 0;
1704 rr->AnnounceCount = rr->WakeUp.HMAC.l[0] ? WakeupCount : (drt == mDNS_Dereg_rapid) ? 1 : GoodbyeCount;
1705 rr->ThisAPInterval = mDNSPlatformOneSecond * 2;
1706 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
1713 if (!dupList && RRLocalOnly(rr))
1715 AuthGroup *ag = RemoveAuthRecord(m, &m->rrauth, rr);
1716 if (ag->NewLocalOnlyRecords == rr) ag->NewLocalOnlyRecords = rr->next;
1720 *p = rr->next; // Cut this record from the list
1721 if (m->NewLocalRecords == rr) m->NewLocalRecords = rr->next;
1722 DecrementAutoTargetServices(m, rr);
1725 if (m->CurrentRecord == rr) m->CurrentRecord = rr->next;
1726 rr->next = mDNSNULL;
1730 // if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse); rr->AnsweredLocalQ = mDNSfalse; }
1732 verbosedebugf("mDNS_Deregister_internal: Deleting record for %s", ARDisplayString(m, rr));
1733 rr->resrec.RecordType = kDNSRecordTypeUnregistered;
1737 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1740 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
1743 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
1746 // so any attempt to touch rr after this is likely to lead to a crash.
1750 LogInfo("mDNS_Deregister_internal: mStatus_MemFree for %s", ARDisplayString(m, rr));
1751 if (rr->RecordCallback)
1752 rr->RecordCallback(m, rr, mStatus_MemFree); // MUST NOT touch rr after this
1757 RecordProbeFailure(m, rr);
1759 if (rr->RecordCallback)
1760 rr->RecordCallback(m, rr, mStatus_NameConflict); // MUST NOT touch rr after this
1762 // Now that we've finished deregistering rr, check our DuplicateRecords list for any that we marked previously.
1792 mDNSlocal void AddRecordToResponseList(AuthRecord ***nrpp, AuthRecord *rr, AuthRecord *add)
1794 if (rr->NextResponse == mDNSNULL && *nrpp != &rr->NextResponse)
1796 **nrpp = rr;
1801 rr->NR_AdditionalTo = add;
1802 *nrpp = &rr->NextResponse;
1804 debugf("AddRecordToResponseList: %##s (%s) already in list", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1809 AuthRecord *rr, *rr2;
1810 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // For each record we plan to put
1814 if (rr->Additional1 && ResourceRecordIsValidInterfaceAnswer(rr->Additional1, InterfaceID))
1815 AddRecordToResponseList(nrpp, rr->Additional1, rr);
1817 if (rr->Additional2 && ResourceRecordIsValidInterfaceAnswer(rr->Additional2, InterfaceID))
1818 AddRecordToResponseList(nrpp, rr->Additional2, rr);
1821 if (rr->resrec.rrtype == kDNSType_SRV)
1826 rr->resrec.rdatahash == rr2->resrec.namehash && // ... whose name is the name of the SRV target
1827 SameDomainName(&rr->resrec.rdata->u.srv.target, rr2->resrec.name))
1828 AddRecordToResponseList(nrpp, rr2, rr);
1830 else if (RRTypeIsAddressType(rr->resrec.rrtype)) // For A or AAAA, put counterpart as additional
1835 rr->resrec.namehash == rr2->resrec.namehash && // ... and have the same name
1836 SameDomainName(rr->resrec.name, rr2->resrec.name))
1837 AddRecordToResponseList(nrpp, rr2, rr);
1839 else if (rr->resrec.rrtype == kDNSType_PTR) // For service PTR, see if we want to add DeviceInfo record
1842 SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
1843 AddRecordToResponseList(nrpp, &m->DeviceInfo, rr);
1850 ResourceRecord *rr = info->nsec3RR;
1853 return (2 + 10 + rr->rdlength);
1858 AuthRecord *rr;
1865 for (rr = m->ResourceRecords; rr; rr=rr->next)
1868 if (rr->ImmedAnswer == mDNSInterfaceMark ||
1869 mDNSSameIPv4Address(rr->v4Requester, onesIPv4Addr) ||
1870 mDNSSameIPv6Address(rr->v6Requester, onesIPv6Addr) )
1871 rr->ImmedUnicast = mDNSfalse;
1873 if (rr->ImmedUnicast && rr->ImmedAnswer == InterfaceID)
1875 if ((dest->type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->v4Requester, dest->ip.v4)) ||
1876 (dest->type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->v6Requester, dest->ip.v6)))
1878 rr->ImmedAnswer = mDNSNULL; // Clear the state fields
1879 rr->ImmedUnicast = mDNSfalse;
1880 rr->v4Requester = zerov4Addr;
1881 rr->v6Requester = zerov6Addr;
1884 if (intf && !mDNSPlatformValidRecordForInterface(rr, intf))
1886 LogInfo("SendDelayedUnicastResponse: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, InterfaceID));
1890 if (rr->NextResponse == mDNSNULL && nrp != &rr->NextResponse) // rr->NR_AnswerTo
1892 rr->NR_AnswerTo = NR_AnswerMulticast;
1893 *nrp = rr;
1894 nrp = &rr->NextResponse;
1911 rr = ResponseRecords;
1912 if (rr->resrec.AnonInfo)
1914 AnoninfoSpace += AnonInfoSpace(rr->resrec.AnonInfo);
1915 rr->resrec.AnonInfo->SendNow = mDNSInterfaceMark;
1917 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1918 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1921 newptr = PutResourceRecordTTLWithLimit(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec, rr->resrec.rroriginalttl,
1924 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1930 ResponseRecords = rr->NextResponse;
1931 rr->NextResponse = mDNSNULL;
1932 rr->NR_AnswerTo = mDNSNULL;
1933 rr->NR_AdditionalTo = mDNSNULL;
1934 rr->RequireGoodbye = mDNStrue;
1939 for (rr = m->ResourceRecords; rr; rr=rr->next)
1941 if (rr->resrec.AnonInfo && rr->resrec.AnonInfo->SendNow == mDNSInterfaceMark)
1943 ResourceRecord *nsec3RR = rr->resrec.AnonInfo->nsec3RR;
1956 rr->resrec.AnonInfo->SendNow = mDNSNULL;
1963 rr = ResponseRecords;
1964 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1965 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1966 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAdditionals, &rr->resrec);
1967 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1970 if (newptr && m->omsg.h.numAnswers) rr->RequireGoodbye = mDNStrue;
1971 else if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask) rr->ImmedAnswer = mDNSInterfaceMark;
1972 ResponseRecords = rr->NextResponse;
1973 rr->NextResponse = mDNSNULL;
1974 rr->NR_AnswerTo = mDNSNULL;
1975 rr->NR_AdditionalTo = mDNSNULL;
1985 mDNSexport void CompleteDeregistration(mDNS *const m, AuthRecord *rr)
1987 LogInfo("CompleteDeregistration: called for Resource record %s", ARDisplayString(m, rr));
1988 // Clearing rr->RequireGoodbye signals mDNS_Deregister_internal() that
1990 rr->resrec.RecordType = kDNSRecordTypeShared;
1991 rr->RequireGoodbye = mDNSfalse;
1992 rr->WakeUp.HMAC = zeroEthAddr;
1993 if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, QC_rmv); rr->AnsweredLocalQ = mDNSfalse; }
1994 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); // Don't touch rr after this
2010 AuthRecord *rr = m->CurrentRecord;
2011 if (!AuthRecord_uDNS(rr) && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2012 CompleteDeregistration(m, rr); // Don't touch rr after this
2014 m->CurrentRecord = rr->next;
2087 mDNSlocal void SendARP(mDNS *const m, const mDNSu8 op, const AuthRecord *const rr,
2092 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
2093 if (!intf) { LogMsg("SendARP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
2124 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
2152 mDNSlocal void SendNDP(mDNS *const m, const mDNSu8 op, const mDNSu8 flags, const AuthRecord *const rr,
2163 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
2164 if (!intf) { LogMsg("SendNDP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
2249 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
2276 mDNSlocal void GrantUpdateCredit(AuthRecord *rr)
2278 if (++rr->UpdateCredits >= kMaxUpdateCredits) rr->NextUpdateCredit = 0;
2279 else rr->NextUpdateCredit = NonZeroTime(rr->NextUpdateCredit + kUpdateCreditRefreshInterval);
2282 mDNSlocal mDNSBool ShouldSendGoodbyesBeforeSleep(mDNS *const m, const NetworkInterfaceInfo *intf, AuthRecord *rr)
2289 if ((rr->AuthFlags & AuthFlagsWakeOnly) && (m->SleepState != SleepState_Awake))
2291 debugf("ShouldSendGoodbyesBeforeSleep: marking for goodbye", ARDisplayString(m, rr));
2302 debugf("ShouldSendGoodbyesBeforeSleep: not sending goodbye %s, int %p", ARDisplayString(m, rr), intf->InterfaceID);
2307 debugf("ShouldSendGoodbyesBeforeSleep: sending goodbye %s, int %p", ARDisplayString(m, rr), intf->InterfaceID);
2331 AuthRecord *rr, *r2;
2339 for (rr = m->ResourceRecords; rr; rr=rr->next)
2340 if (rr->ImmedUnicast)
2344 v4.ip.v4 = rr->v4Requester;
2345 v6.ip.v6 = rr->v6Requester;
2346 if (!mDNSIPv4AddressIsZero(rr->v4Requester)) SendDelayedUnicastResponse(m, &v4, rr->ImmedAnswer);
2347 if (!mDNSIPv6AddressIsZero(rr->v6Requester)) SendDelayedUnicastResponse(m, &v6, rr->ImmedAnswer);
2348 if (rr->ImmedUnicast)
2350 LogMsg("SendResponses: ERROR: rr->ImmedUnicast still set: %s", ARDisplayString(m, rr));
2351 rr->ImmedUnicast = mDNSfalse;
2360 for (rr = m->ResourceRecords; rr; rr=rr->next)
2362 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
2363 if (TimeToAnnounceThisRecord(rr, m->timenow))
2365 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2367 if (!rr->WakeUp.HMAC.l[0])
2369 if (rr->AnnounceCount) rr->ImmedAnswer = mDNSInterfaceMark; // Send goodbye packet on all interfaces
2373 LogSPS("SendResponses: Sending wakeup %2d for %.6a %s", rr->AnnounceCount-3, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
2374 SendWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.IMAC, &rr->WakeUp.password);
2375 for (r2 = rr; r2; r2=r2->next)
2376 if (r2->AnnounceCount && r2->resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&r2->WakeUp.IMAC, &rr->WakeUp.IMAC) &&
2393 else if (ResourceRecordIsValidAnswer(rr))
2395 if (rr->AddressProxy.type)
2397 if (!mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
2399 rr->AnnounceCount--;
2400 rr->ThisAPInterval *= 2;
2401 rr->LastAPTime = m->timenow;
2402 if (rr->AddressProxy.type == mDNSAddrType_IPv4)
2405 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2406 SendARP(m, 1, rr, &rr->AddressProxy.ip.v4, &zeroEthAddr, &rr->AddressProxy.ip.v4, &onesEthAddr);
2408 else if (rr->AddressProxy.type == mDNSAddrType_IPv6)
2411 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2412 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
2418 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2419 if (maxExistingAnnounceInterval < rr->ThisAPInterval)
2420 maxExistingAnnounceInterval = rr->ThisAPInterval;
2421 if (rr->UpdateBlocked) rr->UpdateBlocked = 0;
2429 for (rr = m->ResourceRecords; rr; rr=rr->next)
2430 if ((rr->resrec.InterfaceID && rr->ImmedAnswer) ||
2431 (rr->ThisAPInterval <= maxExistingAnnounceInterval &&
2432 TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2) &&
2433 !rr->AddressProxy.type && // Don't include ARP Annoucements when considering which records to accelerate
2434 ResourceRecordIsValidAnswer(rr)))
2435 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2441 for (rr = m->ResourceRecords; rr; rr=rr->next)
2443 if (rr->ImmedAnswer && rr->resrec.rrtype == kDNSType_SRV)
2447 rr->LastMCTime - r2->LastMCTime >= 0 && // ... which we have not sent recently ...
2448 rr->resrec.rdatahash == r2->resrec.namehash && // ... whose name is the name of the SRV target
2449 SameDomainName(&rr->resrec.rdata->u.srv.target, r2->resrec.name) &&
2450 (rr->ImmedAnswer == mDNSInterfaceMark || rr->ImmedAnswer == r2->resrec.InterfaceID))
2455 if (rr->ImmedAnswer && rr->resrec.RecordType == kDNSRecordTypeShared && rr->resrec.rrtype == kDNSType_PTR)
2456 if (ResourceRecordIsValidAnswer(&m->DeviceInfo) && SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
2458 if (!m->DeviceInfo.ImmedAnswer) m->DeviceInfo.ImmedAnswer = rr->ImmedAnswer;
2469 for (rr = m->ResourceRecords; rr; rr=rr->next)
2470 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2472 if (rr->ImmedAnswer) // If we're sending this as answer, see that its whole RRSet is similarly marked
2477 r2->ImmedAnswer != rr->ImmedAnswer && SameResourceRecordSignature(r2, rr))
2478 r2->ImmedAnswer = !r2->ImmedAnswer ? rr->ImmedAnswer : mDNSInterfaceMark;
2480 else if (rr->ImmedAdditional) // If we're sending this as additional, see that its whole RRSet is similarly marked
2484 if (r2->ImmedAdditional != rr->ImmedAdditional && SameResourceRecordSignature(r2, rr))
2485 r2->ImmedAdditional = rr->ImmedAdditional;
2490 for (rr = m->ResourceRecords; rr; rr=rr->next)
2492 if (rr->ImmedAnswer == mDNSInterfaceMark) // Sending this record on all appropriate interfaces
2494 rr->SendRNow = !intf ? mDNSNULL : (rr->resrec.InterfaceID) ? rr->resrec.InterfaceID : intf->InterfaceID;
2495 rr->ImmedAdditional = mDNSNULL; // No need to send as additional if sending as answer
2496 rr->LastMCTime = m->timenow;
2497 rr->LastMCInterface = rr->ImmedAnswer;
2499 if (TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2))
2501 rr->AnnounceCount--;
2502 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
2503 rr->ThisAPInterval *= 2;
2504 rr->LastAPTime = m->timenow;
2505 debugf("Announcing %##s (%s) %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->AnnounceCount);
2508 else if (rr->ImmedAnswer) // Else, just respond to a single query on single interface:
2510 rr->SendRNow = rr->ImmedAnswer; // Just respond on that interface
2511 rr->ImmedAdditional = mDNSNULL; // No need to send as additional too
2512 rr->LastMCTime = m->timenow;
2513 rr->LastMCInterface = rr->ImmedAnswer;
2515 SetNextAnnounceProbeTime(m, rr);
2516 //if (rr->SendRNow) LogMsg("%-15.4a %s", &rr->v4Requester, ARDisplayString(m, rr));
2539 for (rr = m->ResourceRecords; rr; rr=rr->next)
2544 if ((rr->SendRNow == intf->InterfaceID) &&
2545 ((rr->resrec.InterfaceID == mDNSInterface_Any) && !mDNSPlatformValidRecordForInterface(rr, intf)))
2547 LogInfo("SendResponses: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, rr->SendRNow));
2548 rr->SendRNow = GetNextActiveInterfaceID(intf);
2550 else if (rr->SendRNow == intf->InterfaceID)
2552 RData *OldRData = rr->resrec.rdata;
2553 mDNSu16 oldrdlength = rr->resrec.rdlength;
2555 (rr->resrec.RecordType != kDNSRecordTypeDeregistering && !ShouldSendGoodbyesBeforeSleep(m, intf, rr));
2557 if (rr->NewRData && active)
2560 if (ResourceRecordIsValidAnswer(rr) && rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
2562 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, 0);
2563 if (newptr) { responseptr = newptr; numDereg++; rr->RequireGoodbye = mDNSfalse; }
2566 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
2569 if (rr->resrec.AnonInfo)
2571 int tmp = AnonInfoSpace(rr->resrec.AnonInfo);
2580 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2581 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2582 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, active ? rr->resrec.rroriginalttl : 0);
2583 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2587 rr->RequireGoodbye = active;
2588 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) numDereg++;
2589 else if (rr->LastAPTime == m->timenow) numAnnounce++;else numAnswer++;
2592 if (rr->NewRData && active)
2593 SetNewRData(&rr->resrec, OldRData, oldrdlength);
2597 if (!pktcount && active && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2598 rr->SendNSECNow = mDNSInterfaceMark;
2602 if (rr->resrec.AnonInfo)
2604 debugf("SendResponses: Marking %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2606 rr->resrec.AnonInfo->SendNow = intf->InterfaceID;
2610 if (rr->ImmedAnswer == mDNSInterfaceMark && rr->resrec.InterfaceID == mDNSInterface_Any)
2611 rr->SendRNow = GetNextActiveInterfaceID(intf);
2613 rr->SendRNow = mDNSNULL;
2622 for (rr = m->ResourceRecords; rr; rr=rr->next)
2624 if (rr->resrec.AnonInfo && rr->resrec.AnonInfo->SendNow == intf->InterfaceID)
2626 ResourceRecord *nsec3RR = rr->resrec.AnonInfo->nsec3RR;
2632 debugf("SendResponses: Added NSEC3 %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2637 LogMsg("SendResponses: Cannot add NSEC3 %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2640 rr->resrec.AnonInfo->SendNow = mDNSNULL;
2645 for (rr = m->ResourceRecords; rr; rr=rr->next)
2646 if (rr->ImmedAdditional == intf->InterfaceID)
2647 if (ResourceRecordIsValidAnswer(rr))
2655 if (!SendAdditional && (rr->resrec.RecordType & kDNSRecordTypeUniqueMask))
2661 SameResourceRecordSignature(a, rr)) { SendAdditional = mDNStrue; break; }
2664 rr->ImmedAdditional = mDNSNULL; // then cancel its ImmedAdditional field
2669 if (!pktcount && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2670 rr->SendNSECNow = mDNSInterfaceMark;
2672 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2673 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2674 newptr = PutRR_OS(newptr, &m->omsg.h.numAdditionals, &rr->resrec);
2675 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2679 rr->ImmedAdditional = mDNSNULL;
2680 rr->RequireGoodbye = mDNStrue;
2685 rr->LastMCTime = m->timenow;
2686 rr->LastMCInterface = intf->InterfaceID;
2693 // (recognized by rr->SendNSECNow == intf->InterfaceID) we should really put the NSEC in the Answer Section,
2695 for (rr = m->ResourceRecords; rr; rr=rr->next)
2696 if (rr->SendNSECNow == mDNSInterfaceMark || rr->SendNSECNow == intf->InterfaceID)
2701 mDNS_SetupResourceRecord(&nsec, mDNSNULL, mDNSInterface_Any, kDNSType_NSEC, rr->resrec.rroriginalttl, kDNSRecordTypeUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
2703 AssignDomainName(&nsec.namestorage, rr->resrec.name);
2705 len = DomainNameLength(rr->resrec.name);
2711 AssignDomainName((domainname *)ptr, rr->resrec.name);
2716 if (ResourceRecordIsValidAnswer(r2) && SameResourceRecordNameClassInterface(r2, rr))
2732 if (newptr || rr->SendNSECNow == mDNSInterfaceMark)
2734 rr->SendNSECNow = mDNSNULL;
2736 for (r2 = rr->next; r2; r2=r2->next)
2737 if (SameResourceRecordNameClassInterface(r2, rr))
2819 rr = m->CurrentRecord;
2820 m->CurrentRecord = rr->next;
2822 if (rr->SendRNow)
2824 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P)
2826 (uint32_t)rr->SendRNow, (uint32_t)rr->resrec.InterfaceID, rr->resrec.RecordType, ARDisplayString(m, rr));
2827 rr->SendRNow = mDNSNULL;
2830 if (rr->ImmedAnswer || rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2832 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
2834 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->AnnounceCount == 0)
2837 if (!AuthRecord_uDNS(rr)) CompleteDeregistration(m, rr); // Don't touch rr after this
2841 rr->ImmedAnswer = mDNSNULL;
2842 rr->ImmedUnicast = mDNSfalse;
2843 rr->v4Requester = zerov4Addr;
2844 rr->v6Requester = zerov6Addr;
2865 ((RR)->UnansweredQueries < MaxUnansweredQueries) ? (TicksTTL(rr)/50) : \
2880 // rr->TimeRcvd
2881 // rr->resrec.rroriginalttl
2882 // rr->UnansweredQueries
2883 // rr->CRActiveQuestion
2884 mDNSexport void SetNextCacheCheckTimeForRecord(mDNS *const m, CacheRecord *const rr)
2886 rr->NextRequiredQuery = RRExpireTime(rr);
2890 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
2892 rr->NextRequiredQuery -= TicksTTL(rr)/20 * (MaxUnansweredQueries - rr->UnansweredQueries);
2893 rr->NextRequiredQuery += mDNSRandom((mDNSu32)TicksTTL(rr)/50);
2895 (rr->NextRequiredQuery - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m,rr));
2897 ScheduleNextCacheCheckTime(m, HashSlot(rr->resrec.name), NextCacheCheckEvent(rr));
2905 mDNSexport mStatus mDNS_Reconfirm_internal(mDNS *const m, CacheRecord *const rr, mDNSu32 interval)
2913 if (RRExpireTime(rr) - m->timenow > (mDNSs32)((interval * 4) / 3))
2920 rr->TimeRcvd = m->timenow - (mDNSs32)interval * 3;
2921 rr->resrec.rroriginalttl = (interval * 4 + mDNSPlatformOneSecond - 1) / mDNSPlatformOneSecond;
2922 SetNextCacheCheckTimeForRecord(m, rr);
2925 RRExpireTime(rr) - m->timenow, CRDisplayString(m, rr), rr->CRActiveQuestion);
2950 CacheRecord *rr;
2953 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
2954 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2955 !(rr->resrec.RecordType & kDNSRecordTypeUniqueMask) && // which is a shared (i.e. not unique) record type
2956 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not already in the known answer list
2957 rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
2958 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
2959 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow > // and its half-way-to-expiry time is at least 1 second away
2968 *ka = rr; // Link this record into our known answer chain
2969 ka = &rr->NextInKAList;
2971 forecast += 12 + rr->resrec.rdestimate;
2991 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // For every resource record in our cache,
2992 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2993 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not in the known answer list
2994 SameNameRecordAnswersQuestion(&rr->resrec, q)) // which answers our question
2996 rr->UnansweredQueries++; // indicate that we're expecting a response
2997 rr->LastUnansweredTime = m->timenow;
2998 SetNextCacheCheckTimeForRecord(m, rr);
3229 const CacheRecord *rr;
3230 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
3231 if (rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
3232 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
3233 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow >= 0 && // and it is less than half-way to expiry
3234 rr->NextRequiredQuery - (m->timenow + q->ThisQInterval) > 0) // and we'll ask at least once again before NextRequiredQuery
3237 forecast += 12 + rr->resrec.rdestimate;
3860 mDNSexport void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheRecord *const rr, const QC_result AddRecord)
3863 mDNSBool followcname = FollowCNAME(q, &rr->resrec, AddRecord);
3866 q->CurrentAnswers, AddRecord ? "Add" : "Rmv", rr->resrec.rroriginalttl, CRDisplayString(m, rr));
3881 (rr->resrec.RecordType == kDNSRecordTypePacketNegative && (AddRecord == QC_add))))
3894 "LOAddressAnswers %d", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr),
3904 if (!q->TimeoutQuestion || rr->resrec.RecordType != kDNSRecordTypePacketNegative || (m->timenow - q->StopTime < 0))
3908 // Note: Use caution here. In the case of records with rr->DelayDelivery set, AnswerCurrentQuestionWithResourceRecord(... mDNStrue)
3912 rr->LastUsed = m->timenow;
3913 if (AddRecord == QC_add && !q->DuplicateOf && rr->CRActiveQuestion != q)
3915 if (!rr->CRActiveQuestion) m->rrcache_active++; // If not previously active, increment rrcache_active count
3917 rr->CRActiveQuestion, q, CRDisplayString(m,rr), q->CurrentAnswers);
3918 rr->CRActiveQuestion = q; // We know q is non-null
3919 SetNextCacheCheckTimeForRecord(m, rr);
3930 (AddRecord == QC_add && (q->ExpectUnique || (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))))
3936 if (rr->DelayDelivery) return; // We'll come back later when CacheRecordDeferredAdd() calls us
3940 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative || (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype)))
3947 if (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype))
3950 MakeNegativeCacheRecord(m, &neg, &q->qname, q->qnamehash, q->qtype, q->qclass, 1, rr->resrec.InterfaceID, q->qDNSServer);
3954 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
3989 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
3992 mDNSlocal void CacheRecordDeferredAdd(mDNS *const m, CacheRecord *rr)
3994 rr->DelayDelivery = 0;
4002 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4003 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4016 const CacheRecord *rr;
4020 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
4048 if (purge && !rr->resrec.InterfaceID && !rr->CRActiveQuestion && rr->resrec.rroriginalttl)
4050 mDNSu32 uTTL = RRUnadjustedTTL(rr->resrec.rroriginalttl);
4051 if (m->timenow - (rr->TimeRcvd + ((mDNSs32)uTTL * mDNSPlatformOneSecond)) >= 0)
4054 CRDisplayString(m, rr), rr->resrec.rroriginalttl, uTTL, (m->timenow - rr->TimeRcvd)/mDNSPlatformOneSecond);
4059 if (threshhold - RRExpireTime(rr) >= 0) // If we have records about to expire within a second
4061 if (delay - RRExpireTime(rr) < 0) // then delay until after they've been deleted
4062 delay = RRExpireTime(rr);
4074 // rr is a new CacheRecord just received into our cache
4079 mDNSlocal void CacheRecordAdd(mDNS *const m, CacheRecord *rr)
4087 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4108 verbosedebugf("CacheRecordAdd %p %##s (%s) %lu %#a:%d question %p", rr, rr->resrec.name->c,
4109 DNSTypeName(rr->resrec.rrtype), rr->resrec.rroriginalttl, rr->resrec.rDNSServer ?
4110 &rr->resrec.rDNSServer->addr : mDNSNULL, mDNSVal16(rr->resrec.rDNSServer ?
4111 rr->resrec.rDNSServer->port : zeroIPPort), q);
4115 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
4116 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
4123 rr->resrec.rroriginalttl = 0;
4124 rr->UnansweredQueries = MaxUnansweredQueries;
4129 if (!rr->DelayDelivery)
4137 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4138 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4145 SetNextCacheCheckTimeForRecord(m, rr);
4151 // rr is a new CacheRecord just received from the wire (kDNSRecordTypePacketAns/AnsUnique/Add/AddUnique)
4158 mDNSlocal void NoCacheAnswer(mDNS *const m, CacheRecord *rr)
4169 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4170 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_addnocache); // QC_addnocache means "don't expect remove events for this"
4181 // rr is an existing cache CacheRecord that just expired and is being deleted
4186 mDNSlocal void CacheRecordRmv(mDNS *const m, CacheRecord *rr)
4202 if (!QuerySuppressed(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
4204 verbosedebugf("CacheRecordRmv %p %s", rr, CRDisplayString(m, rr));
4217 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
4218 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
4231 if (rr->resrec.rdata->MaxRDLength) // Never generate "remove" events for negative results
4239 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_rmv);
4277 CacheRecord *rr = *rp;
4279 if (rr->resrec.rdata && rr->resrec.rdata != (RData*)&rr->smallrdatastorage)
4281 mDNSPlatformMemFree(rr->resrec.rdata);
4282 rr->resrec.rdata = mDNSNULL;
4286 if (rr->resrec.name)
4288 debugf("ReleaseAdditionalCacheRecords: freeing cached record %##s (%s)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
4289 mDNSPlatformMemFree((void *)rr->resrec.name);
4290 rr->resrec.name = mDNSNULL;
4293 if (!rr->resrec.InterfaceID)
4295 m->rrcache_totalused_unicast -= rr->resrec.rdlength;
4296 if (DNSSECRecordType(rr->resrec.rrtype))
4297 BumpDNSSECStats(m, kStatsActionDecrement, kStatsTypeMemoryUsage, rr->resrec.rdlength);
4299 ReleaseCacheEntity(m, (CacheEntity *)rr);
4361 CacheRecord *const rr = *rp;
4362 mDNSs32 event = RRExpireTime(rr);
4365 *rp = rr->next; // Cut it from the list
4368 m->timenow - rr->TimeRcvd, rr->resrec.rroriginalttl, rr->CRActiveQuestion, CRDisplayString(m, rr));
4369 if (rr->CRActiveQuestion) // If this record has one or more active questions, tell them it's going away
4371 DNSQuestion *q = rr->CRActiveQuestion;
4385 CacheRecordRmv(m, rr);
4388 ReleaseCacheRecord(m, rr);
4393 if (rr->DelayDelivery && rr->DelayDelivery - m->timenow > 0)
4394 event = rr->DelayDelivery;
4397 if (rr->DelayDelivery) CacheRecordDeferredAdd(m, rr);
4398 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
4400 if (m->timenow - rr->NextRequiredQuery < 0) // If not yet time for next query
4401 event = NextCacheCheckEvent(rr); // then just record when we want the next query
4414 (event - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m, rr));
4417 rp = &rr->next;
4448 AuthRecord *rr = m->CurrentRecord;
4449 m->CurrentRecord = rr->next;
4458 if (rr->ARType == AuthRecordLocalOnly || (rr->ARType == AuthRecordP2P && q->InterfaceID == mDNSInterface_Any))
4459 if (LocalOnlyRecordAnswersQuestion(rr, q))
4464 ARDisplayString(m, rr));
4468 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_add);
4607 CacheRecord *rr;
4608 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
4609 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
4612 mDNSu32 SecsSinceRcvd = ((mDNSu32)(m->timenow - rr->TimeRcvd)) / mDNSPlatformOneSecond;
4613 if (rr->resrec.rroriginalttl <= SecsSinceRcvd)
4615 LogMsg("AnswerNewQuestion: How is rr->resrec.rroriginalttl %lu <= SecsSinceRcvd %lu for %s %d %d",
4616 rr->resrec.rroriginalttl, SecsSinceRcvd, CRDisplayString(m, rr), m->timenow, rr->TimeRcvd);
4622 if ((rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) || (q->ExpectUnique))
4625 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
4626 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
4628 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4631 else if (RRTypeIsAddressType(rr->resrec.rrtype) && RRTypeIsAddressType(q->qtype))
4707 AuthRecord *rr = m->CurrentRecord;
4708 m->CurrentRecord = rr->next;
4709 if (LocalOnlyRecordAnswersQuestion(rr, q))
4711 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_add);
4723 AuthRecord *rr = m->CurrentRecord;
4724 m->CurrentRecord = rr->next;
4725 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4727 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_add);
4787 CacheRecord *rr = *rp;
4789 ReleaseCacheRecord(m, rr);
4838 mDNSlocal CacheGroup *GetCacheGroup(mDNS *const m, const mDNSu32 slot, const ResourceRecord *const rr)
4840 mDNSu16 namelen = DomainNameLength(rr->name);
4842 if (!cg) { LogMsg("GetCacheGroup: Failed to allocate memory for %##s", rr->name->c); return(mDNSNULL); }
4844 cg->namehash = rr->namehash;
4853 LogMsg("GetCacheGroup: Failed to allocate name storage for %##s", rr->name->c);
4857 AssignDomainName(cg->name, rr->name);
4859 if (CacheGroupForRecord(m, slot, rr)) LogMsg("GetCacheGroup: Already have CacheGroup for %##s", rr->name->c);
4861 if (CacheGroupForRecord(m, slot, rr) != cg) LogMsg("GetCacheGroup: Not finding CacheGroup for %##s", rr->name->c);
4866 mDNSexport void mDNS_PurgeCacheResourceRecord(mDNS *const m, CacheRecord *rr)
4875 rr->TimeRcvd = m->timenow - mDNSPlatformOneSecond * 60;
4876 rr->UnansweredQueries = MaxUnansweredQueries;
4877 rr->resrec.rroriginalttl = 0;
4878 SetNextCacheCheckTimeForRecord(m, rr);
4910 AuthRecord *rr = m->CurrentRecord;
4911 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering && rr->WakeUp.HMAC.l[0])
4915 if (m->SPSSocket && m->timenow - rr->TimeExpire < 0) // If proxy record not expired yet, update m->NextScheduledSPS
4917 if (m->NextScheduledSPS - rr->TimeExpire > 0)
4918 m->NextScheduledSPS = rr->TimeExpire;
4923 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, ARDisplayString(m, rr));
4924 SetSPSProxyListChanged(rr->resrec.InterfaceID);
4925 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
4926 // Don't touch rr after this -- memory may have been free'd
4931 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
4932 m->CurrentRecord = rr->next;
4940 AuthRecord *rr = m->CurrentRecord;
4941 if (rr->AnsweredLocalQ && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
4943 debugf("CheckRmvEventsForLocalRecords: Generating local RMV events for %s", ARDisplayString(m, rr));
4944 rr->resrec.RecordType = kDNSRecordTypeShared;
4945 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, QC_rmv);
4946 if (m->CurrentRecord == rr) // If rr still exists in list, restore its state now
4948 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
4949 rr->AnsweredLocalQ = mDNSfalse;
4952 if (RRLocalOnly(rr)) CompleteDeregistration(m, rr);
4955 if (m->CurrentRecord == rr) // If m->CurrentRecord was not auto-advanced, do it ourselves now
4956 m->CurrentRecord = rr->next;
5108 // Make sure we deliver *all* local RMV events, and clear the corresponding rr->AnsweredLocalQ flags, *before*
5132 AuthRecord *rr = m->NewLocalRecords;
5134 if (LocalRecordReady(rr))
5136 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
5137 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, QC_add);
5139 else if (!rr->next)
5143 // terminate and set the NewLocalRecords to rr.
5144 debugf("mDNS_Execute: Just one LocalAuthRecord %s, breaking out of the loop early", ARDisplayString(m, rr));
5148 head = rr;
5153 debugf("mDNS_Execute: Skipping LocalAuthRecord %s", ARDisplayString(m, rr));
5156 while (*p && *p != rr) p=&(*p)->next;
5157 if (*p) *p = rr->next; // Cut this record from the list
5158 else { LogMsg("mDNS_Execute: ERROR!! Cannot find record %s in ResourceRecords list", ARDisplayString(m, rr)); break; }
5162 *p = rr;
5163 head = tail = rr;
5167 tail->next = rr;
5168 tail = rr;
5170 rr->next = mDNSNULL;
5188 AuthRecord *rr = ag->NewLocalOnlyRecords;
5191 if (LocalRecordReady(rr))
5193 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
5194 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, QC_add);
5196 else LogMsg("mDNS_Execute: LocalOnlyRecord %s not ready", ARDisplayString(m, rr));
5292 AuthRecord *rr;
5300 for (rr = ag->members; rr; rr=rr->next)
5302 if (UniqueLocalOnlyRecord(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
5304 LogInfo("QuestionHasLocalAnswers: Question %p %##s (%s) has local answer %s", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr));
5512 mDNSexport void mDNSCoreRestartRegistration(mDNS *const m, AuthRecord *rr, int announceCount)
5514 if (!AuthRecord_uDNS(rr))
5516 if (rr->resrec.RecordType == kDNSRecordTypeVerified && !rr->DependentOn) rr->resrec.RecordType = kDNSRecordTypeUnique;
5517 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
5522 if (rr->AnnounceCount < announceCount)
5523 rr->AnnounceCount = announceCount;
5525 if (mDNS_KeepaliveRecord(&rr->resrec))
5526 rr->AnnounceCount = 0; // Do not announce keepalive records
5528 rr->AnnounceCount = InitialAnnounceCount;
5529 rr->SendNSECNow = mDNSNULL;
5530 InitializeLastAPTime(m, rr);
5608 mDNSlocal mDNSBool mDNSUpdateOkToSend(mDNS *const m, AuthRecord *rr, NetworkInterfaceInfo *const intf, mDNSu32 scopeid)
5613 if (AuthRecord_uDNS(rr) || (rr->AuthFlags & AuthFlagsWakeOnly) || mDNSOpaque16IsZero(rr->updateid) ||
5614 m->timenow - (rr->LastAPTime + rr->ThisAPInterval) < 0)
5621 // we successfully update on all the interfaces (with whatever set in "rr->updateIntID"), we clear
5627 if ((scopeid >= (sizeof(rr->updateIntID) * mDNSNBBY) || bit_get_opaque64(rr->updateIntID, scopeid)) &&
5628 (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == intf->InterfaceID))
5647 AuthRecord *rr = m->CurrentRecord;
5649 if (mDNS_KeepaliveRecord(&rr->resrec))
5652 getKeepaliveRaddr(m, rr, &raddr);
5655 UpdateKeepaliveRData(m, rr, mDNSNULL, mDNStrue, (char *)(addrmap->ethaddr));
5658 m->CurrentRecord = rr->next;
5667 mDNSexport mStatus UpdateKeepaliveRData(mDNS *const m, AuthRecord *rr, NetworkInterfaceInfo *const intf, mDNSBool updateMac, char *ethAddr)
5683 mDNS_ExtractKeepaliveInfo(rr, &timeout, &laddr, &raddr, ð, &seq, &ack, &lport, &rport, &win);
5687 LogMsg("UpdateKeepaliveRData: not a valid record %s for keepalive %#a:%d %#a:%d", ARDisplayString(m, rr), &laddr, lport.NotAnInteger, &raddr, rport.NotAnInteger);
5726 LogMsg("UpdateKeepaliveRData: could not allocate memory %s", ARDisplayString(m, rr));
5746 if ( rr->resrec.rdata != &rr->rdatastorage)
5748 mDNSPlatformMemFree(rr->resrec.rdata);
5749 LogSPS("UpdateKeepaliveRData: Freed allocated memory for keep alive packet: %s ", ARDisplayString(m, rr));
5751 SetNewRData(&rr->resrec, newrd, newrdlength); // Update our rdata
5753 LogSPS("UpdateKeepaliveRData: successfully updated the record %s", ARDisplayString(m, rr));
5761 AuthRecord *rr;
5787 for (rr = m->ResourceRecords; rr; rr=rr->next)
5789 if (!(rr->AuthFlags & AuthFlagsWakeOnly) && rr->resrec.RecordType > kDNSRecordTypeDeregistering)
5791 if (rr->resrec.InterfaceID == intf->InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
5793 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
5795 rr->SendRNow = mDNSInterfaceMark; // mark it now
5796 // When we are registering on the first interface, rr->updateid is zero in which case
5799 if (mDNSOpaque16IsZero(rr->updateid))
5800 rr->updateid = msgid;
5802 msgid = rr->updateid;
5820 for (rr = m->ResourceRecords; rr; rr=rr->next)
5821 if (rr->SendRNow || mDNSUpdateOkToSend(m, rr, intf, scopeid))
5823 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
5829 if (mDNS_KeepaliveRecord(&rr->resrec) && (UpdateKeepaliveRData(m, rr, intf, mDNSfalse, mDNSNULL) != mStatus_NoError))
5831 if (scopeid < (sizeof(rr->updateIntID) * mDNSNBBY))
5833 bit_clr_opaque64(rr->updateIntID, scopeid);
5835 rr->SendRNow = mDNSNULL;
5839 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
5840 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the 'unique' bit so PutResourceRecord will set it
5841 newptr = PutResourceRecordTTLWithLimit(&m->omsg, p, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
5842 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear 'unique' bit back to normal state
5844 LogSPS("SendSPSRegistration put %s FAILED %d/%d %s", intf->ifname, p - m->omsg.data, limit - m->omsg.data, ARDisplayString(m, rr));
5847 LogSPS("SendSPSRegistration put %s 0x%x 0x%x (updateid %d) %s", intf->ifname, rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(m->omsg.h.id), ARDisplayString(m, rr));
5848 rr->SendRNow = mDNSNULL;
5849 rr->ThisAPInterval = mDNSPlatformOneSecond;
5850 rr->LastAPTime = m->timenow;
5852 if (mDNSOpaque16IsZero(rr->updateid)) LogMsg("SendSPSRegistration: ERROR!! rr %s updateid is zero", ARDisplayString(m, rr));
5853 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
5854 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
5909 mDNSlocal mDNSBool RecordIsFirstOccurrenceOfOwner(mDNS *const m, const AuthRecord *const rr)
5912 for (ar = m->ResourceRecords; ar && ar != rr; ar=ar->next)
5913 if (mDNSPlatformMemSame(&rr->WakeUp, &ar->WakeUp, sizeof(rr->WakeUp))) return mDNSfalse;
5917 mDNSlocal void mDNSCoreStoreProxyRR(mDNS *const m, const mDNSInterfaceID InterfaceID, AuthRecord *const rr)
5928 mDNS_SetupResourceRecord(newRR, mDNSNULL, InterfaceID, rr->resrec.rrtype,
5929 rr->resrec.rroriginalttl, rr->resrec.RecordType,
5930 rr->ARType, mDNSNULL, mDNSNULL);
5932 AssignDomainName(&newRR->namestorage, &rr->namestorage);
5933 newRR->resrec.rdlength = DomainNameLength(rr->resrec.name);
5935 newRR->resrec.rrclass = rr->resrec.rrclass;
5937 if (rr->resrec.rrtype == kDNSType_A)
5939 newRR->resrec.rdata->u.ipv4 = rr->resrec.rdata->u.ipv4;
5941 else if (rr->resrec.rrtype == kDNSType_AAAA)
5943 newRR->resrec.rdata->u.ipv6 = rr->resrec.rdata->u.ipv6;
5950 LogSPS("%s : Storing proxy record : %s ", __func__, ARDisplayString(m, rr));
6038 AuthRecord *rr;
6047 for (rr = m->ResourceRecords; rr; rr=rr->next)
6048 if (!AuthRecord_uDNS(rr) && !mDNSOpaque16IsZero(rr->updateid) && m->timenow - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
6054 if ((scopeid >= (sizeof(rr->updateIntID) * mDNSNBBY) || bit_get_opaque64(rr->updateIntID, scopeid)) &&
6055 (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == intf->InterfaceID))
6057 LogSPS("RetrySPSRegistrations: 0x%x 0x%x (updateid %d) %s", rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m, rr));
6058 SendSPSRegistration(m, intf, rr->updateid);
6124 AuthRecord *rr;
6125 for (rr = m->ResourceRecords; rr; rr=rr->next)
6126 if (mDNS_KeepaliveRecord(&rr->resrec) || (rr->resrec.rrtype == kDNSType_SRV && !AuthRecord_uDNS(rr) && !mDNSSameIPPort(rr->resrec.rdata->u.srv.port, DiscardPort)))
6137 AuthRecord *rr;
6142 for (rr = m->ResourceRecords; rr; rr=rr->next)
6144 if ((rr->AuthFlags & AuthFlagsWakeOnly) &&
6145 rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
6147 rr->ImmedAnswer = mDNSInterfaceMark;
6156 AuthRecord *rr;
6177 for (rr = m->ResourceRecords; rr; rr=rr->next)
6178 if (rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
6179 rr->ImmedAnswer = mDNSInterfaceMark;
6232 AuthRecord *const rr = m->CurrentRecord;
6233 if ((mDNS_KeepaliveRecord(&rr->resrec)) && (rr->resrec.RecordType != kDNSRecordTypeDeregistering))
6235 LogSPS("DoKeepaliveCallbacks: Invoking the callback for %s", ARDisplayString(m, rr));
6236 if (rr->RecordCallback)
6237 rr->RecordCallback(m, rr, mStatus_BadStateErr);
6239 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
6240 m->CurrentRecord = rr->next;
6426 AuthRecord *rr;
6578 for (rr = m->ResourceRecords; rr; rr=rr->next)
6580 if (AuthRecord_uDNS(rr))
6582 ActivateUnicastRegistration(m, rr);
6586 mDNSCoreRestartRegistration(m, rr, -1);
6606 AuthRecord *rr;
6648 for (rr = m->ResourceRecords; rr; rr = rr->next)
6649 if (!AuthRecord_uDNS(rr))
6650 if (!mDNSOpaque64IsZero(&rr->updateIntID))
6651 { LogSPS("mDNSCoreReadyForSleep: waiting for SPS updateIntID 0x%x 0x%x (updateid %d) %s", rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m,rr)); goto spsnotready; }
6662 for (rr = m->ResourceRecords; rr; rr = rr->next)
6663 if (AuthRecord_uDNS(rr))
6665 if (rr->state == regState_Refresh && rr->tcp)
6666 { LogSPS("mDNSCoreReadyForSleep: waiting for Record updateIntID 0x%x 0x%x (updateid %d) %s", rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m,rr)); goto notready; }
6668 if (!RecordReadyForSleep(m, rr)) { LogSPS("mDNSCoreReadyForSleep: waiting for %s", ARDisplayString(m, rr)); goto notready; }
6691 for (rr = m->ResourceRecords; rr; rr = rr->next)
6692 if (!AuthRecord_uDNS(rr))
6693 if (!mDNSOpaque64IsZero(&rr->updateIntID))
6695 LogSPS("ReadyForSleep clearing updateIntID 0x%x 0x%x (updateid %d) for %s", rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m, rr));
6696 rr->updateIntID = zeroOpaque64;
6771 AuthRecord *rr;
6790 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // and search our list of proposed answers
6792 if (rr->NR_AnswerTo == ptr) // If we're going to generate a record answering this question
6807 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6808 if (rr->NR_AnswerTo)
6810 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAnswers, &rr->resrec,
6811 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
6819 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6820 if (rr->NR_AdditionalTo && !rr->NR_AnswerTo)
6822 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAdditionals, &rr->resrec,
6823 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
6896 const AuthRecord *rr;
6897 for (rr = m->ResourceRecords; rr; rr=rr->next)
6899 if (IdenticalResourceRecord(&rr->resrec, &pktrr->resrec))
6901 while (rr->RRSet && rr != rr->RRSet) rr = rr->RRSet;
6902 return(rr);
6912 // 2b. If the packet rr exactly matches one of our other RRs, and *that* record's DependentOn pointer
7001 CacheRecord *rr;
7003 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
7008 mDNSu16 id2 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
7011 else match = (pktrr->InterfaceID == rr->resrec.InterfaceID);
7013 if (match && IdenticalSameNameRecord(pktrr, &rr->resrec)) break;
7015 return(rr);
7017 mDNSlocal void DeregisterProxyRecord(mDNS *const m, AuthRecord *const rr)
7019 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
7020 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
7021 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7035 AuthRecord *const rr = m->CurrentRecord;
7036 if (InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7041 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7042 DeregisterProxyRecord(m, rr);
7047 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7048 m->CurrentRecord = rr->next;
7061 AuthRecord *const rr = m->CurrentRecord;
7062 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7063 if (IdenticalResourceRecord(&rr->resrec, &m->rec.r.resrec))
7066 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7067 DeregisterProxyRecord(m, rr);
7071 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7072 m->CurrentRecord = rr->next;
7084 AuthRecord *const rr = m->CurrentRecord;
7085 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7086 if (owner->seq != rr->WakeUp.seq || m->timenow - rr->TimeRcvd > mDNSPlatformOneSecond * 60)
7088 if (rr->AddressProxy.type == mDNSAddrType_IPv6)
7095 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
7096 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, &rr->WakeUp.IMAC, &AllHosts_v6, &AllHosts_v6_Eth);
7100 m->ProxyRecords, rr->AnnounceCount, rr->resrec.RecordType,
7101 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7102 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) rr->resrec.RecordType = kDNSRecordTypeShared;
7103 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
7104 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it, since real host is now back and functional
7105 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7110 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7111 m->CurrentRecord = rr->next;
7135 AuthRecord *rr;
7213 rr = m->CurrentRecord;
7214 m->CurrentRecord = rr->next;
7215 if (AnyTypeRecordAnswersQuestion(&rr->resrec, &pktq) && (QueryWasMulticast || QueryWasLocalUnicast || rr->AllowRemoteQuery))
7218 if (RRTypeAnswersQuestionType(&rr->resrec, pktq.qtype))
7220 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
7221 ResolveSimultaneousProbe(m, query, end, &pktq, rr);
7222 else if (ResourceRecordIsValidAnswer(rr))
7229 if (pktq.AnonInfo && rr->resrec.AnonInfo)
7230 SetAnonData(&pktq, &rr->resrec, mDNStrue);
7247 if (m->timenow - (rr->LastMCTime + mDNSPlatformOneSecond) >= 0 ||
7248 (rr->LastMCInterface != mDNSInterfaceMark && rr->LastMCInterface != InterfaceID))
7249 rr->NR_AnswerTo = NR_AnswerMulticast;
7251 else if (!rr->NR_AnswerTo) rr->NR_AnswerTo = LegacyQuery ? ptr : NR_AnswerUnicast;
7254 else if ((rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && ResourceRecordIsValidAnswer(rr))
7258 if (!NSECAnswer) NSECAnswer = rr;
7348 for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers
7349 if (rr->NR_AnswerTo) // If we marked the record...
7350 AddRecordToResponseList(&nrp, rr, mDNSNULL); // ... add it to the list
7369 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7371 if (MustSendRecord(rr) && ShouldSuppressKnownAnswer(&m->rec.r, rr))
7374 rr->NR_AnswerTo = mDNSNULL;
7375 rr->NR_AdditionalTo = mDNSNULL;
7380 for (rr=m->ResourceRecords; rr; rr=rr->next)
7383 if (rr->ImmedAnswer == InterfaceID && ShouldSuppressKnownAnswer(&m->rec.r, rr))
7387 if (mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = zerov4Addr;
7391 if (mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = zerov6Addr;
7393 if (mDNSIPv4AddressIsZero(rr->v4Requester) && mDNSIPv6AddressIsZero(rr->v6Requester))
7396 rr->ImmedAnswer = mDNSNULL;
7397 rr->ImmedUnicast = mDNSfalse;
7399 LogMsg("Suppressed after%4d: %s", m->timenow - rr->ImmedAnswerMarkTime, ARDisplayString(m, rr));
7449 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7450 if (rr->NR_AdditionalTo && !MustSendRecord(rr->NR_AdditionalTo))
7451 { rr->NR_AnswerTo = mDNSNULL; rr->NR_AdditionalTo = mDNSNULL; }
7456 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7458 if (rr->NR_AnswerTo)
7469 if (m->timenow - (rr->LastMCTime + TicksTTL(rr)/4) >= 0)
7475 if (rr->NR_AnswerTo == NR_AnswerUnicast)
7478 rr->NR_AnswerTo = NR_AnswerMulticast;
7484 if (rr->NR_AnswerTo == NR_AnswerMulticast)
7489 else if (rr->NR_AnswerTo == NR_AnswerUnicast)
7494 else if (rr->NR_AnswerTo)
7503 rr->ImmedAnswerMarkTime = m->timenow;
7507 if (rr->ImmedAnswer && rr->ImmedAnswer != InterfaceID)
7508 rr->ImmedAnswer = mDNSInterfaceMark;
7511 rr->ImmedAnswer = InterfaceID; // Record interface to send it on
7512 if (SendUnicastResponse) rr->ImmedUnicast = mDNStrue;
7515 if (mDNSIPv4AddressIsZero(rr->v4Requester)) rr->v4Requester = srcaddr->ip.v4;
7516 else if (!mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = onesIPv4Addr;
7520 if (mDNSIPv6AddressIsZero(rr->v6Requester)) rr->v6Requester = srcaddr->ip.v6;
7521 else if (!mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = onesIPv6Addr;
7530 else if (rr->resrec.RecordType == kDNSRecordTypeShared) delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
7532 else if (rr->NR_AdditionalTo && rr->NR_AdditionalTo->NR_AnswerTo == NR_AnswerMulticast)
7537 rr->ImmedAdditional = InterfaceID;
7588 rr = ResponseRecords;
7589 ResponseRecords = rr->NextResponse;
7590 rr->NextResponse = mDNSNULL;
7591 rr->NR_AnswerTo = mDNSNULL;
7592 rr->NR_AdditionalTo = mDNSNULL;
7763 const mDNSAddr *const srcaddr, const mDNSBool SrcLocal, const mDNSIPPort port, const mDNSOpaque16 id, const CacheRecord *const rr, mDNSBool tcp)
7771 if (!q->DuplicateOf && ResourceRecordAnswersUnicastResponse(&rr->resrec, q))
7775 debugf("ExpectingUnicastResponseForRecord msg->h.id %d q->TargetQID %d for %s", mDNSVal16(id), mDNSVal16(q->TargetQID), CRDisplayString(m, rr));
7797 q->qname.c, DNSTypeName(q->qtype), &q->Target, mDNSVal16(srcp), srcaddr, mDNSVal16(port), CRDisplayString(m, rr));
7828 mDNSlocal mDNSBool ExpectingMulticastResponseForRecord(mDNS *const m, CacheRecord *rr, const mDNSAddr *srcaddr, mDNSBool recordAccepted,
7835 if (recordAccepted && (rr->resrec.rrtype == kDNSType_A || rr->resrec.rrtype == kDNSType_AAAA))
7837 LogInfo("ExpectingMulticastResponseForRecord:A:AAAA: accepting %s, from %#a due to same packet %d", CRDisplayString(m, rr), srcaddr, m->PktNum);
7849 if (q->AnonInfo && McastNSEC3Records && !rr->resrec.AnonInfo)
7851 InitializeAnonInfoForCR(m, McastNSEC3Records, rr);
7853 ret = ResourceRecordAnswersQuestion(&rr->resrec, q);
7858 if (q->AnonInfo && rr->resrec.AnonInfo)
7860 SetAnonData(q, &rr->resrec, mDNSfalse);
7862 LogInfo("ExpectingMulticastResponseForRecord: Name and Type match, accepting %s, from %#a", CRDisplayString(m, rr), srcaddr);
7863 if (rr->resrec.rrtype == kDNSType_NSEC)
7864 LogInfo("ExpectingMulticastResponseForRecord: record %s, question %##s (%s)", CRDisplayString(m, rr), q->qname.c, DNSTypeName(q->qtype));
7867 if (rr->resrec.rrtype == kDNSType_SRV || rr->resrec.rrtype == kDNSType_TXT)
7870 const domainname *name = SkipLeadingLabels(rr->resrec.name, 1);
7881 CRDisplayString(m, rr), q->qname.c, srcaddr, m->PktNum);
7903 CRDisplayString(m, rr), srcaddr, m->PktNum);
7912 debugf("ExpectingMulticastResponseForRecord: discarding %s, from %#a, pktnum %d", CRDisplayString(m, rr), srcaddr, m->PktNum);
7919 mDNSlocal mDNSu16 GetRDLengthMem(const ResourceRecord *const rr)
7921 switch (rr->rrtype)
7926 default: return rr->rdlength;
7932 CacheRecord *rr = mDNSNULL;
7941 if (cg) rr = GetCacheRecord(m, cg, RDLength); // Make a cache record, being careful not to recycle cg
7942 if (!rr) NoCacheAnswer(m, &m->rec.r);
7945 RData *saveptr = rr->resrec.rdata; // Save the rr->resrec.rdata pointer
7946 *rr = m->rec.r; // Block copy the CacheRecord object
7947 rr->resrec.rdata = saveptr; // Restore rr->resrec.rdata after the structure assignment
7948 rr->resrec.name = cg->name; // And set rr->resrec.name to point into our CacheGroup header
7956 rr->resrec.AnonInfo = m->rec.r.resrec.AnonInfo;
7959 rr->DelayDelivery = delay;
7962 if (rr->resrec.rdata == (RData*)&rr->smallrdatastorage && RDLength > InlineCacheRDSize)
7963 LogMsg("rr->resrec.rdata == &rr->rdatastorage but length > InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
7964 else if (rr->resrec.rdata != (RData*)&rr->smallrdatastorage && RDLength <= InlineCacheRDSize)
7965 LogMsg("rr->resrec.rdata != &rr->rdatastorage but length <= InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
7967 mDNSPlatformMemCopy(rr->resrec.rdata, m->rec.r.resrec.rdata, sizeofRDataHeader + RDLength);
7969 rr->next = mDNSNULL; // Clear 'next' pointer
7970 rr->nsec = mDNSNULL;
7971 rr->soa = mDNSNULL;
7974 rr->sourceAddress = *sourceAddress;
7976 if (!rr->resrec.InterfaceID)
7978 m->rrcache_totalused_unicast += rr->resrec.rdlength;
7979 if (DNSSECRecordType(rr->resrec.rrtype))
7980 BumpDNSSECStats(m, kStatsActionIncrement, kStatsTypeMemoryUsage, rr->resrec.rdlength);
7985 *(cg->rrcache_tail) = rr; // Append this record to tail of cache slot list
7986 cg->rrcache_tail = &(rr->next); // Advance tail pointer
7987 CacheRecordAdd(m, rr); // CacheRecordAdd calls SetNextCacheCheckTimeForRecord(m, rr); for us
7997 rr->resrec.name = name;
8001 ReleaseCacheRecord(m, rr);
8003 rr = mDNSNULL;
8007 return(rr);
8010 mDNSlocal void RefreshCacheRecord(mDNS *const m, CacheRecord *rr, mDNSu32 ttl)
8012 rr->TimeRcvd = m->timenow;
8013 rr->resrec.rroriginalttl = ttl;
8014 rr->UnansweredQueries = 0;
8016 rr->MPUnansweredQ = 0;
8017 rr->MPUnansweredKA = 0;
8018 rr->MPExpectingKA = mDNSfalse;
8020 SetNextCacheCheckTimeForRecord(m, rr);
8025 CacheRecord *rr;
8028 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8029 if (rr->CRActiveQuestion == q)
8031 //LogInfo("GrantCacheExtensions: new lease %d / %s", lease, CRDisplayString(m, rr));
8032 RefreshCacheRecord(m, rr, lease);
8076 ResourceRecord *rr = &newcr->resrec;
8089 if (target && cr->resrec.rdatahash == rr->namehash && SameDomainName(target, rr->name))
8091 LogInfo("IsResponseAcceptable: Found a matching entry for %##s in the CacheFlushRecords %s", rr->name->c, CRDisplayString(m, cr));
8102 mDNSBool same = SameDomainName(&q->qname, rr->name);
8103 if (same && (q->qtype == rr->rrtype || rr->rrtype == kDNSType_CNAME))
8111 if (rr->rrtype == kDNSType_RRSIG)
8142 if (rr->rrtype == kDNSType_NSEC)
8144 if (!UNICAST_NSEC(rr))
8153 if (rr->rrtype == kDNSType_SOA)
8159 else if (rr->rrtype == kDNSType_NSEC3)
8239 CacheRecord *rr, *neg = mDNSNULL;
8242 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8243 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
8246 if (RRExpireTime(rr) - m->timenow > 0) break;
8248 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative) neg = rr;
8268 if (!rr)
8287 if (!rr)
8481 mDNSlocal mDNSBool mDNSCoreRegisteredProxyRecord(mDNS *const m, AuthRecord *rr)
8487 if (IdenticalResourceRecord(&rrPtr->resrec, &rr->resrec))
8489 LogSPS("mDNSCoreRegisteredProxyRecord: Ignoring packet registered with sleep proxy : %s ", ARDisplayString(m, rr));
8501 CacheRecord *rr;
8504 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8510 mDNSu16 id1 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
8515 match = (rr->resrec.InterfaceID == InterfaceID);
8517 if (match && IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
8526 if (rr->NextInCFList == mDNSNULL && *cfp != &rr->NextInCFList && LLQType != uDNS_LLQ_Events)
8528 *cflocal = rr;
8529 cflocal = &rr->NextInCFList;
8531 *cfp = &rr->NextInCFList;
8535 if (!(rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))
8540 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
8543 rr->resrec.RecordType = m->rec.r.resrec.RecordType;
8547 if (!SameRDataBody(&m->rec.r.resrec, &rr->resrec.rdata->u, SameDomainNameCS))
8553 rr->resrec.rroriginalttl = 0;
8554 rr->TimeRcvd = m->timenow;
8555 rr->UnansweredQueries = MaxUnansweredQueries;
8556 SetNextCacheCheckTimeForRecord(m, rr);
8557 LogInfo("mDNSCoreReceiveCacheCheck: Discarding due to domainname case change old: %s", CRDisplayString(m, rr));
8560 NextCacheCheckEvent(rr) - m->timenow, slot, m->rrcache_nextcheck[slot] - m->timenow, m->NextCacheCheck - m->timenow);
8563 else if (!IdenticalAnonInfo(m->rec.r.resrec.AnonInfo, rr->resrec.AnonInfo))
8580 rr->resrec.rroriginalttl = 0;
8581 rr->TimeRcvd = m->timenow;
8582 rr->UnansweredQueries = MaxUnansweredQueries;
8583 SetNextCacheCheckTimeForRecord(m, rr);
8584 LogInfo("mDNSCoreReceiveCacheCheck: AnonInfo changed for %s", CRDisplayString(m, rr));
8594 if (rr->resrec.rroriginalttl == 0) debugf("uDNS rescuing %s", CRDisplayString(m, rr));
8595 RefreshCacheRecord(m, rr, m->rec.r.resrec.rroriginalttl);
8596 rr->responseFlags = response->h.flags;
8605 if (response->h.numAnswers && unicastQuestion && unicastQuestion->qtype == rr->resrec.rrtype
8608 LogInfo("mDNSCoreReceiveCacheCheck: rescuing RR %s", CRDisplayString(m, rr));
8609 *NSECCachePtr = rr;
8619 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask)
8624 ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
8645 debugf("DE for %s", CRDisplayString(m, rr));
8646 if (RRExpireTime(rr) - m->timenow > mDNSPlatformOneSecond)
8648 rr->resrec.rroriginalttl = 1;
8649 rr->TimeRcvd = m->timenow;
8650 rr->UnansweredQueries = MaxUnansweredQueries;
8651 SetNextCacheCheckTimeForRecord(m, rr);
8657 return rr;
8664 CacheRecord *rr;
8691 rr = CreateNewCacheEntry(m, slot, cg, 0, mDNSfalse, mDNSNULL);
8692 if (rr)
8694 debugf("mDNSParseNSEC3Records: %s", CRDisplayString(m, rr));
8695 *NSEC3Records = rr;
8696 NSEC3Records = &rr->next;
8829 CacheRecord *rr;
8847 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8848 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
8851 rr->resrec.InterfaceID, CRDisplayString(m, rr));
8853 rr->TimeRcvd = m->timenow - TicksTTL(rr) - 1;
8854 rr->UnansweredQueries = MaxUnansweredQueries;
8855 rr->CRDNSSECQuestion = 0;
8858 LogInfo("mDNSCoreReceiveResponse: CRDNSSECQuestion set for record %s, question %##s (%s)", CRDisplayString(m, rr),
8860 rr->CRDNSSECQuestion = 1;
9056 CacheRecord *const rr = &m->rec.r;
9057 RDataBody2 *const rdb = (RDataBody2 *)rr->smallrdatastorage.data;
9077 AuthRecord *rr = m->CurrentRecord;
9078 m->CurrentRecord = rr->next;
9082 if (!AcceptableResponse && !(ResponseSrcLocal && rr->resrec.RecordType == kDNSRecordTypeUnique)) continue;
9084 if (PacketRRMatchesSignature(&m->rec.r, rr)) // If interface, name, type (if shared record) and class match...
9087 if (IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
9090 if (m->rec.r.resrec.rroriginalttl >= rr->resrec.rroriginalttl/2 || m->SleepState)
9093 if (rr->ImmedAnswer == InterfaceID) { rr->ImmedAnswer = mDNSNULL; rr->ImmedUnicast = mDNSfalse; }
9097 if (rr->ImmedAnswer == mDNSNULL) { rr->ImmedAnswer = InterfaceID; m->NextScheduledResponse = m->timenow; }
9098 else if (rr->ImmedAnswer != InterfaceID) { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
9102 else if (m->rec.r.resrec.rroriginalttl > 0 && PacketRRConflict(m, rr, &m->rec.r))
9105 LogInfo("mDNSCoreReceiveResponse: Our Record: %08lX %s", rr->resrec.rdatahash, ARDisplayString(m, rr));
9109 if (rr->DependentOn)
9111 while (rr->DependentOn) rr = rr->DependentOn;
9112 LogInfo("mDNSCoreReceiveResponse: Dep Record: %08lX %s", rr->resrec.rdatahash, ARDisplayString(m, rr));
9116 if (rr->ProbeCount > DefaultProbeCountForTypeUnique)
9117 LogInfo("mDNSCoreReceiveResponse: Already reset to Probing: %s", ARDisplayString(m, rr));
9118 else if (rr->ProbeCount == DefaultProbeCountForTypeUnique)
9119 LogMsg("mDNSCoreReceiveResponse: Ignoring response received before we even began probing: %s", ARDisplayString(m, rr));
9124 if (rr->resrec.RecordType == kDNSRecordTypeVerified)
9126 LogMsg("mDNSCoreReceiveResponse: Resetting to Probing: %s", ARDisplayString(m, rr));
9127 rr->resrec.RecordType = kDNSRecordTypeUnique;
9132 rr->ProbeCount = DefaultProbeCountForTypeUnique + 1;
9133 rr->AnnounceCount = InitialAnnounceCount;
9134 InitializeLastAPTime(m, rr);
9135 RecordProbeFailure(m, rr); // Repeated late conflicts also cause us to back off to the slower probing rate
9138 else if (rr->resrec.RecordType == kDNSRecordTypeUnique)
9141 if (!mDNSCoreRegisteredProxyRecord(m, rr))
9143 LogMsg("mDNSCoreReceiveResponse: ProbeCount %d; will deregister %s", rr->ProbeCount, ARDisplayString(m, rr));
9146 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
9154 else if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique)
9156 LogMsg("mDNSCoreReceiveResponse: Unexpected conflict discarding %s", ARDisplayString(m, rr));
9158 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
9161 LogMsg("mDNSCoreReceiveResponse: Unexpected record type %X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
9168 else if (m->rec.r.resrec.rrtype == rr->resrec.rrtype)
9169 if ((m->rec.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) && m->timenow - rr->LastMCTime > mDNSPlatformOneSecond/2)
9170 { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
9190 CacheRecord *rr = mDNSNULL;
9202 rr = mDNSCoreReceiveCacheCheck(m, response, LLQType, slot, cg, unicastQuestion, &cfp, &NSECCachePtr, InterfaceID);
9211 if (!m->mDNSOppCaching && !rr && !myself && mDNSOpaque16IsZero(response->h.id))
9228 if (!rr && m->rec.r.resrec.rroriginalttl > 0)
9242 rr = CreateNewCacheEntry(m, slot, cg, delay, !nseclist, srcaddr);
9243 if (rr)
9245 rr->responseFlags = response->h.flags;
9249 if (rr->resrec.rrtype == kDNSType_RRSIG && !nseclist)
9255 rr->CRDNSSECQuestion = 0;
9258 LogInfo("mDNSCoreReceiveResponse: CRDNSSECQuestion set for new record %s, question %##s (%s)", CRDisplayString(m, rr),
9260 rr->CRDNSSECQuestion = 1;
9267 rr->TimeRcvd = m->timenow;
9268 *nsecp = rr;
9269 nsecp = &rr->next;
9273 *cfp = rr;
9274 cfp = &rr->NextInCFList;
9277 else if (rr->DelayDelivery)
9279 ScheduleNextCacheCheckTime(m, slot, rr->DelayDelivery);
9285 if (rr && rr->resrec.AnonInfo && m->rec.r.resrec.AnonInfo)
9287 CopyAnonInfoForCR(m, rr, &m->rec.r);
9510 AuthRecord *const rr = m->CurrentRecord;
9511 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering && mDNSSameEthAddress(&rr->WakeUp.HMAC, e))
9513 LogInfo("ScheduleWakeupForList: Scheduling wakeup packets for %s", ARDisplayString(m, rr));
9514 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
9516 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
9517 m->CurrentRecord = rr->next;
10131 AuthRecord *const rr = m->CurrentRecord;
10132 if (rr->resrec.InterfaceID == InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
10133 if (mDNSSameOpaque16(rr->updateid, msg->h.id))
10138 if (scopeid < (sizeof(rr->updateIntID) * mDNSNBBY))
10139 bit_clr_opaque64(rr->updateIntID, scopeid);
10140 if (mDNSOpaque64IsZero(&rr->updateIntID))
10141 rr->updateid = zeroID;
10142 rr->expire = NonZeroTime(m->timenow + updatelease * mDNSPlatformOneSecond);
10143 LogSPS("Sleep Proxy %s record %5d 0x%x 0x%x (%d) %s", rr->WakeUp.HMAC.l[0] ? "transferred" : "registered", updatelease, rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m,rr));
10144 if (rr->WakeUp.HMAC.l[0])
10146 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
10147 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
10148 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
10153 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
10154 m->CurrentRecord = rr->next;
10987 AuthRecord *rr;
11023 for (rr = m->ResourceRecords; rr; rr = rr->next)
11025 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
11027 LogInfo("ShouldSuppressDotLocalQuery: Found resource record %s for %##s (%s) not suppressing", ARDisplayString(m, rr),
11065 CacheRecord *rr;
11071 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11074 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative)
11077 CRDisplayString(m, rr), q, q->qname.c, DNSTypeName(q->qtype), rr->CRActiveQuestion, q->CurrentAnswers);
11081 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
11084 q->qname.c, CRDisplayString(m, rr), q->LOAddressAnswers);
11087 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
11088 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
11090 if (rr->CRActiveQuestion == q)
11099 if (qptr != q && ActiveQuestion(qptr) && ResourceRecordAnswersQuestion(&rr->resrec, qptr))
11105 qptr, CRDisplayString(m,rr), q->CurrentAnswers, qptr->CurrentAnswers, qptr->SuppressUnusable, qptr->SuppressQuery);
11107 rr->CRActiveQuestion = qptr; // Question used to be active; new value may or may not be null
11110 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_rmv);
11126 AuthRecord *rr;
11144 for (rr = ag->members; rr; rr=rr->next)
11146 if (UniqueLocalOnlyRecord(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
11149 ARDisplayString(m, rr));
11157 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_rmv); // MUST NOT dereference q again
11773 CacheRecord *rr;
11801 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11803 if (rr->CRActiveQuestion == question)
11809 if (ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
11813 "CurrentAnswers %d, SuppressQuery %d", q, CRDisplayString(m,rr), question->CurrentAnswers, q->CurrentAnswers, q->SuppressQuery);
11814 rr->CRActiveQuestion = q; // Question used to be active; new value may or may not be null
11954 const CacheRecord *rr;
11958 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11959 if (rr->resrec.RecordType != kDNSRecordTypePacketNegative && SameNameRecordAnswersQuestion(&rr->resrec, question))
11963 question->QuestionCallback(m, question, &rr->resrec, QC_rmv);
11980 mDNSexport mStatus mDNS_ReconfirmByValue(mDNS *const m, ResourceRecord *const rr)
11985 cr = FindIdenticalRecordInCache(m, rr);
11986 debugf("mDNS_ReconfirmByValue: %p %s", cr, RRDisplayString(m, rr));
12383 mDNSexport mStatus mDNS_Register(mDNS *const m, AuthRecord *const rr)
12387 status = mDNS_Register_internal(m, rr);
12392 mDNSexport mStatus mDNS_Update(mDNS *const m, AuthRecord *const rr, mDNSu32 newttl,
12395 if (!ValidateRData(rr->resrec.rrtype, newrdlength, newrdata))
12397 LogMsg("Attempt to update record with invalid rdata: %s", GetRRDisplayString_rdb(&rr->resrec, &newrdata->u, m->MsgBuffer));
12404 if (newttl == 0) newttl = rr->resrec.rroriginalttl;
12407 if (rr->NewRData)
12409 RData *n = rr->NewRData;
12410 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
12411 if (rr->UpdateCallback)
12412 rr->UpdateCallback(m, rr, n, rr->newrdlength); // ...and let the client free this memory, if necessary
12415 rr->NewRData = newrdata;
12416 rr->newrdlength = newrdlength;
12417 rr->UpdateCallback = Callback;
12420 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P && !IsLocalDomain(rr->resrec.name))
12422 mStatus status = uDNS_UpdateRecord(m, rr);
12424 if (status != mStatus_NoError) { rr->NewRData = mDNSNULL; rr->newrdlength = 0; }
12430 if (RRLocalOnly(rr) || (rr->resrec.rroriginalttl == newttl &&
12431 rr->resrec.rdlength == newrdlength && mDNSPlatformMemSame(rr->resrec.rdata->u.data, newrdata->u.data, newrdlength)))
12432 CompleteRDataUpdate(m, rr);
12435 rr->AnnounceCount = InitialAnnounceCount;
12436 InitializeLastAPTime(m, rr);
12437 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
12438 if (!rr->UpdateBlocked && rr->UpdateCredits) rr->UpdateCredits--;
12439 if (!rr->NextUpdateCredit) rr->NextUpdateCredit = NonZeroTime(m->timenow + kUpdateCreditRefreshInterval);
12440 if (rr->AnnounceCount > rr->UpdateCredits + 1) rr->AnnounceCount = (mDNSu8)(rr->UpdateCredits + 1);
12441 if (rr->UpdateCredits <= 5)
12443 mDNSu32 delay = 6 - rr->UpdateCredits; // Delay 1 second, then 2, then 3, etc. up to 6 seconds maximum
12444 if (!rr->UpdateBlocked) rr->UpdateBlocked = NonZeroTime(m->timenow + (mDNSs32)delay * mDNSPlatformOneSecond);
12445 rr->ThisAPInterval *= 4;
12446 rr->LastAPTime = rr->UpdateBlocked - rr->ThisAPInterval;
12448 rr->resrec.name->c, delay, delay > 1 ? "s" : "");
12450 rr->resrec.rroriginalttl = newttl;
12460 mDNSexport mStatus mDNS_Deregister(mDNS *const m, AuthRecord *const rr)
12464 status = mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
12470 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
12636 AuthRecord *rr;
12659 for (rr = m->ResourceRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
12660 for (rr = m->DuplicateRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
12665 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
12667 (void)rr; // Unused parameter
12674 debugf("mDNS_HostNameCallback: %##s (%s) %s (%ld)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
12710 LogMsg("mDNS_HostNameCallback: Unknown error %d for registration of record %s", result, rr->resrec.name->c);
12728 AuthRecord *rr;
12730 for (rr = m->ResourceRecords; rr; rr=rr->next)
12731 if (AuthRecord_uDNS(rr) && rr->state != regState_NoTarget)
12733 debugf("RestartRecordGetZoneData: StartGetZoneData for %##s", rr->resrec.name->c);
12736 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
12737 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
12808 AuthRecord *rr;
12945 for (rr = m->ResourceRecords; rr; rr=rr->next)
12947 if (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == set->InterfaceID)
12950 ReInitAnonInfo(&rr->resrec.AnonInfo, rr->resrec.name);
12951 mDNSCoreRestartRegistration(m, rr, numannounce);
13020 CacheRecord *rr;
13048 FORALL_CACHERECORDS(slot, cg, rr)
13050 if (rr->resrec.InterfaceID == set->InterfaceID)
13057 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
13060 rr->UnansweredQueries = MaxUnansweredQueries;
13064 mDNS_PurgeCacheResourceRecord(m, rr);
13082 CacheRecord *rr;
13083 FORALL_CACHERECORDS(slot, cg, rr)
13084 if (rr->resrec.InterfaceID == set->InterfaceID)
13085 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
13139 mDNSlocal void ServiceCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
13141 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
13150 debugf("ServiceCallback: %##s (%s) %s (%d)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
13155 if (result == mStatus_NoError && rr != &sr->RR_SRV) return;
13199 mDNSlocal void NSSCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
13201 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
13541 mDNSexport mStatus mDNS_RegisterNoSuchService(mDNS *const m, AuthRecord *const rr,
13550 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_SRV, kHostNameTTL, kDNSRecordTypeUnique, artype, Callback, Context);
13551 if (ConstructServiceName(&rr->namestorage, name, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
13552 rr->resrec.rdata->u.srv.priority = 0;
13553 rr->resrec.rdata->u.srv.weight = 0;
13554 rr->resrec.rdata->u.srv.port = zeroIPPort;
13555 if (host && host->c[0]) AssignDomainName(&rr->resrec.rdata->u.srv.target, host);
13556 else rr->AutoTarget = Target_AutoHost;
13557 return(mDNS_Register(m, rr));
13560 mDNSexport mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr,
13571 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_PTR, kStandardTTL, kDNSRecordTypeShared, artype, mDNSNULL, mDNSNULL);
13572 if (!MakeDomainNameFromDNSNameString(&rr->namestorage, mDNS_DomainTypeNames[DomainType])) return(mStatus_BadParamErr);
13573 if (!MakeDomainNameFromDNSNameString(&rr->resrec.rdata->u.name, domname)) return(mStatus_BadParamErr);
13574 return(mDNS_Register(m, rr));
13613 mDNSlocal void RestartARPProbing(mDNS *const m, AuthRecord *const rr)
13619 // generating ARP conflicts with a waking machine, and set rr->LastAPTime so we'll start probing again in 10 seconds.
13625 rr->resrec.RecordType = kDNSRecordTypeUnique;
13626 rr->ProbeCount = DefaultProbeCountForTypeUnique;
13627 rr->ProbeRestartCount++;
13630 // still going to sleep, so we just reset rr->ProbeCount so we'll continue probing until it stops responding.
13635 if (rr->AnnounceCount == InitialAnnounceCount && m->timenow - rr->LastAPTime >= 0)
13636 InitializeLastAPTime(m, rr);
13639 rr->AnnounceCount = InitialAnnounceCount;
13640 rr->ThisAPInterval = mDNSPlatformOneSecond;
13641 rr->LastAPTime = m->timenow + mDNSPlatformOneSecond * 9; // Send first packet at rr->LastAPTime + rr->ThisAPInterval, i.e. 10 seconds from now
13642 SetNextAnnounceProbeTime(m, rr);
13649 AuthRecord *rr;
13665 for (rr = m->ResourceRecords; rr; rr=rr->next)
13666 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13667 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->tpa))
13673 const char *const msg = mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC) ? msg1 :
13674 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
13677 intf->ifname, msg, &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13680 if ( rr->ProbeRestartCount < MAX_PROBE_RESTARTS)
13681 RestartARPProbing(m, rr);
13683 LogSPS("Reached maximum number of restarts for probing - %s", ARDisplayString(m,rr));
13687 mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
13691 SendARP(m, 2, rr, &arp->tpa, &arp->sha, &arp->spa, &arp->sha);
13709 for (rr = m->ResourceRecords; rr; rr=rr->next)
13710 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13711 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->spa) && (rr->ProbeRestartCount < MAX_PROBE_RESTARTS))
13713 if (mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
13716 &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13720 RestartARPProbing(m, rr);
13721 if (mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC))
13725 &arp->sha, &arp->spa, &arp->tpa, ARDisplayString(m, rr));
13730 &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13731 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
13759 AuthRecord *rr;
13770 for (rr = m->ResourceRecords; rr; rr=rr->next)
13771 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13772 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, ndp->target))
13779 const char *const msg = sha && mDNSSameEthAddress(sha, &rr->WakeUp.IMAC) ? msg1 :
13780 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
13784 intf->ifname, msg, sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13787 if (rr->ProbeRestartCount < MAX_PROBE_RESTARTS)
13788 RestartARPProbing(m, rr);
13790 LogSPS("Reached maximum number of restarts for probing - %s", ARDisplayString(m,rr));
13793 mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
13795 SendNDP(m, NDP_Adv, NDP_Solicited, rr, &ndp->target, mDNSNULL, spa, sha);
13797 SendNDP(m, NDP_Adv, 0, rr, &ndp->target, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
13812 for (rr = m->ResourceRecords; rr; rr=rr->next)
13813 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13814 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, *spa) && (rr->ProbeRestartCount < MAX_PROBE_RESTARTS))
13816 if (mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
13819 sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13823 RestartARPProbing(m, rr);
13824 if (mDNSSameEthAddress(sha, &rr->WakeUp.IMAC))
13827 ndp->type == NDP_Sol ? "Solicitation " : "Advertisement", sha, spa, &ndp->target, ARDisplayString(m, rr));
13832 sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13833 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
13993 AuthRecord *rr, *r2;
13996 for (rr = m->ResourceRecords; rr; rr=rr->next)
13997 if (rr->resrec.InterfaceID == InterfaceID &&
13998 rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13999 rr->AddressProxy.type && mDNSSameAddress(&rr->AddressProxy, dst))
14003 if (r2->resrec.InterfaceID == InterfaceID && mDNSSameEthAddress(&r2->WakeUp.HMAC, &rr->WakeUp.HMAC) &&
14008 if (!r2 && mDNSSameIPPort(port, IPSECPort)) r2 = rr; // So that we wake for BTMM IPSEC packets, even without a matching SRV record
14009 if (!r2 && kaWake) r2 = rr; // So that we wake for keepalive packets, even without a matching SRV record
14013 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, r2));
14014 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
14018 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, tp, mDNSVal16(port));
14402 mDNSlocal void DynDNSHostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
14405 debugf("NameStatusCallback: result %d for registration of name %##s", result, rr->resrec.name->c);
14406 mDNSPlatformDynDNSHostNameStatusChanged(rr->resrec.name, result);
14926 AuthRecord *rr = m->CurrentRecord;
14928 (rr->resrec.RecordType != kDNSRecordTypeDeregistering) ? "Initiating " : "Accelerating",
14929 rr, rr->resrec.RecordType, ARDisplayString(m, rr));
14930 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
14931 mDNS_Deregister_internal(m, rr, mDNS_Dereg_rapid);
14932 else if (rr->AnnounceCount > 1)
14934 rr->AnnounceCount = 1;
14935 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
14939 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
14940 m->CurrentRecord = rr->next;
14947 AuthRecord *rr;
15034 for (rr = m->DuplicateRecords; rr; rr = rr->next)
15035 LogMsg("mDNS_StartExit: Should not still have Duplicate Records remaining: %02X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
15049 AuthRecord *rr;
15074 for (rr = m->ResourceRecords; rr; rr = rr->next)
15075 LogMsg("mDNS_FinalExit failed to send goodbye for: %p %02X %s", rr, rr->resrec.RecordType, ARDisplayString(m, rr));