Home | History | Annotate | Download | only in mDNSCore

Lines Matching refs:rr

117 #define LORecordAnswersAddressType(rr) ((rr)->ARType == AuthRecordLocalOnly && \
118 (rr)->resrec.RecordType & kDNSRecordTypeUniqueMask && \
119 ((rr)->resrec.rrtype == kDNSType_A || (rr)->resrec.rrtype == kDNSType_AAAA || \
120 (rr)->resrec.rrtype == kDNSType_CNAME))
122 #define FollowCNAME(q, rr, AddRecord) (AddRecord && (q)->qtype != kDNSType_CNAME && \
123 (rr)->RecordType != kDNSRecordTypePacketNegative && \
124 (rr)->rrtype == kDNSType_CNAME)
225 LogInfo("RR Auth now using %ld objects", r->rrauth_totalused);
247 mDNSexport AuthGroup *AuthGroupForRecord(AuthHash *r, const mDNSu32 slot, const ResourceRecord *const rr)
249 return(AuthGroupForName(r, slot, rr->namehash, rr->name));
252 mDNSlocal AuthGroup *GetAuthGroup(AuthHash *r, const mDNSu32 slot, const ResourceRecord *const rr)
254 mDNSu16 namelen = DomainNameLength(rr->name);
256 if (!ag) { LogMsg("GetAuthGroup: Failed to allocate memory for %##s", rr->name->c); return(mDNSNULL); }
258 ag->namehash = rr->namehash;
266 LogMsg("GetAuthGroup: Failed to allocate name storage for %##s", rr->name->c);
270 AssignDomainName(ag->name, rr->name);
272 if (AuthGroupForRecord(r, slot, rr)) LogMsg("GetAuthGroup: Already have AuthGroup for %##s", rr->name->c);
274 if (AuthGroupForRecord(r, slot, rr) != ag) LogMsg("GetAuthGroup: Not finding AuthGroup for %##s", rr->name->c);
280 mDNSexport AuthGroup *InsertAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr)
283 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
284 ag = AuthGroupForRecord(r, slot, &rr->resrec);
285 if (!ag) ag = GetAuthGroup(r, slot, &rr->resrec); // If we don't have a AuthGroup for this name, make one now
288 LogInfo("InsertAuthRecord: inserting auth record %s from table", ARDisplayString(m, rr));
289 *(ag->rrauth_tail) = rr; // Append this record to tail of cache slot list
290 ag->rrauth_tail = &(rr->next); // Advance tail pointer
295 mDNSexport AuthGroup *RemoveAuthRecord(mDNS *const m, AuthHash *r, AuthRecord *rr)
300 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
302 a = AuthGroupForRecord(r, slot, &rr->resrec);
303 if (!a) { LogMsg("RemoveAuthRecord: ERROR!! AuthGroup not found for %s", ARDisplayString(m, rr)); return mDNSNULL; }
307 if (*rp != rr)
313 LogInfo("RemoveAuthRecord: removing auth record %s from table", ARDisplayString(m, rr));
331 mDNSlocal CacheGroup *CacheGroupForRecord(const mDNS *const m, const mDNSu32 slot, const ResourceRecord *const rr)
333 return(CacheGroupForName(m, slot, rr->namehash, rr->name));
393 mDNSlocal void AnswerQuestionByFollowingCNAME(mDNS *const m, DNSQuestion *q, ResourceRecord *rr)
395 const mDNSBool selfref = SameDomainName(&q->qname, &rr->rdata->u.name);
398 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, selfref ? " (Self-Referential)" : "", RRDisplayString(m, rr));
419 q, q->qname.c, DNSTypeName(q->qtype), q->CNAMEReferrals, RRDisplayString(m, rr));
422 AssignDomainName(&q->qname, &rr->rdata->u.name); // Update qname
430 q, q->qname.c, DNSTypeName(q->qtype), RRDisplayString(m, rr));
442 mDNSlocal void AnswerLocalQuestionWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
449 LogMsg("AnswerLocalQuestionWithLocalAuthRecord: ERROR!! CurrentQuestion NULL while answering with %s", ARDisplayString(m, rr));
453 followcname = FollowCNAME(q, &rr->resrec, AddRecord);
456 if (!(rr->resrec.RecordType & kDNSRecordTypeActiveMask))
459 AddRecord ? "Add" : "Rmv", rr->resrec.RecordType, ARDisplayString(m, rr));
464 if (AddRecord) rr->AnsweredLocalQ = mDNStrue;
469 if (LORecordAnswersAddressType(rr))
476 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
482 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
486 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
491 mDNSlocal void AnswerInterfaceAnyQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
501 if (RRAny(rr))
502 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
504 answered = LocalOnlyRecordAnswersQuestion(rr, q);
506 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
524 mDNSlocal void AnswerAllLocalQuestionsWithLocalAuthRecord(mDNS *const m, AuthRecord *rr, QC_result AddRecord)
536 if (RRAny(rr))
537 answered = ResourceRecordAnswersQuestion(&rr->resrec, q);
539 answered = LocalOnlyRecordAnswersQuestion(rr, q);
541 AnswerLocalQuestionWithLocalAuthRecord(m, rr, AddRecord); // MUST NOT dereference q again
549 if (rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P)
550 AnswerInterfaceAnyQuestionsWithLocalAuthRecord(m, rr, AddRecord);
562 #define ResourceRecordIsValidAnswer(RR) ( ((RR)-> resrec.RecordType & kDNSRecordTypeActiveMask) && \
563 ((RR)->Additional1 == mDNSNULL || ((RR)->Additional1->resrec.RecordType & kDNSRecordTypeActiveMask)) && \
564 ((RR)->Additional2 == mDNSNULL || ((RR)->Additional2->resrec.RecordType & kDNSRecordTypeActiveMask)) && \
565 ((RR)->DependentOn == mDNSNULL || ((RR)->DependentOn->resrec.RecordType & kDNSRecordTypeActiveMask)) )
567 #define ResourceRecordIsValidInterfaceAnswer(RR, INTID) \
568 (ResourceRecordIsValidAnswer(RR) && \
569 ((RR)->resrec.InterfaceID == mDNSInterface_Any || (RR)->resrec.InterfaceID == (INTID)))
597 #define TimeToAnnounceThisRecord(RR,time) ((RR)->AnnounceCount && (time) - ((RR)->LastAPTime + (RR)->ThisAPInterval) >= 0)
598 #define TimeToSendThisRecord(RR,time) ((TimeToAnnounceThisRecord(RR,time) || (RR)->ImmedAnswer) && ResourceRecordIsValidAnswer(RR))
599 #define TicksTTL(RR) ((mDNSs32)(RR)->resrec.rroriginalttl * mDNSPlatformOneSecond)
600 #define RRExpireTime(RR) ((RR)->TimeRcvd + TicksTTL(RR))
653 // AuthRecord *rr is the answer we are proposing to give, if not suppressed.
658 mDNSlocal mDNSBool ShouldSuppressKnownAnswer(const CacheRecord *const ka, const AuthRecord *const rr)
660 // If RR signature is different, or data is different, then don't suppress our answer
661 if (!IdenticalResourceRecord(&ka->resrec, &rr->resrec)) return(mDNSfalse);
672 return(mDNSBool)(ka->resrec.rroriginalttl >= rr->resrec.rroriginalttl / 2);
675 mDNSlocal void SetNextAnnounceProbeTime(mDNS *const m, const AuthRecord *const rr)
677 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
679 if ((rr->LastAPTime + rr->ThisAPInterval) - m->timenow > mDNSPlatformOneSecond * 10)
681 LogMsg("SetNextAnnounceProbeTime: ProbeCount %d Next in %d %s", rr->ProbeCount, (rr->LastAPTime + rr->ThisAPInterval) - m->timenow, ARDisplayString(m, rr));
684 if (m->NextScheduledProbe - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
685 m->NextScheduledProbe = (rr->LastAPTime + rr->ThisAPInterval);
687 // If (rr->LastAPTime + rr->ThisAPInterval) happens to be far in the past, we don't want to allow
693 else if (rr->AnnounceCount && (ResourceRecordIsValidAnswer(rr) || rr->resrec.RecordType == kDNSRecordTypeDeregistering))
695 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
696 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
700 mDNSlocal void InitializeLastAPTime(mDNS *const m, AuthRecord *const rr)
703 rr->ThisAPInterval = rr->AddressProxy.type ? mDNSPlatformOneSecond : DefaultAPIntervalForRecordType(rr->resrec.RecordType);
716 if (rr->ProbeCount)
756 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval;
759 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval + DefaultProbeIntervalForTypeUnique * DefaultProbeCountForTypeUnique + rr->ThisAPInterval / 2;
761 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
769 if (rr->AddressProxy.type) rr->LastAPTime = m->timenow;
777 if (rr->WakeUp.HMAC.l[0] && rr->resrec.rrtype == kDNSType_AAAA)
778 rr->LastAPTime = m->timenow - rr->ThisAPInterval + mDNSPlatformOneSecond * 10;
782 rr->LastMCTime = m->timenow;
783 rr->LastMCInterface = mDNSInterfaceMark;
785 SetNextAnnounceProbeTime(m, rr);
788 mDNSlocal const domainname *SetUnicastTargetToHostName(mDNS *const m, AuthRecord *rr)
791 if (rr->AutoTarget)
796 DomainAuthInfo *AuthInfo = GetAuthInfoForName_internal(m, rr->resrec.name);
797 if (!AuthInfo || !AuthInfo->AutoTunnel) rr->AutoTarget = Target_AutoHostAndNATMAP;
800 target = GetServiceTarget(m, rr);
804 LogInfo("SetUnicastTargetToHostName No target for %s", ARDisplayString(m, rr));
805 rr->state = regState_NoTarget;
810 LogInfo("SetUnicastTargetToHostName target %##s for resource record %s", target->c, ARDisplayString(m,rr));
817 mDNSlocal void SetTargetToHostName(mDNS *const m, AuthRecord *const rr)
819 domainname *const target = GetRRDomainNameTarget(&rr->resrec);
822 if (!target) LogInfo("SetTargetToHostName: Don't know how to set the target of rrtype %s", DNSTypeName(rr->resrec.rrtype));
824 if (!(rr->ForceMCast || rr->ARType == AuthRecordLocalOnly || rr->ARType == AuthRecordP2P || IsLocalDomain(&rr->namestorage)))
826 const domainname *const n = SetUnicastTargetToHostName(m, rr);
828 else { target->c[0] = 0; SetNewRData(&rr->resrec, mDNSNULL, 0); return; }
832 debugf("SetTargetToHostName: Target of %##s is already %##s", rr->resrec.name->c, target->c);
837 SetNewRData(&rr->resrec, mDNSNULL, 0); // Update rdlength, rdestimate, rdatahash
842 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
847 if (rr->RequireGoodbye && rr->resrec.RecordType == kDNSRecordTypeShared)
849 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
851 rr->AnnounceCount = InitialAnnounceCount;
852 rr->RequireGoodbye = mDNSfalse;
853 InitializeLastAPTime(m, rr);
857 mDNSlocal void AcknowledgeRecord(mDNS *const m, AuthRecord *const rr)
859 if (rr->RecordCallback)
861 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
863 rr->Acknowledged = mDNStrue;
865 rr->RecordCallback(m, rr, mStatus_NoError);
870 mDNSexport void ActivateUnicastRegistration(mDNS *const m, AuthRecord *const rr)
876 if (rr->resrec.rrtype != kDNSType_SRV)
879 if (rr->resrec.rrtype == kDNSType_PTR)
880 srvRR = rr->Additional1;
881 else if (rr->resrec.rrtype == kDNSType_TXT)
882 srvRR = rr->DependentOn;
892 ARDisplayString(m, srvRR), srvRR->state, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
893 rr->state = srvRR->state;
898 if (rr->state == regState_NoTarget)
900 LogInfo("ActivateUnicastRegistration record %s in regState_NoTarget, not activating", ARDisplayString(m, rr));
908 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
910 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to DeregPending", ARDisplayString(m, rr), rr->state);
911 rr->state = regState_DeregPending;
915 LogInfo("ActivateUnicastRegistration: Resource record %s, current state %d, moving to Pending", ARDisplayString(m, rr), rr->state);
916 rr->state = regState_Pending;
918 rr->ProbeCount = 0;
919 rr->AnnounceCount = 0;
920 rr->ThisAPInterval = INIT_RECORD_REG_INTERVAL;
921 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
922 rr->expire = 0; // Forget about all the leases, start fresh
923 rr->uselease = mDNStrue;
924 rr->updateid = zeroID;
925 rr->SRVChanged = mDNSfalse;
926 rr->updateError = mStatus_NoError;
929 if (rr->NATinfo.clientContext)
931 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
932 rr->NATinfo.clientContext = mDNSNULL;
934 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
935 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
936 if (m->NextuDNSEvent - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
937 m->NextuDNSEvent = (rr->LastAPTime + rr->ThisAPInterval);
951 mDNSlocal AuthRecord *CheckAuthIdenticalRecord(AuthHash *r, AuthRecord *rr)
956 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
958 a = AuthGroupForRecord(r, slot, &rr->resrec);
963 if (!RecordIsLocalDuplicate(*rp, rr))
978 mDNSlocal mDNSBool CheckAuthRecordConflict(AuthHash *r, AuthRecord *rr)
983 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
985 a = AuthGroupForRecord(r, slot, &rr->resrec);
990 const AuthRecord *s1 = rr->RRSet ? rr->RRSet : rr;
992 if (s1 != s2 && SameResourceRecordSignature((*rp), rr) && !IdenticalSameNameRecord(&(*rp)->resrec, &rr->resrec))
1000 // checks to see if "rr" is already present
1001 mDNSlocal AuthRecord *CheckAuthSameRecord(AuthHash *r, AuthRecord *rr)
1006 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1008 a = AuthGroupForRecord(r, slot, &rr->resrec);
1013 if (*rp != rr)
1024 mDNSexport mStatus mDNS_Register_internal(mDNS *const m, AuthRecord *const rr)
1026 domainname *target = GetRRDomainNameTarget(&rr->resrec);
1031 if ((mDNSs32)rr->resrec.rroriginalttl <= 0)
1032 { LogMsg("mDNS_Register_internal: TTL %X should be 1 - 0x7FFFFFFF %s", rr->resrec.rroriginalttl, ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1034 if (!rr->resrec.RecordType)
1035 { LogMsg("mDNS_Register_internal: RecordType must be non-zero %s", ARDisplayString(m, rr)); return(mStatus_BadParamErr); }
1038 { LogMsg("mDNS_Register_internal: Shutting down, can't register %s", ARDisplayString(m, rr)); return(mStatus_ServiceNotRunning); }
1040 if (m->DivertMulticastAdvertisements && !AuthRecord_uDNS(rr))
1042 mDNSInterfaceID previousID = rr->resrec.InterfaceID;
1043 if (rr->resrec.InterfaceID == mDNSInterface_Any || rr->resrec.InterfaceID == mDNSInterface_P2P)
1045 rr->resrec.InterfaceID = mDNSInterface_LocalOnly;
1046 rr->ARType = AuthRecordLocalOnly;
1048 if (rr->resrec.InterfaceID != mDNSInterface_LocalOnly)
1050 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1051 if (intf && !intf->Advertise){ rr->resrec.InterfaceID = mDNSInterface_LocalOnly; rr->ARType = AuthRecordLocalOnly; }
1053 if (rr->resrec.InterfaceID != previousID)
1054 LogInfo("mDNS_Register_internal: Diverting record to local-only %s", ARDisplayString(m, rr));
1057 if (RRLocalOnly(rr))
1059 if (CheckAuthSameRecord(&m->rrauth, rr))
1062 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1068 while (*p && *p != rr) p=&(*p)->next;
1072 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1077 while (*d && *d != rr) d=&(*d)->next;
1081 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1085 if (rr->DependentOn)
1087 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
1088 rr->resrec.RecordType = kDNSRecordTypeVerified;
1091 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn && RecordType != kDNSRecordTypeUnique",
1092 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1095 if (!(rr->DependentOn->resrec.RecordType & (kDNSRecordTypeUnique | kDNSRecordTypeVerified | kDNSRecordTypeKnownUnique)))
1097 LogMsg("mDNS_Register_internal: ERROR! %##s (%s): rr->DependentOn->RecordType bad type %X",
1098 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->DependentOn->resrec.RecordType);
1106 if (rr->resrec.InterfaceID && rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P)
1108 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1111 debugf("mDNS_Register_internal: Bogus InterfaceID %p in resource record", rr->resrec.InterfaceID);
1116 rr->next = mDNSNULL;
1122 // rr->Additional1 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1123 // rr->Additional2 = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1124 // rr->DependentOn = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1125 // rr->RRSet = set to mDNSNULL in mDNS_SetupResourceRecord; may be overridden by client
1126 // rr->Callback = already set in mDNS_SetupResourceRecord
1127 // rr->Context = already set in mDNS_SetupResourceRecord
1128 // rr->RecordType = already set in mDNS_SetupResourceRecord
1129 // rr->HostTarget = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1130 // rr->AllowRemoteQuery = set to mDNSfalse in mDNS_SetupResourceRecord; may be overridden by client
1132 if (rr->AutoTarget && target) target->c[0] = 0;
1135 rr->Acknowledged = mDNSfalse;
1136 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
1137 rr->AnnounceCount = InitialAnnounceCount;
1138 rr->RequireGoodbye = mDNSfalse;
1139 rr->AnsweredLocalQ = mDNSfalse;
1140 rr->IncludeInProbe = mDNSfalse;
1141 rr->ImmedUnicast = mDNSfalse;
1142 rr->SendNSECNow = mDNSNULL;
1143 rr->ImmedAnswer = mDNSNULL;
1144 rr->ImmedAdditional = mDNSNULL;
1145 rr->SendRNow = mDNSNULL;
1146 rr->v4Requester = zerov4Addr;
1147 rr->v6Requester = zerov6Addr;
1148 rr->NextResponse = mDNSNULL;
1149 rr->NR_AnswerTo = mDNSNULL;
1150 rr->NR_AdditionalTo = mDNSNULL;
1151 if (!rr->AutoTarget) InitializeLastAPTime(m, rr);
1152 // rr->LastAPTime = Set for us in InitializeLastAPTime()
1153 // rr->LastMCTime = Set for us in InitializeLastAPTime()
1154 // rr->LastMCInterface = Set for us in InitializeLastAPTime()
1155 rr->NewRData = mDNSNULL;
1156 rr->newrdlength = 0;
1157 rr->UpdateCallback = mDNSNULL;
1158 rr->UpdateCredits = kMaxUpdateCredits;
1159 rr->NextUpdateCredit = 0;
1160 rr->UpdateBlocked = 0;
1163 if (rr->WakeUp.HMAC.l[0] && !rr->AddressProxy.type) rr->AnnounceCount = 2;
1166 rr->state = regState_Zero;
1167 rr->uselease = 0;
1168 rr->expire = 0;
1169 rr->Private = 0;
1170 rr->updateid = zeroID;
1171 rr->zone = rr->resrec.name;
1172 rr->nta = mDNSNULL;
1173 rr->tcp = mDNSNULL;
1174 rr->OrigRData = 0;
1175 rr->OrigRDLen = 0;
1176 rr->InFlightRData = 0;
1177 rr->InFlightRDLen = 0;
1178 rr->QueuedRData = 0;
1179 rr->QueuedRDLen = 0;
1180 //mDNSPlatformMemZero(&rr->NATinfo, sizeof(rr->NATinfo));
1184 //if (rr->resrec.rrtype == kDNSType_SRV) rr->NATinfo.IntPort = rr->resrec.rdata->u.srv.port;
1186 // rr->resrec.interface = already set in mDNS_SetupResourceRecord
1187 // rr->resrec.name->c = MUST be set by client
1188 // rr->resrec.rrtype = already set in mDNS_SetupResourceRecord
1189 // rr->resrec.rrclass = already set in mDNS_SetupResourceRecord
1190 // rr->resrec.rroriginalttl = already set in mDNS_SetupResourceRecord
1191 // rr->resrec.rdata = MUST be set by client, unless record type is CNAME or PTR and rr->HostTarget is set
1196 if (rr->resrec.rrtype == kDNSType_TXT && rr->resrec.rdlength == 0) { rr->resrec.rdlength = 1; rr->resrec.rdata->u.txt.c[0] = 0; }
1198 if (rr->AutoTarget)
1200 SetTargetToHostName(m, rr); // Also sets rdlength and rdestimate for us, and calls InitializeLastAPTime();
1202 // If we have no target record yet, SetTargetToHostName will set rr->state == regState_NoTarget
1204 if (rr->state == regState_NoTarget)
1207 domainname *tar = GetRRDomainNameTarget(&rr->resrec);
1209 LogInfo("mDNS_Register_internal: record %s in NoTarget state", ARDisplayString(m, rr));
1215 rr->resrec.rdlength = GetRDLength(&rr->resrec, mDNSfalse);
1216 rr->resrec.rdestimate = GetRDLength(&rr->resrec, mDNStrue);
1219 if (!ValidateDomainName(rr->resrec.name))
1220 { LogMsg("Attempt to register record with invalid name: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1222 // Don't do this until *after* we've set rr->resrec.rdlength
1223 if (!ValidateRData(rr->resrec.rrtype, rr->resrec.rdlength, rr->resrec.rdata))
1224 { LogMsg("Attempt to register record with invalid rdata: %s", ARDisplayString(m, rr)); return(mStatus_Invalid); }
1226 rr->resrec.namehash = DomainNameHashValue(rr->resrec.name);
1227 rr->resrec.rdatahash = target ? DomainNameHashValue(target) : RDataHashValue(&rr->resrec);
1229 if (RRLocalOnly(rr))
1236 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1238 if (CheckAuthRecordConflict(&m->rrauth, rr))
1240 LogInfo("mDNS_Register_internal: Name conflict %s (%p), InterfaceID %p", ARDisplayString(m, rr), rr, rr->resrec.InterfaceID);
1248 if (AuthRecord_uDNS(rr))
1250 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1255 *p = rr;
1256 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1257 rr->ProbeCount = 0;
1258 rr->AnnounceCount = 0;
1259 if (rr->state != regState_NoTarget) ActivateUnicastRegistration(m, rr);
1265 if (RRLocalOnly(rr))
1267 rr->ProbeCount = 0;
1268 rr->AnnounceCount = 0;
1269 r = CheckAuthIdenticalRecord(&m->rrauth, rr);
1274 if (RecordIsLocalDuplicate(r, rr))
1283 debugf("mDNS_Register_internal:Adding to duplicate list %s", ARDisplayString(m,rr));
1284 *d = rr;
1289 if (rr->resrec.RecordType == kDNSRecordTypeUnique && r->resrec.RecordType == kDNSRecordTypeVerified)
1290 rr->ProbeCount = 0;
1294 debugf("mDNS_Register_internal: Adding to active record list %s", ARDisplayString(m,rr));
1295 if (RRLocalOnly(rr))
1298 ag = InsertAuthRecord(m, &m->rrauth, rr);
1301 ag->NewLocalOnlyRecords = rr;
1304 if (rr->resrec.RecordType == kDNSRecordTypeUnique) rr->resrec.RecordType = kDNSRecordTypeVerified;
1305 AcknowledgeRecord(m, rr);
1310 if (!m->NewLocalRecords) m->NewLocalRecords = rr;
1311 *p = rr;
1315 if (!AuthRecord_uDNS(rr)) // This check is superfluous, given that for unicast records we (currently) bail out above
1318 if (rr->resrec.RecordType != kDNSRecordTypeUnique && rr->resrec.RecordType != kDNSRecordTypeDeregistering)
1319 AcknowledgeRecord(m, rr);
1328 mDNSlocal void RecordProbeFailure(mDNS *const m, const AuthRecord *const rr)
1343 m->NumFailedProbes, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1347 mDNSlocal void CompleteRDataUpdate(mDNS *const m, AuthRecord *const rr)
1349 RData *OldRData = rr->resrec.rdata;
1350 mDNSu16 OldRDLen = rr->resrec.rdlength;
1351 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength); // Update our rdata
1352 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
1353 if (rr->UpdateCallback)
1354 rr->UpdateCallback(m, rr, OldRData, OldRDLen); // ... and let the client know
1360 mDNSexport mStatus mDNS_Deregister_internal(mDNS *const m, AuthRecord *const rr, mDNS_Dereg_type drt)
1363 mDNSu8 RecordType = rr->resrec.RecordType;
1367 if (RRLocalOnly(rr))
1372 const mDNSu32 slot = AuthHashSlot(rr->resrec.name);
1374 a = AuthGroupForRecord(&m->rrauth, slot, &rr->resrec);
1377 while (*rp && *rp != rr) rp=&(*rp)->next;
1382 while (*p && *p != rr) p=&(*p)->next;
1390 // Scan for duplicates of rr, and mark them for deregistration at the end of this routine, after we've finished
1391 // deregistering rr. We need to do this scan *before* we give the client the chance to free and reuse the rr memory.
1392 for (r2 = m->DuplicateRecords; r2; r2=r2->next) if (RecordIsLocalDuplicate(r2, rr)) r2->ProbeCount = 0xFF;
1399 while (*d && !RecordIsLocalDuplicate(*d, rr)) d=&(*d)->next;
1404 dup, rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1406 if (RRLocalOnly(rr))
1413 dup->next = rr->next; // And then...
1414 rr->next = dup; // ... splice it in right after the record we're about to delete
1416 dup->resrec.RecordType = rr->resrec.RecordType;
1417 dup->ProbeCount = rr->ProbeCount;
1418 dup->AnnounceCount = rr->AnnounceCount;
1419 dup->RequireGoodbye = rr->RequireGoodbye;
1420 dup->AnsweredLocalQ = rr->AnsweredLocalQ;
1421 dup->ImmedAnswer = rr->ImmedAnswer;
1422 dup->ImmedUnicast = rr->ImmedUnicast;
1423 dup->ImmedAdditional = rr->ImmedAdditional;
1424 dup->v4Requester = rr->v4Requester;
1425 dup->v6Requester = rr->v6Requester;
1426 dup->ThisAPInterval = rr->ThisAPInterval;
1427 dup->LastAPTime = rr->LastAPTime;
1428 dup->LastMCTime = rr->LastMCTime;
1429 dup->LastMCInterface = rr->LastMCInterface;
1430 dup->Private = rr->Private;
1431 dup->state = rr->state;
1432 rr->RequireGoodbye = mDNSfalse;
1433 rr->AnsweredLocalQ = mDNSfalse;
1441 while (*p && *p != rr) p=&(*p)->next;
1443 if (*p) { rr->RequireGoodbye = mDNSfalse; dupList = mDNStrue; }
1445 rr, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1452 LogMsg("mDNS_Deregister_internal: Record %p not found in list %s", rr, ARDisplayString(m,rr));
1460 // it's tempting to just do "AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse)" here, but that would not not be safe.
1471 if (AuthRecord_uDNS(rr))
1473 if (rr->RequireGoodbye)
1475 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1476 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1478 uDNS_DeregisterRecord(m, rr);
1488 rr->updateid = zeroID;
1497 if (rr->NATinfo.clientContext)
1499 mDNS_StopNATOperation_internal(m, &rr->NATinfo);
1500 rr->NATinfo.clientContext = mDNSNULL;
1502 if (rr->nta) { CancelGetZoneData(m, rr->nta); rr->nta = mDNSNULL; }
1503 if (rr->tcp) { DisposeTCPConn(rr->tcp); rr->tcp = mDNSNULL; }
1508 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeUnregistered", ARDisplayString(m, rr));
1511 LogMsg("mDNS_Deregister_internal: %s already marked kDNSRecordTypeDeregistering", ARDisplayString(m, rr));
1521 if (rr->WakeUp.HMAC.l[0] ||
1522 (RecordType == kDNSRecordTypeShared && (rr->RequireGoodbye || rr->AnsweredLocalQ)))
1524 verbosedebugf("mDNS_Deregister_internal: Starting deregistration for %s", ARDisplayString(m, rr));
1525 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
1526 rr->resrec.rroriginalttl = 0;
1527 rr->AnnounceCount = rr->WakeUp.HMAC.l[0] ? WakeupCount : (drt == mDNS_Dereg_rapid) ? 1 : GoodbyeCount;
1528 rr->ThisAPInterval = mDNSPlatformOneSecond * 2;
1529 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
1536 if (!dupList && RRLocalOnly(rr))
1538 AuthGroup *ag = RemoveAuthRecord(m, &m->rrauth, rr);
1539 if (ag->NewLocalOnlyRecords == rr) ag->NewLocalOnlyRecords = rr->next;
1543 *p = rr->next; // Cut this record from the list
1544 if (m->NewLocalRecords == rr) m->NewLocalRecords = rr->next;
1547 if (m->CurrentRecord == rr) m->CurrentRecord = rr->next;
1548 rr->next = mDNSNULL;
1552 // if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse); rr->AnsweredLocalQ = mDNSfalse; }
1554 verbosedebugf("mDNS_Deregister_internal: Deleting record for %s", ARDisplayString(m, rr));
1555 rr->resrec.RecordType = kDNSRecordTypeUnregistered;
1559 rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1562 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
1565 // CAUTION: MUST NOT do anything more with rr after calling rr->Callback(), because the client's callback function
1568 // so any attempt to touch rr after this is likely to lead to a crash.
1572 LogInfo("mDNS_Deregister_internal: mStatus_MemFree for %s", ARDisplayString(m, rr));
1573 if (rr->RecordCallback)
1574 rr->RecordCallback(m, rr, mStatus_MemFree); // MUST NOT touch rr after this
1579 RecordProbeFailure(m, rr);
1581 if (rr->RecordCallback)
1582 rr->RecordCallback(m, rr, mStatus_NameConflict); // MUST NOT touch rr after this
1584 // Now that we've finished deregistering rr, check our DuplicateRecords list for any that we marked previously.
1605 mDNSlocal void AddRecordToResponseList(AuthRecord ***nrpp, AuthRecord *rr, AuthRecord *add)
1607 if (rr->NextResponse == mDNSNULL && *nrpp != &rr->NextResponse)
1609 **nrpp = rr;
1614 rr->NR_AdditionalTo = add;
1615 *nrpp = &rr->NextResponse;
1617 debugf("AddRecordToResponseList: %##s (%s) already in list", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype));
1622 AuthRecord *rr, *rr2;
1623 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // For each record we plan to put
1627 if (rr->Additional1 && ResourceRecordIsValidInterfaceAnswer(rr->Additional1, InterfaceID))
1628 AddRecordToResponseList(nrpp, rr->Additional1, rr);
1630 if (rr->Additional2 && ResourceRecordIsValidInterfaceAnswer(rr->Additional2, InterfaceID))
1631 AddRecordToResponseList(nrpp, rr->Additional2, rr);
1634 if (rr->resrec.rrtype == kDNSType_SRV)
1639 rr->resrec.rdatahash == rr2->resrec.namehash && // ... whose name is the name of the SRV target
1640 SameDomainName(&rr->resrec.rdata->u.srv.target, rr2->resrec.name))
1641 AddRecordToResponseList(nrpp, rr2, rr);
1643 else if (RRTypeIsAddressType(rr->resrec.rrtype)) // For A or AAAA, put counterpart as additional
1648 rr->resrec.namehash == rr2->resrec.namehash && // ... and have the same name
1649 SameDomainName(rr->resrec.name, rr2->resrec.name))
1650 AddRecordToResponseList(nrpp, rr2, rr);
1652 else if (rr->resrec.rrtype == kDNSType_PTR) // For service PTR, see if we want to add DeviceInfo record
1655 SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
1656 AddRecordToResponseList(nrpp, &m->DeviceInfo, rr);
1663 AuthRecord *rr;
1669 for (rr = m->ResourceRecords; rr; rr=rr->next)
1672 if (rr->ImmedAnswer == mDNSInterfaceMark ||
1673 mDNSSameIPv4Address(rr->v4Requester, onesIPv4Addr) ||
1674 mDNSSameIPv6Address(rr->v6Requester, onesIPv6Addr) )
1675 rr->ImmedUnicast = mDNSfalse;
1677 if (rr->ImmedUnicast && rr->ImmedAnswer == InterfaceID)
1679 if ((dest->type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->v4Requester, dest->ip.v4)) ||
1680 (dest->type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->v6Requester, dest->ip.v6)))
1682 rr->ImmedAnswer = mDNSNULL; // Clear the state fields
1683 rr->ImmedUnicast = mDNSfalse;
1684 rr->v4Requester = zerov4Addr;
1685 rr->v6Requester = zerov6Addr;
1688 if (intf && !mDNSPlatformValidRecordForInterface(rr, intf))
1690 LogInfo("SendDelayedUnicastResponse: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, InterfaceID));
1694 if (rr->NextResponse == mDNSNULL && nrp != &rr->NextResponse) // rr->NR_AnswerTo
1695 { rr->NR_AnswerTo = (mDNSu8*)~0; *nrp = rr; nrp = &rr->NextResponse; }
1711 rr = ResponseRecords;
1712 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1713 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1714 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec);
1715 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1718 ResponseRecords = rr->NextResponse;
1719 rr->NextResponse = mDNSNULL;
1720 rr->NR_AnswerTo = mDNSNULL;
1721 rr->NR_AdditionalTo = mDNSNULL;
1722 rr->RequireGoodbye = mDNStrue;
1728 rr = ResponseRecords;
1729 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
1730 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
1731 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAdditionals, &rr->resrec);
1732 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
1735 if (newptr && m->omsg.h.numAnswers) rr->RequireGoodbye = mDNStrue;
1736 else if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask) rr->ImmedAnswer = mDNSInterfaceMark;
1737 ResponseRecords = rr->NextResponse;
1738 rr->NextResponse = mDNSNULL;
1739 rr->NR_AnswerTo = mDNSNULL;
1740 rr->NR_AdditionalTo = mDNSNULL;
1750 mDNSexport void CompleteDeregistration(mDNS *const m, AuthRecord *rr)
1752 LogInfo("CompleteDeregistration: called for Resource record %s", ARDisplayString(m, rr));
1753 // Clearing rr->RequireGoodbye signals mDNS_Deregister_internal() that
1755 rr->resrec.RecordType = kDNSRecordTypeShared;
1756 rr->RequireGoodbye = mDNSfalse;
1757 rr->WakeUp.HMAC = zeroEthAddr;
1758 if (rr->AnsweredLocalQ) { AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse); rr->AnsweredLocalQ = mDNSfalse; }
1759 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); // Don't touch rr after this
1775 AuthRecord *rr = m->CurrentRecord;
1776 if (!AuthRecord_uDNS(rr) && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
1777 CompleteDeregistration(m, rr); // Don't touch rr after this
1779 m->CurrentRecord = rr->next;
1852 mDNSlocal void SendARP(mDNS *const m, const mDNSu8 op, const AuthRecord *const rr,
1857 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1858 if (!intf) { LogMsg("SendARP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
1889 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
1917 mDNSlocal void SendNDP(mDNS *const m, const mDNSu8 op, const mDNSu8 flags, const AuthRecord *const rr,
1928 NetworkInterfaceInfo *intf = FirstInterfaceForID(m, rr->resrec.InterfaceID);
1929 if (!intf) { LogMsg("SendNDP: No interface with InterfaceID %p found %s", rr->resrec.InterfaceID, ARDisplayString(m,rr)); return; }
2002 mDNSPlatformSendRawPacket(m->omsg.data, ptr, rr->resrec.InterfaceID);
2019 mDNSlocal void GrantUpdateCredit(AuthRecord *rr)
2021 if (++rr->UpdateCredits >= kMaxUpdateCredits) rr->NextUpdateCredit = 0;
2022 else rr->NextUpdateCredit = NonZeroTime(rr->NextUpdateCredit + kUpdateCreditRefreshInterval);
2044 AuthRecord *rr, *r2;
2052 for (rr = m->ResourceRecords; rr; rr=rr->next)
2053 if (rr->ImmedUnicast)
2057 v4.ip.v4 = rr->v4Requester;
2058 v6.ip.v6 = rr->v6Requester;
2059 if (!mDNSIPv4AddressIsZero(rr->v4Requester)) SendDelayedUnicastResponse(m, &v4, rr->ImmedAnswer);
2060 if (!mDNSIPv6AddressIsZero(rr->v6Requester)) SendDelayedUnicastResponse(m, &v6, rr->ImmedAnswer);
2061 if (rr->ImmedUnicast)
2063 LogMsg("SendResponses: ERROR: rr->ImmedUnicast still set: %s", ARDisplayString(m, rr));
2064 rr->ImmedUnicast = mDNSfalse;
2073 for (rr = m->ResourceRecords; rr; rr=rr->next)
2075 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
2076 if (TimeToAnnounceThisRecord(rr, m->timenow))
2078 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2080 if (!rr->WakeUp.HMAC.l[0])
2082 if (rr->AnnounceCount) rr->ImmedAnswer = mDNSInterfaceMark; // Send goodbye packet on all interfaces
2086 LogSPS("SendResponses: Sending wakeup %2d for %.6a %s", rr->AnnounceCount-3, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
2087 SendWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.IMAC, &rr->WakeUp.password);
2088 for (r2 = rr; r2; r2=r2->next)
2089 if (r2->AnnounceCount && r2->resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&r2->WakeUp.IMAC, &rr->WakeUp.IMAC))
2105 else if (ResourceRecordIsValidAnswer(rr))
2107 if (rr->AddressProxy.type)
2109 rr->AnnounceCount--;
2110 rr->ThisAPInterval *= 2;
2111 rr->LastAPTime = m->timenow;
2112 if (rr->AddressProxy.type == mDNSAddrType_IPv4)
2115 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2116 SendARP(m, 1, rr, &rr->AddressProxy.ip.v4, &zeroEthAddr, &rr->AddressProxy.ip.v4, &onesEthAddr);
2118 else if (rr->AddressProxy.type == mDNSAddrType_IPv6)
2121 rr->AnnounceCount, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
2122 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
2127 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2128 if (maxExistingAnnounceInterval < rr->ThisAPInterval)
2129 maxExistingAnnounceInterval = rr->ThisAPInterval;
2130 if (rr->UpdateBlocked) rr->UpdateBlocked = 0;
2138 for (rr = m->ResourceRecords; rr; rr=rr->next)
2139 if ((rr->resrec.InterfaceID && rr->ImmedAnswer) ||
2140 (rr->ThisAPInterval <= maxExistingAnnounceInterval &&
2141 TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2) &&
2142 !rr->AddressProxy.type && // Don't include ARP Annoucements when considering which records to accelerate
2143 ResourceRecordIsValidAnswer(rr)))
2144 rr->ImmedAnswer = mDNSInterfaceMark; // Send on all interfaces
2150 for (rrrr; rr=rr->next)
2152 if (rr->ImmedAnswer && rr->resrec.rrtype == kDNSType_SRV)
2156 rr->LastMCTime - r2->LastMCTime >= 0 && // ... which we have not sent recently ...
2157 rr->resrec.rdatahash == r2->resrec.namehash && // ... whose name is the name of the SRV target
2158 SameDomainName(&rr->resrec.rdata->u.srv.target, r2->resrec.name) &&
2159 (rr->ImmedAnswer == mDNSInterfaceMark || rr->ImmedAnswer == r2->resrec.InterfaceID))
2164 if (rr->ImmedAnswer && rr->resrec.RecordType == kDNSRecordTypeShared && rr->resrec.rrtype == kDNSType_PTR)
2165 if (ResourceRecordIsValidAnswer(&m->DeviceInfo) && SameDomainLabel(rr->resrec.rdata->u.name.c, m->DeviceInfo.resrec.name->c))
2167 if (!m->DeviceInfo.ImmedAnswer) m->DeviceInfo.ImmedAnswer = rr->ImmedAnswer;
2178 for (rr = m->ResourceRecords; rr; rr=rr->next)
2179 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2181 if (rr->ImmedAnswer) // If we're sending this as answer, see that its whole RRSet is similarly marked
2186 r2->ImmedAnswer != rr->ImmedAnswer && SameResourceRecordSignature(r2, rr))
2187 r2->ImmedAnswer = !r2->ImmedAnswer ? rr->ImmedAnswer : mDNSInterfaceMark;
2189 else if (rr->ImmedAdditional) // If we're sending this as additional, see that its whole RRSet is similarly marked
2193 if (r2->ImmedAdditional != rr->ImmedAdditional && SameResourceRecordSignature(r2, rr))
2194 r2->ImmedAdditional = rr->ImmedAdditional;
2199 for (rr = m->ResourceRecords; rr; rr=rr->next)
2201 if (rr->ImmedAnswer == mDNSInterfaceMark) // Sending this record on all appropriate interfaces
2203 rr->SendRNow = !intf ? mDNSNULL : (rr->resrec.InterfaceID) ? rr->resrec.InterfaceID : intf->InterfaceID;
2204 rr->ImmedAdditional = mDNSNULL; // No need to send as additional if sending as answer
2205 rr->LastMCTime = m->timenow;
2206 rr->LastMCInterface = rr->ImmedAnswer;
2208 if (TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2))
2210 rr->AnnounceCount--;
2211 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
2212 rr->ThisAPInterval *= 2;
2213 rr->LastAPTime = m->timenow;
2214 debugf("Announcing %##s (%s) %d", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), rr->AnnounceCount);
2217 else if (rr->ImmedAnswer) // Else, just respond to a single query on single interface:
2219 rr->SendRNow = rr->ImmedAnswer; // Just respond on that interface
2220 rr->ImmedAdditional = mDNSNULL; // No need to send as additional too
2221 rr->LastMCTime = m->timenow;
2222 rr->LastMCInterface = rr->ImmedAnswer;
2224 SetNextAnnounceProbeTime(m, rr);
2225 //if (rr->SendRNow) LogMsg("%-15.4a %s", &rr->v4Requester, ARDisplayString(m, rr));
2246 for (rr = m->ResourceRecords; rr; rr=rr->next)
2251 if ((rr->SendRNow == intf->InterfaceID) &&
2252 ((rr->resrec.InterfaceID == mDNSInterface_Any) && !mDNSPlatformValidRecordForInterface(rr, intf)))
2254 LogInfo("SendResponses: Not sending %s, on %s", ARDisplayString(m, rr), InterfaceNameForID(m, rr->SendRNow));
2255 rr->SendRNow = GetNextActiveInterfaceID(intf);
2257 else if (rr->SendRNow == intf->InterfaceID)
2259 RData *OldRData = rr->resrec.rdata;
2260 mDNSu16 oldrdlength = rr->resrec.rdlength;
2262 (rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
2265 if (rr->NewRData && active)
2268 if (ResourceRecordIsValidAnswer(rr) && rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
2270 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, 0);
2271 if (newptr) { responseptr = newptr; numDereg++; rr->RequireGoodbye = mDNSfalse; }
2274 SetNewRData(&rr->resrec, rr->NewRData, rr->newrdlength);
2277 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2278 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2279 newptr = PutRR_OS_TTL(responseptr, &m->omsg.h.numAnswers, &rr->resrec, active ? rr->resrec.rroriginalttl : 0);
2280 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2284 rr->RequireGoodbye = active;
2285 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) numDereg++;
2286 else if (rr->LastAPTime == m->timenow) numAnnounce++; else numAnswer++;
2289 if (rr->NewRData && active)
2290 SetNewRData(&rr->resrec, OldRData, oldrdlength);
2294 if (!pktcount && active && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2295 rr->SendNSECNow = mDNSInterfaceMark;
2300 if (rr->ImmedAnswer == mDNSInterfaceMark && rr->resrec.InterfaceID == mDNSInterface_Any)
2301 rr->SendRNow = GetNextActiveInterfaceID(intf);
2303 rr->SendRNow = mDNSNULL;
2310 for (rr = m->ResourceRecords; rr; rr=rr->next)
2311 if (rr->ImmedAdditional == intf->InterfaceID)
2312 if (ResourceRecordIsValidAnswer(rr))
2320 if (!SendAdditional && (rr->resrec.RecordType & kDNSRecordTypeUniqueMask))
2326 SameResourceRecordSignature(a, rr)) { SendAdditional = mDNStrue; break; }
2329 rr->ImmedAdditional = mDNSNULL; // then cancel its ImmedAdditional field
2334 if (!pktcount && (rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && !rr->SendNSECNow)
2335 rr->SendNSECNow = mDNSInterfaceMark;
2337 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
2338 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the cache flush bit so PutResourceRecord will set it
2339 newptr = PutRR_OS(newptr, &m->omsg.h.numAdditionals, &rr->resrec);
2340 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear cache flush bit back to normal state
2344 rr->ImmedAdditional = mDNSNULL;
2345 rr->RequireGoodbye = mDNStrue;
2350 rr->LastMCTime = m->timenow;
2351 rr->LastMCInterface = intf->InterfaceID;
2358 // (recognized by rr->SendNSECNow == intf->InterfaceID) we should really put the NSEC in the Answer Section,
2360 for (rr = m->ResourceRecords; rr; rr=rr->next)
2361 if (rr->SendNSECNow == mDNSInterfaceMark || rr->SendNSECNow == intf->InterfaceID)
2364 mDNS_SetupResourceRecord(&nsec, mDNSNULL, mDNSInterface_Any, kDNSType_NSEC, rr->resrec.rroriginalttl, kDNSRecordTypeUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
2366 AssignDomainName(&nsec.namestorage, rr->resrec.name);
2369 if (ResourceRecordIsValidAnswer(r2) && SameResourceRecordNameClassInterface(r2, rr))
2383 if (newptr || rr->SendNSECNow == mDNSInterfaceMark)
2385 rr->SendNSECNow = mDNSNULL;
2387 for (r2 = rr->next; r2; r2=r2->next)
2388 if (SameResourceRecordNameClassInterface(r2, rr))
2449 rr = m->CurrentRecord;
2450 m->CurrentRecord = rr->next;
2452 if (rr->SendRNow)
2454 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P)
2455 LogMsg("SendResponses: No active interface %p to send: %p %02X %s", rr->SendRNow, rrrr->resrec.RecordType, ARDisplayString(m, rr));
2456 rr->SendRNow = mDNSNULL;
2459 if (rr->ImmedAnswer || rr->resrec.RecordType == kDNSRecordTypeDeregistering)
2461 if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and return memory to the client
2463 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering && rr->AnnounceCount == 0)
2466 if (!AuthRecord_uDNS(rr)) CompleteDeregistration(m, rr); // Don't touch rr after this
2470 rr->ImmedAnswer = mDNSNULL;
2471 rr->ImmedUnicast = mDNSfalse;
2472 rr->v4Requester = zerov4Addr;
2473 rr->v6Requester = zerov6Addr;
2492 #define CacheCheckGracePeriod(RR) ( \
2493 ((RR)->CRActiveQuestion == mDNSNULL ) ? (60 * mDNSPlatformOneSecond) : \
2494 ((RR)->UnansweredQueries < MaxUnansweredQueries) ? (TicksTTL(rr)/50) : \
2495 ((RR)->resrec.rroriginalttl > 10 ) ? (mDNSPlatformOneSecond) : \
2496 ((RR)->resrec.rroriginalttl > 0 ) ? (mDNSPlatformOneSecond/10) : 0)
2498 #define NextCacheCheckEvent(RR) ((RR)->NextRequiredQuery + CacheCheckGracePeriod(RR))
2509 // rr->TimeRcvd
2510 // rr->resrec.rroriginalttl
2511 // rr->UnansweredQueries
2512 // rr->CRActiveQuestion
2513 mDNSlocal void SetNextCacheCheckTimeForRecord(mDNS *const m, CacheRecord *const rr)
2515 rr->NextRequiredQuery = RRExpireTime(rr);
2519 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
2521 rr->NextRequiredQuery -= TicksTTL(rr)/20 * (MaxUnansweredQueries - rr->UnansweredQueries);
2522 rr->NextRequiredQuery += mDNSRandom((mDNSu32)TicksTTL(rr)/50);
2524 (rr->NextRequiredQuery - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m,rr));
2527 ScheduleNextCacheCheckTime(m, HashSlot(rr->resrec.name), NextCacheCheckEvent(rr));
2535 mDNSlocal mStatus mDNS_Reconfirm_internal(mDNS *const m, CacheRecord *const rr, mDNSu32 interval)
2543 if (RRExpireTime(rr) - m->timenow > (mDNSs32)((interval * 4) / 3))
2550 rr->TimeRcvd = m->timenow - (mDNSs32)interval * 3;
2551 rr->resrec.rroriginalttl = (interval * 4 + mDNSPlatformOneSecond - 1) / mDNSPlatformOneSecond;
2552 SetNextCacheCheckTimeForRecord(m, rr);
2555 RRExpireTime(rr) - m->timenow, CRDisplayString(m, rr), rr->CRActiveQuestion);
2581 CacheRecord *rr;
2584 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
2585 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2586 !(rr->resrec.RecordType & kDNSRecordTypeUniqueMask) && // which is a shared (i.e. not unique) record type
2587 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not already in the known answer list
2588 rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
2589 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
2590 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow > // and its half-way-to-expiry time is at least 1 second away
2599 *ka = rr; // Link this record into our known answer chain
2600 ka = &rr->NextInKAList;
2602 forecast += 12 + rr->resrec.rdestimate;
2622 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // For every resource record in our cache,
2623 if (rr->resrec.InterfaceID == q->SendQNow && // received on this interface
2624 rr->NextInKAList == mDNSNULL && ka != &rr->NextInKAList && // which is not in the known answer list
2625 SameNameRecordAnswersQuestion(&rr->resrec, q)) // which answers our question
2627 rr->UnansweredQueries++; // indicate that we're expecting a response
2628 rr->LastUnansweredTime = m->timenow;
2629 SetNextCacheCheckTimeForRecord(m, rr);
2820 const CacheRecord *rr;
2821 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next) // If we have a resource record in our cache,
2822 if (rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
2823 SameNameRecordAnswersQuestion(&rr->resrec, q) && // which answers our question
2824 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow >= 0 && // and it is less than half-way to expiry
2825 rr->NextRequiredQuery - (m->timenow + q->ThisQInterval) > 0)// and we'll ask at least once again before NextRequiredQuery
2828 forecast += 12 + rr->resrec.rdestimate;
2992 // 2. Scan our authoritative RR list to see what probes we might need to send
3296 #pragma mark - RR List Management & Task Management
3303 mDNSexport void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheRecord *const rr, const QC_result AddRecord)
3306 mDNSBool followcname = FollowCNAME(q, &rr->resrec, AddRecord);
3309 q->CurrentAnswers, AddRecord ? "Add" : "Rmv", rr->resrec.rroriginalttl, CRDisplayString(m, rr));
3318 "LOAddressAnswers %d", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr),
3328 if (!q->TimeoutQuestion || rr->resrec.RecordType != kDNSRecordTypePacketNegative || (m->timenow - q->StopTime < 0))
3332 // Note: Use caution here. In the case of records with rr->DelayDelivery set, AnswerCurrentQuestionWithResourceRecord(... mDNStrue)
3336 rr->LastUsed = m->timenow;
3337 if (AddRecord == QC_add && !q->DuplicateOf && rr->CRActiveQuestion != q)
3339 if (!rr->CRActiveQuestion) m->rrcache_active++; // If not previously active, increment rrcache_active count
3341 rr->CRActiveQuestion, q, CRDisplayString(m,rr), q->CurrentAnswers);
3342 rr->CRActiveQuestion = q; // We know q is non-null
3343 SetNextCacheCheckTimeForRecord(m, rr);
3354 (AddRecord == QC_add && (q->ExpectUnique || (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))))
3365 if (rr->DelayDelivery) return; // We'll come back later when CacheRecordDeferredAdd() calls us
3368 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative || (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype)))
3375 if (q->qtype != kDNSType_NSEC && RRAssertsNonexistence(&rr->resrec, q->qtype))
3378 MakeNegativeCacheRecord(m, &neg, &q->qname, q->qnamehash, q->qtype, q->qclass, 1, rr->resrec.InterfaceID, q->qDNSServer);
3382 q->QuestionCallback(m, q, &rr->resrec, AddRecord);
3389 AnswerQuestionByFollowingCNAME(m, q, &rr->resrec);
3413 CacheRecord *rr;
3437 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
3439 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
3442 q, q->qname.c, CRDisplayString(m, rr));
3449 if (!q->qDNSServer && !q->DuplicateOf && rr->resrec.RecordType == kDNSRecordTypePacketNegative)
3458 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
3459 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
3460 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
3468 mDNSlocal void CacheRecordDeferredAdd(mDNS *const m, CacheRecord *rr)
3470 rr->DelayDelivery = 0;
3478 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
3479 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
3492 const CacheRecord *rr;
3493 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
3494 if (threshhold - RRExpireTime(rr) >= 0) // If we have records about to expire within a second
3495 if (delay - RRExpireTime(rr) < 0) // then delay until after they've been deleted
3496 delay = RRExpireTime(rr);
3504 // rr is a new CacheRecord just received into our cache
3509 mDNSlocal void CacheRecordAdd(mDNS *const m, CacheRecord *rr)
3517 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
3538 verbosedebugf("CacheRecordAdd %p %##s (%s) %lu %#a:%d question %p", rr, rr->resrec.name->c,
3539 DNSTypeName(rr->resrec.rrtype), rr->resrec.rroriginalttl, rr->resrec.rDNSServer ?
3540 &rr->resrec.rDNSServer->addr : mDNSNULL, mDNSVal16(rr->resrec.rDNSServer ?
3541 rr->resrec.rDNSServer->port : zeroIPPort), q);
3544 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
3545 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
3552 rr->resrec.rroriginalttl = 0;
3553 rr->UnansweredQueries = MaxUnansweredQueries;
3558 if (!rr->DelayDelivery)
3566 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
3567 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
3574 SetNextCacheCheckTimeForRecord(m, rr);
3580 // rr is a new CacheRecord just received from the wire (kDNSRecordTypePacketAns/AnsUnique/Add/AddUnique)
3587 mDNSlocal void NoCacheAnswer(mDNS *const m, CacheRecord *rr)
3598 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
3599 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_addnocache); // QC_addnocache means "don't expect remove events for this"
3610 // rr is an existing cache CacheRecord that just expired and is being deleted
3615 mDNSlocal void CacheRecordRmv(mDNS *const m, CacheRecord *rr)
3631 if (!QuerySuppressed(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
3633 verbosedebugf("CacheRecordRmv %p %s", rr, CRDisplayString(m, rr));
3655 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
3656 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
3658 if (rr->resrec.rdata->MaxRDLength) // Never generate "remove" events for negative results
3666 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_rmv);
3720 CacheRecord *const rr = *rp;
3721 mDNSs32 event = RRExpireTime(rr);
3724 *rp = rr->next; // Cut it from the list
3726 m->timenow - rr->TimeRcvd, rr->resrec.rroriginalttl, rr->CRActiveQuestion, CRDisplayString(m, rr));
3727 if (rr->CRActiveQuestion) // If this record has one or more active questions, tell them it's going away
3729 DNSQuestion *q = rr->CRActiveQuestion;
3743 CacheRecordRmv(m, rr);
3746 ReleaseCacheRecord(m, rr);
3751 if (rr->DelayDelivery && rr->DelayDelivery - m->timenow > 0)
3752 event = rr->DelayDelivery;
3755 if (rr->DelayDelivery) CacheRecordDeferredAdd(m, rr);
3756 if (rr->CRActiveQuestion && rr->UnansweredQueries < MaxUnansweredQueries)
3758 if (m->timenow - rr->NextRequiredQuery < 0) // If not yet time for next query
3759 event = NextCacheCheckEvent(rr); // then just record when we want the next query
3772 (event - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m, rr));
3775 rp = &rr->next;
3848 AuthRecord *rr = m->CurrentRecord;
3849 m->CurrentRecord = rr->next;
3858 if (rr->ARType == AuthRecordLocalOnly || (rr->ARType == AuthRecordP2P && q->InterfaceID == mDNSInterface_Any))
3859 if (LocalOnlyRecordAnswersQuestion(rr, q))
3861 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
3903 CacheRecord *rr;
3904 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
3905 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
3908 mDNSu32 SecsSinceRcvd = ((mDNSu32)(m->timenow - rr->TimeRcvd)) / mDNSPlatformOneSecond;
3909 if (rr->resrec.rroriginalttl <= SecsSinceRcvd)
3911 LogMsg("AnswerNewQuestion: How is rr->resrec.rroriginalttl %lu <= SecsSinceRcvd %lu for %s %d %d",
3912 rr->resrec.rroriginalttl, SecsSinceRcvd, CRDisplayString(m, rr), m->timenow, rr->TimeRcvd);
3918 if ((rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) || (q->ExpectUnique))
3921 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers++;
3922 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers++;
3924 AnswerCurrentQuestionWithResourceRecord(m, rr, QC_add);
3927 else if (RRTypeIsAddressType(rr->resrec.rrtype) && RRTypeIsAddressType(q->qtype))
4003 AuthRecord *rr = m->CurrentRecord;
4004 m->CurrentRecord = rr->next;
4005 if (LocalOnlyRecordAnswersQuestion(rr, q))
4007 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
4019 AuthRecord *rr = m->CurrentRecord;
4020 m->CurrentRecord = rr->next;
4021 if (ResourceRecordAnswersQuestion(&rr->resrec, q))
4023 AnswerLocalQuestionWithLocalAuthRecord(m, rr, mDNStrue);
4083 CacheRecord *rr = *rp;
4085 ReleaseCacheRecord(m, rr);
4105 LogInfo("RR Cache now using %ld objects", m->rrcache_totalused);
4134 mDNSlocal CacheGroup *GetCacheGroup(mDNS *const m, const mDNSu32 slot, const ResourceRecord *const rr)
4136 mDNSu16 namelen = DomainNameLength(rr->name);
4138 if (!cg) { LogMsg("GetCacheGroup: Failed to allocate memory for %##s", rr->name->c); return(mDNSNULL); }
4140 cg->namehash = rr->namehash;
4145 // (namelen > InlineCacheGroupNameSize) ? "Allocating" : "Inline", namelen, rr->name->c);
4149 LogMsg("GetCacheGroup: Failed to allocate name storage for %##s", rr->name->c);
4153 AssignDomainName(cg->name, rr->name);
4155 if (CacheGroupForRecord(m, slot, rr)) LogMsg("GetCacheGroup: Already have CacheGroup for %##s", rr->name->c);
4157 if (CacheGroupForRecord(m, slot, rr) != cg) LogMsg("GetCacheGroup: Not finding CacheGroup for %##s", rr->name->c);
4162 mDNSexport void mDNS_PurgeCacheResourceRecord(mDNS *const m, CacheRecord *rr)
4171 rr->TimeRcvd = m->timenow - mDNSPlatformOneSecond * 60;
4172 rr->UnansweredQueries = MaxUnansweredQueries;
4173 rr->resrec.rroriginalttl = 0;
4174 SetNextCacheCheckTimeForRecord(m, rr);
4206 AuthRecord *rr = m->CurrentRecord;
4207 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering && rr->WakeUp.HMAC.l[0])
4211 if (m->SPSSocket && m->timenow - rr->TimeExpire < 0) // If proxy record not expired yet, update m->NextScheduledSPS
4213 if (m->NextScheduledSPS - rr->TimeExpire > 0)
4214 m->NextScheduledSPS = rr->TimeExpire;
4219 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, ARDisplayString(m, rr));
4220 SetSPSProxyListChanged(rr->resrec.InterfaceID);
4221 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
4222 // Don't touch rr after this -- memory may have been free'd
4227 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
4228 m->CurrentRecord = rr->next;
4236 AuthRecord *rr = m->CurrentRecord;
4237 if (rr->AnsweredLocalQ && rr->resrec.RecordType == kDNSRecordTypeDeregistering)
4239 debugf("CheckRmvEventsForLocalRecords: Generating local RMV events for %s", ARDisplayString(m, rr));
4240 rr->resrec.RecordType = kDNSRecordTypeShared;
4241 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNSfalse);
4242 if (m->CurrentRecord == rr) // If rr still exists in list, restore its state now
4244 rr->resrec.RecordType = kDNSRecordTypeDeregistering;
4245 rr->AnsweredLocalQ = mDNSfalse;
4248 if (RRLocalOnly(rr)) CompleteDeregistration(m, rr);
4251 if (m->CurrentRecord == rr) // If m->CurrentRecord was not auto-advanced, do it ourselves now
4252 m->CurrentRecord = rr->next;
4373 // Make sure we deliver *all* local RMV events, and clear the corresponding rr->AnsweredLocalQ flags, *before*
4397 AuthRecord *rr = m->NewLocalRecords;
4399 if (LocalRecordReady(rr))
4401 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
4402 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNStrue);
4404 else if (!rr->next)
4408 // terminate and set the NewLocalRecords to rr.
4409 debugf("mDNS_Execute: Just one LocalAuthRecord %s, breaking out of the loop early", ARDisplayString(m, rr));
4413 head = rr;
4418 debugf("mDNS_Execute: Skipping LocalAuthRecord %s", ARDisplayString(m, rr));
4421 while (*p && *p != rr) p=&(*p)->next;
4422 if (*p) *p = rr->next; // Cut this record from the list
4423 else { LogMsg("mDNS_Execute: ERROR!! Cannot find record %s in ResourceRecords list", ARDisplayString(m, rr)); break; }
4427 *p = rr;
4428 head = tail = rr;
4432 tail->next = rr;
4433 tail = rr;
4435 rr->next = mDNSNULL;
4453 AuthRecord *rr = ag->NewLocalOnlyRecords;
4456 if (LocalRecordReady(rr))
4458 debugf("mDNS_Execute: Delivering Add event with LocalAuthRecord %s", ARDisplayString(m, rr));
4459 AnswerAllLocalQuestionsWithLocalAuthRecord(m, rr, mDNStrue);
4461 else LogMsg("mDNS_Execute: LocalOnlyRecord %s not ready", ARDisplayString(m, rr));
4558 AuthRecord *rr;
4566 for (rr = ag->members; rr; rr=rr->next)
4568 if (LORecordAnswersAddressType(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
4570 LogInfo("QuestionHasLocalAnswers: Question %p %##s (%s) has local answer %s", q, q->qname.c, DNSTypeName(q->qtype), ARDisplayString(m, rr));
4830 AuthRecord *rr;
4843 for (rr = m->ResourceRecords; rr; rr=rr->next)
4844 if (rr->resrec.RecordType > kDNSRecordTypeDeregistering)
4845 if (rr->resrec.InterfaceID == intf->InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
4846 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
4847 rr->SendRNow = mDNSInterfaceMark; // mark it now
4858 for (rr = m->ResourceRecords; rr; rr=rr->next)
4859 if (rr->SendRNow || (!mDNSOpaque16IsZero(id) && !AuthRecord_uDNS(rr) && mDNSSameOpaque16(rr->updateid, id) && m->timenow - (rr->LastAPTime + rr->ThisAPInterval) >= 0))
4860 if (mDNSPlatformMemSame(owner, &rr->WakeUp, sizeof(*owner)))
4864 if (rr->resrec.RecordType & kDNSRecordTypeUniqueMask)
4865 rr->resrec.rrclass |= kDNSClass_UniqueRRSet; // Temporarily set the 'unique' bit so PutResourceRecord will set it
4866 newptr = PutResourceRecordTTLWithLimit(&m->omsg, p, &m->omsg.h.mDNS_numUpdates, &rr->resrec, rr->resrec.rroriginalttl, limit);
4867 rr->resrec.rrclass &= ~kDNSClass_UniqueRRSet; // Make sure to clear 'unique' bit back to normal state
4869 LogSPS("SendSPSRegistration put %s FAILED %d/%d %s", intf->ifname, p - m->omsg.data, limit - m->omsg.data, ARDisplayString(m, rr));
4872 LogSPS("SendSPSRegistration put %s %s", intf->ifname, ARDisplayString(m, rr));
4873 rr->SendRNow = mDNSNULL;
4874 rr->ThisAPInterval = mDNSPlatformOneSecond;
4875 rr->LastAPTime = m->timenow;
4876 rr->updateid = m->omsg.h.id;
4877 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
4878 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval);
4932 mDNSlocal mDNSBool RecordIsFirstOccurrenceOfOwner(mDNS *const m, const AuthRecord *const rr)
4935 for (ar = m->ResourceRecords; ar && ar != rr; ar=ar->next)
4936 if (mDNSPlatformMemSame(&rr->WakeUp, &ar->WakeUp, sizeof(rr->WakeUp))) return mDNSfalse;
4960 AuthRecord *rr;
4969 for (rr = m->ResourceRecords; rr; rr=rr->next)
4970 if (!AuthRecord_uDNS(rr) && !mDNSOpaque16IsZero(rr->updateid) && m->timenow - (rr->LastAPTime + rr->ThisAPInterval) >= 0)
4972 if (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == intf->InterfaceID)
4974 LogSPS("RetrySPSRegistrations: %s", ARDisplayString(m, rr));
4975 SendSPSRegistration(m, intf, rr->updateid);
5039 AuthRecord *rr;
5040 for (rr = m->ResourceRecords; rr; rr=rr->next)
5041 if (rr->resrec.rrtype == kDNSType_SRV && !AuthRecord_uDNS(rr) && !mDNSSameIPPort(rr->resrec.rdata->u.srv.port, DiscardPort))
5048 AuthRecord *rr;
5056 for (rr = m->ResourceRecords; rr; rr=rr->next)
5057 if (rr->resrec.RecordType == kDNSRecordTypeShared && rr->RequireGoodbye)
5058 rr->ImmedAnswer = mDNSInterfaceMark;
5136 AuthRecord *rr;
5210 for (rr = m->ResourceRecords; rr; rr=rr->next) rr->updateid = zeroID;
5227 for (rr = m->ResourceRecords; rr; rr=rr->next)
5228 if (AuthRecord_uDNS(rr))
5230 ActivateUnicastRegistration(m, rr);
5234 if (rr->resrec.RecordType == kDNSRecordTypeVerified && !rr->DependentOn) rr->resrec.RecordType = kDNSRecordTypeUnique;
5235 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
5236 rr->AnnounceCount = InitialAnnounceCount;
5237 rr->SendNSECNow = mDNSNULL;
5238 InitializeLastAPTime(m, rr);
5258 AuthRecord *rr;
5300 for (rr = m->ResourceRecords; rr; rr = rr->next)
5301 if (!AuthRecord_uDNS(rr))
5302 if (!mDNSOpaque16IsZero(rr->updateid))
5303 { LogSPS("mDNSCoreReadyForSleep: waiting for SPS Update ID %d %s", mDNSVal16(rr->updateid), ARDisplayString(m,rr)); goto spsnotready; }
5314 for (rr = m->ResourceRecords; rr; rr = rr->next)
5315 if (AuthRecord_uDNS(rr))
5317 if (rr->state == regState_Refresh && rr->tcp)
5318 { LogSPS("mDNSCoreReadyForSleep: waiting for Record Update ID %d %s", mDNSVal16(rr->updateid), ARDisplayString(m,rr)); goto notready; }
5320 if (!RecordReadyForSleep(m, rr)) { LogSPS("mDNSCoreReadyForSleep: waiting for %s", ARDisplayString(m, rr)); goto notready; }
5343 for (rr = m->ResourceRecords; rr; rr = rr->next)
5344 if (!AuthRecord_uDNS(rr))
5345 if (!mDNSOpaque16IsZero(rr->updateid))
5347 LogSPS("ReadyForSleep clearing updateid for %s", ARDisplayString(m, rr));
5348 rr->updateid = zeroID;
5415 #define MustSendRecord(RR) ((RR)->NR_AnswerTo || (RR)->NR_AdditionalTo)
5423 AuthRecord *rr;
5442 for (rr=ResponseRecords; rr; rr=rr->NextResponse) // and search our list of proposed answers
5444 if (rr->NR_AnswerTo == ptr) // If we're going to generate a record answering this question
5459 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
5460 if (rr->NR_AnswerTo)
5462 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAnswers, &rr->resrec,
5463 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
5471 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
5472 if (rr->NR_AdditionalTo && !rr->NR_AnswerTo)
5474 mDNSu8 *p = PutResourceRecordTTL(response, responseptr, &response->h.numAdditionals, &rr->resrec,
5475 maxttl < rr->resrec.rroriginalttl ? maxttl : rr->resrec.rroriginalttl);
5542 // Find the canonical RRSet pointer for this RR received in a packet.
5548 const AuthRecord *rr;
5549 for (rr = m->ResourceRecords; rr; rr=rr->next)
5551 if (IdenticalResourceRecord(&rr->resrec, &pktrr->resrec))
5553 while (rr->RRSet && rr != rr->RRSet) rr = rr->RRSet;
5554 return(rr);
5560 RR (pktrr) which has the same name
5564 // 2b. If the packet rr exactly matches one of our other RRs, and *that* record's DependentOn pointer
5567 // 3. If we have some *other* RR that exactly matches the one from the packet, and that record and our record
5653 CacheRecord *rr;
5655 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
5657 match = !pktrr->InterfaceID ? pktrr->rDNSServer == rr->resrec.rDNSServer : pktrr->InterfaceID == rr->resrec.InterfaceID;
5658 if (match && IdenticalSameNameRecord(pktrr, &rr->resrec)) break;
5660 return(rr);
5672 AuthRecord *const rr = m->CurrentRecord;
5673 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
5674 if (IdenticalResourceRecord(&rr->resrec, &m->rec.r.resrec))
5677 m->ProxyRecords, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
5678 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
5679 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
5680 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
5685 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
5686 m->CurrentRecord = rr->next;
5698 AuthRecord *const rr = m->CurrentRecord;
5699 if (m->rec.r.resrec.InterfaceID == rr->resrec.InterfaceID && mDNSSameEthAddress(&owner->HMAC, &rr->WakeUp.HMAC))
5700 if (owner->seq != rr->WakeUp.seq || m->timenow - rr->TimeRcvd > mDNSPlatformOneSecond * 60)
5702 if (rr->AddressProxy.type == mDNSAddrType_IPv6)
5709 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m,rr));
5710 SendNDP(m, NDP_Adv, NDP_Override, rr, &rr->AddressProxy.ip.v6, &rr->WakeUp.IMAC, &AllHosts_v6, &AllHosts_v6_Eth);
5714 m->ProxyRecords, rr->AnnounceCount, rr->resrec.RecordType,
5715 &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, rr->WakeUp.seq, owner->seq, ARDisplayString(m, rr));
5716 if (rr->resrec.RecordType == kDNSRecordTypeDeregistering) rr->resrec.RecordType = kDNSRecordTypeShared;
5717 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
5718 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it, since real host is now back and functional
5719 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
5724 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
5725 m->CurrentRecord = rr->next;
5745 AuthRecord *rr;
5807 rr = m->CurrentRecord;
5808 m->CurrentRecord = rr->next;
5809 if (AnyTypeRecordAnswersQuestion(&rr->resrec, &pktq) && (QueryWasMulticast || QueryWasLocalUnicast || rr->AllowRemoteQuery))
5811 if (RRTypeAnswersQuestionType(&rr->resrec, pktq.qtype))
5813 if (rr->resrec.RecordType == kDNSRecordTypeUnique)
5814 ResolveSimultaneousProbe(m, query, end, &pktq, rr);
5815 else if (ResourceRecordIsValidAnswer(rr))
5833 if (m->timenow - (rr->LastMCTime + mDNSPlatformOneSecond) >= 0 ||
5834 (rr->LastMCInterface != mDNSInterfaceMark && rr->LastMCInterface != InterfaceID))
5835 rr->NR_AnswerTo = (mDNSu8*)~0;
5837 else if (!rr->NR_AnswerTo) rr->NR_AnswerTo = LegacyQuery ? ptr : (mDNSu8*)~1;
5840 else if ((rr->resrec.RecordType & kDNSRecordTypeActiveUniqueMask) && ResourceRecordIsValidAnswer(rr))
5844 if (!NSECAnswer) NSECAnswer = rr;
5920 for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers
5921 if (rr->NR_AnswerTo) // If we marked the record...
5922 AddRecordToResponseList(&nrp, rr, mDNSNULL); // ... add it to the list
5941 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
5942 if (MustSendRecord(rr) && ShouldSuppressKnownAnswer(&m->rec.r, rr))
5943 { rr->NR_AnswerTo = mDNSNULL; rr->NR_AdditionalTo = mDNSNULL; }
5946 for (rr=m->ResourceRecords; rr; rr=rr->next)
5949 if (rr->ImmedAnswer == InterfaceID && ShouldSuppressKnownAnswer(&m->rec.r, rr))
5953 if (mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = zerov4Addr;
5957 if (mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = zerov6Addr;
5959 if (mDNSIPv4AddressIsZero(rr->v4Requester) && mDNSIPv6AddressIsZero(rr->v6Requester))
5961 rr->ImmedAnswer = mDNSNULL;
5962 rr->ImmedUnicast = mDNSfalse;
5964 LogMsg("Suppressed after%4d: %s", m->timenow - rr->ImmedAnswerMarkTime, ARDisplayString(m, rr));
6012 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6013 if (rr->NR_AdditionalTo && !MustSendRecord(rr->NR_AdditionalTo))
6014 { rr->NR_AnswerTo = mDNSNULL; rr->NR_AdditionalTo = mDNSNULL; }
6019 for (rr=ResponseRecords; rr; rr=rr->NextResponse)
6021 if (rr->NR_AnswerTo)
6027 if (m->timenow - (rr->LastMCTime + TicksTTL(rr)/4) >= 0)
6033 if (rr->NR_AnswerTo == (mDNSu8*)~1) rr->NR_AnswerTo = (mDNSu8*)~0;
6037 if (rr->NR_AnswerTo == (mDNSu8*)~0) SendMulticastResponse = mDNStrue;
6038 else if (rr->NR_AnswerTo == (mDNSu8*)~1) SendUnicastResponse = mDNStrue;
6039 else if (rr->NR_AnswerTo) SendLegacyResponse = mDNStrue;
6044 rr->ImmedAnswerMarkTime = m->timenow;
6048 if (rr->ImmedAnswer && rr->ImmedAnswer != InterfaceID)
6049 rr->ImmedAnswer = mDNSInterfaceMark;
6052 rr->ImmedAnswer = InterfaceID; // Record interface to send it on
6053 if (SendUnicastResponse) rr->ImmedUnicast = mDNStrue;
6056 if (mDNSIPv4AddressIsZero(rr->v4Requester)) rr->v4Requester = srcaddr->ip.v4;
6057 else if (!mDNSSameIPv4Address(rr->v4Requester, srcaddr->ip.v4)) rr->v4Requester = onesIPv4Addr;
6061 if (mDNSIPv6AddressIsZero(rr->v6Requester)) rr->v6Requester = srcaddr->ip.v6;
6062 else if (!mDNSSameIPv6Address(rr->v6Requester, srcaddr->ip.v6)) rr->v6Requester = onesIPv6Addr;
6071 else if (rr->resrec.RecordType == kDNSRecordTypeShared) delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
6073 else if (rr->NR_AdditionalTo && rr->NR_AdditionalTo->NR_AnswerTo == (mDNSu8*)~0)
6078 rr->ImmedAdditional = InterfaceID;
6129 rr = ResponseRecords;
6130 ResponseRecords = rr->NextResponse;
6131 rr->NextResponse = mDNSNULL;
6132 rr->NR_AnswerTo = mDNSNULL;
6133 rr->NR_AdditionalTo = mDNSNULL;
6295 const mDNSAddr *const srcaddr, const mDNSBool SrcLocal, const mDNSIPPort port, const mDNSOpaque16 id, const CacheRecord *const rr, mDNSBool tcp)
6303 if (!q->DuplicateOf && ResourceRecordAnswersUnicastResponse(&rr->resrec, q))
6307 debugf("ExpectingUnicastResponseForRecord msg->h.id %d q->TargetQID %d for %s", mDNSVal16(id), mDNSVal16(q->TargetQID), CRDisplayString(m, rr));
6326 q->qname.c, DNSTypeName(q->qtype), &q->Target, mDNSVal16(srcp), srcaddr, mDNSVal16(port), CRDisplayString(m, rr));
6344 mDNSlocal mDNSu16 GetRDLengthMem(const ResourceRecord *const rr)
6346 switch (rr->rrtype)
6352 default: return rr->rdlength;
6358 CacheRecord *rr = mDNSNULL;
6367 if (cg) rr = GetCacheRecord(m, cg, RDLength); // Make a cache record, being careful not to recycle cg
6368 if (!rr) NoCacheAnswer(m, &m->rec.r);
6371 RData *saveptr = rr->resrec.rdata; // Save the rr->resrec.rdata pointer
6372 *rr = m->rec.r; // Block copy the CacheRecord object
6373 rr->resrec.rdata = saveptr; // Restore rr->resrec.rdata after the structure assignment
6374 rr->resrec.name = cg->name; // And set rr->resrec.name to point into our CacheGroup header
6375 rr->DelayDelivery = delay;
6378 if (rr->resrec.rdata == (RData*)&rr->smallrdatastorage && RDLength > InlineCacheRDSize)
6379 LogMsg("rr->resrec.rdata == &rr->rdatastorage but length > InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
6380 else if (rr->resrec.rdata != (RData*)&rr->smallrdatastorage && RDLength <= InlineCacheRDSize)
6381 LogMsg("rr->resrec.rdata != &rr->rdatastorage but length <= InlineCacheRDSize %##s", m->rec.r.resrec.name->c);
6383 mDNSPlatformMemCopy(rr->resrec.rdata, m->rec.r.resrec.rdata, sizeofRDataHeader + RDLength);
6385 rr->next = mDNSNULL; // Clear 'next' pointer
6386 *(cg->rrcache_tail) = rr; // Append this record to tail of cache slot list
6387 cg->rrcache_tail = &(rr->next); // Advance tail pointer
6389 CacheRecordAdd(m, rr); // CacheRecordAdd calls SetNextCacheCheckTimeForRecord(m, rr); for us
6391 return(rr);
6394 mDNSlocal void RefreshCacheRecord(mDNS *const m, CacheRecord *rr, mDNSu32 ttl)
6396 rr->TimeRcvd = m->timenow;
6397 rr->resrec.rroriginalttl = ttl;
6398 rr->UnansweredQueries = 0;
6400 rr->MPUnansweredQ = 0;
6401 rr->MPUnansweredKA = 0;
6402 rr->MPExpectingKA = mDNSfalse;
6404 SetNextCacheCheckTimeForRecord(m, rr);
6409 CacheRecord *rr;
6412 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
6413 if (rr->CRActiveQuestion == q)
6415 //LogInfo("GrantCacheExtensions: new lease %d / %s", lease, CRDisplayString(m, rr));
6416 RefreshCacheRecord(m, rr, lease);
6549 CacheRecord *rr;
6552 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
6553 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
6556 rr->resrec.InterfaceID, CRDisplayString(m, rr));
6558 rr->TimeRcvd = m->timenow - TicksTTL(rr) - 1;
6559 rr->UnansweredQueries = MaxUnansweredQueries;
6694 AuthRecord *rr = m->CurrentRecord;
6695 m->CurrentRecord = rr->next;
6699 if (!AcceptableResponse && !(ResponseSrcLocal && rr->resrec.RecordType == kDNSRecordTypeUnique)) continue;
6701 if (PacketRRMatchesSignature(&m->rec.r, rr)) // If interface, name, type (if shared record) and class match...
6704 if (IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
6706 // If the RR in the packet is identical to ours, just check they're not trying to lower the TTL on us
6707 if (m->rec.r.resrec.rroriginalttl >= rr->resrec.rroriginalttl/2 || m->SleepState)
6710 if (rr->ImmedAnswer == InterfaceID) { rr->ImmedAnswer = mDNSNULL; rr->ImmedUnicast = mDNSfalse; }
6714 if (rr->ImmedAnswer == mDNSNULL) { rr->ImmedAnswer = InterfaceID; m->NextScheduledResponse = m->timenow; }
6715 else if (rr->ImmedAnswer != InterfaceID) { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
6718 // else, the packet RR has different type or different rdata -- check to see if this is a conflict
6719 else if (m->rec.r.resrec.rroriginalttl > 0 && PacketRRConflict(m, rr, &m->rec.r))
6722 LogInfo("mDNSCoreReceiveResponse: Our Record: %08lX %s", rr-> resrec.rdatahash, ARDisplayString(m, rr));
6726 if (rr->DependentOn)
6728 while (rr->DependentOn) rr = rr->DependentOn;
6729 LogInfo("mDNSCoreReceiveResponse: Dep Record: %08lX %s", rr-> resrec.rdatahash, ARDisplayString(m, rr));
6733 if (rr->ProbeCount > DefaultProbeCountForTypeUnique)
6734 LogInfo("mDNSCoreReceiveResponse: Already reset to Probing: %s", ARDisplayString(m, rr));
6735 else if (rr->ProbeCount == DefaultProbeCountForTypeUnique)
6736 LogMsg("mDNSCoreReceiveResponse: Ignoring response received before we even began probing: %s", ARDisplayString(m, rr));
6741 if (rr->resrec.RecordType == kDNSRecordTypeVerified)
6743 LogMsg("mDNSCoreReceiveResponse: Resetting to Probing: %s", ARDisplayString(m, rr));
6744 rr->resrec.RecordType = kDNSRecordTypeUnique;
6749 rr->ProbeCount = DefaultProbeCountForTypeUnique + 1;
6750 rr->AnnounceCount = InitialAnnounceCount;
6751 InitializeLastAPTime(m, rr);
6752 RecordProbeFailure(m, rr); // Repeated late conflicts also cause us to back off to the slower probing rate
6755 else if (rr->resrec.RecordType == kDNSRecordTypeUnique)
6757 LogMsg("mDNSCoreReceiveResponse: ProbeCount %d; will deregister %s", rr->ProbeCount, ARDisplayString(m, rr));
6758 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
6765 else if (rr->resrec.RecordType == kDNSRecordTypeKnownUnique)
6767 LogMsg("mDNSCoreReceiveResponse: Unexpected conflict discarding %s", ARDisplayString(m, rr));
6768 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict);
6771 LogMsg("mDNSCoreReceiveResponse: Unexpected record type %X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
6778 else if (m->rec.r.resrec.rrtype == rr->resrec.rrtype)
6779 if ((m->rec.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) && m->timenow - rr->LastMCTime > mDNSPlatformOneSecond/2)
6780 { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; }
6815 CacheRecord *rr;
6818 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
6820 mDNSBool match = !InterfaceID ? m->rec.r.resrec.rDNSServer == rr->resrec.rDNSServer : rr->resrec.InterfaceID == InterfaceID;
6822 if (match && IdenticalSameNameRecord(&m->rec.r.resrec, &rr->resrec))
6831 if (rr->NextInCFList == mDNSNULL && cfp != &rr->NextInCFList && LLQType != uDNS_LLQ_Events)
6832 { *cfp = rr; cfp = &rr->NextInCFList; *cfp = (CacheRecord*)1; }
6835 if (!(rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask))
6838 for (q = m->Questions; q; q=q->next) if (ResourceRecordAnswersQuestion(&rr->resrec, q)) q->UniqueAnswers++;
6839 rr->resrec.RecordType = m->rec.r.resrec.RecordType;
6843 if (!SameRDataBody(&m->rec.r.resrec, &rr->resrec.rdata->u, SameDomainNameCS))
6849 rr->resrec.rroriginalttl = 0;
6850 rr->TimeRcvd = m->timenow;
6851 rr->UnansweredQueries = MaxUnansweredQueries;
6852 SetNextCacheCheckTimeForRecord(m, rr);
6853 LogInfo("Discarding due to domainname case change old: %s", CRDisplayString(m,rr));
6856 NextCacheCheckEvent(rr) - m->timenow, slot, m->rrcache_nextcheck[slot] - m->timenow, m->NextCacheCheck - m->timenow);
6862 //if (rr->resrec.rroriginalttl == 0) LogMsg("uDNS rescuing %s", CRDisplayString(m, rr));
6863 RefreshCacheRecord(m, rr, m->rec.r.resrec.rroriginalttl);
6873 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask)
6878 ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
6903 debugf("DE for %s", CRDisplayString(m, rr));
6904 if (RRExpireTime(rr) - m->timenow > mDNSPlatformOneSecond)
6906 rr->resrec.rroriginalttl = 1;
6907 rr->TimeRcvd = m->timenow;
6908 rr->UnansweredQueries = MaxUnansweredQueries;
6909 SetNextCacheCheckTimeForRecord(m, rr);
6918 if (!rr && m->rec.r.resrec.rroriginalttl > 0)
6927 rr = CreateNewCacheEntry(m, slot, cg, delay);
6928 if (rr)
6930 if (AddToCFList) { *cfp = rr; cfp = &rr->NextInCFList; *cfp = (CacheRecord*)1; }
6931 else if (rr->DelayDelivery) ScheduleNextCacheCheckTime(m, slot, rr->DelayDelivery);
7056 CacheRecord *rr, *neg = mDNSNULL;
7059 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
7060 if (SameNameRecordAnswersQuestion(&rr->resrec, qptr))
7063 if (RRExpireTime(rr) - m->timenow > 0) break;
7065 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative) neg = rr;
7081 if (qptr->AppendSearchDomains && !rr)
7092 if (!rr)
7191 AuthRecord *rr;
7193 for (rr = thelist; rr; rr = rr->next)
7194 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering && mDNSSameEthAddress(&rr->WakeUp.HMAC, e))
7196 LogInfo("ScheduleWakeupForList: Scheduling wakeup packets for %s", ARDisplayString(m, rr));
7197 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7408 AuthRecord *const rr = m->CurrentRecord;
7409 if (rr->resrec.InterfaceID == InterfaceID || (!rr->resrec.InterfaceID && (rr->ForceMCast || IsLocalDomain(rr->resrec.name))))
7410 if (mDNSSameOpaque16(rr->updateid, msg->h.id))
7412 rr->updateid = zeroID;
7413 rr->expire = NonZeroTime(m->timenow + updatelease * mDNSPlatformOneSecond);
7414 LogSPS("Sleep Proxy %s record %5d %s", rr->WakeUp.HMAC.l[0] ? "transferred" : "registered", updatelease, ARDisplayString(m,rr));
7415 if (rr->WakeUp.HMAC.l[0])
7417 rr->WakeUp.HMAC = zeroEthAddr; // Clear HMAC so that mDNS_Deregister_internal doesn't waste packets trying to wake this host
7418 rr->RequireGoodbye = mDNSfalse; // and we don't want to send goodbye for it
7419 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
7424 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
7425 m->CurrentRecord = rr->next;
8097 CacheRecord *rr;
8103 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8106 if (rr->resrec.RecordType == kDNSRecordTypePacketNegative)
8109 CRDisplayString(m, rr), q, q->qname.c, DNSTypeName(q->qtype), rr->CRActiveQuestion, q->CurrentAnswers);
8113 if (SameNameRecordAnswersQuestion(&rr->resrec, q))
8116 q->qname.c, CRDisplayString(m, rr), q->LOAddressAnswers);
8119 if (rr->resrec.rdlength > SmallRecordLimit) q->LargeAnswers--;
8120 if (rr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) q->UniqueAnswers--;
8122 if (rr->CRActiveQuestion == q)
8131 if (qptr != q && ActiveQuestion(qptr) && ResourceRecordAnswersQuestion(&rr->resrec, qptr))
8137 qptr, CRDisplayString(m,rr), q->CurrentAnswers, qptr->CurrentAnswers, qptr->SuppressUnusable, qptr->SuppressQuery);
8139 rr->CRActiveQuestion = qptr; // Question used to be active; new value may or may not be null
8142 rr, QC_rmv);
8158 AuthRecord *rr;
8176 for (rr = ag->members; rr; rr=rr->next)
8178 if (LORecordAnswersAddressType(rr) && LocalOnlyRecordAnswersQuestion(rr, q))
8181 ARDisplayString(m, rr));
8189 AnswerLocalQuestionWithLocalAuthRecord(m, rr, QC_rmv); // MUST NOT dereference q again
8543 CacheRecord *rr;
8571 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8573 if (rr->CRActiveQuestion == question)
8579 if (ActiveQuestion(q) && ResourceRecordAnswersQuestion(&rr->resrec, q))
8583 "CurrentAnswers %d, SuppressQuery %d", q, CRDisplayString(m,rr), question->CurrentAnswers, q->CurrentAnswers, q->SuppressQuery);
8584 rr->CRActiveQuestion = q; // Question used to be active; new value may or may not be null
8703 const CacheRecord *rr;
8707 for (rr = cg ? cg->members : mDNSNULL; rr; rr=rr->next)
8708 if (rr->resrec.RecordType != kDNSRecordTypePacketNegative && SameNameRecordAnswersQuestion(&rr->resrec, question))
8712 question->QuestionCallback(m, question, &rr->resrec, mDNSfalse);
8729 mDNSexport mStatus mDNS_ReconfirmByValue(mDNS *const m, ResourceRecord *const rr)
8734 cr = FindIdenticalRecordInCache(m, rr);
8735 debugf("mDNS_ReconfirmByValue: %p %s", cr, RRDisplayString(m, rr));
9071 mDNSexport mStatus mDNS_Register(mDNS *const m, AuthRecord *const rr)
9075 status = mDNS_Register_internal(m, rr);
9080 mDNSexport mStatus mDNS_Update(mDNS *const m, AuthRecord *const rr, mDNSu32 newttl,
9083 if (!ValidateRData(rr->resrec.rrtype, newrdlength, newrdata))
9085 LogMsg("Attempt to update record with invalid rdata: %s", GetRRDisplayString_rdb(&rr->resrec, &newrdata->u, m->MsgBuffer));
9092 if (newttl == 0) newttl = rr->resrec.rroriginalttl;
9095 if (rr->NewRData)
9097 RData *n = rr->NewRData;
9098 rr->NewRData = mDNSNULL; // Clear the NewRData pointer ...
9099 if (rr->UpdateCallback)
9100 rr->UpdateCallback(m, rr, n, rr->newrdlength); // ...and let the client free this memory, if necessary
9103 rr->NewRData = newrdata;
9104 rr->newrdlength = newrdlength;
9105 rr->UpdateCallback = Callback;
9108 if (rr->ARType != AuthRecordLocalOnly && rr->ARType != AuthRecordP2P && !IsLocalDomain(rr->resrec.name))
9110 mStatus status = uDNS_UpdateRecord(m, rr);
9112 if (status != mStatus_NoError) { rr->NewRData = mDNSNULL; rr->newrdlength = 0; }
9118 if (RRLocalOnly(rr) || (rr->resrec.rroriginalttl == newttl &&
9119 rr->resrec.rdlength == newrdlength && mDNSPlatformMemSame(rr->resrec.rdata->u.data, newrdata->u.data, newrdlength)))
9120 CompleteRDataUpdate(m, rr);
9123 rr->AnnounceCount = InitialAnnounceCount;
9124 InitializeLastAPTime(m, rr);
9125 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr);
9126 if (!rr->UpdateBlocked && rr->UpdateCredits) rr->UpdateCredits--;
9127 if (!rr->NextUpdateCredit) rr->NextUpdateCredit = NonZeroTime(m->timenow + kUpdateCreditRefreshInterval);
9128 if (rr->AnnounceCount > rr->UpdateCredits + 1) rr->AnnounceCount = (mDNSu8)(rr->UpdateCredits + 1);
9129 if (rr->UpdateCredits <= 5)
9131 mDNSu32 delay = 6 - rr->UpdateCredits; // Delay 1 second, then 2, then 3, etc. up to 6 seconds maximum
9132 if (!rr->UpdateBlocked) rr->UpdateBlocked = NonZeroTime(m->timenow + (mDNSs32)delay * mDNSPlatformOneSecond);
9133 rr->ThisAPInterval *= 4;
9134 rr->LastAPTime = rr->UpdateBlocked - rr->ThisAPInterval;
9136 rr->resrec.name->c, delay, delay > 1 ? "s" : "");
9138 rr->resrec.rroriginalttl = newttl;
9148 mDNSexport mStatus mDNS_Deregister(mDNS *const m, AuthRecord *const rr)
9152 status = mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal);
9158 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
9262 AuthRecord *rr;
9285 for (rr = m->ResourceRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
9286 for (rr = m->DuplicateRecords; rr; rr=rr->next) if (rr->AutoTarget) SetTargetToHostName(m, rr);
9291 mDNSlocal void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
9293 (void)rr; // Unused parameter
9300 debugf("mDNS_HostNameCallback: %##s (%s) %s (%ld)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
9336 LogMsg("mDNS_HostNameCallback: Unknown error %d for registration of record %s", result, rr->resrec.name->c);
9354 AuthRecord *rr;
9356 for (rr = m->ResourceRecords; rr; rr=rr->next)
9357 if (AuthRecord_uDNS(rr) && rr->state != regState_NoTarget)
9359 debugf("RestartRecordGetZoneData: StartGetZoneData for %##s", rr->resrec.name->c);
9362 if (rr->nta) { rr->updateid = zeroID; CancelGetZoneData(m, rr->nta); }
9363 rr->nta = StartGetZoneData(m, rr->resrec.name, ZoneServiceUpdate, RecordRegistrationGotZoneData, rr);
9424 AuthRecord *rr;
9543 for (rr = m->ResourceRecords; rr; rr=rr->next)
9544 if (!AuthRecord_uDNS(rr))
9545 if (!rr->resrec.InterfaceID || rr->resrec.InterfaceID == set->InterfaceID)
9547 if (rr->resrec.RecordType == kDNSRecordTypeVerified && !rr->DependentOn) rr->resrec.RecordType = kDNSRecordTypeUnique;
9548 rr->ProbeCount = DefaultProbeCountForRecordType(rr->resrec.RecordType);
9549 if (rr->AnnounceCount < numannounce) rr->AnnounceCount = numannounce;
9550 rr->SendNSECNow = mDNSNULL;
9551 InitializeLastAPTime(m, rr);
9618 CacheRecord *rr;
9642 FORALL_CACHERECORDS(slot, cg, rr)
9643 if (rr->resrec.InterfaceID == set->InterfaceID)
9650 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
9653 rr->UnansweredQueries = MaxUnansweredQueries;
9656 mDNS_PurgeCacheResourceRecord(m, rr);
9680 CacheRecord *rr;
9681 FORALL_CACHERECORDS(slot, cg, rr)
9682 if (rr->resrec.InterfaceID == set->InterfaceID)
9683 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface);
9693 mDNSlocal void ServiceCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
9695 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
9704 debugf("ServiceCallback: %##s (%s) %s (%d)", rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), msg, result);
9709 if (result == mStatus_NoError && rr != &sr->RR_SRV) return;
9752 mDNSlocal void NSSCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
9754 ServiceRecordSet *sr = (ServiceRecordSet *)rr->RecordContext;
10078 mDNSexport mStatus mDNS_RegisterNoSuchService(mDNS *const m, AuthRecord *const rr,
10094 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_SRV, kHostNameTTL, kDNSRecordTypeUnique, artype, Callback, Context);
10095 if (ConstructServiceName(&rr->namestorage, name, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
10096 rr->resrec.rdata->u.srv.priority = 0;
10097 rr->resrec.rdata->u.srv.weight = 0;
10098 rr->resrec.rdata->u.srv.port = zeroIPPort;
10099 if (host && host->c[0]) AssignDomainName(&rr->resrec.rdata->u.srv.target, host);
10100 else rr->AutoTarget = Target_AutoHost;
10101 return(mDNS_Register(m, rr));
10104 mDNSexport mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr,
10115 mDNS_SetupResourceRecord(rr, mDNSNULL, InterfaceID, kDNSType_PTR, kStandardTTL, kDNSRecordTypeShared, artype, mDNSNULL, mDNSNULL);
10116 if (!MakeDomainNameFromDNSNameString(&rr->namestorage, mDNS_DomainTypeNames[DomainType])) return(mStatus_BadParamErr);
10117 if (!MakeDomainNameFromDNSNameString(&rr->resrec.rdata->u.name, domname)) return(mStatus_BadParamErr);
10118 return(mDNS_Register(m, rr));
10157 mDNSlocal void RestartARPProbing(mDNS *const m, AuthRecord *const rr)
10163 // generating ARP conflicts with a waking machine, and set rr->LastAPTime so we'll start probing again in 10 seconds.
10169 rr->resrec.RecordType = kDNSRecordTypeUnique;
10170 rr->ProbeCount = DefaultProbeCountForTypeUnique;
10173 // still going to sleep, so we just reset rr->ProbeCount so we'll continue probing until it stops responding.
10178 if (rr->AnnounceCount == InitialAnnounceCount && m->timenow - rr->LastAPTime >= 0)
10179 InitializeLastAPTime(m, rr);
10182 rr->AnnounceCount = InitialAnnounceCount;
10183 rr->ThisAPInterval = mDNSPlatformOneSecond;
10184 rr->LastAPTime = m->timenow + mDNSPlatformOneSecond * 9; // Send first packet at rr->LastAPTime + rr->ThisAPInterval, i.e. 10 seconds from now
10185 SetNextAnnounceProbeTime(m, rr);
10192 AuthRecord *rr;
10208 for (rr = m->ResourceRecords; rr; rr=rr->next)
10209 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
10210 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->tpa))
10216 const char *const msg = mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC) ? msg1 :
10217 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
10220 intf->ifname, msg, &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
10221 if (msg == msg1) RestartARPProbing(m, rr);
10222 else if (msg == msg3) mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
10223 else if (msg == msg4) SendARP(m, 2, rr, &arp->tpa, &arp->sha, &arp->spa, &arp->sha);
10240 for (rr = m->ResourceRecords; rr; rr=rr->next)
10241 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
10242 rr->AddressProxy.type == mDNSAddrType_IPv4 && mDNSSameIPv4Address(rr->AddressProxy.ip.v4, arp->spa))
10244 RestartARPProbing(m, rr);
10245 if (mDNSSameEthAddress(&arp->sha, &rr->WakeUp.IMAC))
10248 &arp->sha, &arp->spa, &arp->tpa, ARDisplayString(m, rr));
10252 &arp->sha, &arp->spa, &arp->tpa, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
10253 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
10280 AuthRecord *rr;
10291 for (rr = m->ResourceRecords; rr; rr=rr->next)
10292 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
10293 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, ndp->target))
10300 const char *const msg = sha && mDNSSameEthAddress(sha, &rr->WakeUp.IMAC) ? msg1 :
10301 (rr->AnnounceCount == InitialAnnounceCount) ? msg2 :
10305 rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
10306 if (msg == msg1) RestartARPProbing(m, rr);
10310 mDNSPlatformSetLocalAddressCacheEntry(m, &rr->AddressProxy, &rr->WakeUp.IMAC, InterfaceID);
10312 else if (msg == msg4) SendNDP(m, NDP_Adv, NDP_Solicited, rr, &ndp->target, mDNSNULL, spa, sha );
10313 else if (msg == msg5) SendNDP(m, NDP_Adv, 0, rr, &ndp->target, mDNSNULL, &AllHosts_v6, &AllHosts_v6_Eth);
10328 for (rr = m->ResourceRecords; rr; rr=rr->next)
10329 if (rr->resrec.InterfaceID == InterfaceID && rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
10330 rr->AddressProxy.type == mDNSAddrType_IPv6 && mDNSSameIPv6Address(rr->AddressProxy.ip.v6, *spa))
10332 RestartARPProbing(m, rr);
10333 if (mDNSSameEthAddress(sha, &rr->WakeUp.IMAC))
10335 ndp->type == NDP_Sol ? "Solicitation " : "Advertisement", sha, spa, &ndp->target, ARDisplayString(m, rr));
10339 sha, spa, &ndp->target, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, rr));
10340 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
10438 AuthRecord *rr, *r2;
10441 for (rr = m->ResourceRecords; rr; rr=rr->next)
10442 if (rr->resrec.InterfaceID == InterfaceID &&
10443 rr->resrec.RecordType != kDNSRecordTypeDeregistering &&
10444 rr->AddressProxy.type && mDNSSameAddress(&rr->AddressProxy, dst))
10448 if (r2->resrec.InterfaceID == InterfaceID && mDNSSameEthAddress(&r2->WakeUp.HMAC, &rr->WakeUp.HMAC) &&
10453 if (!r2 && mDNSSameIPPort(port, IPSECPort)) r2 = rr; // So that we wake for BTMM IPSEC packets, even without a matching SRV record
10457 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, &rr->WakeUp.IMAC, ARDisplayString(m, r2));
10458 ScheduleWakeup(m, rr->resrec.InterfaceID, &rr->WakeUp.HMAC);
10462 InterfaceNameForID(m, rr->resrec.InterfaceID), dst, &rr->WakeUp.HMAC, tp, mDNSVal16(port));
10813 mDNSlocal void DynDNSHostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result)
10816 debugf("NameStatusCallback: result %d for registration of name %##s", result, rr->resrec.name->c);
10817 mDNSPlatformDynDNSHostNameStatusChanged(rr->resrec.name, result);
11313 AuthRecord *rr = m->CurrentRecord;
11315 (rr->resrec.RecordType != kDNSRecordTypeDeregistering) ? "Initiating " : "Accelerating",
11316 rr, rr->resrec.RecordType, ARDisplayString(m, rr));
11317 if (rr->resrec.RecordType != kDNSRecordTypeDeregistering)
11318 mDNS_Deregister_internal(m, rr, mDNS_Dereg_rapid);
11319 else if (rr->AnnounceCount > 1)
11321 rr->AnnounceCount = 1;
11322 rr->LastAPTime = m->timenow - rr->ThisAPInterval;
11326 if (m->CurrentRecord == rr) // If m->CurrentRecord was not advanced for us, do it now
11327 m->CurrentRecord = rr->next;
11334 AuthRecord *rr;
11420 for (rr = m->DuplicateRecords; rr; rr = rr->next)
11421 LogMsg("mDNS_StartExit: Should not still have Duplicate Records remaining: %02X %s", rr->resrec.RecordType, ARDisplayString(m, rr));
11439 AuthRecord *rr;
11461 debugf("mDNS_FinalExit: RR Cache was using %ld records, %lu active", rrcache_totalused, rrcache_active);
11465 for (rr = m->ResourceRecords; rr; rr = rr->next)
11466 LogMsg("mDNS_FinalExit failed to send goodbye for: %p %02X %s", rr, rr->resrec.RecordType, ARDisplayString(m, rr));