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

Lines Matching refs: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);
470 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, selfref ? " (Self-Referential)" : "", RRDisplayString(m, rr));
507 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, RRDisplayString(m, rr));
510 AssignDomainName(&q->qname, &rr->rdata->u.name); // Update qname
518 q, q->qname.c, DNSTypeName(q->qtype), RRDisplayString(m, rr));
538 mDNSlocal void AnswerLocalQuestionWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
545 LogMsg("AnswerLocalQuestionWithLocalAuthRecord: ERROR!! CurrentQuestion NULL while answering with %s", ARDisplayString(m, rr));
549 followcname = FollowCNAME(q, &rr->resrec, AddRecord);
552 if (!(rr->resrec.RecordType & kDNSRecordTypeActiveMask))
555 AddRecord ? "Add" : "Rmv", rr->resrec.RecordType, ARDisplayString(m, rr));
560 if (AddRecord) rr->AnsweredLocalQ = mDNStrue;
565 if (UniqueLocalOnlyRecord(rr))
572 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
578 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
583 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
589 mDNSlocal void AnswerInterfaceAnyQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
599 if (RRAny(rr))
600 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
602 answered = LocalOnlyRecordAnswersQuestion(rr, q);
604 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
622 mDNSlocal void AnswerAllLocalQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
634 if (RRAny(rr))
635 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
637 answered = LocalOnlyRecordAnswersQuestion(rr, q);
639 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
647 if (rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P)
648 AnswerInterfaceAnyQuestionsWithLocalAuthRecord(m, rr, AddRecord);
767 // AuthRecord *rr is the answer we are proposing to give, if not suppressed.
772 mDNSlocal mDNSBool ShouldSuppressKnownAnswer(const CacheRecord *const ka, const AuthRecord *const rr)
775 if (!IdenticalResourceRecord(&ka->resrec, &rr->resrec)) return(mDNSfalse);
786 return (mDNSBool)(ka->resrec.rroriginalttl >= rr->resrec.rroriginalttl / 2);
789 mDNSlocal void SetNextAnnounceProbeTime(mDNS *const m, const AuthRecord *const rr)
791 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
793 if ((rr->LastAPTime + rr->ThisAPInterval) - m->timenow > mDNSPlatformOneSecond * 10)
795 LogMsg("SetNextAnnounceProbeTime: ProbeCount %d Next in %d %s", rr->ProbeCount, (rr->LastAPTime + rr->ThisAPInterval) - m->timenow, ARDisplayString(m, rr));
798 if (m->NextScheduledProbe - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
799 m->NextScheduledProbe = (rr->LastAPTime + rr->ThisAPInterval);
801 // If (rr->LastAPTime + rr->ThisAPInterval) happens to be far in the past, we don't want to allow
807 else if (rr->AnnounceCount && (ResourceRecordIsValidAnswer(rr) || rr->resrec.RecordType == kDNSRecordTypeDeregistering))
809 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
810 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
814 mDNSlocal void InitializeLastAPTime(mDNS *const m, AuthRecord *const rr)
817 rr->ThisAPInterval = rr->AddressProxy.type ? mDNSPlatformOneSecond : DefaultAPIntervalForRecordType(rr->resrec.RecordType);
830 if (rr->ProbeCount)
870 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval;
873 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval + DefaultProbeIntervalForTypeUnique * DefaultProbeCountForTypeUnique + rr->ThisAPInterval / 2;
875 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
883 if (rr->AddressProxy.type)
884 rr->LastAPTime = m->timenow;
888 rr->LastMCTime = m->timenow;
889 rr->LastMCInterface = mDNSInterfaceMark;
891 SetNextAnnounceProbeTime(m, rr);
894 mDNSlocal const domainname *SetUnicastTargetToHostName(mDNS *const m, AuthRecord *rr)
897 if (rr->AutoTarget)
902 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
903 if (!AuthInfo || !AuthInfo->AutoTunnel) rr->AutoTarget = Target_AutoHostAndNATMAP;
906 target = GetServiceTarget(m, rr);
910 LogInfo("SetUnicastTargetToHostName No target for %s", ARDisplayString(m, rr));
911 rr->state = regState_NoTarget;
916 LogInfo("SetUnicastTargetToHostName target %##s for resource record %s", target->c, ARDisplayString(m,rr));
923 mDNSlocal void SetTargetToHostName(mDNS *const m, AuthRecord *const rr)
925 domainname *const target = GetRRDomainNameTarget(&rr->resrec);
928 if (!target) LogInfo("SetTargetToHostName: Don't know how to set the target of rrtype %s", DNSTypeName(rr->resrec.rrtype));
930 if (!(rr->ForceMCast || rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P || IsLocalDomain(&rr->namestorage)))
932 const domainname *const n = SetUnicastTargetToHostName(m, rr);
934 else { target->c[0] = 0; SetNewRData(&rr->resrec, mDNSNULL, 0); return; }
938 debugf("SetTargetToHostName: Target of %##s is already %##s", rr->resrec.name->c, target->c);
943 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
948 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
953 if (rr->RequireGoodbye && rr->resrec.RecordType == kDNSRecordTypeShared)
955 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
957 rr->AnnounceCount = InitialAnnounceCount;
958 rr->RequireGoodbye = mDNSfalse;
959 rr->ProbeRestartCount = 0;
960 InitializeLastAPTime(m, rr);
964 mDNSlocal void AcknowledgeRecord(mDNS *const m, AuthRecord *const rr)
966 if (rr->RecordCallback)
968 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
970 rr->Acknowledged = mDNStrue;
972 rr->RecordCallback(m, rr, mStatus_NoError);
977 mDNSexport void ActivateUnicastRegistration(mDNS *const m, AuthRecord *const rr)
983 if (rr->resrec.rrtype != kDNSType_SRV)
986 if (rr->resrec.rrtype == kDNSType_PTR)
987 srvRR = rr->Additional1;
988 else if (rr->resrec.rrtype == kDNSType_TXT)
989 srvRR = rr->DependentOn;
999 ARDisplayString(m, srvRR), srvRR->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1000 rr->state = srvRR->state;
1005 if (rr->state == regState_NoTarget)
1007 LogInfo("ActivateUnicastRegistration record %s in regState_NoTarget, not activating", ARDisplayString(m, rr));
1015 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
1017 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to DeregPending", ARDisplayString(m, rr), rr->state);
1018 rr->state = regState_DeregPending;
1022 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to Pending", ARDisplayString(m, rr), rr->state);
1023 rr->state = regState_Pending;
1025 rr->ProbeCount = 0;
1026 rr->ProbeRestartCount = 0;
1027 rr->AnnounceCount = 0;
1028 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
1029 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
1030 rr->expire = 0; // Forget about all the leases, start fresh
1031 rr->uselease = mDNStrue;
1032 rr->updateid = zeroID;
1033 rr->SRVChanged = mDNSfalse;
1034 rr->updateError = mStatus_NoError;
1037 if (rr->NATinfo.clientContext)
1039 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1040 rr->NATinfo.clientContext = mDNSNULL;
1042 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
1043 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1044 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
1045 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
1059 mDNSlocal AuthRecord *CheckAuthIdenticalRecord(AuthHash *r, AuthRecord *rr)
1064 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1066 a = AuthGroupForRecord(r, slot, &rr->resrec);
1071 if (!RecordIsLocalDuplicate(*rp, rr))
1086 mDNSlocal mDNSBool CheckAuthRecordConflict(AuthHash *r, AuthRecord *rr)
1091 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1093 a = AuthGroupForRecord(r, slot, &rr->resrec);
1098 const AuthRecord *s1 = rr->RRSet ? rr->RRSet : rr;
1100 if (s1 != s2 && SameResourceRecordSignature((*rp), rr) && !IdenticalSameNameRecord(&(*rp)->resrec, &rr->resrec))
1108 // checks to see if "rr" is already present
1109 mDNSlocal AuthRecord *CheckAuthSameRecord(AuthHash *r, AuthRecord *rr)
1114 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1116 a = AuthGroupForRecord(r, slot, &rr->resrec);
1121 if (*rp != rr)
1132 mDNSlocal void DecrementAutoTargetServices(mDNS *const m, AuthRecord *const rr)
1134 if (!AuthRecord_uDNS(rr) && rr->resrec.rrtype == kDNSType_SRV && rr->AutoTarget == Target_AutoHost)
1137 LogInfo("DecrementAutoTargetServices: AutoService Record %s, AutoTargetServices %d", ARDisplayString(m, rr), m->AutoTargetServices);
1143 mDNSlocal void IncrementAutoTargetServices(mDNS *const m, AuthRecord *const rr)
1145 if (!AuthRecord_uDNS(rr) && rr->resrec.rrtype == kDNSType_SRV && rr->AutoTarget == Target_AutoHost)
1152 LogInfo("IncrementAutoTargetServices: AutoService Record %s, AutoTargetServices %d", ARDisplayString(m, rr), m->AutoTargetServices);
1158 mDNSlocal void getKeepaliveRaddr(mDNS *const m, AuthRecord *rr, mDNSAddr *raddr)
1166 if (mDNS_KeepaliveRecord(&rr->resrec))
1168 mDNS_ExtractKeepaliveInfo(rr, &timeout, &laddr, raddr, &eth, &seq, &ack, &lport, &rport, &win);
1171 LogMsg("getKeepaliveRaddr: not a valid record %s for keepalive %#a:%d %#a:%d", ARDisplayString(m, rr), &laddr, lport.NotAnInteger, raddr, rport.NotAnInteger);
1178 mDNSexport mStatus mDNS_Register_internal(mDNS *const m, AuthRecord *const rr)
1180 domainname *target = GetRRDomainNameTarget(&rr->resrec);
1185 if ((mDNSs32)rr->resrec.rroriginalttl <= 0)
1186 { LogMsg("mDNS_Register_internal: TTL %X should be 1 - 0x7FFFFFFF %s", rr->resrec.rroriginalttl, ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1188 if (!rr->resrec.RecordType)
1189 { LogMsg("mDNS_Register_internal: RecordType must be non-zero %s", ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1192 { LogMsg("mDNS_Register_internal: Shutting down, can't register %s", ARDisplayString(m, rr)); return(mStatus_ServiceNotRunning); }
1194 if (m->DivertMulticastAdvertisements && !AuthRecord_uDNS(rr))
1196 mDNSInterfaceID previousID = rr->resrec.InterfaceID;
1197 if (rr->resrec.InterfaceID == mDNSInterface_Any || rr->resrec.InterfaceID == mDNSInterface_P2P)
1199 rr->resrec.InterfaceID = mDNSInterface_LocalOnly;
1200 rr->ARType = AuthRecordLocalOnly;
1202 if (rr->resrec.InterfaceID != mDNSInterface_LocalOnly)
1204 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1205 if (intf && !intf->Advertise) { rr->resrec.InterfaceID = mDNSInterface_LocalOnly; rr->ARType = AuthRecordLocalOnly; }
1207 if (rr->resrec.InterfaceID != previousID)
1208 LogInfo("mDNS_Register_internal: Diverting record to local-only %s", ARDisplayString(m, rr));
1211 if (RRLocalOnly(rr))
1213 if (CheckAuthSameRecord(&m->rrauth, rr))
1216 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1222 while (*p && *p != rr) p=&(*p)->next;
1226 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1231 while (*d && *d != rr) d=&(*d)->next;
1235 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1239 if (rr->DependentOn)
1241 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
1242 rr->resrec.RecordType = kDNSRecordTypeVerified;
1245 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn && RecordType != kDNSRecordTypeUnique",
1246 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1249 if (!(rr->DependentOn->resrec.RecordType & (kDNSRecordTypeUnique | kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique)))
1251 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn->RecordType bad type %X",
1252 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->DependentOn->resrec.RecordType);
1260 if (rr->resrec.InterfaceID && rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P)
1262 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1265 debugf("mDNS_Register_internal: Bogus InterfaceID %p in resource record", rr->resrec.InterfaceID);
1270 rr->next = mDNSNULL;
1276 // rr->Additional1 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1277 // rr->Additional2 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1278 // rr->DependentOn = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1279 // rr->RRSet = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1280 // rr->Callback = already set in mDNS_SetupResourceRecord
1281 // rr->Context = already set in mDNS_SetupResourceRecord
1282 // rr->RecordType = already set in mDNS_SetupResourceRecord
1283 // rr->HostTarget = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1284 // rr->AllowRemoteQuery = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1286 if (rr->AutoTarget && target) target->c[0] = 0;
1289 rr->Acknowledged = mDNSfalse;
1290 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
1291 rr->ProbeRestartCount = 0;
1292 rr->AnnounceCount = InitialAnnounceCount;
1293 rr->RequireGoodbye = mDNSfalse;
1294 rr->AnsweredLocalQ = mDNSfalse;
1295 rr->IncludeInProbe = mDNSfalse;
1296 rr->ImmedUnicast = mDNSfalse;
1297 rr->SendNSECNow = mDNSNULL;
1298 rr->ImmedAnswer = mDNSNULL;
1299 rr->ImmedAdditional = mDNSNULL;
1300 rr->SendRNow = mDNSNULL;
1301 rr->v4Requester = zerov4Addr;
1302 rr->v6Requester = zerov6Addr;
1303 rr->NextResponse = mDNSNULL;
1304 rr->NR_AnswerTo = mDNSNULL;
1305 rr->NR_AdditionalTo = mDNSNULL;
1306 if (!rr->AutoTarget) InitializeLastAPTime(m, rr);
1307 // rr->LastAPTime = Set for us in InitializeLastAPTime()
1308 // rr->LastMCTime = Set for us in InitializeLastAPTime()
1309 // rr->LastMCInterface = Set for us in InitializeLastAPTime()
1310 rr->NewRData = mDNSNULL;
1311 rr->newrdlength = 0;
1312 rr->UpdateCallback = mDNSNULL;
1313 rr->UpdateCredits = kMaxUpdateCredits;
1314 rr->NextUpdateCredit = 0;
1315 rr->UpdateBlocked = 0;
1318 if (rr->WakeUp.HMAC.l[0] && !rr->AddressProxy.type) rr->AnnounceCount = 2;
1321 rr->state = regState_Zero;
1322 rr->uselease = 0;
1323 rr->expire = 0;
1324 rr->Private = 0;
1325 rr->updateid = zeroID;
1326 rr->updateIntID = zeroOpaque64;
1327 rr->zone = rr->resrec.name;
1328 rr->nta = mDNSNULL;
1329 rr->tcp = mDNSNULL;
1330 rr->OrigRData = 0;
1331 rr->OrigRDLen = 0;
1332 rr->InFlightRData = 0;
1333 rr->InFlightRDLen = 0;
1334 rr->QueuedRData = 0;
1335 rr->QueuedRDLen = 0;
1336 //mDNSPlatformMemZero(&rr->NATinfo, sizeof(rr->NATinfo));
1340 //if (rr->resrec.rrtype == kDNSType_SRV) rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
1342 // rr->resrec.interface = already set in mDNS_SetupResourceRecord
1343 // rr->resrec.name->c = MUST be set by client
1344 // rr->resrec.rrtype = already set in mDNS_SetupResourceRecord
1345 // rr->resrec.rrclass = already set in mDNS_SetupResourceRecord
1346 // rr->resrec.rroriginalttl = already set in mDNS_SetupResourceRecord
1347 // rr->resrec.rdata = MUST be set by client, unless record type is CNAME or PTR and rr->HostTarget is set
1352 if (rr->resrec.rrtype == kDNSType_TXT && rr->resrec.rdlength == 0) { rr->resrec.rdlength = 1; rr->resrec.rdata->u.txt.c[0] = 0; }
1354 if (rr->AutoTarget)
1356 SetTargetToHostName(m, rr); // Also sets rdlength and rdestimate for us, and calls InitializeLastAPTime();
1358 // If we have no target record yet, SetTargetToHostName will set rr->state == regState_NoTarget
1360 if (rr->state == regState_NoTarget)
1363 domainname *tar = GetRRDomainNameTarget(&rr->resrec);
1365 LogInfo("mDNS_Register_internal: record %s in NoTarget state", ARDisplayString(m, rr));
1371 rr->resrec.rdlength = GetRDLength(&rr->resrec, mDNSfalse);
1372 rr->resrec.rdestimate = GetRDLength(&rr->resrec, mDNStrue);
1375 if (!ValidateDomainName(rr->resrec.name))
1376 { LogMsg("Attempt to register record with invalid name: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1378 // Don't do this until *after* we've set rr->resrec.rdlength
1379 if (!ValidateRData(rr->resrec.rrtype, rr->resrec.rdlength, rr->resrec.rdata))
1380 { LogMsg("Attempt to register record with invalid rdata: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1382 rr->resrec.namehash = DomainNameHashValue(rr->resrec.name);
1383 rr->resrec.rdatahash = target ? DomainNameHashValue(target) : RDataHashValue(&rr->resrec);
1385 if (RRLocalOnly(rr))
1392 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1394 if (CheckAuthRecordConflict(&m->rrauth, rr))
1396 LogInfo("mDNS_Register_internal: Name conflict %s (%p), InterfaceID %p", ARDisplayString(m, rr), rr, rr->resrec.InterfaceID);
1404 if (AuthRecord_uDNS(rr))
1406 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1411 *p = rr;
1412 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1413 rr->ProbeCount = 0;
1414 rr->ProbeRestartCount = 0;
1415 rr->AnnounceCount = 0;
1416 if (rr->state != regState_NoTarget) ActivateUnicastRegistration(m, rr);
1422 if (RRLocalOnly(rr))
1424 rr->ProbeCount = 0;
1425 rr->ProbeRestartCount = 0;
1426 rr->AnnounceCount = 0;
1427 r = CheckAuthIdenticalRecord(&m->rrauth, rr);
1432 if (RecordIsLocalDuplicate(r, rr))
1441 debugf("mDNS_Register_internal:Adding to duplicate list %s", ARDisplayString(m,rr));
1442 *d = rr;
1447 if (rr->resrec.RecordType == kDNSRecordTypeUnique && r->resrec.RecordType == kDNSRecordTypeVerified)
1448 rr->ProbeCount = 0;
1452 debugf("mDNS_Register_internal: Adding to active record list %s", ARDisplayString(m,rr));
1453 if (RRLocalOnly(rr))
1456 ag = InsertAuthRecord(m, &m->rrauth, rr);
1459 ag->NewLocalOnlyRecords = rr;
1462 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1463 AcknowledgeRecord(m, rr);
1468 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1469 *p = rr;
1475 if (mDNS_KeepaliveRecord(&rr->resrec))
1479 rr->resrec.RecordType = kDNSRecordTypeKnownUnique;
1480 rr->AnnounceCount = 0;
1482 getKeepaliveRaddr(m, rr, &raddr);
1488 if (!AuthRecord_uDNS(rr)) // This check is superfluous, given that for unicast records we (currently) bail out above
1491 IncrementAutoTargetServices(m, rr);
1493 if (rr->resrec.RecordType != kDNSRecordTypeUnique && rr->resrec.RecordType != kDNSRecordTypeDeregistering)
1494 AcknowledgeRecord(m, rr);
1503 mDNSlocal void RecordProbeFailure(mDNS *const m, const AuthRecord *const rr)
1518 m->NumFailedProbes, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1522 mDNSlocal void CompleteRDataUpdate(mDNS *const m, AuthRecord *const rr)
1524 RData *OldRData = rr->resrec.rdata;
1525 mDNSu16 OldRDLen = rr->resrec.rdlength;
1526 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength); // Update our rdata
1527 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
1528 if (rr->UpdateCallback)
1529 rr->UpdateCallback(m, rr, OldRData, OldRDLen); // ... and let the client know
1535 mDNSexport mStatus mDNS_Deregister_internal(mDNS *const m, AuthRecord *const rr, mDNS_Dereg_type drt)
1538 mDNSu8 RecordType = rr->resrec.RecordType;
1542 if (RRLocalOnly(rr))
1547 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1549 a = AuthGroupForRecord(&m->rrauth, slot, &rr->resrec);
1552 while (*rp && *rp != rr) rp=&(*rp)->next;
1557 while (*p && *p != rr) p=&(*p)->next;
1565 // Scan for duplicates of rr, and mark them for deregistration at the end of this routine, after we've finished
1566 // deregistering rr. We need to do this scan *before* we give the client the chance to free and reuse the rr memory.
1567 for (r2 = m->DuplicateRecords; r2; r2=r2->next) if (RecordIsLocalDuplicate(r2, rr)) r2->ProbeCount = 0xFF;
1574 while (*d && !RecordIsLocalDuplicate(*d, rr)) d=&(*d)->next;
1579 dup, rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1581 if (RRLocalOnly(rr))
1588 dup->next = rr->next; // And then...
1589 rr->next = dup; // ... splice it in right after the record we're about to delete
1591 dup->resrec.RecordType = rr->resrec.RecordType;
1592 dup->ProbeCount = rr->ProbeCount;
1593 dup->ProbeRestartCount = rr->ProbeRestartCount;
1594 dup->AnnounceCount = rr->AnnounceCount;
1595 dup->RequireGoodbye = rr->RequireGoodbye;
1596 dup->AnsweredLocalQ = rr->AnsweredLocalQ;
1597 dup->ImmedAnswer = rr->ImmedAnswer;
1598 dup->ImmedUnicast = rr->ImmedUnicast;
1599 dup->ImmedAdditional = rr->ImmedAdditional;
1600 dup->v4Requester = rr->v4Requester;
1601 dup->v6Requester = rr->v6Requester;
1602 dup->ThisAPInterval = rr->ThisAPInterval;
1603 dup->LastAPTime = rr->LastAPTime;
1604 dup->LastMCTime = rr->LastMCTime;
1605 dup->LastMCInterface = rr->LastMCInterface;
1606 dup->Private = rr->Private;
1607 dup->state = rr->state;
1608 rr->RequireGoodbye = mDNSfalse;
1609 rr->AnsweredLocalQ = mDNSfalse;
1617 while (*p && *p != rr) p=&(*p)->next;
1627 rr->WakeUp.HMAC = zeroEthAddr;
1628 rr->RequireGoodbye = mDNSfalse;
1629 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1633 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1640 LogMsg("mDNS_Deregister_internal: Record %p not found in list %s", rr, ARDisplayString(m,rr));
1648 // it's tempting to just do "AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse)" here, but that would not not be safe.
1659 if (AuthRecord_uDNS(rr))
1661 if (rr->RequireGoodbye)
1663 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1664 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1666 uDNS_DeregisterRecord(m, rr);
1676 rr->updateid = zeroID;
1685 if (rr->NATinfo.clientContext)
1687 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1688 rr->NATinfo.clientContext = mDNSNULL;
1690 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
1691 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1696 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeUnregistered", ARDisplayString(m, rr));
1699 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeDeregistering", ARDisplayString(m, rr));
1709 if (rr->WakeUp.HMAC.l[0] ||
1710 (RecordType == kDNSRecordTypeShared && (rr->RequireGoodbye || rr->AnsweredLocalQ)))
1712 verbosedebugf("mDNS_Deregister_internal: Starting deregistration for %s", ARDisplayString(m, rr));
1713 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1714 rr->resrec.rroriginalttl = 0;
1715 rr->AnnounceCount = rr->WakeUp.HMAC.l[0] ? WakeupCount : (drt == mDNS_Dereg_rapid) ? 1 : GoodbyeCount;
1716 rr->ThisAPInterval = mDNSPlatformOneSecond * 2;
1717 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
1724 if (!dupList && RRLocalOnly(rr))
1726 AuthGroup *ag = RemoveAuthRecord(m, &m->rrauth, rr);
1727 if (ag->NewLocalOnlyRecords == rr) ag->NewLocalOnlyRecords = rr->next;
1731 *p = rr->next; // Cut this record from the list
1732 if (m->NewLocalRecords == rr) m->NewLocalRecords = rr->next;
1733 DecrementAutoTargetServices(m, rr);
1736 if (m->CurrentRecord == rr) m->CurrentRecord = rr->next;
1737 rr->next = mDNSNULL;
1741 // if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse); rr->AnsweredLocalQ = mDNSfalse; }
1743 verbosedebugf("mDNS_Deregister_internal: Deleting record for %s", ARDisplayString(m, rr));
1744 rr->resrec.RecordType = kDNSRecordTypeUnregistered;
1748 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1751 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
1754 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
1757 // so any attempt to touch rr after this is likely to lead to a crash.
1761 LogInfo("mDNS_Deregister_internal: mStatus_MemFree for %s", ARDisplayString(m, rr));
1762 if (rr->RecordCallback)
1763 rr->RecordCallback(m, rr, mStatus_MemFree); // MUST NOT touch rr after this
1768 RecordProbeFailure(m, rr);
1770 if (rr->RecordCallback)
1771 rr->RecordCallback(m, rr, mStatus_NameConflict); // MUST NOT touch rr after this
1773 // Now that we've finished deregistering rr, check our DuplicateRecords list for any that we marked previously.
1803 mDNSlocal void AddRecordToResponseList(AuthRecord ***nrpp, AuthRecord *rr, AuthRecord *add)
1805 if (rr->NextResponse == mDNSNULL && *nrpp != &rr->NextResponse)
1807 **nrpp = rr;
1812 rr->NR_AdditionalTo = add;
1813 *nrpp = &rr->NextResponse;
1815 debugf("AddRecordToResponseList: %##s (%s) already in list", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1820 AuthRecord *rr, *rr2;
1821 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // For each record we plan to put
1825 if (rr->Additional1 && ResourceRecordIsValidInterfaceAnswer(rr->Additional1, InterfaceID))
1826 AddRecordToResponseList(nrpp, rr->Additional1, rr);
1828 if (rr->Additional2 && ResourceRecordIsValidInterfaceAnswer(rr->Additional2, InterfaceID))
1829 AddRecordToResponseList(nrpp, rr->Additional2, rr);
1832 if (rr->resrec.rrtype == kDNSType_SRV)
1837 rr->resrec.rdatahash == rr2->resrec.namehash && // ... whose name is the name of the SRV target
1838 SameDomainName(&rr->resrec.rdata->u.srv.target, rr2->resrec.name))
1839 AddRecordToResponseList(nrpp, rr2, rr);
1841 else if (RRTypeIsAddressType(rr->resrec.rrtype)) // For A or AAAA, put counterpart as additional
1846 rr->resrec.namehash == rr2->resrec.namehash && // ... and have the same name
1847 SameDomainName(rr->resrec.name, rr2->resrec.name))
1848 AddRecordToResponseList(nrpp, rr2, rr);
1850 else if (rr->resrec.rrtype == kDNSType_PTR) // For service PTR, see if we want to add DeviceInfo record
1853 SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
1854 AddRecordToResponseList(nrpp, &m->DeviceInfo, rr);
1861 ResourceRecord *rr = info->nsec3RR;
1864 return (2 + 10 + rr->rdlength);
1869 AuthRecord *rr;
1876 for (rr = m->ResourceRecords; rr; rr=rr->next)
1879 if (rr->ImmedAnswer == mDNSInterfaceMark ||
1880 mDNSSameIPv4Address(rr->v4Requester, onesIPv4Addr) ||
1881 mDNSSameIPv6Address(rr->v6Requester, onesIPv6Addr) )
1882 rr->ImmedUnicast = mDNSfalse;
1884 if (rr->ImmedUnicast && rr->ImmedAnswer == InterfaceID)
1886 if ((dest->type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->v4Requester, dest->ip.v4)) ||
1887 (dest->type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->v6Requester, dest->ip.v6)))
1889 rr->ImmedAnswer = mDNSNULL; // Clear the state fields
1890 rr->ImmedUnicast = mDNSfalse;
1891 rr->v4Requester = zerov4Addr;
1892 rr->v6Requester = zerov6Addr;
1895 if (intf && !mDNSPlatformValidRecordForInterface(rr, intf))
1897 LogInfo("SendDelayedUnicastResponse: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, InterfaceID));
1901 if (rr->NextResponse == mDNSNULL && nrp != &rr->NextResponse) // rr->NR_AnswerTo
1903 rr->NR_AnswerTo = NR_AnswerMulticast;
1904 *nrp = rr;
1905 nrp = &rr->NextResponse;
1922 rr = ResponseRecords;
1923 if (rr->resrec.AnonInfo)
1925 AnoninfoSpace += AnonInfoSpace(rr->resrec.AnonInfo);
1926 rr->resrec.AnonInfo->SendNow = mDNSInterfaceMark;
1928 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1929 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1932 newptr = PutResourceRecordTTLWithLimit(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec, rr->resrec.rroriginalttl,
1935 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1941 ResponseRecords = rr->NextResponse;
1942 rr->NextResponse = mDNSNULL;
1943 rr->NR_AnswerTo = mDNSNULL;
1944 rr->NR_AdditionalTo = mDNSNULL;
1945 rr->RequireGoodbye = mDNStrue;
1950 for (rr = m->ResourceRecords; rr; rr=rr->next)
1952 if (rr->resrec.AnonInfo && rr->resrec.AnonInfo->SendNow == mDNSInterfaceMark)
1954 ResourceRecord *nsec3RR = rr->resrec.AnonInfo->nsec3RR;
1967 rr->resrec.AnonInfo->SendNow = mDNSNULL;
1974 rr = ResponseRecords;
1975 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1976 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1977 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAdditionals, &rr->resrec);
1978 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1981 if (newptr && m->omsg.h.numAnswers) rr->RequireGoodbye = mDNStrue;
1982 else if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask) rr->ImmedAnswer = mDNSInterfaceMark;
1983 ResponseRecords = rr->NextResponse;
1984 rr->NextResponse = mDNSNULL;
1985 rr->NR_AnswerTo = mDNSNULL;
1986 rr->NR_AdditionalTo = mDNSNULL;
1996 mDNSexport void CompleteDeregistration(mDNS *const m, AuthRecord *rr)
1998 LogInfo("CompleteDeregistration: called for Resource record %s", ARDisplayString(m, rr));
1999 // Clearing rr->RequireGoodbye signals mDNS_Deregister_internal() that
2001 rr->resrec.RecordType = kDNSRecordTypeShared;
2002 rr->RequireGoodbye = mDNSfalse;
2003 rr->WakeUp.HMAC = zeroEthAddr;
2004 if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse); rr->AnsweredLocalQ = mDNSfalse; }
2005 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); // Don't touch rr after this
2021 AuthRecord *rr = m->CurrentRecord;
2022 if (!AuthRecord_uDNS(rr) && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2023 CompleteDeregistration(m, rr); // Don't touch rr after this
2025 m->CurrentRecord = rr->next;
2098 mDNSlocal void SendARP(mDNS *const m, const mDNSu8 op, const AuthRecord *const rr,
2103 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
2104 if (!intf) { LogMsg("SendARP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
2135 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
2163 mDNSlocal void SendNDP(mDNS *const m, const mDNSu8 op, const mDNSu8 flags, const AuthRecord *const rr,
2174 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
2175 if (!intf) { LogMsg("SendNDP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
2248 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
2275 mDNSlocal void GrantUpdateCredit(AuthRecord *rr)
2277 if (++rr->UpdateCredits >= kMaxUpdateCredits) rr->NextUpdateCredit = 0;
2278 else rr->NextUpdateCredit = NonZeroTime(rr->NextUpdateCredit + kUpdateCreditRefreshInterval);
2281 mDNSlocal mDNSBool ShouldSendGoodbyesBeforeSleep(mDNS *const m, const NetworkInterfaceInfo *intf, AuthRecord *rr)
2288 if ((rr->AuthFlags & AuthFlagsWakeOnly) && (m->SleepState != SleepState_Awake))
2290 debugf("ShouldSendGoodbyesBeforeSleep: marking for goodbye", ARDisplayString(m, rr));
2301 debugf("ShouldSendGoodbyesBeforeSleep: not sending goodbye %s, int %p", ARDisplayString(m, rr), intf->InterfaceID);
2306 debugf("ShouldSendGoodbyesBeforeSleep: sending goodbye %s, int %p", ARDisplayString(m, rr), intf->InterfaceID);
2330 AuthRecord *rr, *r2;
2338 for (rr = m->ResourceRecords; rr; rr=rr->next)
2339 if (rr->ImmedUnicast)
2343 v4.ip.v4 = rr->v4Requester;
2344 v6.ip.v6 = rr->v6Requester;
2345 if (!mDNSIPv4AddressIsZero(rr->v4Requester)) SendDelayedUnicastResponse(m, &v4, rr->ImmedAnswer);
2346 if (!mDNSIPv6AddressIsZero(rr->v6Requester)) SendDelayedUnicastResponse(m, &v6, rr->ImmedAnswer);
2347 if (rr->ImmedUnicast)
2349 LogMsg("SendResponses: ERROR: rr->ImmedUnicast still set: %s", ARDisplayString(m, rr));
2350 rr->ImmedUnicast = mDNSfalse;
2359 for (rr = m->ResourceRecords; rr; rr=rr->next)
2361 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
2362 if (TimeToAnnounceThisRecord(rr, m->timenow))
2364 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2366 if (!rr->WakeUp.HMAC.l[0])
2368 if (rr->AnnounceCount) rr->ImmedAnswer = mDNSInterfaceMark; // Send goodbye packet on all interfaces
2372 LogSPS("SendResponses: Sending wakeup %2d for %.6a %s", rr->AnnounceCount-3, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
2373 SendWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.IMAC, &rr->WakeUp.password);
2374 for (r2 = rr; r2; r2=r2->next)
2375 if (r2->AnnounceCount && r2->resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&r2->WakeUp.IMAC, &rr->WakeUp.IMAC) &&
2392 else if (ResourceRecordIsValidAnswer(rr))
2394 if (rr->AddressProxy.type)
2396 if (!mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
2398 rr->AnnounceCount--;
2399 rr->ThisAPInterval *= 2;
2400 rr->LastAPTime = m->timenow;
2401 if (rr->AddressProxy.type == mDNSAddrType_IPv4)
2404 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2405 SendARP(m, 1, rr, &rr->AddressProxy.ip.v4, &zeroEthAddr, &rr->AddressProxy.ip.v4, &onesEthAddr);
2407 else if (rr->AddressProxy.type == mDNSAddrType_IPv6)
2410 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2411 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
2417 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2418 if (maxExistingAnnounceInterval < rr->ThisAPInterval)
2419 maxExistingAnnounceInterval = rr->ThisAPInterval;
2420 if (rr->UpdateBlocked) rr->UpdateBlocked = 0;
2428 for (rr = m->ResourceRecords; rr; rr=rr->next)
2429 if ((rr->resrec.InterfaceID && rr->ImmedAnswer) ||
2430 (rr->ThisAPInterval <= maxExistingAnnounceInterval &&
2431 TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2) &&
2432 !rr->AddressProxy.type && // Don't include ARP Annoucements when considering which records to accelerate
2433 ResourceRecordIsValidAnswer(rr)))
2434 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2440 for (rr = m->ResourceRecords; rr; rr=rr->next)
2442 if (rr->ImmedAnswer && rr->resrec.rrtype == kDNSType_SRV)
2446 rr->LastMCTime - r2->LastMCTime >= 0 && // ... which we have not sent recently ...
2447 rr->resrec.rdatahash == r2->resrec.namehash && // ... whose name is the name of the SRV target
2448 SameDomainName(&rr->resrec.rdata->u.srv.target, r2->resrec.name) &&
2449 (rr->ImmedAnswer == mDNSInterfaceMark || rr->ImmedAnswer == r2->resrec.InterfaceID))
2454 if (rr->ImmedAnswer && rr->resrec.RecordType == kDNSRecordTypeShared && rr->resrec.rrtype == kDNSType_PTR)
2455 if (ResourceRecordIsValidAnswer(&m->DeviceInfo) && SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
2457 if (!m->DeviceInfo.ImmedAnswer) m->DeviceInfo.ImmedAnswer = rr->ImmedAnswer;
2468 for (rr = m->ResourceRecords; rr; rr=rr->next)
2469 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2471 if (rr->ImmedAnswer) // If we're sending this as answer, see that its whole RRSet is similarly marked
2476 r2->ImmedAnswer != rr->ImmedAnswer && SameResourceRecordSignature(r2, rr))
2477 r2->ImmedAnswer = !r2->ImmedAnswer ? rr->ImmedAnswer : mDNSInterfaceMark;
2479 else if (rr->ImmedAdditional) // If we're sending this as additional, see that its whole RRSet is similarly marked
2483 if (r2->ImmedAdditional != rr->ImmedAdditional && SameResourceRecordSignature(r2, rr))
2484 r2->ImmedAdditional = rr->ImmedAdditional;
2489 for (rr = m->ResourceRecords; rr; rr=rr->next)
2491 if (rr->ImmedAnswer == mDNSInterfaceMark) // Sending this record on all appropriate interfaces
2493 rr->SendRNow = !intf ? mDNSNULL : (rr->resrec.InterfaceID) ? rr->resrec.InterfaceID : intf->InterfaceID;
2494 rr->ImmedAdditional = mDNSNULL; // No need to send as additional if sending as answer
2495 rr->LastMCTime = m->timenow;
2496 rr->LastMCInterface = rr->ImmedAnswer;
2498 if (TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2))
2500 rr->AnnounceCount--;
2501 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
2502 rr->ThisAPInterval *= 2;
2503 rr->LastAPTime = m->timenow;
2504 debugf("Announcing %##s (%s) %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->AnnounceCount);
2507 else if (rr->ImmedAnswer) // Else, just respond to a single query on single interface:
2509 rr->SendRNow = rr->ImmedAnswer; // Just respond on that interface
2510 rr->ImmedAdditional = mDNSNULL; // No need to send as additional too
2511 rr->LastMCTime = m->timenow;
2512 rr->LastMCInterface = rr->ImmedAnswer;
2514 SetNextAnnounceProbeTime(m, rr);
2515 //if (rr->SendRNow) LogMsg("%-15.4a %s", &rr->v4Requester, ARDisplayString(m, rr));
2538 for (rr = m->ResourceRecords; rr; rr=rr->next)
2543 if ((rr->SendRNow == intf->InterfaceID) &&
2544 ((rr->resrec.InterfaceID == mDNSInterface_Any) && !mDNSPlatformValidRecordForInterface(rr, intf)))
2546 LogInfo("SendResponses: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, rr->SendRNow));
2547 rr->SendRNow = GetNextActiveInterfaceID(intf);
2549 else if (rr->SendRNow == intf->InterfaceID)
2551 RData *OldRData = rr->resrec.rdata;
2552 mDNSu16 oldrdlength = rr->resrec.rdlength;
2554 (rr->resrec.RecordType != kDNSRecordTypeDeregistering && !ShouldSendGoodbyesBeforeSleep(m, intf, rr));
2556 if (rr->NewRData && active)
2559 if (ResourceRecordIsValidAnswer(rr) && rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
2561 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, 0);
2562 if (newptr) { responseptr = newptr; numDereg++; rr->RequireGoodbye = mDNSfalse; }
2565 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
2568 if (rr->resrec.AnonInfo)
2570 int tmp = AnonInfoSpace(rr->resrec.AnonInfo);
2579 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2580 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2581 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, active ? rr->resrec.rroriginalttl : 0);
2582 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2586 rr->RequireGoodbye = active;
2587 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) numDereg++;
2588 else if (rr->LastAPTime == m->timenow) numAnnounce++;else numAnswer++;
2591 if (rr->NewRData && active)
2592 SetNewRData(&rr->resrec, OldRData, oldrdlength);
2596 if (!pktcount && active && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2597 rr->SendNSECNow = mDNSInterfaceMark;
2601 if (rr->resrec.AnonInfo)
2603 debugf("SendResponses: Marking %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2605 rr->resrec.AnonInfo->SendNow = intf->InterfaceID;
2609 if (rr->ImmedAnswer == mDNSInterfaceMark && rr->resrec.InterfaceID == mDNSInterface_Any)
2610 rr->SendRNow = GetNextActiveInterfaceID(intf);
2612 rr->SendRNow = mDNSNULL;
2621 for (rr = m->ResourceRecords; rr; rr=rr->next)
2623 if (rr->resrec.AnonInfo && rr->resrec.AnonInfo->SendNow == intf->InterfaceID)
2625 ResourceRecord *nsec3RR = rr->resrec.AnonInfo->nsec3RR;
2631 debugf("SendResponses: Added NSEC3 %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2636 LogMsg("SendResponses: Cannot add NSEC3 %s, OwnerRecordSpace %d, TraceRecordSpace %d, limit %p", ARDisplayString(m, rr), OwnerRecordSpace,
2639 rr->resrec.AnonInfo->SendNow = mDNSNULL;
2644 for (rr = m->ResourceRecords; rr; rr=rr->next)
2645 if (rr->ImmedAdditional == intf->InterfaceID)
2646 if (ResourceRecordIsValidAnswer(rr))
2654 if (!SendAdditional && (rr->resrec.RecordType & kDNSRecordTypeUniqueMask))
2660 SameResourceRecordSignature(a, rr)) { SendAdditional = mDNStrue; break; }
2663 rr->ImmedAdditional = mDNSNULL; // then cancel its ImmedAdditional field
2668 if (!pktcount && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2669 rr->SendNSECNow = mDNSInterfaceMark;
2671 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2672 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2673 newptr = PutRR_OS(newptr, &m->omsg.h.numAdditionals, &rr->resrec);
2674 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2678 rr->ImmedAdditional = mDNSNULL;
2679 rr->RequireGoodbye = mDNStrue;
2684 rr->LastMCTime = m->timenow;
2685 rr->LastMCInterface = intf->InterfaceID;
2692 // (recognized by rr->SendNSECNow == intf->InterfaceID) we should really put the NSEC in the Answer Section,
2694 for (rr = m->ResourceRecords; rr; rr=rr->next)
2695 if (rr->SendNSECNow == mDNSInterfaceMark || rr->SendNSECNow == intf->InterfaceID)
2700 mDNS_SetupResourceRecord(&nsec, mDNSNULL, mDNSInterface_Any, kDNSType_NSEC, rr->resrec.rroriginalttl, kDNSRecordTypeUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
2702 AssignDomainName(&nsec.namestorage, rr->resrec.name);
2704 len = DomainNameLength(rr->resrec.name);
2710 AssignDomainName((domainname *)ptr, rr->resrec.name);
2715 if (ResourceRecordIsValidAnswer(r2) && SameResourceRecordNameClassInterface(r2, rr))
2731 if (newptr || rr->SendNSECNow == mDNSInterfaceMark)
2733 rr->SendNSECNow = mDNSNULL;
2735 for (r2 = rr->next; r2; r2=r2->next)
2736 if (SameResourceRecordNameClassInterface(r2, rr))
2818 rr = m->CurrentRecord;
2819 m->CurrentRecord = rr->next;
2821 if (rr->SendRNow)
2823 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P)
2824 LogMsg("SendResponses: No active interface %p to send: %p %02X %s", rr->SendRNow, rr->resrec.InterfaceID, rr->resrec.RecordType, ARDisplayString(m, rr));
2825 rr->SendRNow = mDNSNULL;
2828 if (rr->ImmedAnswer || rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2830 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
2832 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->AnnounceCount == 0)
2835 if (!AuthRecord_uDNS(rr)) CompleteDeregistration(m, rr); // Don't touch rr after this
2839 rr->ImmedAnswer = mDNSNULL;
2840 rr->ImmedUnicast = mDNSfalse;
2841 rr->v4Requester = zerov4Addr;
2842 rr->v6Requester = zerov6Addr;
2863 ((RR)->UnansweredQueries < MaxUnansweredQueries) ? (TicksTTL(rr)/50) : \
2878 // rr->TimeRcvd
2879 // rr->resrec.rroriginalttl
2880 // rr->UnansweredQueries
2881 // rr->CRActiveQuestion
2882 mDNSexport void SetNextCacheCheckTimeForRecord(mDNS *const m, CacheRecord *const rr)
2884 rr->NextRequiredQuery = RRExpireTime(rr);
2888 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
2890 rr->NextRequiredQuery -= TicksTTL(rr)/20 * (MaxUnansweredQueries - rr->UnansweredQueries);
2891 rr->NextRequiredQuery += mDNSRandom((mDNSu32)TicksTTL(rr)/50);
2893 (rr->NextRequiredQuery - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m,rr));
2895 ScheduleNextCacheCheckTime(m, HashSlot(rr->resrec.name), NextCacheCheckEvent(rr));
2903 mDNSexport mStatus mDNS_Reconfirm_internal(mDNS *const m, CacheRecord *const rr, mDNSu32 interval)
2911 if (RRExpireTime(rr) - m->timenow > (mDNSs32)((interval * 4) / 3))
2918 rr->TimeRcvd = m->timenow - (mDNSs32)interval * 3;
2919 rr->resrec.rroriginalttl = (interval * 4 + mDNSPlatformOneSecond - 1) / mDNSPlatformOneSecond;
2920 SetNextCacheCheckTimeForRecord(m, rr);
2923 RRExpireTime(rr) - m->timenow, CRDisplayString(m, rr), rr->CRActiveQuestion);
2948 CacheRecord *rr;
2951 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
2952 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2953 !(rr->resrec.RecordType & kDNSRecordTypeUniqueMask) && // which is a shared (i.e. not unique) record type
2954 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not already in the known answer list
2955 rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
2956 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
2957 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow > // and its half-way-to-expiry time is at least 1 second away
2966 *ka = rr; // Link this record into our known answer chain
2967 ka = &rr->NextInKAList;
2969 forecast += 12 + rr->resrec.rdestimate;
2989 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // For every resource record in our cache,
2990 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2991 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not in the known answer list
2992 SameNameRecordAnswersQuestion(&rr->resrec, q)) // which answers our question
2994 rr->UnansweredQueries++; // indicate that we're expecting a response
2995 rr->LastUnansweredTime = m->timenow;
2996 SetNextCacheCheckTimeForRecord(m, rr);
3227 const CacheRecord *rr;
3228 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
3229 if (rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
3230 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
3231 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow >= 0 && // and it is less than half-way to expiry
3232 rr->NextRequiredQuery - (m->timenow + q->ThisQInterval) > 0) // and we'll ask at least once again before NextRequiredQuery
3235 forecast += 12 + rr->resrec.rdestimate;
3851 mDNSexport void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheRecord *const rr, const QC_result AddRecord)
3854 mDNSBool followcname = FollowCNAME(q, &rr->resrec, AddRecord);
3857 q->CurrentAnswers, AddRecord ? "Add" : "Rmv", rr->resrec.rroriginalttl, CRDisplayString(m, rr));
3872 (rr->resrec.RecordType == kDNSRecordTypePacketNegative && (AddRecord == QC_add))))
3885 "LOAddressAnswers %d", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr),
3895 if (!q->TimeoutQuestion || rr->resrec.RecordType != kDNSRecordTypePacketNegative || (m->timenow - q->StopTime < 0))
3899 // Note: Use caution here. In the case of records with rr->DelayDelivery set, AnswerCurrentQuestionWithResourceRecord(... mDNStrue)
3903 rr->LastUsed = m->timenow;
3904 if (AddRecord == QC_add && !q->DuplicateOf && rr->CRActiveQuestion != q)
3906 if (!rr->CRActiveQuestion) m->rrcache_active++; // If not previously active, increment rrcache_active count
3908 rr->CRActiveQuestion, q, CRDisplayString(m,rr), q->CurrentAnswers);
3909 rr->CRActiveQuestion = q; // We know q is non-null
3910 SetNextCacheCheckTimeForRecord(m, rr);
3921 (AddRecord == QC_add && (q->ExpectUnique || (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))))
3927 if (rr->DelayDelivery) return; // We'll come back later when CacheRecordDeferredAdd() calls us
3931 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative || (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype)))
3938 if (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype))
3941 MakeNegativeCacheRecord(m, &neg, &q->qname, q->qnamehash, q->qtype, q->qclass, 1, rr->resrec.InterfaceID, q->qDNSServer);
3945 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
3980 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
3983 mDNSlocal void CacheRecordDeferredAdd(mDNS *const m, CacheRecord *rr)
3985 rr->DelayDelivery = 0;
3993 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
3994 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4007 const CacheRecord *rr;
4011 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
4039 if (purge && !rr->resrec.InterfaceID && !rr->CRActiveQuestion && rr->resrec.rroriginalttl)
4041 mDNSu32 uTTL = RRUnadjustedTTL(rr->resrec.rroriginalttl);
4042 if (m->timenow - (rr->TimeRcvd + ((mDNSs32)uTTL * mDNSPlatformOneSecond)) >= 0)
4045 CRDisplayString(m, rr), rr->resrec.rroriginalttl, uTTL, (m->timenow - rr->TimeRcvd)/mDNSPlatformOneSecond);
4050 if (threshhold - RRExpireTime(rr) >= 0) // If we have records about to expire within a second
4052 if (delay - RRExpireTime(rr) < 0) // then delay until after they've been deleted
4053 delay = RRExpireTime(rr);
4065 // rr is a new CacheRecord just received into our cache
4070 mDNSlocal void CacheRecordAdd(mDNS *const m, CacheRecord *rr)
4078 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4099 verbosedebugf("CacheRecordAdd %p %##s (%s) %lu %#a:%d question %p", rr, rr->resrec.name->c,
4100 DNSTypeName(rr->resrec.rrtype), rr->resrec.rroriginalttl, rr->resrec.rDNSServer ?
4101 &rr->resrec.rDNSServer->addr : mDNSNULL, mDNSVal16(rr->resrec.rDNSServer ?
4102 rr->resrec.rDNSServer->port : zeroIPPort), q);
4106 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
4107 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
4114 rr->resrec.rroriginalttl = 0;
4115 rr->UnansweredQueries = MaxUnansweredQueries;
4120 if (!rr->DelayDelivery)
4128 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4129 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4136 SetNextCacheCheckTimeForRecord(m, rr);
4142 // rr is a new CacheRecord just received from the wire (kDNSRecordTypePacketAns/AnsUnique/Add/AddUnique)
4149 mDNSlocal void NoCacheAnswer(mDNS *const m, CacheRecord *rr)
4160 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4161 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_addnocache); // QC_addnocache means "don't expect remove events for this"
4172 // rr is an existing cache CacheRecord that just expired and is being deleted
4177 mDNSlocal void CacheRecordRmv(mDNS *const m, CacheRecord *rr)
4193 if (!QuerySuppressed(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
4195 verbosedebugf("CacheRecordRmv %p %s", rr, CRDisplayString(m, rr));
4206 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
4207 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
4220 if (rr->resrec.rdata->MaxRDLength) // Never generate "remove" events for negative results
4228 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_rmv);
4266 CacheRecord *rr = *rp;
4268 if (rr->resrec.rdata && rr->resrec.rdata != (RData*)&rr->smallrdatastorage)
4270 mDNSPlatformMemFree(rr->resrec.rdata);
4271 rr->resrec.rdata = mDNSNULL;
4275 if (rr->resrec.name)
4277 debugf("ReleaseAdditionalCacheRecords: freeing cached record %##s (%s)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
4278 mDNSPlatformMemFree((void *)rr->resrec.name);
4279 rr->resrec.name = mDNSNULL;
4282 if (!rr->resrec.InterfaceID)
4284 m->rrcache_totalused_unicast -= rr->resrec.rdlength;
4285 if (DNSSECRecordType(rr->resrec.rrtype))
4286 BumpDNSSECStats(m, kStatsActionDecrement, kStatsTypeMemoryUsage, rr->resrec.rdlength);
4288 ReleaseCacheEntity(m, (CacheEntity *)rr);
4350 CacheRecord *const rr = *rp;
4351 mDNSs32 event = RRExpireTime(rr);
4354 *rp = rr->next; // Cut it from the list
4357 m->timenow - rr->TimeRcvd, rr->resrec.rroriginalttl, rr->CRActiveQuestion, CRDisplayString(m, rr));
4358 if (rr->CRActiveQuestion) // If this record has one or more active questions, tell them it's going away
4360 DNSQuestion *q = rr->CRActiveQuestion;
4374 CacheRecordRmv(m, rr);
4377 ReleaseCacheRecord(m, rr);
4382 if (rr->DelayDelivery && rr->DelayDelivery - m->timenow > 0)
4383 event = rr->DelayDelivery;
4386 if (rr->DelayDelivery) CacheRecordDeferredAdd(m, rr);
4387 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
4389 if (m->timenow - rr->NextRequiredQuery < 0) // If not yet time for next query
4390 event = NextCacheCheckEvent(rr); // then just record when we want the next query
4403 (event - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m, rr));
4406 rp = &rr->next;
4437 AuthRecord *rr = m->CurrentRecord;
4438 m->CurrentRecord = rr->next;
4447 if (rr->ARType == AuthRecordLocalOnly || (rr->ARType == AuthRecordP2P && q->InterfaceID == mDNSInterface_Any))
4448 if (LocalOnlyRecordAnswersQuestion(rr, q))
4453 ARDisplayString(m, rr));
4457 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
4596 CacheRecord *rr;
4597 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
4598 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
4601 mDNSu32 SecsSinceRcvd = ((mDNSu32)(m->timenow - rr->TimeRcvd)) / mDNSPlatformOneSecond;
4602 if (rr->resrec.rroriginalttl <= SecsSinceRcvd)
4604 LogMsg("AnswerNewQuestion: How is rr->resrec.rroriginalttl %lu <= SecsSinceRcvd %lu for %s %d %d",
4605 rr->resrec.rroriginalttl, SecsSinceRcvd, CRDisplayString(m, rr), m->timenow, rr->TimeRcvd);
4611 if ((rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) || (q->ExpectUnique))
4614 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
4615 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
4617 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
4620 else if (RRTypeIsAddressType(rr->resrec.rrtype) && RRTypeIsAddressType(q->qtype))
4696 AuthRecord *rr = m->CurrentRecord;
4697 m->CurrentRecord = rr->next;
4698 if (LocalOnlyRecordAnswersQuestion(rr, q))
4700 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
4712 AuthRecord *rr = m->CurrentRecord;
4713 m->CurrentRecord = rr->next;
4714 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4716 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
4776 CacheRecord *rr = *rp;
4778 ReleaseCacheRecord(m, rr);
4827 mDNSlocal CacheGroup *GetCacheGroup(mDNS *const m, const mDNSu32 slot, const ResourceRecord *const rr)
4829 mDNSu16 namelen = DomainNameLength(rr->name);
4831 if (!cg) { LogMsg("GetCacheGroup: Failed to allocate memory for %##s", rr->name->c); return(mDNSNULL); }
4833 cg->namehash = rr->namehash;
4842 LogMsg("GetCacheGroup: Failed to allocate name storage for %##s", rr->name->c);
4846 AssignDomainName(cg->name, rr->name);
4848 if (CacheGroupForRecord(m, slot, rr)) LogMsg("GetCacheGroup: Already have CacheGroup for %##s", rr->name->c);
4850 if (CacheGroupForRecord(m, slot, rr) != cg) LogMsg("GetCacheGroup: Not finding CacheGroup for %##s", rr->name->c);
4855 mDNSexport void mDNS_PurgeCacheResourceRecord(mDNS *const m, CacheRecord *rr)
4864 rr->TimeRcvd = m->timenow - mDNSPlatformOneSecond * 60;
4865 rr->UnansweredQueries = MaxUnansweredQueries;
4866 rr->resrec.rroriginalttl = 0;
4867 SetNextCacheCheckTimeForRecord(m, rr);
4899 AuthRecord *rr = m->CurrentRecord;
4900 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering && rr->WakeUp.HMAC.l[0])
4904 if (m->SPSSocket && m->timenow - rr->TimeExpire < 0) // If proxy record not expired yet, update m->NextScheduledSPS
4906 if (m->NextScheduledSPS - rr->TimeExpire > 0)
4907 m->NextScheduledSPS = rr->TimeExpire;
4912 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, ARDisplayString(m, rr));
4913 SetSPSProxyListChanged(rr->resrec.InterfaceID);
4914 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
4915 // Don't touch rr after this -- memory may have been free'd
4920 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
4921 m->CurrentRecord = rr->next;
4929 AuthRecord *rr = m->CurrentRecord;
4930 if (rr->AnsweredLocalQ && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
4932 debugf("CheckRmvEventsForLocalRecords: Generating local RMV events for %s", ARDisplayString(m, rr));
4933 rr->resrec.RecordType = kDNSRecordTypeShared;
4934 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse);
4935 if (m->CurrentRecord == rr) // If rr still exists in list, restore its state now
4937 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
4938 rr->AnsweredLocalQ = mDNSfalse;
4941 if (RRLocalOnly(rr)) CompleteDeregistration(m, rr);
4944 if (m->CurrentRecord == rr) // If m->CurrentRecord was not auto-advanced, do it ourselves now
4945 m->CurrentRecord = rr->next;
5097 // Make sure we deliver *all* local RMV events, and clear the corresponding rr->AnsweredLocalQ flags, *before*
5121 AuthRecord *rr = m->NewLocalRecords;
5123 if (LocalRecordReady(rr))
5125 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
5126 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNStrue);
5128 else if (!rr->next)
5132 // terminate and set the NewLocalRecords to rr.
5133 debugf("mDNS_Execute: Just one LocalAuthRecord %s, breaking out of the loop early", ARDisplayString(m, rr));
5137 head = rr;
5142 debugf("mDNS_Execute: Skipping LocalAuthRecord %s", ARDisplayString(m, rr));
5145 while (*p && *p != rr) p=&(*p)->next;
5146 if (*p) *p = rr->next; // Cut this record from the list
5147 else { LogMsg("mDNS_Execute: ERROR!! Cannot find record %s in ResourceRecords list", ARDisplayString(m, rr)); break; }
5151 *p = rr;
5152 head = tail = rr;
5156 tail->next = rr;
5157 tail = rr;
5159 rr->next = mDNSNULL;
5177 AuthRecord *rr = ag->NewLocalOnlyRecords;
5180 if (LocalRecordReady(rr))
5182 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
5183 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNStrue);
5185 else LogMsg("mDNS_Execute: LocalOnlyRecord %s not ready", ARDisplayString(m, rr));
5281 AuthRecord *rr;
5289 for (rr = ag->members; rr; rr=rr->next)
5291 if (UniqueLocalOnlyRecord(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
5293 LogInfo("QuestionHasLocalAnswers: Question %p %##s (%s) has local answer %s", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr));
5501 mDNSexport void mDNSCoreRestartRegistration(mDNS *const m, AuthRecord *rr, int announceCount)
5503 if (!AuthRecord_uDNS(rr))
5505 if (rr->resrec.RecordType == kDNSRecordTypeVerified && !rr->DependentOn) rr->resrec.RecordType = kDNSRecordTypeUnique;
5506 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
5511 if (rr->AnnounceCount < announceCount)
5512 rr->AnnounceCount = announceCount;
5514 if (mDNS_KeepaliveRecord(&rr->resrec))
5515 rr->AnnounceCount = 0; // Do not announce keepalive records
5517 rr->AnnounceCount = InitialAnnounceCount;
5518 rr->SendNSECNow = mDNSNULL;
5519 InitializeLastAPTime(m, rr);
5597 mDNSlocal mDNSBool mDNSUpdateOkToSend(mDNS *const m, AuthRecord *rr, NetworkInterfaceInfo *const intf, mDNSu32 scopeid)
5602 if (AuthRecord_uDNS(rr) || (rr->AuthFlags & AuthFlagsWakeOnly) || mDNSOpaque16IsZero(rr->updateid) ||
5603 m->timenow - (rr->LastAPTime + rr->ThisAPInterval) < 0)
5610 // we successfully update on all the interfaces (with whatever set in "rr->updateIntID"), we clear
5616 if ((scopeid >= (sizeof(rr->updateIntID) * mDNSNBBY) || bit_get_opaque64(rr->updateIntID, scopeid)) &&
5617 (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == intf->InterfaceID))
5636 AuthRecord *rr = m->CurrentRecord;
5638 if (mDNS_KeepaliveRecord(&rr->resrec))
5641 getKeepaliveRaddr(m, rr, &raddr);
5644 UpdateKeepaliveRData(m, rr, mDNSNULL, mDNStrue, (char *)(addrmap->ethaddr));
5647 m->CurrentRecord = rr->next;
5656 mDNSexport mStatus UpdateKeepaliveRData(mDNS *const m, AuthRecord *rr, NetworkInterfaceInfo *const intf, mDNSBool updateMac, char *ethAddr)
5672 mDNS_ExtractKeepaliveInfo(rr, &timeout, &laddr, &raddr, &eth, &seq, &ack, &lport, &rport, &win);
5676 LogMsg("UpdateKeepaliveRData: not a valid record %s for keepalive %#a:%d %#a:%d", ARDisplayString(m, rr), &laddr, lport.NotAnInteger, &raddr, rport.NotAnInteger);
5715 LogMsg("UpdateKeepaliveRData: could not allocate memory %s", ARDisplayString(m, rr));
5735 if ( rr->resrec.rdata != &rr->rdatastorage)
5737 mDNSPlatformMemFree(rr->resrec.rdata);
5738 LogSPS("UpdateKeepaliveRData: Freed allocated memory for keep alive packet: %s ", ARDisplayString(m, rr));
5740 SetNewRData(&rr->resrec, newrd, newrdlength); // Update our rdata
5742 LogSPS("UpdateKeepaliveRData: successfully updated the record %s", ARDisplayString(m, rr));
5750 AuthRecord *rr;
5776 for (rr = m->ResourceRecords; rr; rr=rr->next)
5778 if (!(rr->AuthFlags & AuthFlagsWakeOnly) && rr->resrec.RecordType > kDNSRecordTypeDeregistering)
5780 if (rr->resrec.InterfaceID == intf->InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
5782 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
5784 rr->SendRNow = mDNSInterfaceMark; // mark it now
5785 // When we are registering on the first interface, rr->updateid is zero in which case
5788 if (mDNSOpaque16IsZero(rr->updateid))
5789 rr->updateid = msgid;
5791 msgid = rr->updateid;
5809 for (rr = m->ResourceRecords; rr; rr=rr->next)
5810 if (rr->SendRNow || mDNSUpdateOkToSend(m, rr, intf, scopeid))
5812 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
5818 if (mDNS_KeepaliveRecord(&rr->resrec) && (UpdateKeepaliveRData(m, rr, intf, mDNSfalse, mDNSNULL) != mStatus_NoError))
5820 if (scopeid < (sizeof(rr->updateIntID) * mDNSNBBY))
5822 bit_clr_opaque64(rr->updateIntID, scopeid);
5824 rr->SendRNow = mDNSNULL;
5828 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
5829 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the 'unique' bit so PutResourceRecord will set it
5830 newptr = PutResourceRecordTTLWithLimit(&m->omsg, p, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
5831 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear 'unique' bit back to normal state
5833 LogSPS("SendSPSRegistration put %s FAILED %d/%d %s", intf->ifname, p - m->omsg.data, limit - m->omsg.data, ARDisplayString(m, rr));
5836 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));
5837 rr->SendRNow = mDNSNULL;
5838 rr->ThisAPInterval = mDNSPlatformOneSecond;
5839 rr->LastAPTime = m->timenow;
5841 if (mDNSOpaque16IsZero(rr->updateid)) LogMsg("SendSPSRegistration: ERROR!! rr %s updateid is zero", ARDisplayString(m, rr));
5842 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
5843 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
5898 mDNSlocal mDNSBool RecordIsFirstOccurrenceOfOwner(mDNS *const m, const AuthRecord *const rr)
5901 for (ar = m->ResourceRecords; ar && ar != rr; ar=ar->next)
5902 if (mDNSPlatformMemSame(&rr->WakeUp, &ar->WakeUp, sizeof(rr->WakeUp))) return mDNSfalse;
5906 mDNSlocal void mDNSCoreStoreProxyRR(mDNS *const m, const mDNSInterfaceID InterfaceID, AuthRecord *const rr)
5917 mDNS_SetupResourceRecord(newRR, mDNSNULL, InterfaceID, rr->resrec.rrtype,
5918 rr->resrec.rroriginalttl, rr->resrec.RecordType,
5919 rr->ARType, mDNSNULL, mDNSNULL);
5921 AssignDomainName(&newRR->namestorage, &rr->namestorage);
5922 newRR->resrec.rdlength = DomainNameLength(rr->resrec.name);
5924 newRR->resrec.rrclass = rr->resrec.rrclass;
5926 if (rr->resrec.rrtype == kDNSType_A)
5928 newRR->resrec.rdata->u.ipv4 = rr->resrec.rdata->u.ipv4;
5930 else if (rr->resrec.rrtype == kDNSType_AAAA)
5932 newRR->resrec.rdata->u.ipv6 = rr->resrec.rdata->u.ipv6;
5939 LogSPS("%s : Storing proxy record : %s ", __func__, ARDisplayString(m, rr));
6027 AuthRecord *rr;
6036 for (rr = m->ResourceRecords; rr; rr=rr->next)
6037 if (!AuthRecord_uDNS(rr) && !mDNSOpaque16IsZero(rr->updateid) && m->timenow - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
6043 if ((scopeid >= (sizeof(rr->updateIntID) * mDNSNBBY) || bit_get_opaque64(rr->updateIntID, scopeid)) &&
6044 (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == intf->InterfaceID))
6046 LogSPS("RetrySPSRegistrations: 0x%x 0x%x (updateid %d) %s", rr->updateIntID.l[1], rr->updateIntID.l[0], mDNSVal16(rr->updateid), ARDisplayString(m, rr));
6047 SendSPSRegistration(m, intf, rr->updateid);
6113 AuthRecord *rr;
6114 for (rr = m->ResourceRecords; rr; rr=rr->next)
6115 if (mDNS_KeepaliveRecord(&rr->resrec) || (rr->resrec.rrtype == kDNSType_SRV && !AuthRecord_uDNS(rr) && !mDNSSameIPPort(rr->resrec.rdata->u.srv.port, DiscardPort)))
6126 AuthRecord *rr;
6131 for (rr = m->ResourceRecords; rr; rr=rr->next)
6133 if ((rr->AuthFlags & AuthFlagsWakeOnly) &&
6134 rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
6136 rr->ImmedAnswer = mDNSInterfaceMark;
6145 AuthRecord *rr;
6166 for (rr = m->ResourceRecords; rr; rr=rr->next)
6167 if (rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
6168 rr->ImmedAnswer = mDNSInterfaceMark;
6221 AuthRecord *const rr = m->CurrentRecord;
6222 if ((mDNS_KeepaliveRecord(&rr->resrec)) && (rr->resrec.RecordType != kDNSRecordTypeDeregistering))
6224 LogSPS("DoKeepaliveCallbacks: Invoking the callback for %s", ARDisplayString(m, rr));
6225 if (rr->RecordCallback)
6226 rr->RecordCallback(m, rr, mStatus_BadStateErr);
6228 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
6229 m->CurrentRecord = rr->next;
6415 AuthRecord *rr;
6567 for (rr = m->ResourceRecords; rr; rr=rr->next)
6569 if (AuthRecord_uDNS(rr))
6571 ActivateUnicastRegistration(m, rr);
6575 mDNSCoreRestartRegistration(m, rr, -1);
6595 AuthRecord *rr;
6637 for (rr = m->ResourceRecords; rr; rr = rr->next)
6638 if (!AuthRecord_uDNS(rr))
6639 if (!mDNSOpaque64IsZero(&rr->updateIntID))
6640 { 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; }
6651 for (rr = m->ResourceRecords; rr; rr = rr->next)
6652 if (AuthRecord_uDNS(rr))
6654 if (rr->state == regState_Refresh && rr->tcp)
6655 { 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; }
6657 if (!RecordReadyForSleep(m, rr)) { LogSPS("mDNSCoreReadyForSleep: waiting for %s", ARDisplayString(m, rr)); goto notready; }
6680 for (rr = m->ResourceRecords; rr; rr = rr->next)
6681 if (!AuthRecord_uDNS(rr))
6682 if (!mDNSOpaque64IsZero(&rr->updateIntID))
6684 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));
6685 rr->updateIntID = zeroOpaque64;
6760 AuthRecord *rr;
6779 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // and search our list of proposed answers
6781 if (rr->NR_AnswerTo == ptr) // If we're going to generate a record answering this question
6796 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6797 if (rr->NR_AnswerTo)
6799 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAnswers, &rr->resrec,
6800 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
6808 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6809 if (rr->NR_AdditionalTo && !rr->NR_AnswerTo)
6811 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAdditionals, &rr->resrec,
6812 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
6885 const AuthRecord *rr;
6886 for (rr = m->ResourceRecords; rr; rr=rr->next)
6888 if (IdenticalResourceRecord(&rr->resrec, &pktrr->resrec))
6890 while (rr->RRSet && rr != rr->RRSet) rr = rr->RRSet;
6891 return(rr);
6901 // 2b. If the packet rr exactly matches one of our other RRs, and *that* record's DependentOn pointer
6990 CacheRecord *rr;
6992 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
6997 mDNSu16 id2 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
7000 else match = (pktrr->InterfaceID == rr->resrec.InterfaceID);
7002 if (match && IdenticalSameNameRecord(pktrr, &rr->resrec)) break;
7004 return(rr);
7006 mDNSlocal void DeregisterProxyRecord(mDNS *const m, AuthRecord *const rr)
7008 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
7009 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
7010 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7024 AuthRecord *const rr = m->CurrentRecord;
7025 if (InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7030 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7031 DeregisterProxyRecord(m, rr);
7036 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7037 m->CurrentRecord = rr->next;
7050 AuthRecord *const rr = m->CurrentRecord;
7051 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7052 if (IdenticalResourceRecord(&rr->resrec, &m->rec.r.resrec))
7055 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7056 DeregisterProxyRecord(m, rr);
7060 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7061 m->CurrentRecord = rr->next;
7073 AuthRecord *const rr = m->CurrentRecord;
7074 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
7075 if (owner->seq != rr->WakeUp.seq || m->timenow - rr->TimeRcvd > mDNSPlatformOneSecond * 60)
7077 if (rr->AddressProxy.type == mDNSAddrType_IPv6)
7084 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
7085 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, &rr->WakeUp.IMAC, &AllHosts_v6, &AllHosts_v6_Eth);
7089 m->ProxyRecords, rr->AnnounceCount, rr->resrec.RecordType,
7090 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
7091 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) rr->resrec.RecordType = kDNSRecordTypeShared;
7092 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
7093 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it, since real host is now back and functional
7094 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7099 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7100 m->CurrentRecord = rr->next;
7124 AuthRecord *rr;
7202 rr = m->CurrentRecord;
7203 m->CurrentRecord = rr->next;
7204 if (AnyTypeRecordAnswersQuestion(&rr->resrec, &pktq) && (QueryWasMulticast || QueryWasLocalUnicast || rr->AllowRemoteQuery))
7207 if (RRTypeAnswersQuestionType(&rr->resrec, pktq.qtype))
7209 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
7210 ResolveSimultaneousProbe(m, query, end, &pktq, rr);
7211 else if (ResourceRecordIsValidAnswer(rr))
7218 if (pktq.AnonInfo && rr->resrec.AnonInfo)
7219 SetAnonData(&pktq, &rr->resrec, mDNStrue);
7236 if (m->timenow - (rr->LastMCTime + mDNSPlatformOneSecond) >= 0 ||
7237 (rr->LastMCInterface != mDNSInterfaceMark && rr->LastMCInterface != InterfaceID))
7238 rr->NR_AnswerTo = NR_AnswerMulticast;
7240 else if (!rr->NR_AnswerTo) rr->NR_AnswerTo = LegacyQuery ? ptr : NR_AnswerUnicast;
7243 else if ((rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && ResourceRecordIsValidAnswer(rr))
7247 if (!NSECAnswer) NSECAnswer = rr;
7337 for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers
7338 if (rr->NR_AnswerTo) // If we marked the record...
7339 AddRecordToResponseList(&nrp, rr, mDNSNULL); // ... add it to the list
7358 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7360 if (MustSendRecord(rr) && ShouldSuppressKnownAnswer(&m->rec.r, rr))
7363 rr->NR_AnswerTo = mDNSNULL;
7364 rr->NR_AdditionalTo = mDNSNULL;
7369 for (rr=m->ResourceRecords; rr; rr=rr->next)
7372 if (rr->ImmedAnswer == InterfaceID && ShouldSuppressKnownAnswer(&m->rec.r, rr))
7376 if (mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = zerov4Addr;
7380 if (mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = zerov6Addr;
7382 if (mDNSIPv4AddressIsZero(rr->v4Requester) && mDNSIPv6AddressIsZero(rr->v6Requester))
7385 rr->ImmedAnswer = mDNSNULL;
7386 rr->ImmedUnicast = mDNSfalse;
7388 LogMsg("Suppressed after%4d: %s", m->timenow - rr->ImmedAnswerMarkTime, ARDisplayString(m, rr));
7438 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7439 if (rr->NR_AdditionalTo && !MustSendRecord(rr->NR_AdditionalTo))
7440 { rr->NR_AnswerTo = mDNSNULL; rr->NR_AdditionalTo = mDNSNULL; }
7445 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
7447 if (rr->NR_AnswerTo)
7458 if (m->timenow - (rr->LastMCTime + TicksTTL(rr)/4) >= 0)
7464 if (rr->NR_AnswerTo == NR_AnswerUnicast)
7467 rr->NR_AnswerTo = NR_AnswerMulticast;
7473 if (rr->NR_AnswerTo == NR_AnswerMulticast)
7478 else if (rr->NR_AnswerTo == NR_AnswerUnicast)
7483 else if (rr->NR_AnswerTo)
7492 rr->ImmedAnswerMarkTime = m->timenow;
7496 if (rr->ImmedAnswer && rr->ImmedAnswer != InterfaceID)
7497 rr->ImmedAnswer = mDNSInterfaceMark;
7500 rr->ImmedAnswer = InterfaceID; // Record interface to send it on
7501 if (SendUnicastResponse) rr->ImmedUnicast = mDNStrue;
7504 if (mDNSIPv4AddressIsZero(rr->v4Requester)) rr->v4Requester = srcaddr->ip.v4;
7505 else if (!mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = onesIPv4Addr;
7509 if (mDNSIPv6AddressIsZero(rr->v6Requester)) rr->v6Requester = srcaddr->ip.v6;
7510 else if (!mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = onesIPv6Addr;
7519 else if (rr->resrec.RecordType == kDNSRecordTypeShared) delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
7521 else if (rr->NR_AdditionalTo && rr->NR_AdditionalTo->NR_AnswerTo == NR_AnswerMulticast)
7526 rr->ImmedAdditional = InterfaceID;
7577 rr = ResponseRecords;
7578 ResponseRecords = rr->NextResponse;
7579 rr->NextResponse = mDNSNULL;
7580 rr->NR_AnswerTo = mDNSNULL;
7581 rr->NR_AdditionalTo = mDNSNULL;
7752 const mDNSAddr *const srcaddr, const mDNSBool SrcLocal, const mDNSIPPort port, const mDNSOpaque16 id, const CacheRecord *const rr, mDNSBool tcp)
7760 if (!q->DuplicateOf && ResourceRecordAnswersUnicastResponse(&rr->resrec, q))
7764 debugf("ExpectingUnicastResponseForRecord msg->h.id %d q->TargetQID %d for %s", mDNSVal16(id), mDNSVal16(q->TargetQID), CRDisplayString(m, rr));
7783 q->qname.c, DNSTypeName(q->qtype), &q->Target, mDNSVal16(srcp), srcaddr, mDNSVal16(port), CRDisplayString(m, rr));
7814 mDNSlocal mDNSBool ExpectingMulticastResponseForRecord(mDNS *const m, CacheRecord *rr, const mDNSAddr *srcaddr, mDNSBool recordAccepted,
7821 if (recordAccepted && (rr->resrec.rrtype == kDNSType_A || rr->resrec.rrtype == kDNSType_AAAA))
7823 LogInfo("ExpectingMulticastResponseForRecord:A:AAAA: accepting %s, from %#a due to same packet %d", CRDisplayString(m, rr), srcaddr, m->PktNum);
7835 if (q->AnonInfo && McastNSEC3Records && !rr->resrec.AnonInfo)
7837 InitializeAnonInfoForCR(m, McastNSEC3Records, rr);
7839 ret = ResourceRecordAnswersQuestion(&rr->resrec, q);
7844 if (q->AnonInfo && rr->resrec.AnonInfo)
7846 SetAnonData(q, &rr->resrec, mDNSfalse);
7848 LogInfo("ExpectingMulticastResponseForRecord: Name and Type match, accepting %s, from %#a", CRDisplayString(m, rr), srcaddr);
7849 if (rr->resrec.rrtype == kDNSType_NSEC)
7850 LogInfo("ExpectingMulticastResponseForRecord: record %s, question %##s (%s)", CRDisplayString(m, rr), q->qname.c, DNSTypeName(q->qtype));
7853 if (rr->resrec.rrtype == kDNSType_SRV || rr->resrec.rrtype == kDNSType_TXT)
7856 const domainname *name = SkipLeadingLabels(rr->resrec.name, 1);
7867 CRDisplayString(m, rr), q->qname.c, srcaddr, m->PktNum);
7889 CRDisplayString(m, rr), srcaddr, m->PktNum);
7898 debugf("ExpectingMulticastResponseForRecord: discarding %s, from %#a, pktnum %d", CRDisplayString(m, rr), srcaddr, m->PktNum);
7905 mDNSlocal mDNSu16 GetRDLengthMem(const ResourceRecord *const rr)
7907 switch (rr->rrtype)
7912 default: return rr->rdlength;
7918 CacheRecord *rr = mDNSNULL;
7927 if (cg) rr = GetCacheRecord(m, cg, RDLength); // Make a cache record, being careful not to recycle cg
7928 if (!rr) NoCacheAnswer(m, &m->rec.r);
7931 RData *saveptr = rr->resrec.rdata; // Save the rr->resrec.rdata pointer
7932 *rr = m->rec.r; // Block copy the CacheRecord object
7933 rr->resrec.rdata = saveptr; // Restore rr->resrec.rdata after the structure assignment
7934 rr->resrec.name = cg->name; // And set rr->resrec.name to point into our CacheGroup header
7942 rr->resrec.AnonInfo = m->rec.r.resrec.AnonInfo;
7945 rr->DelayDelivery = delay;
7948 if (rr->resrec.rdata == (RData*)&rr->smallrdatastorage && RDLength > InlineCacheRDSize)
7949 LogMsg("rr->resrec.rdata == &rr->rdatastorage but length > InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
7950 else if (rr->resrec.rdata != (RData*)&rr->smallrdatastorage && RDLength <= InlineCacheRDSize)
7951 LogMsg("rr->resrec.rdata != &rr->rdatastorage but length <= InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
7953 mDNSPlatformMemCopy(rr->resrec.rdata, m->rec.r.resrec.rdata, sizeofRDataHeader + RDLength);
7955 rr->next = mDNSNULL; // Clear 'next' pointer
7956 rr->nsec = mDNSNULL;
7957 rr->soa = mDNSNULL;
7960 rr->sourceAddress = *sourceAddress;
7962 if (!rr->resrec.InterfaceID)
7964 m->rrcache_totalused_unicast += rr->resrec.rdlength;
7965 if (DNSSECRecordType(rr->resrec.rrtype))
7966 BumpDNSSECStats(m, kStatsActionIncrement, kStatsTypeMemoryUsage, rr->resrec.rdlength);
7971 *(cg->rrcache_tail) = rr; // Append this record to tail of cache slot list
7972 cg->rrcache_tail = &(rr->next); // Advance tail pointer
7973 CacheRecordAdd(m, rr); // CacheRecordAdd calls SetNextCacheCheckTimeForRecord(m, rr); for us
7983 rr->resrec.name = name;
7987 ReleaseCacheRecord(m, rr);
7989 rr = mDNSNULL;
7993 return(rr);
7996 mDNSlocal void RefreshCacheRecord(mDNS *const m, CacheRecord *rr, mDNSu32 ttl)
7998 rr->TimeRcvd = m->timenow;
7999 rr->resrec.rroriginalttl = ttl;
8000 rr->UnansweredQueries = 0;
8002 rr->MPUnansweredQ = 0;
8003 rr->MPUnansweredKA = 0;
8004 rr->MPExpectingKA = mDNSfalse;
8006 SetNextCacheCheckTimeForRecord(m, rr);
8011 CacheRecord *rr;
8014 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8015 if (rr->CRActiveQuestion == q)
8017 //LogInfo("GrantCacheExtensions: new lease %d / %s", lease, CRDisplayString(m, rr));
8018 RefreshCacheRecord(m, rr, lease);
8062 ResourceRecord *rr = &newcr->resrec;
8075 if (target && cr->resrec.rdatahash == rr->namehash && SameDomainName(target, rr->name))
8077 LogInfo("IsResponseAcceptable: Found a matching entry for %##s in the CacheFlushRecords %s", rr->name->c, CRDisplayString(m, cr));
8088 mDNSBool same = SameDomainName(&q->qname, rr->name);
8089 if (same && (q->qtype == rr->rrtype || rr->rrtype == kDNSType_CNAME))
8097 if (rr->rrtype == kDNSType_RRSIG)
8128 if (rr->rrtype == kDNSType_NSEC)
8130 if (!UNICAST_NSEC(rr))
8139 if (rr->rrtype == kDNSType_SOA)
8145 else if (rr->rrtype == kDNSType_NSEC3)
8225 CacheRecord *rr, *neg = mDNSNULL;
8228 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8229 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
8232 if (RRExpireTime(rr) - m->timenow > 0) break;
8234 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative) neg = rr;
8254 if (!rr)
8273 if (!rr)
8467 mDNSlocal mDNSBool mDNSCoreRegisteredProxyRecord(mDNS *const m, AuthRecord *rr)
8473 if (IdenticalResourceRecord(&rrPtr->resrec, &rr->resrec))
8475 LogSPS("mDNSCoreRegisteredProxyRecord: Ignoring packet registered with sleep proxy : %s ", ARDisplayString(m, rr));
8487 CacheRecord *rr;
8490 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8496 mDNSu16 id1 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
8501 match = (rr->resrec.InterfaceID == InterfaceID);
8503 if (match && IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
8512 if (rr->NextInCFList == mDNSNULL && *cfp != &rr->NextInCFList && LLQType != uDNS_LLQ_Events)
8514 *cflocal = rr;
8515 cflocal = &rr->NextInCFList;
8517 *cfp = &rr->NextInCFList;
8521 if (!(rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))
8526 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
8529 rr->resrec.RecordType = m->rec.r.resrec.RecordType;
8533 if (!SameRDataBody(&m->rec.r.resrec, &rr->resrec.rdata->u, SameDomainNameCS))
8539 rr->resrec.rroriginalttl = 0;
8540 rr->TimeRcvd = m->timenow;
8541 rr->UnansweredQueries = MaxUnansweredQueries;
8542 SetNextCacheCheckTimeForRecord(m, rr);
8543 LogInfo("mDNSCoreReceiveCacheCheck: Discarding due to domainname case change old: %s", CRDisplayString(m, rr));
8546 NextCacheCheckEvent(rr) - m->timenow, slot, m->rrcache_nextcheck[slot] - m->timenow, m->NextCacheCheck - m->timenow);
8549 else if (!IdenticalAnonInfo(m->rec.r.resrec.AnonInfo, rr->resrec.AnonInfo))
8566 rr->resrec.rroriginalttl = 0;
8567 rr->TimeRcvd = m->timenow;
8568 rr->UnansweredQueries = MaxUnansweredQueries;
8569 SetNextCacheCheckTimeForRecord(m, rr);
8570 LogInfo("mDNSCoreReceiveCacheCheck: AnonInfo changed for %s", CRDisplayString(m, rr));
8580 if (rr->resrec.rroriginalttl == 0) debugf("uDNS rescuing %s", CRDisplayString(m, rr));
8581 RefreshCacheRecord(m, rr, m->rec.r.resrec.rroriginalttl);
8582 rr->responseFlags = response->h.flags;
8591 if (response->h.numAnswers && unicastQuestion && unicastQuestion->qtype == rr->resrec.rrtype
8594 LogInfo("mDNSCoreReceiveCacheCheck: rescuing RR %s", CRDisplayString(m, rr));
8595 *NSECCachePtr = rr;
8605 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask)
8610 ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
8631 debugf("DE for %s", CRDisplayString(m, rr));
8632 if (RRExpireTime(rr) - m->timenow > mDNSPlatformOneSecond)
8634 rr->resrec.rroriginalttl = 1;
8635 rr->TimeRcvd = m->timenow;
8636 rr->UnansweredQueries = MaxUnansweredQueries;
8637 SetNextCacheCheckTimeForRecord(m, rr);
8643 return rr;
8650 CacheRecord *rr;
8677 rr = CreateNewCacheEntry(m, slot, cg, 0, mDNSfalse, mDNSNULL);
8678 if (rr)
8680 debugf("mDNSParseNSEC3Records: %s", CRDisplayString(m, rr));
8681 *NSEC3Records = rr;
8682 NSEC3Records = &rr->next;
8815 CacheRecord *rr;
8833 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8834 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
8837 rr->resrec.InterfaceID, CRDisplayString(m, rr));
8839 rr->TimeRcvd = m->timenow - TicksTTL(rr) - 1;
8840 rr->UnansweredQueries = MaxUnansweredQueries;
8841 rr->CRDNSSECQuestion = 0;
8844 LogInfo("mDNSCoreReceiveResponse: CRDNSSECQuestion set for record %s, question %##s (%s)", CRDisplayString(m, rr),
8846 rr->CRDNSSECQuestion = 1;
9042 CacheRecord *const rr = &m->rec.r;
9043 RDataBody2 *const rdb = (RDataBody2 *)rr->smallrdatastorage.data;
9063 AuthRecord *rr = m->CurrentRecord;
9064 m->CurrentRecord = rr->next;
9068 if (!AcceptableResponse && !(ResponseSrcLocal && rr->resrec.RecordType == kDNSRecordTypeUnique)) continue;
9070 if (PacketRRMatchesSignature(&m->rec.r, rr)) // If interface, name, type (if shared record) and class match...
9073 if (IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
9076 if (m->rec.r.resrec.rroriginalttl >= rr->resrec.rroriginalttl/2 || m->SleepState)
9079 if (rr->ImmedAnswer == InterfaceID) { rr->ImmedAnswer = mDNSNULL; rr->ImmedUnicast = mDNSfalse; }
9083 if (rr->ImmedAnswer == mDNSNULL) { rr->ImmedAnswer = InterfaceID; m->NextScheduledResponse = m->timenow; }
9084 else if (rr->ImmedAnswer != InterfaceID) { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
9088 else if (m->rec.r.resrec.rroriginalttl > 0 && PacketRRConflict(m, rr, &m->rec.r))
9091 LogInfo("mDNSCoreReceiveResponse: Our Record: %08lX %s", rr->resrec.rdatahash, ARDisplayString(m, rr));
9095 if (rr->DependentOn)
9097 while (rr->DependentOn) rr = rr->DependentOn;
9098 LogInfo("mDNSCoreReceiveResponse: Dep Record: %08lX %s", rr->resrec.rdatahash, ARDisplayString(m, rr));
9102 if (rr->ProbeCount > DefaultProbeCountForTypeUnique)
9103 LogInfo("mDNSCoreReceiveResponse: Already reset to Probing: %s", ARDisplayString(m, rr));
9104 else if (rr->ProbeCount == DefaultProbeCountForTypeUnique)
9105 LogMsg("mDNSCoreReceiveResponse: Ignoring response received before we even began probing: %s", ARDisplayString(m, rr));
9110 if (rr->resrec.RecordType == kDNSRecordTypeVerified)
9112 LogMsg("mDNSCoreReceiveResponse: Resetting to Probing: %s", ARDisplayString(m, rr));
9113 rr->resrec.RecordType = kDNSRecordTypeUnique;
9118 rr->ProbeCount = DefaultProbeCountForTypeUnique + 1;
9119 rr->AnnounceCount = InitialAnnounceCount;
9120 InitializeLastAPTime(m, rr);
9121 RecordProbeFailure(m, rr); // Repeated late conflicts also cause us to back off to the slower probing rate
9124 else if (rr->resrec.RecordType == kDNSRecordTypeUnique)
9127 if (!mDNSCoreRegisteredProxyRecord(m, rr))
9129 LogMsg("mDNSCoreReceiveResponse: ProbeCount %d; will deregister %s", rr->ProbeCount, ARDisplayString(m, rr));
9132 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
9140 else if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique)
9142 LogMsg("mDNSCoreReceiveResponse: Unexpected conflict discarding %s", ARDisplayString(m, rr));
9144 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
9147 LogMsg("mDNSCoreReceiveResponse: Unexpected record type %X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
9154 else if (m->rec.r.resrec.rrtype == rr->resrec.rrtype)
9155 if ((m->rec.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) && m->timenow - rr->LastMCTime > mDNSPlatformOneSecond/2)
9156 { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
9176 CacheRecord *rr = mDNSNULL;
9188 rr = mDNSCoreReceiveCacheCheck(m, response, LLQType, slot, cg, unicastQuestion, &cfp, &NSECCachePtr, InterfaceID);
9197 if (!m->mDNSOppCaching && !rr && !myself && mDNSOpaque16IsZero(response->h.id))
9214 if (!rr && m->rec.r.resrec.rroriginalttl > 0)
9228 rr = CreateNewCacheEntry(m, slot, cg, delay, !nseclist, srcaddr);
9229 if (rr)
9231 rr->responseFlags = response->h.flags;
9235 if (rr->resrec.rrtype == kDNSType_RRSIG && !nseclist)
9241 rr->CRDNSSECQuestion = 0;
9244 LogInfo("mDNSCoreReceiveResponse: CRDNSSECQuestion set for new record %s, question %##s (%s)", CRDisplayString(m, rr),
9246 rr->CRDNSSECQuestion = 1;
9253 rr->TimeRcvd = m->timenow;
9254 *nsecp = rr;
9255 nsecp = &rr->next;
9259 *cfp = rr;
9260 cfp = &rr->NextInCFList;
9263 else if (rr->DelayDelivery)
9265 ScheduleNextCacheCheckTime(m, slot, rr->DelayDelivery);
9271 if (rr && rr->resrec.AnonInfo && m->rec.r.resrec.AnonInfo)
9273 CopyAnonInfoForCR(m, rr, &m->rec.r);
9496 AuthRecord *const rr = m->CurrentRecord;
9497 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering && mDNSSameEthAddress(&rr->WakeUp.HMAC, e))
9499 LogInfo("ScheduleWakeupForList: Scheduling wakeup packets for %s", ARDisplayString(m, rr));
9500 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
9502 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
9503 m->CurrentRecord = rr->next;
10117 AuthRecord *const rr = m->CurrentRecord;
10118 if (rr->resrec.InterfaceID == InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
10119 if (mDNSSameOpaque16(rr->updateid, msg->h.id))
10124 if (scopeid < (sizeof(rr->updateIntID) * mDNSNBBY))
10125 bit_clr_opaque64(rr->updateIntID, scopeid);
10126 if (mDNSOpaque64IsZero(&rr->updateIntID))
10127 rr->updateid = zeroID;
10128 rr->expire = NonZeroTime(m->timenow + updatelease * mDNSPlatformOneSecond);
10129 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));
10130 if (rr->WakeUp.HMAC.l[0])
10132 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
10133 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
10134 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
10139 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
10140 m->CurrentRecord = rr->next;
10971 AuthRecord *rr;
11007 for (rr = m->ResourceRecords; rr; rr = rr->next)
11009 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
11011 LogInfo("ShouldSuppressDotLocalQuery: Found resource record %s for %##s (%s) not suppressing", ARDisplayString(m, rr),
11049 CacheRecord *rr;
11055 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11058 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative)
11061 CRDisplayString(m, rr), q, q->qname.c, DNSTypeName(q->qtype), rr->CRActiveQuestion, q->CurrentAnswers);
11065 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
11068 q->qname.c, CRDisplayString(m, rr), q->LOAddressAnswers);
11071 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
11072 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
11074 if (rr->CRActiveQuestion == q)
11083 if (qptr != q && ActiveQuestion(qptr) && ResourceRecordAnswersQuestion(&rr->resrec, qptr))
11089 qptr, CRDisplayString(m,rr), q->CurrentAnswers, qptr->CurrentAnswers, qptr->SuppressUnusable, qptr->SuppressQuery);
11091 rr->CRActiveQuestion = qptr; // Question used to be active; new value may or may not be null
11094 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_rmv);
11110 AuthRecord *rr;
11128 for (rr = ag->members; rr; rr=rr->next)
11130 if (UniqueLocalOnlyRecord(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
11133 ARDisplayString(m, rr));
11141 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_rmv); // MUST NOT dereference q again
11750 CacheRecord *rr;
11778 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11780 if (rr->CRActiveQuestion == question)
11786 if (ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
11790 "CurrentAnswers %d, SuppressQuery %d", q, CRDisplayString(m,rr), question->CurrentAnswers, q->CurrentAnswers, q->SuppressQuery);
11791 rr->CRActiveQuestion = q; // Question used to be active; new value may or may not be null
11931 const CacheRecord *rr;
11935 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
11936 if (rr->resrec.RecordType != kDNSRecordTypePacketNegative && SameNameRecordAnswersQuestion(&rr->resrec, question))
11940 question->QuestionCallback(m, question, &rr->resrec, mDNSfalse);
11957 mDNSexport mStatus mDNS_ReconfirmByValue(mDNS *const m, ResourceRecord *const rr)
11962 cr = FindIdenticalRecordInCache(m, rr);
11963 debugf("mDNS_ReconfirmByValue: %p %s", cr, RRDisplayString(m, rr));
12348 mDNSexport mStatus mDNS_Register(mDNS *const m, AuthRecord *const rr)
12352 status = mDNS_Register_internal(m, rr);
12357 mDNSexport mStatus mDNS_Update(mDNS *const m, AuthRecord *const rr, mDNSu32 newttl,
12360 if (!ValidateRData(rr->resrec.rrtype, newrdlength, newrdata))
12362 LogMsg("Attempt to update record with invalid rdata: %s", GetRRDisplayString_rdb(&rr->resrec, &newrdata->u, m->MsgBuffer));
12369 if (newttl == 0) newttl = rr->resrec.rroriginalttl;
12372 if (rr->NewRData)
12374 RData *n = rr->NewRData;
12375 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
12376 if (rr->UpdateCallback)
12377 rr->UpdateCallback(m, rr, n, rr->newrdlength); // ...and let the client free this memory, if necessary
12380 rr->NewRData = newrdata;
12381 rr->newrdlength = newrdlength;
12382 rr->UpdateCallback = Callback;
12385 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P && !IsLocalDomain(rr->resrec.name))
12387 mStatus status = uDNS_UpdateRecord(m, rr);
12389 if (status != mStatus_NoError) { rr->NewRData = mDNSNULL; rr->newrdlength = 0; }
12395 if (RRLocalOnly(rr) || (rr->resrec.rroriginalttl == newttl &&
12396 rr->resrec.rdlength == newrdlength && mDNSPlatformMemSame(rr->resrec.rdata->u.data, newrdata->u.data, newrdlength)))
12397 CompleteRDataUpdate(m, rr);
12400 rr->AnnounceCount = InitialAnnounceCount;
12401 InitializeLastAPTime(m, rr);
12402 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
12403 if (!rr->UpdateBlocked && rr->UpdateCredits) rr->UpdateCredits--;
12404 if (!rr->NextUpdateCredit) rr->NextUpdateCredit = NonZeroTime(m->timenow + kUpdateCreditRefreshInterval);
12405 if (rr->AnnounceCount > rr->UpdateCredits + 1) rr->AnnounceCount = (mDNSu8)(rr->UpdateCredits + 1);
12406 if (rr->UpdateCredits <= 5)
12408 mDNSu32 delay = 6 - rr->UpdateCredits; // Delay 1 second, then 2, then 3, etc. up to 6 seconds maximum
12409 if (!rr->UpdateBlocked) rr->UpdateBlocked = NonZeroTime(m->timenow + (mDNSs32)delay * mDNSPlatformOneSecond);
12410 rr->ThisAPInterval *= 4;
12411 rr->LastAPTime = rr->UpdateBlocked - rr->ThisAPInterval;
12413 rr->resrec.name->c, delay, delay > 1 ? "s" : "");
12415 rr->resrec.rroriginalttl = newttl;
12425 mDNSexport mStatus mDNS_Deregister(mDNS *const m, AuthRecord *const rr)
12429 status = mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
12435 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
12601 AuthRecord *rr;
12624 for (rr = m->ResourceRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
12625 for (rr = m->DuplicateRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
12630 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
12632 (void)rr; // Unused parameter
12639 debugf("mDNS_HostNameCallback: %##s (%s) %s (%ld)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
12675 LogMsg("mDNS_HostNameCallback: Unknown error %d for registration of record %s", result, rr->resrec.name->c);
12693 AuthRecord *rr;
12695 for (rr = m->ResourceRecords; rr; rr=rr->next)
12696 if (AuthRecord_uDNS(rr) && rr->state != regState_NoTarget)
12698 debugf("RestartRecordGetZoneData: StartGetZoneData for %##s", rr->resrec.name->c);
12701 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
12702 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
12773 AuthRecord *rr;
12909 for (rr = m->ResourceRecords; rr; rr=rr->next)
12911 if (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == set->InterfaceID)
12914 ReInitAnonInfo(&rr->resrec.AnonInfo, rr->resrec.name);
12915 mDNSCoreRestartRegistration(m, rr, numannounce);
12984 CacheRecord *rr;
13012 FORALL_CACHERECORDS(slot, cg, rr)
13014 if (rr->resrec.InterfaceID == set->InterfaceID)
13021 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
13024 rr->UnansweredQueries = MaxUnansweredQueries;
13028 mDNS_PurgeCacheResourceRecord(m, rr);
13046 CacheRecord *rr;
13047 FORALL_CACHERECORDS(slot, cg, rr)
13048 if (rr->resrec.InterfaceID == set->InterfaceID)
13049 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
13103 mDNSlocal void ServiceCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
13105 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
13114 debugf("ServiceCallback: %##s (%s) %s (%d)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
13119 if (result == mStatus_NoError && rr != &sr->RR_SRV) return;
13163 mDNSlocal void NSSCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
13165 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
13505 mDNSexport mStatus mDNS_RegisterNoSuchService(mDNS *const m, AuthRecord *const rr,
13514 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_SRV, kHostNameTTL, kDNSRecordTypeUnique, artype, Callback, Context);
13515 if (ConstructServiceName(&rr->namestorage, name, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
13516 rr->resrec.rdata->u.srv.priority = 0;
13517 rr->resrec.rdata->u.srv.weight = 0;
13518 rr->resrec.rdata->u.srv.port = zeroIPPort;
13519 if (host && host->c[0]) AssignDomainName(&rr->resrec.rdata->u.srv.target, host);
13520 else rr->AutoTarget = Target_AutoHost;
13521 return(mDNS_Register(m, rr));
13524 mDNSexport mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr,
13535 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_PTR, kStandardTTL, kDNSRecordTypeShared, artype, mDNSNULL, mDNSNULL);
13536 if (!MakeDomainNameFromDNSNameString(&rr->namestorage, mDNS_DomainTypeNames[DomainType])) return(mStatus_BadParamErr);
13537 if (!MakeDomainNameFromDNSNameString(&rr->resrec.rdata->u.name, domname)) return(mStatus_BadParamErr);
13538 return(mDNS_Register(m, rr));
13577 mDNSlocal void RestartARPProbing(mDNS *const m, AuthRecord *const rr)
13583 // generating ARP conflicts with a waking machine, and set rr->LastAPTime so we'll start probing again in 10 seconds.
13589 rr->resrec.RecordType = kDNSRecordTypeUnique;
13590 rr->ProbeCount = DefaultProbeCountForTypeUnique;
13591 rr->ProbeRestartCount++;
13594 // still going to sleep, so we just reset rr->ProbeCount so we'll continue probing until it stops responding.
13599 if (rr->AnnounceCount == InitialAnnounceCount && m->timenow - rr->LastAPTime >= 0)
13600 InitializeLastAPTime(m, rr);
13603 rr->AnnounceCount = InitialAnnounceCount;
13604 rr->ThisAPInterval = mDNSPlatformOneSecond;
13605 rr->LastAPTime = m->timenow + mDNSPlatformOneSecond * 9; // Send first packet at rr->LastAPTime + rr->ThisAPInterval, i.e. 10 seconds from now
13606 SetNextAnnounceProbeTime(m, rr);
13613 AuthRecord *rr;
13629 for (rr = m->ResourceRecords; rr; rr=rr->next)
13630 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13631 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->tpa))
13637 const char *const msg = mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC) ? msg1 :
13638 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
13641 intf->ifname, msg, &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13644 if ( rr->ProbeRestartCount < MAX_PROBE_RESTARTS)
13645 RestartARPProbing(m, rr);
13647 LogSPS("Reached maximum number of restarts for probing - %s", ARDisplayString(m,rr));
13651 mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
13655 SendARP(m, 2, rr, &arp->tpa, &arp->sha, &arp->spa, &arp->sha);
13673 for (rr = m->ResourceRecords; rr; rr=rr->next)
13674 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13675 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->spa) && (rr->ProbeRestartCount < MAX_PROBE_RESTARTS))
13677 if (mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
13680 &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13684 RestartARPProbing(m, rr);
13685 if (mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC))
13689 &arp->sha, &arp->spa, &arp->tpa, ARDisplayString(m, rr));
13694 &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13695 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
13723 AuthRecord *rr;
13734 for (rr = m->ResourceRecords; rr; rr=rr->next)
13735 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13736 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, ndp->target))
13743 const char *const msg = sha && mDNSSameEthAddress(sha, &rr->WakeUp.IMAC) ? msg1 :
13744 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
13748 intf->ifname, msg, sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13751 if (rr->ProbeRestartCount < MAX_PROBE_RESTARTS)
13752 RestartARPProbing(m, rr);
13754 LogSPS("Reached maximum number of restarts for probing - %s", ARDisplayString(m,rr));
13757 mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
13759 SendNDP(m, NDP_Adv, NDP_Solicited, rr, &ndp->target, mDNSNULL, spa, sha);
13761 SendNDP(m, NDP_Adv, 0, rr, &ndp->target, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
13776 for (rr = m->ResourceRecords; rr; rr=rr->next)
13777 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13778 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, *spa) && (rr->ProbeRestartCount < MAX_PROBE_RESTARTS))
13780 if (mDNSSameEthAddress(&zeroEthAddr, &rr->WakeUp.HMAC))
13783 sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13787 RestartARPProbing(m, rr);
13788 if (mDNSSameEthAddress(sha, &rr->WakeUp.IMAC))
13791 ndp->type == NDP_Sol ? "Solicitation " : "Advertisement", sha, spa, &ndp->target, ARDisplayString(m, rr));
13796 sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
13797 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
13957 AuthRecord *rr, *r2;
13960 for (rr = m->ResourceRecords; rr; rr=rr->next)
13961 if (rr->resrec.InterfaceID == InterfaceID &&
13962 rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
13963 rr->AddressProxy.type && mDNSSameAddress(&rr->AddressProxy, dst))
13967 if (r2->resrec.InterfaceID == InterfaceID && mDNSSameEthAddress(&r2->WakeUp.HMAC, &rr->WakeUp.HMAC) &&
13972 if (!r2 && mDNSSameIPPort(port, IPSECPort)) r2 = rr; // So that we wake for BTMM IPSEC packets, even without a matching SRV record
13973 if (!r2 && kaWake) r2 = rr; // So that we wake for keepalive packets, even without a matching SRV record
13977 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, r2));
13978 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
13982 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, tp, mDNSVal16(port));
14366 mDNSlocal void DynDNSHostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
14369 debugf("NameStatusCallback: result %d for registration of name %##s", result, rr->resrec.name->c);
14370 mDNSPlatformDynDNSHostNameStatusChanged(rr->resrec.name, result);
14880 AuthRecord *rr = m->CurrentRecord;
14882 (rr->resrec.RecordType != kDNSRecordTypeDeregistering) ? "Initiating " : "Accelerating",
14883 rr, rr->resrec.RecordType, ARDisplayString(m, rr));
14884 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
14885 mDNS_Deregister_internal(m, rr, mDNS_Dereg_rapid);
14886 else if (rr->AnnounceCount > 1)
14888 rr->AnnounceCount = 1;
14889 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
14893 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
14894 m->CurrentRecord = rr->next;
14901 AuthRecord *rr;
14988 for (rr = m->DuplicateRecords; rr; rr = rr->next)
14989 LogMsg("mDNS_StartExit: Should not still have Duplicate Records remaining: %02X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
15004 AuthRecord *rr;
15030 for (rr = m->ResourceRecords; rr; rr = rr->next)
15031 LogMsg("mDNS_FinalExit failed to send goodbye for: %p %02X %s", rr, rr->resrec.RecordType, ARDisplayString(m, rr));