Lines Matching refs:m
2130 mDNSlocal void SetNextQueryTime(mDNS *const m, const DNSQuestion *const q) in SetNextQueryTime() argument
2133 if (m->NextScheduledQuery - (q->LastQTime + q->ThisQInterval) > 0) in SetNextQueryTime()
2134 m->NextScheduledQuery = (q->LastQTime + q->ThisQInterval); in SetNextQueryTime()
2137 mDNSlocal CacheGroup *CacheGroupForName(const mDNS *const m, const mDNSu32 slot, const mDNSu32 name… in CacheGroupForName() argument
2140 for (cg = m->rrcache_hash[slot]; cg; cg=cg->next) in CacheGroupForName()
2146 mDNSlocal CacheGroup *CacheGroupForRecord(const mDNS *const m, const mDNSu32 slot, const ResourceRe… in CacheGroupForRecord() argument
2148 return(CacheGroupForName(m, slot, rr->namehash, rr->name)); in CacheGroupForRecord()
2151 mDNSlocal mDNSBool AddressIsLocalSubnet(mDNS *const m, const mDNSInterfaceID InterfaceID, const mDN… in AddressIsLocalSubnet() argument
2158 for (intf = m->HostInterfaces; intf; intf = intf->next) in AddressIsLocalSubnet()
2167 for (intf = m->HostInterfaces; intf; intf = intf->next) in AddressIsLocalSubnet()
2229 mDNSlocal void AnswerLocalOnlyQuestionWithResourceRecord(mDNS *const m, DNSQuestion *q, AuthRecord … in AnswerLocalOnlyQuestionWithResourceRecord() argument
2233 m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in AnswerLocalOnlyQuestionWithResourceRecord()
2235 q->QuestionCallback(m, q, &rr->resrec, AddRecord); in AnswerLocalOnlyQuestionWithResourceRecord()
2236 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in AnswerLocalOnlyQuestionWithResourceRecord()
2243 mDNSlocal void AnswerLocalQuestions(mDNS *const m, AuthRecord *rr, mDNSBool AddRecord) in AnswerLocalQuestions() argument
2245 if (m->CurrentQuestion) LogMsg("AnswerLocalQuestions ERROR m->CurrentQuestion already set"); in AnswerLocalQuestions()
2247 m->CurrentQuestion = m->LocalOnlyQuestions; in AnswerLocalQuestions()
2248 while (m->CurrentQuestion && m->CurrentQuestion != m->NewLocalOnlyQuestions) in AnswerLocalQuestions()
2250 DNSQuestion *q = m->CurrentQuestion; in AnswerLocalQuestions()
2251 m->CurrentQuestion = q->next; in AnswerLocalQuestions()
2253 AnswerLocalOnlyQuestionWithResourceRecord(m, q, rr, AddRecord); // MUST NOT dereference q again in AnswerLocalQuestions()
2259 m->CurrentQuestion = m->Questions; in AnswerLocalQuestions()
2260 while (m->CurrentQuestion && m->CurrentQuestion != m->NewQuestions) in AnswerLocalQuestions()
2262 DNSQuestion *q = m->CurrentQuestion; in AnswerLocalQuestions()
2263 m->CurrentQuestion = q->next; in AnswerLocalQuestions()
2265 AnswerLocalOnlyQuestionWithResourceRecord(m, q, rr, AddRecord); // MUST NOT dereference q again in AnswerLocalQuestions()
2269 m->CurrentQuestion = mDNSNULL; in AnswerLocalQuestions()
2387 mDNSlocal void SetNextAnnounceProbeTime(mDNS *const m, const AuthRecord *const rr) in SetNextAnnounceProbeTime() argument
2393 if (m->NextScheduledProbe - (rr->LastAPTime + rr->ThisAPInterval) >= 0) in SetNextAnnounceProbeTime()
2394 m->NextScheduledProbe = (rr->LastAPTime + rr->ThisAPInterval); in SetNextAnnounceProbeTime()
2398 if (m->NextScheduledResponse - (rr->LastAPTime + rr->ThisAPInterval) >= 0) in SetNextAnnounceProbeTime()
2399 m->NextScheduledResponse = (rr->LastAPTime + rr->ThisAPInterval); in SetNextAnnounceProbeTime()
2403 mDNSlocal void InitializeLastAPTime(mDNS *const m, AuthRecord *const rr) in InitializeLastAPTime() argument
2413 if (m->SuppressProbes == 0 || m->SuppressProbes - m->timenow < 0) in InitializeLastAPTime()
2415 m->SuppressProbes = NonZeroTime(m->timenow + DefaultProbeIntervalForTypeUnique); in InitializeLastAPTime()
2417 if (m->SuppressProbes - m->NextScheduledProbe >= 0) in InitializeLastAPTime()
2418 m->SuppressProbes = m->NextScheduledProbe; in InitializeLastAPTime()
2420 if (m->SuppressProbes - m->NextScheduledQuery >= 0) in InitializeLastAPTime()
2421 m->SuppressProbes = m->NextScheduledQuery; in InitializeLastAPTime()
2427 rr->AnnounceUntil = m->timenow + TicksTTL(rr); in InitializeLastAPTime()
2428 rr->LastAPTime = m->SuppressProbes - rr->ThisAPInterval; in InitializeLastAPTime()
2431 rr->LastMCTime = m->timenow; in InitializeLastAPTime()
2444 SetNextAnnounceProbeTime(m, rr); in InitializeLastAPTime()
2449 mDNSlocal void SetTargetToHostName(mDNS *const m, AuthRecord *const rr) in SetTargetToHostName() argument
2455 if (target && SameDomainName(target, &m->MulticastHostname)) in SetTargetToHostName()
2458 if (target && !SameDomainName(target, &m->MulticastHostname)) in SetTargetToHostName()
2460 AssignDomainName(target, &m->MulticastHostname); in SetTargetToHostName()
2478 InitializeLastAPTime(m,rr); in SetTargetToHostName()
2482 mDNSlocal void AcknowledgeRecord(mDNS *const m, AuthRecord *const rr) in AcknowledgeRecord() argument
2489 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in AcknowledgeRecord()
2490 rr->RecordCallback(m, rr, mStatus_NoError); in AcknowledgeRecord()
2491 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in AcknowledgeRecord()
2501 mDNSlocal mStatus mDNS_Register_internal(mDNS *const m, AuthRecord *const rr) in mDNS_Register_internal() argument
2505 AuthRecord **p = &m->ResourceRecords; in mDNS_Register_internal()
2506 AuthRecord **d = &m->DuplicateRecords; in mDNS_Register_internal()
2511 …{ LogMsg("mDNS_Register_internal: TTL must be 1 - 0x7FFFFFFF %s", ARDisplayString(m, rr)); return(… in mDNS_Register_internal()
2516 else return uDNS_RegisterRecord(m, rr); in mDNS_Register_internal()
2550 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_Register_internal()
2591 if (!rr->HostTarget) InitializeLastAPTime(m, rr); in mDNS_Register_internal()
2611 …SetTargetToHostName(m, rr); // Also sets rdlength and rdestimate for us, and calls InitializeLastA… in mDNS_Register_internal()
2619 …{ LogMsg("Attempt to register record with invalid name: %s", ARDisplayString(m, rr)); return(mStat… in mDNS_Register_internal()
2628 …{ LogMsg("Attempt to register record with invalid rdata: %s", ARDisplayString(m, rr)); return(mSta… in mDNS_Register_internal()
2639 for (r = m->ResourceRecords; r; r=r->next) in mDNS_Register_internal()
2651 m->NextScheduledResponse = m->timenow; in mDNS_Register_internal()
2657 for (r = m->ResourceRecords; r; r=r->next) if (RecordIsLocalDuplicate(r, rr)) break; in mDNS_Register_internal()
2661 debugf("Adding to duplicate list %p %s", rr, ARDisplayString(m,rr)); in mDNS_Register_internal()
2672 debugf("Adding to active record list %p %s", rr, ARDisplayString(m,rr)); in mDNS_Register_internal()
2673 if (!m->NewLocalRecords) m->NewLocalRecords = rr; in mDNS_Register_internal()
2679 AcknowledgeRecord(m, rr); in mDNS_Register_internal()
2684 mDNSlocal void RecordProbeFailure(mDNS *const m, const AuthRecord *const rr) in RecordProbeFailure() argument
2686 m->ProbeFailTime = m->timenow; in RecordProbeFailure()
2687 m->NumFailedProbes++; in RecordProbeFailure()
2695 if (m->NumFailedProbes >= 15) in RecordProbeFailure()
2697 m->SuppressProbes = NonZeroTime(m->timenow + mDNSPlatformOneSecond * 5); in RecordProbeFailure()
2699 m->NumFailedProbes, rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype)); in RecordProbeFailure()
2703 mDNSlocal void CompleteRDataUpdate(mDNS *const m, AuthRecord *const rr) in CompleteRDataUpdate() argument
2709 rr->UpdateCallback(m, rr, OldRData); // ... and let the client know in CompleteRDataUpdate()
2719 mDNSlocal mStatus mDNS_Deregister_internal(mDNS *const m, AuthRecord *const rr, mDNS_Dereg_type drt) in mDNS_Deregister_internal() argument
2723 AuthRecord **p = &m->ResourceRecords; // Find this record in our list of active records in mDNS_Deregister_internal()
2727 return uDNS_DeregisterRecord(m, rr); in mDNS_Deregister_internal()
2739 …for (r2 = m->DuplicateRecords; r2; r2=r2->next) if (RecordIsLocalDuplicate(r2, rr)) r2->ProbeCount… in mDNS_Deregister_internal()
2745 AuthRecord **d = &m->DuplicateRecords; in mDNS_Deregister_internal()
2776 p = &m->DuplicateRecords; in mDNS_Deregister_internal()
2802 if (m->NextScheduledResponse - (m->timenow + mDNSPlatformOneSecond/10) >= 0) in mDNS_Deregister_internal()
2803 m->NextScheduledResponse = (m->timenow + mDNSPlatformOneSecond/10); in mDNS_Deregister_internal()
2809 if (m->CurrentRecord == rr) m->CurrentRecord = rr->next; in mDNS_Deregister_internal()
2810 if (m->NewLocalRecords == rr) m->NewLocalRecords = rr->next; in mDNS_Deregister_internal()
2831 …if (rr->NewRData) CompleteRDataUpdate(m, rr); // Update our rdata, clear the NewRData pointer, and… in mDNS_Deregister_internal()
2833 if (rr->LocalAnswer) AnswerLocalQuestions(m, rr, mDNSfalse); in mDNS_Deregister_internal()
2839 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in mDNS_Deregister_internal()
2842 …if (rr->RecordCallback) rr->RecordCallback(m, rr, mStatus_MemFree); // MUST NOT touch rr after t… in mDNS_Deregister_internal()
2846 RecordProbeFailure(m, rr); in mDNS_Deregister_internal()
2847 …if (rr->RecordCallback) rr->RecordCallback(m, rr, mStatus_NameConflict); // MUST NOT touch rr afte… in mDNS_Deregister_internal()
2851 r2 = m->DuplicateRecords; in mDNS_Deregister_internal()
2855 else { mDNS_Deregister_internal(m, r2, mDNS_Dereg_conflict); r2 = m->DuplicateRecords; } in mDNS_Deregister_internal()
2858 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in mDNS_Deregister_internal()
2885 mDNSlocal void AddAdditionalsToResponseList(mDNS *const m, AuthRecord *ResponseRecords, AuthRecord … in AddAdditionalsToResponseList() argument
2900 for (rr2=m->ResourceRecords; rr2; rr2=rr2->next) // Scan list of resource records in AddAdditionalsToResponseList()
2909 mDNSlocal void SendDelayedUnicastResponse(mDNS *const m, const mDNSAddr *const dest, const mDNSInte… in SendDelayedUnicastResponse() argument
2916 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendDelayedUnicastResponse()
2937 AddAdditionalsToResponseList(m, ResponseRecords, &nrp, InterfaceID); in SendDelayedUnicastResponse()
2941 mDNSu8 *responseptr = m->omsg.data; in SendDelayedUnicastResponse()
2943 InitializeDNSMessage(&m->omsg.h, zeroID, ResponseFlags); in SendDelayedUnicastResponse()
2951 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec); in SendDelayedUnicastResponse()
2953 if (!newptr && m->omsg.h.numAnswers) break; // If packet full, send it now in SendDelayedUnicastResponse()
2968 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAdditionals, &rr->resrec); in SendDelayedUnicastResponse()
2972 if (newptr && m->omsg.h.numAnswers) rr->RequireGoodbye = mDNStrue; in SendDelayedUnicastResponse()
2980 …if (m->omsg.h.numAnswers) mDNSSendDNSMessage(m, &m->omsg, responseptr, mDNSInterface_Any, dest, Mu… in SendDelayedUnicastResponse()
2984 mDNSlocal void CompleteDeregistration(mDNS *const m, AuthRecord *rr) in CompleteDeregistration() argument
2990 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); // Don't touch rr after this in CompleteDeregistration()
2996 mDNSlocal void DiscardDeregistrations(mDNS *const m) in DiscardDeregistrations() argument
2998 if (m->CurrentRecord) LogMsg("DiscardDeregistrations ERROR m->CurrentRecord already set"); in DiscardDeregistrations()
2999 m->CurrentRecord = m->ResourceRecords; in DiscardDeregistrations()
3001 while (m->CurrentRecord) in DiscardDeregistrations()
3003 AuthRecord *rr = m->CurrentRecord; in DiscardDeregistrations()
3005 CompleteDeregistration(m, rr); // Don't touch rr after this in DiscardDeregistrations()
3007 m->CurrentRecord = rr->next; in DiscardDeregistrations()
3033 mDNSlocal void SendResponses(mDNS *const m) in SendResponses() argument
3038 const NetworkInterfaceInfo *intf = GetFirstActiveInterface(m->HostInterfaces); in SendResponses()
3040 m->NextScheduledResponse = m->timenow + 0x78000000; in SendResponses()
3042 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3049 if (!mDNSIPv4AddressIsZero(rr->v4Requester)) SendDelayedUnicastResponse(m, &v4, rr->ImmedAnswer); in SendResponses()
3050 if (!mDNSIPv6AddressIsZero(rr->v6Requester)) SendDelayedUnicastResponse(m, &v6, rr->ImmedAnswer); in SendResponses()
3053 LogMsg("SendResponses: ERROR: rr->ImmedUnicast still set: %s", ARDisplayString(m, rr)); in SendResponses()
3063 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3065 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr); in SendResponses()
3066 if (TimeToAnnounceThisRecord(rr, m->timenow) && ResourceRecordIsValidAnswer(rr)) in SendResponses()
3077 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3080 TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2) && in SendResponses()
3088 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3090 for (r2=m->ResourceRecords; r2; r2=r2->next) // Scan list of resource records in SendResponses()
3105 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3110 for (r2 = m->ResourceRecords; r2; r2=r2->next) in SendResponses()
3118 for (r2 = m->ResourceRecords; r2; r2=r2->next) in SendResponses()
3126 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3132 rr->LastMCTime = m->timenow; in SendResponses()
3135 if (TimeToAnnounceThisRecord(rr, m->timenow + rr->ThisAPInterval/2)) in SendResponses()
3139 rr->LastAPTime = m->timenow; in SendResponses()
3148 rr->LastMCTime = m->timenow; in SendResponses()
3151 SetNextAnnounceProbeTime(m, rr); in SendResponses()
3164 mDNSu8 *responseptr = m->omsg.data; in SendResponses()
3166 InitializeDNSMessage(&m->omsg.h, zeroID, ResponseFlags); in SendResponses()
3176 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3181 newptr = PutResourceRecordTTL(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec, 0); in SendResponses()
3182 if (!newptr && m->omsg.h.numAnswers) break; in SendResponses()
3186 else if (rr->NewRData && !m->SleepState) // If we have new data for this record in SendResponses()
3193 newptr = PutResourceRecordTTL(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec, 0); in SendResponses()
3194 if (!newptr && m->omsg.h.numAnswers) break; in SendResponses()
3203 newptr = PutResourceRecord(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec); in SendResponses()
3212 …newptr = PutResourceRecordTTL(&m->omsg, responseptr, &m->omsg.h.numAnswers, &rr->resrec, m->SleepS… in SendResponses()
3214 if (!newptr && m->omsg.h.numAnswers) break; in SendResponses()
3215 rr->RequireGoodbye = (mDNSu8) (!m->SleepState); in SendResponses()
3216 if (rr->LastAPTime == m->timenow) numAnnounce++; else numAnswer++; in SendResponses()
3228 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendResponses()
3233 mDNSBool SendAdditional = (m->omsg.h.numAnswers > 0); in SendResponses()
3241 for (a = m->ResourceRecords; a; a=a->next) in SendResponses()
3242 if (a->LastMCTime == m->timenow && in SendResponses()
3252 newptr = PutResourceRecord(&m->omsg, newptr, &m->omsg.h.numAdditionals, &rr->resrec); in SendResponses()
3263 rr->LastMCTime = m->timenow; in SendResponses()
3269 if (m->omsg.h.numAnswers > 0 || m->omsg.h.numAdditionals) in SendResponses()
3275 m->omsg.h.numAdditionals, m->omsg.h.numAdditionals == 1 ? "" : "s", intf->InterfaceID); in SendResponses()
3276 …if (intf->IPv4Available) mDNSSendDNSMessage(m, &m->omsg, responseptr, intf->InterfaceID, &AllDNSLi… in SendResponses()
3277 …if (intf->IPv6Available) mDNSSendDNSMessage(m, &m->omsg, responseptr, intf->InterfaceID, &AllDNSLi… in SendResponses()
3278 …if (!m->SuppressSending) m->SuppressSending = NonZeroTime(m->timenow + (mDNSPlatformOneSecond+9)/1… in SendResponses()
3297 if (m->CurrentRecord) LogMsg("SendResponses: ERROR m->CurrentRecord already set"); in SendResponses()
3298 m->CurrentRecord = m->ResourceRecords; in SendResponses()
3299 while (m->CurrentRecord) in SendResponses()
3301 rr = m->CurrentRecord; in SendResponses()
3302 m->CurrentRecord = rr->next; in SendResponses()
3307 LogMsg("SendResponses: No active interface to send: %s", ARDisplayString(m, rr)); in SendResponses()
3313 …if (rr->NewRData) CompleteRDataUpdate(m,rr); // Update our rdata, clear the NewRData pointer, and … in SendResponses()
3316 CompleteDeregistration(m, rr); // Don't touch rr after this in SendResponses()
3326 verbosedebugf("SendResponses: Next in %ld ticks", m->NextScheduledResponse - m->timenow); in SendResponses()
3352 mDNSlocal void SetNextCacheCheckTime(mDNS *const m, CacheRecord *const rr) in SetNextCacheCheckTime() argument
3364 (rr->NextRequiredQuery - m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr)); in SetNextCacheCheckTime()
3367 if (m->NextCacheCheck - (rr->NextRequiredQuery + CacheCheckGracePeriod(rr)) > 0) in SetNextCacheCheckTime()
3368 m->NextCacheCheck = (rr->NextRequiredQuery + CacheCheckGracePeriod(rr)); in SetNextCacheCheckTime()
3371 if (m->NextCacheCheck - rr->DelayDelivery > 0) in SetNextCacheCheckTime()
3372 m->NextCacheCheck = rr->DelayDelivery; in SetNextCacheCheckTime()
3380 mDNSlocal mStatus mDNS_Reconfirm_internal(mDNS *const m, CacheRecord *const rr, mDNSu32 interval) in mDNS_Reconfirm_internal() argument
3388 if (RRExpireTime(rr) - m->timenow > (mDNSs32)((interval * 4) / 3)) in mDNS_Reconfirm_internal()
3393 if (!m->RandomReconfirmDelay) m->RandomReconfirmDelay = 1 + mDNSRandom(0x3FFFFFFF); in mDNS_Reconfirm_internal()
3394 interval += mDNSRandomFromFixedSeed(m->RandomReconfirmDelay, interval/3); in mDNS_Reconfirm_internal()
3395 rr->TimeRcvd = m->timenow - (mDNSs32)interval * 3; in mDNS_Reconfirm_internal()
3397 SetNextCacheCheckTime(m, rr); in mDNS_Reconfirm_internal()
3399 …econfirm_internal:%6ld ticks to go for %s", RRExpireTime(rr) - m->timenow, CRDisplayString(m, rr)); in mDNS_Reconfirm_internal()
3408 mDNSlocal mDNSBool BuildQuestion(mDNS *const m, DNSMessage *query, mDNSu8 **queryptr, DNSQuestion *… in BuildQuestion() argument
3411 mDNSBool ucast = (q->LargeAnswers || q->RequestUnicast) && m->CanReceiveUnicastOn5353; in BuildQuestion()
3431 CacheGroup *cg = CacheGroupForName(m, slot, q->qnamehash, &q->qname); in BuildQuestion()
3440 …rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow > // and its half-way-to-expiry time is at least 1 s… in BuildQuestion()
3483 if (ucast) m->ExpectUnicastResponse = m->timenow; in BuildQuestion()
3491 rr->LastUnansweredTime = m->timenow; in BuildQuestion()
3492 SetNextCacheCheckTime(m, rr); in BuildQuestion()
3499 mDNSlocal void ReconfirmAntecedents(mDNS *const m, DNSQuestion *q) in ReconfirmAntecedents() argument
3507 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForNoAnswer); in ReconfirmAntecedents()
3562 mDNSlocal mDNSBool AccelerateThisQuery(mDNS *const m, DNSQuestion *q) in AccelerateThisQuery() argument
3565 if (TimeToSendThisQuestion(q, m->timenow + q->ThisQInterval/10)) in AccelerateThisQuery()
3569 if (TimeToSendThisQuestion(q, m->timenow + q->ThisQInterval/2)) in AccelerateThisQuery()
3574 CacheGroup *cg = CacheGroupForName(m, slot, q->qnamehash, &q->qname); in AccelerateThisQuery()
3579 rr->TimeRcvd + TicksTTL(rr)/2 - m->timenow >= 0 && // and it is less than half-way to expiry in AccelerateThisQuery()
3580 …rr->NextRequiredQuery - (m->timenow + q->ThisQInterval) > 0)// and we'll ask at least once again b… in AccelerateThisQuery()
3604 mDNSlocal void SendQueries(mDNS *const m) in SendQueries() argument
3614 const NetworkInterfaceInfo *intf = GetFirstActiveInterface(m->HostInterfaces); in SendQueries()
3618 if (m->timenow - m->NextScheduledQuery >= 0) in SendQueries()
3621 m->NextScheduledQuery = m->timenow + 0x78000000; in SendQueries()
3627 if (m->timenow + TicksTTL(rr)/50 - rr->NextRequiredQuery >= 0) in SendQueries()
3630 …ExpireDupSuppressInfoOnInterface(q->DupSuppress, m->timenow - TicksTTL(rr)/20, rr->resrec.Interfac… in SendQueries()
3637 for (q = m->Questions; q; q=q->next) in SendQueries()
3638 if (q->Target.type && (q->SendQNow || TimeToSendThisQuestion(q, m->timenow))) in SendQueries()
3640 mDNSu8 *qptr = m->omsg.data; in SendQueries()
3641 const mDNSu8 *const limit = m->omsg.data + sizeof(m->omsg.data); in SendQueries()
3642 InitializeDNSMessage(&m->omsg.h, q->TargetQID, QueryFlags); in SendQueries()
3643 qptr = putQuestion(&m->omsg, qptr, limit, &q->qname, q->qtype, q->qclass); in SendQueries()
3644 … mDNSSendDNSMessage(m, &m->omsg, qptr, mDNSInterface_Any, &q->Target, q->TargetPort, -1, mDNSNULL); in SendQueries()
3648 q->LastQTime = m->timenow; in SendQueries()
3649 q->LastQTxTime = m->timenow; in SendQueries()
3652 m->ExpectUnicastResponse = m->timenow; in SendQueries()
3656 for (q = m->Questions; q; q=q->next) in SendQueries()
3657 if (!q->Target.type && TimeToSendThisQuestion(q, m->timenow)) in SendQueries()
3667 for (q = m->Questions; q; q=q->next) in SendQueries()
3670 … ActiveQuestion(q) && q->ThisQInterval <= maxExistingQuestionInterval && AccelerateThisQuery(m,q))) in SendQueries()
3675 if (m->timenow - (q->LastQTime + q->ThisQInterval/2) >= 0) in SendQueries()
3685 …ReconfirmAntecedents(m, q); // Sending third query, and no answers yet; time to begin doubting th… in SendQueries()
3694 q->LastQTime = m->timenow; in SendQueries()
3699 ExpireDupSuppressInfo(q->DupSuppress, m->timenow - q->ThisQInterval/2); in SendQueries()
3701 q->LastQTxTime = m->timenow; in SendQueries()
3706 SetNextQueryTime(m,q); in SendQueries()
3711 if (m->timenow - m->NextScheduledProbe >= 0) in SendQueries()
3713 m->NextScheduledProbe = m->timenow + 0x78000000; in SendQueries()
3715 if (m->CurrentRecord) LogMsg("SendQueries: ERROR m->CurrentRecord already set"); in SendQueries()
3716 m->CurrentRecord = m->ResourceRecords; in SendQueries()
3717 while (m->CurrentRecord) in SendQueries()
3719 AuthRecord *rr = m->CurrentRecord; in SendQueries()
3720 m->CurrentRecord = rr->next; in SendQueries()
3724 if (m->timenow - (rr->LastAPTime + rr->ThisAPInterval) < 0) in SendQueries()
3726 SetNextAnnounceProbeTime(m, rr); in SendQueries()
3733 rr->LastAPTime = m->timenow; in SendQueries()
3735 SetNextAnnounceProbeTime(m, rr); in SendQueries()
3744 rr->LastAPTime = m->timenow - DefaultAnnounceIntervalForTypeUnique; in SendQueries()
3745 SetNextAnnounceProbeTime(m, rr); in SendQueries()
3747 for (r2 = m->DuplicateRecords; r2; r2=r2->next) in SendQueries()
3750 AcknowledgeRecord(m, rr); in SendQueries()
3754 m->CurrentRecord = m->DuplicateRecords; in SendQueries()
3755 while (m->CurrentRecord) in SendQueries()
3757 AuthRecord *rr = m->CurrentRecord; in SendQueries()
3758 m->CurrentRecord = rr->next; in SendQueries()
3760 AcknowledgeRecord(m, rr); in SendQueries()
3769 mDNSu8 *queryptr = m->omsg.data; in SendQueries()
3770 InitializeDNSMessage(&m->omsg.h, zeroID, QueryFlags); in SendQueries()
3779 for (q = m->Questions; q; q=q->next) in SendQueries()
3784 …q->qname.c, DNSTypeName(q->qtype), queryptr - m->omsg.data, queryptr + answerforecast - m->omsg.da… in SendQueries()
3787 BuildQuestion(m, &m->omsg, &queryptr, q, &kalistptr, &answerforecast)) in SendQueries()
3792 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendQueries()
3795 …mDNSBool ucast = (rr->ProbeCount >= DefaultProbeCountForTypeUnique-1) && m->CanReceiveUnicastOn535… in SendQueries()
3797 …const mDNSu8 *const limit = m->omsg.data + ((m->omsg.h.numQuestions) ? NormalMaxDNSMessageData : A… in SendQueries()
3798 …mDNSu8 *newptr = putQuestion(&m->omsg, queryptr, limit, rr->resrec.name, kDNSQType_ANY, (mDNSu16)(… in SendQueries()
3814 m->omsg.h.numQuestions--; in SendQueries()
3823 mDNSu32 SecsSinceRcvd = ((mDNSu32)(m->timenow - rr->TimeRcvd)) / mDNSPlatformOneSecond; in SendQueries()
3824 …mDNSu8 *newptr = PutResourceRecordTTL(&m->omsg, queryptr, &m->omsg.h.numAnswers, &rr->resrec, rr->… in SendQueries()
3828 …rr->resrec.name->c, DNSTypeName(rr->resrec.rrtype), queryptr - m->omsg.data, newptr - m->omsg.data… in SendQueries()
3837 if (m->omsg.h.numQuestions > 1) in SendQueries()
3838 LogMsg("SendQueries: Put %d answers; No more space for known answers", m->omsg.h.numAnswers); in SendQueries()
3839 m->omsg.h.flags.b[0] |= kDNSFlag0_TC; in SendQueries()
3844 for (rr = m->ResourceRecords; rr; rr=rr->next) in SendQueries()
3847 mDNSu8 *newptr = PutResourceRecord(&m->omsg, queryptr, &m->omsg.h.numAuthorities, &rr->resrec); in SendQueries()
3854 if (queryptr > m->omsg.data) in SendQueries()
3856 if ((m->omsg.h.flags.b[0] & kDNSFlag0_TC) && m->omsg.h.numQuestions > 1) in SendQueries()
3857 …LogMsg("SendQueries: Should not have more than one question (%d) in a truncated packet", m->omsg.h… in SendQueries()
3859 m->omsg.h.numQuestions, m->omsg.h.numQuestions == 1 ? "" : "s", in SendQueries()
3860 m->omsg.h.numAnswers, m->omsg.h.numAnswers == 1 ? "" : "s", in SendQueries()
3861 m->omsg.h.numAuthorities, m->omsg.h.numAuthorities == 1 ? "" : "s", intf->InterfaceID); in SendQueries()
3862 …if (intf->IPv4Available) mDNSSendDNSMessage(m, &m->omsg, queryptr, intf->InterfaceID, &AllDNSLinkG… in SendQueries()
3863 …if (intf->IPv6Available) mDNSSendDNSMessage(m, &m->omsg, queryptr, intf->InterfaceID, &AllDNSLinkG… in SendQueries()
3864 …if (!m->SuppressSending) m->SuppressSending = NonZeroTime(m->timenow + (mDNSPlatformOneSecond+9)/1… in SendQueries()
3884 for (ar = m->ResourceRecords; ar; ar=ar->next) in SendQueries()
3888 LogMsg("SendQueries: No active interface to send: %s", ARDisplayString(m, ar)); in SendQueries()
3898 …if (cr->CRActiveQuestion && cr->UnansweredQueries < MaxUnansweredQueries && m->timenow - cr->NextR… in SendQueries()
3902 SetNextCacheCheckTime(m, cr); in SendQueries()
3908 for (q = m->Questions; q; q=q->next) in SendQueries()
3924 mDNSlocal void AnswerQuestionWithResourceRecord(mDNS *const m, DNSQuestion *q, CacheRecord *rr, mDN… in AnswerQuestionWithResourceRecord() argument
3933 rr->LastUsed = m->timenow; in AnswerQuestionWithResourceRecord()
3936 …if (!rr->CRActiveQuestion) m->rrcache_active++; // If not previously active, increment rrcache_act… in AnswerQuestionWithResourceRecord()
3938 SetNextCacheCheckTime(m, rr); in AnswerQuestionWithResourceRecord()
3950 q->LastQTime = m->timenow; in AnswerQuestionWithResourceRecord()
3951 q->LastQTxTime = m->timenow; in AnswerQuestionWithResourceRecord()
3959 m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in AnswerQuestionWithResourceRecord()
3961 q->QuestionCallback(m, q, &rr->resrec, AddRecord); in AnswerQuestionWithResourceRecord()
3962 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in AnswerQuestionWithResourceRecord()
3970 mDNSlocal void CacheRecordDeferredAdd(mDNS *const m, CacheRecord *rr) in CacheRecordDeferredAdd() argument
3973 if (m->CurrentQuestion) LogMsg("CacheRecordDeferredAdd ERROR m->CurrentQuestion already set"); in CacheRecordDeferredAdd()
3974 m->CurrentQuestion = m->Questions; in CacheRecordDeferredAdd()
3975 while (m->CurrentQuestion && m->CurrentQuestion != m->NewQuestions) in CacheRecordDeferredAdd()
3977 DNSQuestion *q = m->CurrentQuestion; in CacheRecordDeferredAdd()
3978 m->CurrentQuestion = q->next; in CacheRecordDeferredAdd()
3980 AnswerQuestionWithResourceRecord(m, q, rr, mDNStrue); in CacheRecordDeferredAdd()
3982 m->CurrentQuestion = mDNSNULL; in CacheRecordDeferredAdd()
3985 mDNSlocal mDNSs32 CheckForSoonToExpireRecords(mDNS *const m, const domainname *const name, const mD… in CheckForSoonToExpireRecords() argument
3987 …const mDNSs32 threshhold = m->timenow + mDNSPlatformOneSecond; // See if there are any records exp… in CheckForSoonToExpireRecords()
3988 const mDNSs32 start = m->timenow - 0x10000000; in CheckForSoonToExpireRecords()
3990 CacheGroup *cg = CacheGroupForName(m, slot, namehash, name); in CheckForSoonToExpireRecords()
4009 mDNSlocal void CacheRecordAdd(mDNS *const m, CacheRecord *rr) in CacheRecordAdd() argument
4011 if (m->CurrentQuestion) LogMsg("CacheRecordAdd ERROR m->CurrentQuestion already set"); in CacheRecordAdd()
4012 m->CurrentQuestion = m->Questions; in CacheRecordAdd()
4013 while (m->CurrentQuestion && m->CurrentQuestion != m->NewQuestions) in CacheRecordAdd()
4015 DNSQuestion *q = m->CurrentQuestion; in CacheRecordAdd()
4016 m->CurrentQuestion = q->next; in CacheRecordAdd()
4025 if (q->LastAnswerPktNum != m->PktNum) in CacheRecordAdd()
4027 q->LastAnswerPktNum = m->PktNum; in CacheRecordAdd()
4029 …q->ThisQInterval > InitialQuestionInterval*32 && m->timenow - q->LastQTxTime < mDNSPlatformOneSeco… in CacheRecordAdd()
4033 …q->LastQTime = m->timenow - InitialQuestionInterval + (mDNSs32)mDNSRandom((mDNSu32)mDNSPlatfo… in CacheRecordAdd()
4035 SetNextQueryTime(m,q); in CacheRecordAdd()
4052 AnswerQuestionWithResourceRecord(m, q, rr, mDNStrue); in CacheRecordAdd()
4056 m->CurrentQuestion = mDNSNULL; in CacheRecordAdd()
4057 SetNextCacheCheckTime(m, rr); in CacheRecordAdd()
4070 mDNSlocal void NoCacheAnswer(mDNS *const m, CacheRecord *rr) in NoCacheAnswer() argument
4072 LogMsg("No cache space: Delivering non-cached result for %##s", m->rec.r.resrec.name->c); in NoCacheAnswer()
4073 if (m->CurrentQuestion) LogMsg("NoCacheAnswer ERROR m->CurrentQuestion already set"); in NoCacheAnswer()
4074 m->CurrentQuestion = m->Questions; in NoCacheAnswer()
4075 while (m->CurrentQuestion) in NoCacheAnswer()
4077 DNSQuestion *q = m->CurrentQuestion; in NoCacheAnswer()
4078 m->CurrentQuestion = q->next; in NoCacheAnswer()
4080 …AnswerQuestionWithResourceRecord(m, q, rr, 2); // Value '2' indicates "don't expect 'remove' event… in NoCacheAnswer()
4083 m->CurrentQuestion = mDNSNULL; in NoCacheAnswer()
4094 mDNSlocal void CacheRecordRmv(mDNS *const m, CacheRecord *rr) in CacheRecordRmv() argument
4096 if (m->CurrentQuestion) LogMsg("CacheRecordRmv ERROR m->CurrentQuestion already set"); in CacheRecordRmv()
4097 m->CurrentQuestion = m->Questions; in CacheRecordRmv()
4098 while (m->CurrentQuestion && m->CurrentQuestion != m->NewQuestions) in CacheRecordRmv()
4100 DNSQuestion *q = m->CurrentQuestion; in CacheRecordRmv()
4101 m->CurrentQuestion = q->next; in CacheRecordRmv()
4104 verbosedebugf("CacheRecordRmv %p %s", rr, CRDisplayString(m, rr)); in CacheRecordRmv()
4118 ReconfirmAntecedents(m, q); in CacheRecordRmv()
4121 AnswerQuestionWithResourceRecord(m, q, rr, mDNSfalse); in CacheRecordRmv()
4125 m->CurrentQuestion = mDNSNULL; in CacheRecordRmv()
4128 mDNSlocal void ReleaseCacheEntity(mDNS *const m, CacheEntity *e) in ReleaseCacheEntity() argument
4134 e->next = m->rrcache_free; in ReleaseCacheEntity()
4135 m->rrcache_free = e; in ReleaseCacheEntity()
4136 m->rrcache_totalused--; in ReleaseCacheEntity()
4139 mDNSlocal void ReleaseCacheGroup(mDNS *const m, CacheGroup **cp) in ReleaseCacheGroup() argument
4150 ReleaseCacheEntity(m, e); in ReleaseCacheGroup()
4153 mDNSlocal void ReleaseCacheRecord(mDNS *const m, CacheRecord *r) in ReleaseCacheRecord() argument
4157 ReleaseCacheEntity(m, (CacheEntity *)r); in ReleaseCacheRecord()
4163 mDNSlocal void CheckCacheExpiration(mDNS *const m, CacheGroup *cg) in CheckCacheExpiration() argument
4167 if (m->lock_rrcache) { LogMsg("CheckCacheExpiration ERROR! Cache already locked!"); return; } in CheckCacheExpiration()
4168 m->lock_rrcache = 1; in CheckCacheExpiration()
4174 if (m->timenow - event >= 0) // If expired, delete it in CheckCacheExpiration()
4177 verbosedebugf("CheckCacheExpiration: Deleting %s", CRDisplayString(m, rr)); in CheckCacheExpiration()
4180 CacheRecordRmv(m, rr); in CheckCacheExpiration()
4181 m->rrcache_active--; in CheckCacheExpiration()
4183 ReleaseCacheRecord(m, rr); in CheckCacheExpiration()
4187 if (rr->DelayDelivery && rr->DelayDelivery - m->timenow > 0) in CheckCacheExpiration()
4191 if (rr->DelayDelivery) CacheRecordDeferredAdd(m, rr); in CheckCacheExpiration()
4194 if (m->timenow - rr->NextRequiredQuery < 0) // If not yet time for next query in CheckCacheExpiration()
4200 m->NextScheduledQuery = m->timenow; in CheckCacheExpiration()
4203 event = m->timenow + 0x3FFFFFFF; in CheckCacheExpiration()
4208 (event-m->timenow) / mDNSPlatformOneSecond, CacheCheckGracePeriod(rr), CRDisplayString(m, rr)); in CheckCacheExpiration()
4209 if (m->NextCacheCheck - (event + CacheCheckGracePeriod(rr)) > 0) in CheckCacheExpiration()
4210 m->NextCacheCheck = (event + CacheCheckGracePeriod(rr)); in CheckCacheExpiration()
4216 m->lock_rrcache = 0; in CheckCacheExpiration()
4219 mDNSlocal void AnswerNewQuestion(mDNS *const m) in AnswerNewQuestion() argument
4223 DNSQuestion *q = m->NewQuestions; // Grab the question we're going to answer in AnswerNewQuestion()
4225 CacheGroup *cg = CacheGroupForName(m, slot, q->qnamehash, &q->qname); in AnswerNewQuestion()
4229 if (cg) CheckCacheExpiration(m, cg); in AnswerNewQuestion()
4230 …m->NewQuestions = q->next; // Advance NewQuestions to the next *after* calling CheckCacheExpira… in AnswerNewQuestion()
4232 if (m->lock_rrcache) LogMsg("AnswerNewQuestion ERROR! Cache already locked!"); in AnswerNewQuestion()
4237 m->lock_rrcache = 1; in AnswerNewQuestion()
4238 if (m->CurrentQuestion) LogMsg("AnswerNewQuestion ERROR m->CurrentQuestion already set"); in AnswerNewQuestion()
4239 …m->CurrentQuestion = q; // Indicate which question we're answering, so we'll know if it gets dele… in AnswerNewQuestion()
4243 if (m->CurrentRecord) LogMsg("AnswerNewLocalOnlyQuestion ERROR m->CurrentRecord already set"); in AnswerNewQuestion()
4244 m->CurrentRecord = m->ResourceRecords; in AnswerNewQuestion()
4245 while (m->CurrentRecord && m->CurrentRecord != m->NewLocalRecords) in AnswerNewQuestion()
4247 AuthRecord *rr = m->CurrentRecord; in AnswerNewQuestion()
4248 m->CurrentRecord = rr->next; in AnswerNewQuestion()
4252 AnswerLocalOnlyQuestionWithResourceRecord(m, q, rr, mDNStrue); in AnswerNewQuestion()
4254 if (m->CurrentQuestion != q) break; // If callback deleted q, then we're finished here in AnswerNewQuestion()
4257 m->CurrentRecord = mDNSNULL; in AnswerNewQuestion()
4264 mDNSu32 SecsSinceRcvd = ((mDNSu32)(m->timenow - rr->TimeRcvd)) / mDNSPlatformOneSecond; in AnswerNewQuestion()
4279 AnswerQuestionWithResourceRecord(m, q, rr, mDNStrue); in AnswerNewQuestion()
4281 if (m->CurrentQuestion != q) break; // If callback deleted q, then we're finished here in AnswerNewQuestion()
4287 if (ShouldQueryImmediately && m->CurrentQuestion == q) in AnswerNewQuestion()
4290 q->LastQTime = m->timenow - q->ThisQInterval; in AnswerNewQuestion()
4291 m->NextScheduledQuery = m->timenow; in AnswerNewQuestion()
4293 m->CurrentQuestion = mDNSNULL; in AnswerNewQuestion()
4294 m->lock_rrcache = 0; in AnswerNewQuestion()
4299 mDNSlocal void AnswerNewLocalOnlyQuestion(mDNS *const m) in AnswerNewLocalOnlyQuestion() argument
4301 DNSQuestion *q = m->NewLocalOnlyQuestions; // Grab the question we're going to answer in AnswerNewLocalOnlyQuestion()
4302 m->NewLocalOnlyQuestions = q->next; // Advance NewQuestions to the next (if any) in AnswerNewLocalOnlyQuestion()
4306 if (m->CurrentQuestion) LogMsg("AnswerNewLocalOnlyQuestion ERROR m->CurrentQuestion already set"); in AnswerNewLocalOnlyQuestion()
4307 …m->CurrentQuestion = q; // Indicate which question we're answering, so we'll know if it gets dele… in AnswerNewLocalOnlyQuestion()
4309 if (m->CurrentRecord) LogMsg("AnswerNewLocalOnlyQuestion ERROR m->CurrentRecord already set"); in AnswerNewLocalOnlyQuestion()
4310 m->CurrentRecord = m->ResourceRecords; in AnswerNewLocalOnlyQuestion()
4311 while (m->CurrentRecord && m->CurrentRecord != m->NewLocalRecords) in AnswerNewLocalOnlyQuestion()
4313 AuthRecord *rr = m->CurrentRecord; in AnswerNewLocalOnlyQuestion()
4314 m->CurrentRecord = rr->next; in AnswerNewLocalOnlyQuestion()
4317 AnswerLocalOnlyQuestionWithResourceRecord(m, q, rr, mDNStrue); in AnswerNewLocalOnlyQuestion()
4319 if (m->CurrentQuestion != q) break; // If callback deleted q, then we're finished here in AnswerNewLocalOnlyQuestion()
4323 m->CurrentQuestion = mDNSNULL; in AnswerNewLocalOnlyQuestion()
4324 m->CurrentRecord = mDNSNULL; in AnswerNewLocalOnlyQuestion()
4327 mDNSlocal CacheEntity *GetCacheEntity(mDNS *const m, const CacheGroup *const PreserveCG) in GetCacheEntity() argument
4331 if (m->lock_rrcache) { LogMsg("GetFreeCacheRR ERROR! Cache already locked!"); return(mDNSNULL); } in GetCacheEntity()
4332 m->lock_rrcache = 1; in GetCacheEntity()
4335 if (!m->rrcache_free && m->MainCallback) in GetCacheEntity()
4337 if (m->rrcache_totalused != m->rrcache_size) in GetCacheEntity()
4339 m->rrcache_totalused, m->rrcache_size); in GetCacheEntity()
4345 if (m->rrcache_size >= 512 && m->rrcache_size / 32 > m->rrcache_active) in GetCacheEntity()
4347 m->rrcache_size, m->rrcache_active); in GetCacheEntity()
4350 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in GetCacheEntity()
4351 m->MainCallback(m, mStatus_GrowCache); in GetCacheEntity()
4352 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in GetCacheEntity()
4358 if (!m->rrcache_free) in GetCacheEntity()
4361 mDNSu32 oldtotalused = m->rrcache_totalused; in GetCacheEntity()
4366 CacheGroup **cp = &m->rrcache_hash[slot]; in GetCacheEntity()
4380 ReleaseCacheRecord(m, rr); in GetCacheEntity()
4387 else ReleaseCacheGroup(m, cp); in GetCacheEntity()
4391 …debugf("Clear unused records; m->rrcache_totalused was %lu; now %lu", oldtotalused, m->rrcache_tot… in GetCacheEntity()
4395 if (m->rrcache_free) // If there are records in the free list, take one in GetCacheEntity()
4397 e = m->rrcache_free; in GetCacheEntity()
4398 m->rrcache_free = e->next; in GetCacheEntity()
4399 if (++m->rrcache_totalused >= m->rrcache_report) in GetCacheEntity()
4401 debugf("RR Cache now using %ld objects", m->rrcache_totalused); in GetCacheEntity()
4402 if (m->rrcache_report < 100) m->rrcache_report += 10; in GetCacheEntity()
4403 else m->rrcache_report += 100; in GetCacheEntity()
4408 m->lock_rrcache = 0; in GetCacheEntity()
4413 mDNSlocal CacheRecord *GetCacheRecord(mDNS *const m, CacheGroup *cg, mDNSu16 RDLength) in GetCacheRecord() argument
4415 CacheRecord *r = (CacheRecord *)GetCacheEntity(m, cg); in GetCacheRecord()
4423 else { ReleaseCacheEntity(m, (CacheEntity*)r); r = mDNSNULL; } in GetCacheRecord()
4429 mDNSlocal CacheGroup *GetCacheGroup(mDNS *const m, const mDNSu32 slot, const ResourceRecord *const … in GetCacheGroup() argument
4432 CacheGroup *cg = (CacheGroup*)GetCacheEntity(m, mDNSNULL); in GetCacheGroup()
4434 cg->next = m->rrcache_hash[slot]; in GetCacheGroup()
4445 ReleaseCacheEntity(m, (CacheEntity*)cg); in GetCacheGroup()
4450 …if (CacheGroupForRecord(m, slot, rr)) LogMsg("GetCacheGroup: Already have CacheGroup for %##s", rr… in GetCacheGroup()
4451 m->rrcache_hash[slot] = cg; in GetCacheGroup()
4452 …if (CacheGroupForRecord(m, slot, rr) != cg) LogMsg("GetCacheGroup: Not finding CacheGroup for %##s… in GetCacheGroup()
4457 mDNSlocal void PurgeCacheResourceRecord(mDNS *const m, CacheRecord *rr) in PurgeCacheResourceRecord() argument
4464 rr->TimeRcvd = m->timenow - mDNSPlatformOneSecond * 60; in PurgeCacheResourceRecord()
4467 SetNextCacheCheckTime(m, rr); in PurgeCacheResourceRecord()
4470 mDNSexport mDNSs32 mDNS_TimeNow(const mDNS *const m) in mDNS_TimeNow() argument
4473 mDNSPlatformLock(m); in mDNS_TimeNow()
4474 if (m->mDNS_busy) in mDNS_TimeNow()
4477 if (!m->timenow) LogMsg("mDNS_TimeNow: m->mDNS_busy is %ld but m->timenow not set", m->mDNS_busy); in mDNS_TimeNow()
4480 if (m->timenow) time = m->timenow; in mDNS_TimeNow()
4481 else time = mDNS_TimeNow_NoLock(m); in mDNS_TimeNow()
4482 mDNSPlatformUnlock(m); in mDNS_TimeNow()
4486 mDNSexport mDNSs32 mDNS_Execute(mDNS *const m) in mDNS_Execute() argument
4488 mDNS_Lock(m); // Must grab lock before trying to read m->timenow in mDNS_Execute()
4490 if (m->timenow - m->NextScheduledEvent >= 0) in mDNS_Execute()
4495 if (m->CurrentQuestion) LogMsg("mDNS_Execute: ERROR! m->CurrentQuestion already set"); in mDNS_Execute()
4498 if (m->SuppressProbes && m->timenow - m->SuppressProbes >= 0) m->SuppressProbes = 0; in mDNS_Execute()
4501 …if (m->NumFailedProbes && m->timenow - m->ProbeFailTime >= mDNSPlatformOneSecond * 10) m->NumFaile… in mDNS_Execute()
4504 if (m->rrcache_size && m->timenow - m->NextCacheCheck >= 0) in mDNS_Execute()
4507 m->NextCacheCheck = m->timenow + 0x3FFFFFFF; in mDNS_Execute()
4510 CacheGroup **cp = &m->rrcache_hash[slot]; in mDNS_Execute()
4513 CheckCacheExpiration(m, *cp); in mDNS_Execute()
4515 else ReleaseCacheGroup(m, cp); in mDNS_Execute()
4518 LogOperation("Cache checked. Next in %ld ticks", m->NextCacheCheck - m->timenow); in mDNS_Execute()
4522 for (i=0; m->NewQuestions && i<1000; i++) in mDNS_Execute()
4524 if (m->NewQuestions->DelayAnswering && m->timenow - m->NewQuestions->DelayAnswering < 0) break; in mDNS_Execute()
4525 AnswerNewQuestion(m); in mDNS_Execute()
4529 for (i=0; m->NewLocalOnlyQuestions && i<1000; i++) AnswerNewLocalOnlyQuestion(m); in mDNS_Execute()
4532 for (i=0; i<1000 && m->NewLocalRecords && LocalRecordReady(m->NewLocalRecords); i++) in mDNS_Execute()
4534 AuthRecord *rr = m->NewLocalRecords; in mDNS_Execute()
4535 m->NewLocalRecords = m->NewLocalRecords->next; in mDNS_Execute()
4536 AnswerLocalQuestions(m, rr, mDNStrue); in mDNS_Execute()
4541 if (m->mDNSPlatformStatus != mStatus_NoError || m->SleepState) DiscardDeregistrations(m); in mDNS_Execute()
4542 else if (m->SuppressSending == 0 || m->timenow - m->SuppressSending >= 0) in mDNS_Execute()
4550 m->SuppressSending = 0; in mDNS_Execute()
4553 …if (m->timenow - m->NextScheduledQuery >= 0 || m->timenow - m->NextScheduledProbe >= 0) SendQuerie… in mDNS_Execute()
4554 if (m->timenow - m->NextScheduledQuery >= 0) in mDNS_Execute()
4557 m->NextScheduledQuery = m->timenow + mDNSPlatformOneSecond; in mDNS_Execute()
4559 if (m->timenow - m->NextScheduledProbe >= 0) in mDNS_Execute()
4562 m->NextScheduledProbe = m->timenow + mDNSPlatformOneSecond; in mDNS_Execute()
4566 if (m->timenow - m->NextScheduledResponse >= 0) SendResponses(m); in mDNS_Execute()
4567 if (m->timenow - m->NextScheduledResponse >= 0) in mDNS_Execute()
4570 m->NextScheduledResponse = m->timenow + mDNSPlatformOneSecond; in mDNS_Execute()
4575 m->RandomQueryDelay = 0; in mDNS_Execute()
4576 m->RandomReconfirmDelay = 0; in mDNS_Execute()
4600 uDNS_Execute(m); in mDNS_Execute()
4602 mDNS_Unlock(m); // Calling mDNS_Unlock is what gives m->NextScheduledEvent its new value in mDNS_Execute()
4603 return(m->NextScheduledEvent); in mDNS_Execute()
4617 mDNSexport void mDNSCoreMachineSleep(mDNS *const m, mDNSBool sleepstate) in mDNSCoreMachineSleep() argument
4621 mDNS_Lock(m); in mDNSCoreMachineSleep()
4623 m->SleepState = sleepstate; in mDNSCoreMachineSleep()
4624 LogOperation("%s at %ld", sleepstate ? "Sleeping" : "Waking", m->timenow); in mDNSCoreMachineSleep()
4629 uDNS_Sleep(m); in mDNSCoreMachineSleep()
4632 for (rr = m->ResourceRecords; rr; rr=rr->next) in mDNSCoreMachineSleep()
4635 SendResponses(m); in mDNSCoreMachineSleep()
4645 uDNS_Wake(m); in mDNSCoreMachineSleep()
4648 for (q = m->Questions; q; q=q->next) // Scan our list of questions in mDNSCoreMachineSleep()
4653 q->LastQTime = m->timenow - q->ThisQInterval; in mDNSCoreMachineSleep()
4655 ExpireDupSuppressInfo(q->DupSuppress, m->timenow); in mDNSCoreMachineSleep()
4656 m->NextScheduledQuery = m->timenow; in mDNSCoreMachineSleep()
4660 m->NextCacheCheck = m->timenow; in mDNSCoreMachineSleep()
4662 mDNS_Reconfirm_internal(m, cr, kDefaultReconfirmTimeForWake); in mDNSCoreMachineSleep()
4665 for (rr = m->ResourceRecords; rr; rr=rr->next) in mDNSCoreMachineSleep()
4671 InitializeLastAPTime(m, rr); in mDNSCoreMachineSleep()
4675 mDNS_Unlock(m); in mDNSCoreMachineSleep()
4785 mDNSlocal mDNSBool MatchDependentOn(const mDNS *const m, const CacheRecord *const pktrr, const Auth… in MatchDependentOn() argument
4788 for (r1 = m->ResourceRecords; r1; r1=r1->next) in MatchDependentOn()
4797 for (r1 = m->DuplicateRecords; r1; r1=r1->next) in MatchDependentOn()
4813 mDNSlocal const AuthRecord *FindRRSet(const mDNS *const m, const CacheRecord *const pktrr) in FindRRSet() argument
4816 for (rr = m->ResourceRecords; rr; rr=rr->next) in FindRRSet()
4836 mDNSlocal mDNSBool PacketRRConflict(const mDNS *const m, const AuthRecord *const our, const CacheRe… in PacketRRConflict() argument
4844 if (our->DependentOn || MatchDependentOn(m, pktrr, our)) return(mDNSfalse); in PacketRRConflict()
4847 if (FindRRSet(m, pktrr) == ourset) return(mDNSfalse); in PacketRRConflict()
4856 mDNSlocal void ResolveSimultaneousProbe(mDNS *const m, const DNSMessage *const query, const mDNSu8 … in ResolveSimultaneousProbe() argument
4865 …ptr = GetLargeResourceRecord(m, query, ptr, end, q->InterfaceID, kDNSRecordTypePacketAuth, &m->rec… in ResolveSimultaneousProbe()
4867 if (ResourceRecordAnswersQuestion(&m->rec.r.resrec, q)) in ResolveSimultaneousProbe()
4870 if (PacketRRConflict(m, our, &m->rec.r)) in ResolveSimultaneousProbe()
4872 int result = (int)our->resrec.rrclass - (int)m->rec.r.resrec.rrclass; in ResolveSimultaneousProbe()
4873 if (!result) result = (int)our->resrec.rrtype - (int)m->rec.r.resrec.rrtype; in ResolveSimultaneousProbe()
4874 if (!result) result = CompareRData(our, &m->rec.r); in ResolveSimultaneousProbe()
4880 mDNS_Deregister_internal(m, our, mDNS_Dereg_conflict); in ResolveSimultaneousProbe()
4885 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in ResolveSimultaneousProbe()
4890 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in ResolveSimultaneousProbe()
4893 mDNSlocal CacheRecord *FindIdenticalRecordInCache(const mDNS *const m, ResourceRecord *pktrr) in FindIdenticalRecordInCache() argument
4896 CacheGroup *cg = CacheGroupForRecord(m, slot, pktrr); in FindIdenticalRecordInCache()
4904 mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, const mDNSu8 *const en… in ProcessQuery() argument
4908 mDNSBool FromLocalSubnet = AddressIsLocalSubnet(m, InterfaceID, srcaddr); in ProcessQuery()
4951 if (m->CurrentRecord) LogMsg("ProcessQuery ERROR m->CurrentRecord already set"); in ProcessQuery()
4952 m->CurrentRecord = m->ResourceRecords; in ProcessQuery()
4953 while (m->CurrentRecord) in ProcessQuery()
4955 rr = m->CurrentRecord; in ProcessQuery()
4956 m->CurrentRecord = rr->next; in ProcessQuery()
4960 ResolveSimultaneousProbe(m, query, end, &pktq, rr); in ProcessQuery()
4976 if (m->timenow - (rr->LastMCTime + mDNSPlatformOneSecond) >= 0 || in ProcessQuery()
4995 CacheGroup *cg = CacheGroupForName(m, slot, pktq.qnamehash, &pktq.qname); in ProcessQuery()
5006 if (rr->MPUnansweredQ == 0 || m->timenow - rr->MPLastUnansweredQT >= mDNSPlatformOneSecond) in ProcessQuery()
5012 rr->MPLastUnansweredQT = m->timenow; in ProcessQuery()
5022 for (q = m->Questions; q; q=q->next) in ProcessQuery()
5023 …if (!q->Target.type && ActiveQuestion(q) && m->timenow - q->LastQTxTime > mDNSPlatformOneSecond / … in ProcessQuery()
5036 for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers in ProcessQuery()
5043 AddAdditionalsToResponseList(m, ResponseRecords, &nrp, InterfaceID); in ProcessQuery()
5053 ptr = GetLargeResourceRecord(m, query, ptr, end, InterfaceID, kDNSRecordTypePacketAns, &m->rec); in ProcessQuery()
5058 if (MustSendRecord(rr) && ShouldSuppressKnownAnswer(&m->rec.r, rr)) in ProcessQuery()
5062 for (rr=m->ResourceRecords; rr; rr=rr->next) in ProcessQuery()
5065 if (rr->ImmedAnswer == InterfaceID && ShouldSuppressKnownAnswer(&m->rec.r, rr)) in ProcessQuery()
5080 … LogMsg("Suppressed after%4d: %s", m->timenow - rr->ImmedAnswerMarkTime, ARDisplayString(m, rr)); in ProcessQuery()
5088 ourcacherr = FindIdenticalRecordInCache(m, &m->rec.r.resrec); in ProcessQuery()
5089 …if (ourcacherr && ourcacherr->MPExpectingKA && m->timenow - ourcacherr->MPLastUnansweredQT < mDNSP… in ProcessQuery()
5102 …if (rr->resrec.InterfaceID == InterfaceID && IdenticalResourceRecord(&m->rec.r.resrec, &rr->resrec… in ProcessQuery()
5114 if (ResourceRecordAnswersQuestion(&m->rec.r.resrec, q)) in ProcessQuery()
5119 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in ProcessQuery()
5140 if (m->timenow - (rr->LastMCTime + TicksTTL(rr)/4) >= 0) in ProcessQuery()
5157 rr->ImmedAnswerMarkTime = m->timenow; in ProcessQuery()
5159 m->NextScheduledResponse = m->timenow; in ProcessQuery()
5200 …if (delayresponse && (!m->SuppressSending || (m->SuppressSending - m->timenow) < (delayresponse + … in ProcessQuery()
5203 mDNSs32 oldss = m->SuppressSending; in ProcessQuery()
5205 …LogMsg("Current SuppressSending delay%5ld; require%5ld", m->SuppressSending - m->timenow, (delayre… in ProcessQuery()
5220 …m->SuppressSending = m->timenow + (delayresponse + (mDNSs32)mDNSRandom((mDNSu32)mDNSPlatformOneSec… in ProcessQuery()
5221 if (m->SuppressSending == 0) m->SuppressSending = 1; in ProcessQuery()
5224 LogMsg("Set SuppressSending to %5ld", m->SuppressSending - m->timenow); in ProcessQuery()
5235 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in ProcessQuery()
5259 if (rr->UnansweredQueries == 0 || m->timenow - rr->LastUnansweredTime >= mDNSPlatformOneSecond) in ProcessQuery()
5262 rr->LastUnansweredTime = m->timenow; in ProcessQuery()
5265 rr->UnansweredQueries, rr->MPUnansweredQ, rr->MPUnansweredKA, CRDisplayString(m, rr)); in ProcessQuery()
5266 SetNextCacheCheckTime(m, rr); in ProcessQuery()
5274 if (RRExpireTime(rr) - m->timenow > 4 * mDNSPlatformOneSecond) in ProcessQuery()
5276 rr->UnansweredQueries, rr->MPUnansweredQ, rr->MPUnansweredKA, CRDisplayString(m, rr)); in ProcessQuery()
5277 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForNoAnswer); in ProcessQuery()
5290 mDNSu32 remain = (mDNSu32)(RRExpireTime(rr) - m->timenow) / 4; in ProcessQuery()
5295 if (RRExpireTime(rr) - m->timenow > 4 * mDNSPlatformOneSecond) in ProcessQuery()
5297 rr->UnansweredQueries, rr->MPUnansweredQ, rr->MPUnansweredKA, CRDisplayString(m, rr)); in ProcessQuery()
5307 mDNS_Reconfirm_internal(m, rr, remain); in ProcessQuery()
5317 i = RecordDupSuppressInfo(q->DupSuppress, m->timenow, InterfaceID, srcaddr->type); in ProcessQuery()
5325 mDNSlocal void mDNSCoreReceiveQuery(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const… in mDNSCoreReceiveQuery() argument
5330 …mDNSBool QueryWasLocalUnicast = !mDNSAddrIsDNSMulticast(dstaddr) && AddressIsLocalSubnet(m, Inte… in mDNSCoreReceiveQuery()
5352 responseend = ProcessQuery(m, msg, end, srcaddr, InterfaceID, in mDNSCoreReceiveQuery()
5353 …= MulticastDNSPort.NotAnInteger), mDNSAddrIsDNSMulticast(dstaddr), QueryWasLocalUnicast, &m->omsg); in mDNSCoreReceiveQuery()
5358 m->omsg.h.numQuestions, m->omsg.h.numQuestions == 1 ? "" : "s", in mDNSCoreReceiveQuery()
5359 m->omsg.h.numAnswers, m->omsg.h.numAnswers == 1 ? "" : "s", in mDNSCoreReceiveQuery()
5360 m->omsg.h.numAdditionals, m->omsg.h.numAdditionals == 1 ? "" : "s", in mDNSCoreReceiveQuery()
5362 mDNSSendDNSMessage(m, &m->omsg, responseend, InterfaceID, srcaddr, srcport, -1, mDNSNULL); in mDNSCoreReceiveQuery()
5369 mDNSlocal void mDNSCoreReceiveResponse(mDNS *const m, in mDNSCoreReceiveResponse() argument
5405 …if (!AddressIsLocalSubnet(m, InterfaceID, srcaddr) || (mDNSu32)(m->timenow - m->ExpectUnicastRespo… in mDNSCoreReceiveResponse()
5416 ptr = GetLargeResourceRecord(m, response, ptr, end, InterfaceID, RecordType, &m->rec); in mDNSCoreReceiveResponse()
5420 if (m->CurrentRecord) LogMsg("mDNSCoreReceiveResponse ERROR m->CurrentRecord already set"); in mDNSCoreReceiveResponse()
5421 m->CurrentRecord = m->ResourceRecords; in mDNSCoreReceiveResponse()
5422 while (m->CurrentRecord) in mDNSCoreReceiveResponse()
5424 AuthRecord *rr = m->CurrentRecord; in mDNSCoreReceiveResponse()
5425 m->CurrentRecord = rr->next; in mDNSCoreReceiveResponse()
5426 …if (PacketRRMatchesSignature(&m->rec.r, rr)) // If interface, name, type (if shared record) and c… in mDNSCoreReceiveResponse()
5429 if (m->rec.r.resrec.rrtype == rr->resrec.rrtype && SameRData(&m->rec.r.resrec, &rr->resrec)) in mDNSCoreReceiveResponse()
5432 if (m->rec.r.resrec.rroriginalttl >= rr->resrec.rroriginalttl/2 || m->SleepState) in mDNSCoreReceiveResponse()
5439 …Answer == mDNSNULL) { rr->ImmedAnswer = InterfaceID; m->NextScheduledResponse = m->timeno… in mDNSCoreReceiveResponse()
5440 …Answer != InterfaceID) { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timeno… in mDNSCoreReceiveResponse()
5444 else if (m->rec.r.resrec.rroriginalttl > 0 && PacketRRConflict(m, rr, &m->rec.r)) in mDNSCoreReceiveResponse()
5446 …mDNSCoreReceiveResponse: Our Record: %08lX %s", rr-> resrec.rdatahash, ARDisplayString(m, rr)); in mDNSCoreReceiveResponse()
5447 …gf("mDNSCoreReceiveResponse: Pkt Record: %08lX %s", m->rec.r.resrec.rdatahash, CRDisplayString(m, … in mDNSCoreReceiveResponse()
5463 InitializeLastAPTime(m, rr); in mDNSCoreReceiveResponse()
5464 …RecordProbeFailure(m, rr); // Repeated late conflicts also cause us to back off to the slower prob… in mDNSCoreReceiveResponse()
5470 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict); in mDNSCoreReceiveResponse()
5480 mDNS_Deregister_internal(m, rr, mDNS_Dereg_conflict); in mDNSCoreReceiveResponse()
5491 else if (m->rec.r.resrec.rrtype == rr->resrec.rrtype) in mDNSCoreReceiveResponse()
5492 …if ((m->rec.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) && m->timenow - rr->LastMCTime >… in mDNSCoreReceiveResponse()
5493 { rr->ImmedAnswer = mDNSInterfaceMark; m->NextScheduledResponse = m->timenow; } in mDNSCoreReceiveResponse()
5498 if (m->rrcache_size) // Only try to cache answers if we have a cache to put them in in mDNSCoreReceiveResponse()
5500 const mDNSu32 slot = HashSlot(m->rec.r.resrec.name); in mDNSCoreReceiveResponse()
5501 CacheGroup *cg = CacheGroupForRecord(m, slot, &m->rec.r.resrec); in mDNSCoreReceiveResponse()
5507 …if (rr->resrec.InterfaceID == InterfaceID && IdenticalResourceRecord(&m->rec.r.resrec, &rr->resrec… in mDNSCoreReceiveResponse()
5509 if (m->rec.r.resrec.rdlength > InlineCacheRDSize) in mDNSCoreReceiveResponse()
5511 m->rec.r.resrec.rdlength, InterfaceID, CRDisplayString(m, &m->rec.r)); in mDNSCoreReceiveResponse()
5512 rr->TimeRcvd = m->timenow; in mDNSCoreReceiveResponse()
5514 if (m->rec.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) in mDNSCoreReceiveResponse()
5524 …for (q = m->Questions; q; q=q->next) if (ResourceRecordAnswersQuestion(&rr->resrec, q)) q->UniqueA… in mDNSCoreReceiveResponse()
5525 rr->resrec.RecordType = m->rec.r.resrec.RecordType; in mDNSCoreReceiveResponse()
5529 …if (!mDNSPlatformMemSame(m->rec.r.resrec.rdata->u.data, rr->resrec.rdata->u.data, m->rec.r.resrec.… in mDNSCoreReceiveResponse()
5536 SetNextCacheCheckTime(m, rr); in mDNSCoreReceiveResponse()
5539 else if (m->rec.r.resrec.rroriginalttl > 0) in mDNSCoreReceiveResponse()
5541 rr->resrec.rroriginalttl = m->rec.r.resrec.rroriginalttl; in mDNSCoreReceiveResponse()
5546 SetNextCacheCheckTime(m, rr); in mDNSCoreReceiveResponse()
5558 SetNextCacheCheckTime(m, rr); in mDNSCoreReceiveResponse()
5566 if (!rr && m->rec.r.resrec.rroriginalttl > 0) in mDNSCoreReceiveResponse()
5569 if (!cg) cg = GetCacheGroup(m, slot, &m->rec.r.resrec); in mDNSCoreReceiveResponse()
5570 …if (cg) rr = GetCacheRecord(m, cg, m->rec.r.resrec.rdlength); // Make a cache record, being carefu… in mDNSCoreReceiveResponse()
5571 if (!rr) NoCacheAnswer(m, &m->rec.r); in mDNSCoreReceiveResponse()
5575 *rr = m->rec.r; // Block copy the CacheRecord object in mDNSCoreReceiveResponse()
5581 …if (rr->resrec.rdata != (RData*)&rr->rdatastorage && !(m->rec.r.resrec.rdlength > InlineCacheRDSiz… in mDNSCoreReceiveResponse()
5582 …LogMsg("rr->resrec.rdata != &rr->rdatastorage but length <= InlineCacheRDSize %##s", m->rec.r.resr… in mDNSCoreReceiveResponse()
5583 if (m->rec.r.resrec.rdlength > InlineCacheRDSize) in mDNSCoreReceiveResponse()
5584 …mDNSPlatformMemCopy(m->rec.r.resrec.rdata, rr->resrec.rdata, sizeofRDataHeader + m->rec.r.resrec.r… in mDNSCoreReceiveResponse()
5589 … rr->DelayDelivery = m->timenow + mDNSPlatformOneSecond; // to delay delivery of this 'add' event in mDNSCoreReceiveResponse()
5591 … rr->DelayDelivery = CheckForSoonToExpireRecords(m, rr->resrec.name, rr->resrec.namehash, slot); in mDNSCoreReceiveResponse()
5592 CacheRecordAdd(m, rr); // CacheRecordAdd calls SetNextCacheCheckTime(m, rr); for us in mDNSCoreReceiveResponse()
5596 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in mDNSCoreReceiveResponse()
5600 m->rec.r.resrec.RecordType = 0; // Clear RecordType to show we're not still using it in mDNSCoreReceiveResponse()
5608 CacheGroup *cg = CacheGroupForRecord(m, slot, &r1->resrec); in mDNSCoreReceiveResponse()
5617 if (r2->resrec.rroriginalttl > 1 && m->timenow - r2->TimeRcvd < mDNSPlatformOneSecond) in mDNSCoreReceiveResponse()
5621 r2->resrec.rroriginalttl, r1->resrec.rroriginalttl, CRDisplayString(m, r2)); in mDNSCoreReceiveResponse()
5623 r2->TimeRcvd = m->timenow; in mDNSCoreReceiveResponse()
5627 verbosedebugf("Cache flush %p X %p %s", r1, r2, CRDisplayString(m, r2)); in mDNSCoreReceiveResponse()
5640 r2->TimeRcvd = m->timenow; in mDNSCoreReceiveResponse()
5643 SetNextCacheCheckTime(m, r2); in mDNSCoreReceiveResponse()
5648 r1->DelayDelivery = CheckForSoonToExpireRecords(m, r1->resrec.name, r1->resrec.namehash, slot); in mDNSCoreReceiveResponse()
5649 if (!r1->DelayDelivery) CacheRecordDeferredAdd(m, r1); in mDNSCoreReceiveResponse()
5654 mDNSexport void mDNSCoreReceive(mDNS *const m, void *const pkt, const mDNSu8 *const end, in mDNSCoreReceive() argument
5668 mDNS_Lock(m); in mDNSCoreReceive()
5669 uDNS_ReceiveNATMap(m, pkt, (mDNSu16)(end - (mDNSu8 *)pkt)); in mDNSCoreReceive()
5670 mDNS_Unlock(m); in mDNSCoreReceive()
5683 if (!m) { LogMsg("mDNSCoreReceive ERROR m is NULL"); return; } in mDNSCoreReceive()
5689 mDNS_Lock(m); in mDNSCoreReceive()
5690 m->PktNum++; in mDNSCoreReceive()
5693 uDNS_ReceiveMsg(m, msg, end, srcaddr, srcport, dstaddr, dstport, InterfaceID); in mDNSCoreReceive()
5696 …if (QR_OP == StdQ) mDNSCoreReceiveQuery (m, msg, end, srcaddr, srcport, dstaddr, dstport, I… in mDNSCoreReceive()
5697 …else if (QR_OP == StdR) mDNSCoreReceiveResponse(m, msg, end, srcaddr, srcport, dstaddr, dstport, I… in mDNSCoreReceive()
5707 mDNS_Unlock(m); in mDNSCoreReceive()
5719 mDNSlocal DNSQuestion *FindDuplicateQuestion(const mDNS *const m, const DNSQuestion *const question) in FindDuplicateQuestion() argument
5726 for (q = m->Questions; q && q != question; q=q->next) // Scan our list of questions in FindDuplicateQuestion()
5739 mDNSlocal void UpdateQuestionDuplicates(mDNS *const m, const DNSQuestion *const question) in UpdateQuestionDuplicates() argument
5742 for (q = m->Questions; q; q=q->next) // Scan our list of questions in UpdateQuestionDuplicates()
5749 q->DuplicateOf = FindDuplicateQuestion(m, q); in UpdateQuestionDuplicates()
5751 SetNextQueryTime(m,q); in UpdateQuestionDuplicates()
5758 mDNSlocal mStatus mDNS_StartQuery_internal(mDNS *const m, DNSQuestion *const question) in mDNS_StartQuery_internal() argument
5778 else return uDNS_StartQuery(m, question); in mDNS_StartQuery_internal()
5785 if (m->rrcache_size == 0) // Can't do queries if we have no cache space allocated in mDNS_StartQuery_internal()
5791 DNSQuestion **q = &m->Questions; in mDNS_StartQuery_internal()
5792 if (question->InterfaceID == mDNSInterface_LocalOnly) q = &m->LocalOnlyQuestions; in mDNS_StartQuery_internal()
5806 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_StartQuery_internal()
5823 …if (!m->RandomQueryDelay) m->RandomQueryDelay = 1 + (mDNSs32)mDNSRandom((mDNSu32)InitialQuestionIn… in mDNS_StartQuery_internal()
5827 …question->DelayAnswering = CheckForSoonToExpireRecords(m, &question->qname, question->qnamehash… in mDNS_StartQuery_internal()
5830 …question->LastQTime = m->timenow - m->RandomQueryDelay; // Avoid inter-machine synchroniz… in mDNS_StartQuery_internal()
5831 question->LastAnswerPktNum = m->PktNum; in mDNS_StartQuery_internal()
5837 question->DuplicateOf = FindDuplicateQuestion(m, question); in mDNS_StartQuery_internal()
5844 question->LastQTxTime = m->timenow; in mDNS_StartQuery_internal()
5849 question->LastQTime + question->ThisQInterval - m->timenow, question); in mDNS_StartQuery_internal()
5853 question->LastQTime + question->ThisQInterval - m->timenow, question, question->DuplicateOf); in mDNS_StartQuery_internal()
5858 if (!m->NewLocalOnlyQuestions) m->NewLocalOnlyQuestions = question; in mDNS_StartQuery_internal()
5862 if (!m->NewQuestions) m->NewQuestions = question; in mDNS_StartQuery_internal()
5863 SetNextQueryTime(m,question); in mDNS_StartQuery_internal()
5870 mDNSlocal mStatus mDNS_StopQuery_internal(mDNS *const m, DNSQuestion *const question) in mDNS_StopQuery_internal() argument
5873 CacheGroup *cg = CacheGroupForName(m, slot, question->qnamehash, &question->qname); in mDNS_StopQuery_internal()
5875 DNSQuestion **q = &m->Questions; in mDNS_StopQuery_internal()
5877 if (uDNS_IsActiveQuery(question, &m->uDNS_info)) return uDNS_StopQuery(m, question); in mDNS_StopQuery_internal()
5879 if (question->InterfaceID == mDNSInterface_LocalOnly) q = &m->LocalOnlyQuestions; in mDNS_StopQuery_internal()
5891 UpdateQuestionDuplicates(m, question); in mDNS_StopQuery_internal()
5902 for (q = m->Questions; q; q=q->next) // Scan our list of questions in mDNS_StopQuery_internal()
5908 if (!q) m->rrcache_active--; // If no longer active, decrement rrcache_active count in mDNS_StopQuery_internal()
5914 if (m->CurrentQuestion == question) in mDNS_StopQuery_internal()
5918 m->CurrentQuestion = question->next; in mDNS_StopQuery_internal()
5921 if (m->NewQuestions == question) in mDNS_StopQuery_internal()
5925 m->NewQuestions = question->next; in mDNS_StopQuery_internal()
5928 if (m->NewLocalOnlyQuestions == question) m->NewLocalOnlyQuestions = question->next; in mDNS_StopQuery_internal()
5935 mDNSexport mStatus mDNS_StartQuery(mDNS *const m, DNSQuestion *const question) in mDNS_StartQuery() argument
5938 mDNS_Lock(m); in mDNS_StartQuery()
5939 status = mDNS_StartQuery_internal(m, question); in mDNS_StartQuery()
5940 mDNS_Unlock(m); in mDNS_StartQuery()
5944 mDNSexport mStatus mDNS_StopQuery(mDNS *const m, DNSQuestion *const question) in mDNS_StopQuery() argument
5947 mDNS_Lock(m); in mDNS_StopQuery()
5948 status = mDNS_StopQuery_internal(m, question); in mDNS_StopQuery()
5949 mDNS_Unlock(m); in mDNS_StopQuery()
5953 mDNSexport mStatus mDNS_Reconfirm(mDNS *const m, CacheRecord *const rr) in mDNS_Reconfirm() argument
5956 mDNS_Lock(m); in mDNS_Reconfirm()
5957 status = mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForNoAnswer); in mDNS_Reconfirm()
5958 mDNS_Unlock(m); in mDNS_Reconfirm()
5962 mDNSexport mStatus mDNS_ReconfirmByValue(mDNS *const m, ResourceRecord *const rr) in mDNS_ReconfirmByValue() argument
5966 mDNS_Lock(m); in mDNS_ReconfirmByValue()
5967 cr = FindIdenticalRecordInCache(m, rr); in mDNS_ReconfirmByValue()
5968 if (cr) status = mDNS_Reconfirm_internal(m, cr, kDefaultReconfirmTimeForNoAnswer); in mDNS_ReconfirmByValue()
5969 mDNS_Unlock(m); in mDNS_ReconfirmByValue()
5973 mDNSexport mStatus mDNS_StartBrowse(mDNS *const m, DNSQuestion *const question, in mDNS_StartBrowse() argument
5993 return(mDNS_StartQuery(m, question)); in mDNS_StartBrowse()
5999 mDNS_Lock(m); in mDNS_StartBrowse()
6001 status = uDNS_StartQuery(m, question); in mDNS_StartBrowse()
6002 mDNS_Unlock(m); in mDNS_StartBrowse()
6006 return(mDNS_StartQuery(m, question)); in mDNS_StartBrowse()
6010 mDNSlocal mDNSBool MachineHasActiveIPv6(mDNS *const m) in MachineHasActiveIPv6() argument
6013 for (intf = m->HostInterfaces; intf; intf = intf->next) in MachineHasActiveIPv6()
6018 mDNSlocal void FoundServiceInfoSRV(mDNS *const m, DNSQuestion *question, const ResourceRecord *cons… in FoundServiceInfoSRV() argument
6035 mDNS_StartQuery(m, &query->qAv4); in FoundServiceInfoSRV()
6037 if (MachineHasActiveIPv6(m)) mDNS_StartQuery(m, &query->qAv6); in FoundServiceInfoSRV()
6043 mDNS_StopQuery(m, &query->qAv4); in FoundServiceInfoSRV()
6044 if (query->qAv6.ThisQInterval >= 0) mDNS_StopQuery(m, &query->qAv6); in FoundServiceInfoSRV()
6063 mDNS_StartQuery(m, &query->qAv4); in FoundServiceInfoSRV()
6065 if (MachineHasActiveIPv6(m)) mDNS_StartQuery(m, &query->qAv6); in FoundServiceInfoSRV()
6073 query->ServiceInfoQueryCallback(m, query); in FoundServiceInfoSRV()
6079 mDNSlocal void FoundServiceInfoTXT(mDNS *const m, DNSQuestion *question, const ResourceRecord *cons… in FoundServiceInfoTXT() argument
6100 query->ServiceInfoQueryCallback(m, query); in FoundServiceInfoTXT()
6104 mDNSlocal void FoundServiceInfo(mDNS *const m, DNSQuestion *question, const ResourceRecord *const a… in FoundServiceInfo() argument
6140 query->ServiceInfoQueryCallback(m, query); in FoundServiceInfo()
6148 mDNSexport mStatus mDNS_StartResolveService(mDNS *const m, in mDNS_StartResolveService() argument
6152 mDNS_Lock(m); in mDNS_StartResolveService()
6218 status = mDNS_StartQuery_internal(m, &query->qSRV); in mDNS_StartResolveService()
6219 if (status == mStatus_NoError) status = mDNS_StartQuery_internal(m, &query->qTXT); in mDNS_StartResolveService()
6220 if (status != mStatus_NoError) mDNS_StopResolveService(m, query); in mDNS_StartResolveService()
6222 mDNS_Unlock(m); in mDNS_StartResolveService()
6226 mDNSexport void mDNS_StopResolveService (mDNS *const m, ServiceInfoQuery *q) in mDNS_StopResolveService() argument
6228 mDNS_Lock(m); in mDNS_StopResolveService()
6230 …SRV.ThisQInterval >= 0 || uDNS_IsActiveQuery(&q->qSRV, &m->uDNS_info)) mDNS_StopQuery_internal(m, … in mDNS_StopResolveService()
6231 …TXT.ThisQInterval >= 0 || uDNS_IsActiveQuery(&q->qTXT, &m->uDNS_info)) mDNS_StopQuery_internal(m, … in mDNS_StopResolveService()
6232 …Av4.ThisQInterval >= 0 || uDNS_IsActiveQuery(&q->qAv4, &m->uDNS_info)) mDNS_StopQuery_internal(m, … in mDNS_StopResolveService()
6233 …Av6.ThisQInterval >= 0 || uDNS_IsActiveQuery(&q->qAv6, &m->uDNS_info)) mDNS_StopQuery_internal(m, … in mDNS_StopResolveService()
6234 mDNS_Unlock(m); in mDNS_StopResolveService()
6237 mDNSexport mStatus mDNS_GetDomains(mDNS *const m, DNSQuestion *const question, mDNS_DomainType Doma… in mDNS_GetDomains() argument
6253 return(mDNS_StartQuery(m, question)); in mDNS_GetDomains()
6262 mDNSexport mStatus mDNS_Register(mDNS *const m, AuthRecord *const rr) in mDNS_Register() argument
6265 mDNS_Lock(m); in mDNS_Register()
6266 status = mDNS_Register_internal(m, rr); in mDNS_Register()
6267 mDNS_Unlock(m); in mDNS_Register()
6271 mDNSexport mStatus mDNS_Update(mDNS *const m, AuthRecord *const rr, mDNSu32 newttl, in mDNS_Update() argument
6282 …e record with invalid rdata: %s", GetRRDisplayString_rdb(&rr->resrec, &newrdata->u, m->MsgBuffer)); in mDNS_Update()
6286 mDNS_Lock(m); in mDNS_Update()
6298 rr->UpdateCallback(m, rr, n); // ...and let the client free this memory, if necessary in mDNS_Update()
6305 if (unicast) { mStatus status = uDNS_UpdateRecord(m, rr); mDNS_Unlock(m); return(status); } in mDNS_Update()
6309 CompleteRDataUpdate(m, rr); in mDNS_Update()
6323 InitializeLastAPTime(m, rr); in mDNS_Update()
6324 while (rr->NextUpdateCredit && m->timenow - rr->NextUpdateCredit >= 0) GrantUpdateCredit(rr); in mDNS_Update()
6326 …if (!rr->NextUpdateCredit) rr->NextUpdateCredit = NonZeroTime(m->timenow + kUpdateCreditRefreshInt… in mDNS_Update()
6331 …if (!rr->UpdateBlocked) rr->UpdateBlocked = NonZeroTime(m->timenow + (mDNSs32)delay * mDNSPlatform… in mDNS_Update()
6340 mDNS_Unlock(m); in mDNS_Update()
6347 mDNSexport mStatus mDNS_Deregister(mDNS *const m, AuthRecord *const rr) in mDNS_Deregister() argument
6350 mDNS_Lock(m); in mDNS_Deregister()
6351 status = mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); in mDNS_Deregister()
6352 mDNS_Unlock(m); in mDNS_Deregister()
6356 mDNSexport void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result);
6358 mDNSlocal NetworkInterfaceInfo *FindFirstAdvertisedInterface(mDNS *const m) in FindFirstAdvertisedInterface() argument
6361 for (intf = m->HostInterfaces; intf; intf = intf->next) in FindFirstAdvertisedInterface()
6366 mDNSlocal void AdvertiseInterface(mDNS *const m, NetworkInterfaceInfo *set) in AdvertiseInterface() argument
6369 NetworkInterfaceInfo *primary = FindFirstAdvertisedInterface(m); in AdvertiseInterface()
6384 AssignDomainName(set->RR_A.resrec.name, &m->MulticastHostname); in AdvertiseInterface()
6415 mDNS_Register_internal(m, &set->RR_A); in AdvertiseInterface()
6416 mDNS_Register_internal(m, &set->RR_PTR); in AdvertiseInterface()
6418 …if (m->HIHardware.c[0] > 0 && m->HISoftware.c[0] > 0 && m->HIHardware.c[0] + m->HISoftware.c[0] <=… in AdvertiseInterface()
6421 AssignDomainName(set->RR_HINFO.resrec.name, &m->MulticastHostname); in AdvertiseInterface()
6423 mDNSPlatformMemCopy(&m->HIHardware, p, 1 + (mDNSu32)m->HIHardware.c[0]); in AdvertiseInterface()
6425 mDNSPlatformMemCopy(&m->HISoftware, p, 1 + (mDNSu32)m->HISoftware.c[0]); in AdvertiseInterface()
6426 mDNS_Register_internal(m, &set->RR_HINFO); in AdvertiseInterface()
6435 mDNSlocal void DeadvertiseInterface(mDNS *const m, NetworkInterfaceInfo *set) in DeadvertiseInterface() argument
6440 NetworkInterfaceInfo *primary = FindFirstAdvertisedInterface(m); in DeadvertiseInterface()
6442 for (intf = m->HostInterfaces; intf; intf = intf->next) in DeadvertiseInterface()
6451 …if (set->RR_A. resrec.RecordType) mDNS_Deregister_internal(m, &set->RR_A, mDNS_Dereg_normal… in DeadvertiseInterface()
6452 …if (set->RR_PTR. resrec.RecordType) mDNS_Deregister_internal(m, &set->RR_PTR, mDNS_Dereg_normal… in DeadvertiseInterface()
6453 …if (set->RR_HINFO.resrec.RecordType) mDNS_Deregister_internal(m, &set->RR_HINFO, mDNS_Dereg_normal… in DeadvertiseInterface()
6456 mDNSexport void mDNS_SetFQDN(mDNS *const m) in mDNS_SetFQDN() argument
6463 …if (!AppendDomainLabel(&newmname, &m->hostlabel)) { LogMsg("ERROR: mDNS_SetFQDN: Cannot create Mu… in mDNS_SetFQDN()
6465 …if (SameDomainName(&m->MulticastHostname, &newmname)) { LogMsg("mDNS_SetFQDN - hostname unchanged"… in mDNS_SetFQDN()
6467 mDNS_Lock(m); in mDNS_SetFQDN()
6468 AssignDomainName(&m->MulticastHostname, &newmname); in mDNS_SetFQDN()
6471 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_SetFQDN()
6472 if (intf->Advertise) DeadvertiseInterface(m, intf); in mDNS_SetFQDN()
6475 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_SetFQDN()
6476 if (intf->Advertise) AdvertiseInterface(m, intf); in mDNS_SetFQDN()
6480 for (rr = m->ResourceRecords; rr; rr=rr->next) if (rr->HostTarget) SetTargetToHostName(m, rr); in mDNS_SetFQDN()
6481 for (rr = m->DuplicateRecords; rr; rr=rr->next) if (rr->HostTarget) SetTargetToHostName(m, rr); in mDNS_SetFQDN()
6483 mDNS_Unlock(m); in mDNS_SetFQDN()
6486 mDNSexport void mDNS_HostNameCallback(mDNS *const m, AuthRecord *const rr, mStatus result) in mDNS_HostNameCallback() argument
6502 if (m->MainCallback) in mDNS_HostNameCallback()
6504 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in mDNS_HostNameCallback()
6505 m->MainCallback(m, result); in mDNS_HostNameCallback()
6506 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in mDNS_HostNameCallback()
6511 domainlabel oldlabel = m->hostlabel; in mDNS_HostNameCallback()
6514 if (m->MainCallback) in mDNS_HostNameCallback()
6516 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in mDNS_HostNameCallback()
6517 m->MainCallback(m, mStatus_NameConflict); in mDNS_HostNameCallback()
6518 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in mDNS_HostNameCallback()
6522 if (SameDomainLabel(m->hostlabel.c, oldlabel.c)) in mDNS_HostNameCallback()
6523 IncrementLabelSuffix(&m->hostlabel, mDNSfalse); in mDNS_HostNameCallback()
6527 mDNS_SetFQDN(m); in mDNS_HostNameCallback()
6528 …LogMsg("Local Hostname %#s.local already in use; will try %#s.local instead", oldlabel.c, m->hostl… in mDNS_HostNameCallback()
6540 mDNSlocal void UpdateInterfaceProtocols(mDNS *const m, NetworkInterfaceInfo *active) in UpdateInterfaceProtocols() argument
6545 for (intf = m->HostInterfaces; intf; intf = intf->next) in UpdateInterfaceProtocols()
6553 mDNSexport mStatus mDNS_RegisterInterface(mDNS *const m, NetworkInterfaceInfo *set, mDNSBool flappi… in mDNS_RegisterInterface() argument
6556 NetworkInterfaceInfo **p = &m->HostInterfaces; in mDNS_RegisterInterface()
6564 mDNS_Lock(m); in mDNS_RegisterInterface()
6577 mDNS_Unlock(m); in mDNS_RegisterInterface()
6597 AdvertiseInterface(m, set); in mDNS_RegisterInterface()
6608 …if (set->McastTxRx && ((m->KnownBugs & mDNS_KnownBug_PhantomInterfaces) || FirstOfType || set->Int… in mDNS_RegisterInterface()
6620 …if (!m->SuppressSending) m->SuppressSending = m->timenow + (mDNSs32)mDNSRandom((mDNSu32)InitialQue… in mDNS_RegisterInterface()
6625 if (!m->SuppressProbes || in mDNS_RegisterInterface()
6626 m->SuppressProbes - (m->timenow + delay) < 0) in mDNS_RegisterInterface()
6627 m->SuppressProbes = (m->timenow + delay); in mDNS_RegisterInterface()
6630 for (q = m->Questions; q; q=q->next) // Scan our list of questions in mDNS_RegisterInterface()
6643 if (q->LastQTime - (m->timenow - q->ThisQInterval + qdelay) > 0) in mDNS_RegisterInterface()
6644 q->LastQTime = (m->timenow - q->ThisQInterval + qdelay); in mDNS_RegisterInterface()
6646 SetNextQueryTime(m,q); in mDNS_RegisterInterface()
6651 for (rr = m->ResourceRecords; rr; rr=rr->next) in mDNS_RegisterInterface()
6658 InitializeLastAPTime(m, rr); in mDNS_RegisterInterface()
6662 mDNS_Unlock(m); in mDNS_RegisterInterface()
6669 mDNSexport void mDNS_DeregisterInterface(mDNS *const m, NetworkInterfaceInfo *set, mDNSBool flappin… in mDNS_DeregisterInterface() argument
6671 NetworkInterfaceInfo **p = &m->HostInterfaces; in mDNS_DeregisterInterface()
6677 if (m->KnownBugs & mDNS_KnownBug_PhantomInterfaces) revalidate = mDNStrue; in mDNS_DeregisterInterface()
6679 mDNS_Lock(m); in mDNS_DeregisterInterface()
6683 …bugf("mDNS_DeregisterInterface: NetworkInterfaceInfo not found in list"); mDNS_Unlock(m); return; } in mDNS_DeregisterInterface()
6693 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_DeregisterInterface()
6695 UpdateInterfaceProtocols(m, intf); in mDNS_DeregisterInterface()
6700 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_DeregisterInterface()
6708 UpdateInterfaceProtocols(m, intf); in mDNS_DeregisterInterface()
6712 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_DeregisterInterface()
6732 for (q = m->Questions; q; q=q->next) in mDNS_DeregisterInterface()
6746 if (!flapping) PurgeCacheResourceRecord(m, rr); in mDNS_DeregisterInterface()
6747 else mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface); in mDNS_DeregisterInterface()
6753 if (set->Advertise) DeadvertiseInterface(m, set); in mDNS_DeregisterInterface()
6759 if (revalidate && !m->mDNS_shutdown) in mDNS_DeregisterInterface()
6764 m->NextCacheCheck = m->timenow; in mDNS_DeregisterInterface()
6767 mDNS_Reconfirm_internal(m, rr, kDefaultReconfirmTimeForFlappingInterface); in mDNS_DeregisterInterface()
6770 mDNS_Unlock(m); in mDNS_DeregisterInterface()
6773 mDNSlocal void ServiceCallback(mDNS *const m, AuthRecord *const rr, mStatus result) in ServiceCallback() argument
6776 (void)m; // Unused parameter in ServiceCallback()
6795 mDNS_DeregisterService(m, sr); // Unlink the records from our list in ServiceCallback()
6815 sr->ServiceCallback(m, sr, result); in ServiceCallback()
6818 mDNSlocal void NSSCallback(mDNS *const m, AuthRecord *const rr, mStatus result) in NSSCallback() argument
6822 sr->ServiceCallback(m, sr, result); in NSSCallback()
6833 mDNSexport mStatus mDNS_RegisterService(mDNS *const m, ServiceRecordSet *sr, in mDNS_RegisterService() argument
6853 …return(mDNS_RegisterNoSuchService(m, &sr->RR_SRV, name, type, domain, mDNSNULL, mDNSInterface_Any,… in mDNS_RegisterService()
6926 mDNS_Lock(m); in mDNS_RegisterService()
6932 status = uDNS_RegisterService(m, sr); in mDNS_RegisterService()
6933 mDNS_Unlock(m); in mDNS_RegisterService()
6937 mDNS_Lock(m); in mDNS_RegisterService()
6938 err = mDNS_Register_internal(m, &sr->RR_SRV); in mDNS_RegisterService()
6939 if (!err) err = mDNS_Register_internal(m, &sr->RR_TXT); in mDNS_RegisterService()
6945 if (!err) err = mDNS_Register_internal(m, &sr->RR_ADV); in mDNS_RegisterService()
6946 for (i=0; i<NumSubTypes; i++) if (!err) err = mDNS_Register_internal(m, &sr->SubTypes[i]); in mDNS_RegisterService()
6947 if (!err) err = mDNS_Register_internal(m, &sr->RR_PTR); in mDNS_RegisterService()
6949 mDNS_Unlock(m); in mDNS_RegisterService()
6951 if (err) mDNS_DeregisterService(m, sr); in mDNS_RegisterService()
6955 mDNSexport mStatus mDNS_AddRecordToService(mDNS *const m, ServiceRecordSet *sr, in mDNS_AddRecordToService() argument
6969 mDNS_Lock(m); in mDNS_AddRecordToService()
6976 status = uDNS_AddRecordToService(m, sr, extra); in mDNS_AddRecordToService()
6977 mDNS_Unlock(m); in mDNS_AddRecordToService()
6982 mDNS_Lock(m); in mDNS_AddRecordToService()
6992 status = mDNS_Register_internal(m, &extra->r); in mDNS_AddRecordToService()
6994 mDNS_Unlock(m); in mDNS_AddRecordToService()
6998 mDNSexport mStatus mDNS_RemoveRecordFromService(mDNS *const m, ServiceRecordSet *sr, ExtraResourceR… in mDNS_RemoveRecordFromService() argument
7004 mDNS_Lock(m); in mDNS_RemoveRecordFromService()
7020 status = uDNS_DeregisterRecord(m, &extra->r); in mDNS_RemoveRecordFromService()
7023 status = mDNS_Deregister_internal(m, &extra->r, mDNS_Dereg_normal); in mDNS_RemoveRecordFromService()
7025 mDNS_Unlock(m); in mDNS_RemoveRecordFromService()
7029 mDNSexport mStatus mDNS_RenameAndReregisterService(mDNS *const m, ServiceRecordSet *const sr, const… in mDNS_RenameAndReregisterService() argument
7053 err = mDNS_RegisterService(m, sr, newname, &type, &domain, in mDNS_RenameAndReregisterService()
7065 err = mDNS_AddRecordToService(m, sr, e, e->r.resrec.rdata, e->r.resrec.rroriginalttl); in mDNS_RenameAndReregisterService()
7074 mDNSexport mStatus mDNS_DeregisterService(mDNS *const m, ServiceRecordSet *sr) in mDNS_DeregisterService() argument
7077 …if (!sr->RR_SRV.resrec.rdata->u.srv.port.NotAnInteger) return(mDNS_DeregisterNoSuchService(m, &sr-… in mDNS_DeregisterService()
7083 mDNS_Lock(m); in mDNS_DeregisterService()
7084 status = uDNS_DeregisterService(m, sr); in mDNS_DeregisterService()
7085 mDNS_Unlock(m); in mDNS_DeregisterService()
7104 mDNS_Lock(m); in mDNS_DeregisterService()
7109 mDNS_Deregister_internal(m, &sr->RR_SRV, mDNS_Dereg_repeat); in mDNS_DeregisterService()
7110 mDNS_Deregister_internal(m, &sr->RR_TXT, mDNS_Dereg_repeat); in mDNS_DeregisterService()
7112 mDNS_Deregister_internal(m, &sr->RR_ADV, mDNS_Dereg_normal); in mDNS_DeregisterService()
7118 mDNS_Deregister_internal(m, &e->r, mDNS_Dereg_repeat); in mDNS_DeregisterService()
7123 mDNS_Deregister_internal(m, &sr->SubTypes[i], mDNS_Dereg_normal); in mDNS_DeregisterService()
7130 status = mDNS_Deregister_internal(m, &sr->RR_PTR, mDNS_Dereg_normal); in mDNS_DeregisterService()
7131 mDNS_Unlock(m); in mDNS_DeregisterService()
7142 mDNSexport mStatus mDNS_RegisterNoSuchService(mDNS *const m, AuthRecord *const rr, in mDNS_RegisterNoSuchService() argument
7154 return(mDNS_Register(m, rr)); in mDNS_RegisterNoSuchService()
7157 mDNSexport mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr, in mDNS_AdvertiseDomains() argument
7163 return(mDNS_Register(m, rr)); in mDNS_AdvertiseDomains()
7173 mDNSlocal void mDNS_GrowCache_internal(mDNS *const m, CacheEntity *storage, mDNSu32 numrecords) in mDNS_GrowCache_internal() argument
7180 storage[numrecords-1].next = m->rrcache_free; in mDNS_GrowCache_internal()
7181 m->rrcache_free = storage; in mDNS_GrowCache_internal()
7182 m->rrcache_size += numrecords; in mDNS_GrowCache_internal()
7186 mDNSexport void mDNS_GrowCache(mDNS *const m, CacheEntity *storage, mDNSu32 numrecords) in mDNS_GrowCache() argument
7188 mDNS_Lock(m); in mDNS_GrowCache()
7189 mDNS_GrowCache_internal(m, storage, numrecords); in mDNS_GrowCache()
7190 mDNS_Unlock(m); in mDNS_GrowCache()
7193 mDNSexport mStatus mDNS_Init(mDNS *const m, mDNS_PlatformSupport *const p, in mDNS_Init() argument
7203 m->p = p; in mDNS_Init()
7204 m->KnownBugs = 0; in mDNS_Init()
7205 …m->CanReceiveUnicastOn5353 = mDNSfalse; // Assume we can't receive unicasts on 5353, unless platfo… in mDNS_Init()
7206 m->AdvertiseLocalAddresses = AdvertiseLocalAddresses; in mDNS_Init()
7207 m->mDNSPlatformStatus = mStatus_Waiting; in mDNS_Init()
7208 m->UnicastPort4 = zeroIPPort; in mDNS_Init()
7209 m->UnicastPort6 = zeroIPPort; in mDNS_Init()
7210 m->MainCallback = Callback; in mDNS_Init()
7211 m->MainContext = Context; in mDNS_Init()
7212 m->rec.r.resrec.RecordType = 0; in mDNS_Init()
7215 m->mDNS_busy = 0; in mDNS_Init()
7216 m->mDNS_reentrancy = 0; in mDNS_Init()
7217 m->mDNS_shutdown = mDNSfalse; in mDNS_Init()
7218 m->lock_rrcache = 0; in mDNS_Init()
7219 m->lock_Questions = 0; in mDNS_Init()
7220 m->lock_Records = 0; in mDNS_Init()
7225 m->timenow_adjust = (mDNSs32)mDNSRandom(0xFFFFFFFF); in mDNS_Init()
7226 timenow = mDNS_TimeNow_NoLock(m); in mDNS_Init()
7228 m->timenow = 0; // MUST only be set within mDNS_Lock/mDNS_Unlock section in mDNS_Init()
7229 m->timenow_last = timenow; in mDNS_Init()
7230 m->NextScheduledEvent = timenow; in mDNS_Init()
7231 m->SuppressSending = timenow; in mDNS_Init()
7232 m->NextCacheCheck = timenow + 0x78000000; in mDNS_Init()
7233 m->NextScheduledQuery = timenow + 0x78000000; in mDNS_Init()
7234 m->NextScheduledProbe = timenow + 0x78000000; in mDNS_Init()
7235 m->NextScheduledResponse = timenow + 0x78000000; in mDNS_Init()
7236 m->ExpectUnicastResponse = timenow + 0x78000000; in mDNS_Init()
7237 m->RandomQueryDelay = 0; in mDNS_Init()
7238 m->RandomReconfirmDelay = 0; in mDNS_Init()
7239 m->PktNum = 0; in mDNS_Init()
7240 m->SendDeregistrations = mDNSfalse; in mDNS_Init()
7241 m->SendImmediateAnswers = mDNSfalse; in mDNS_Init()
7242 m->SleepState = mDNSfalse; in mDNS_Init()
7245 m->Questions = mDNSNULL; in mDNS_Init()
7246 m->NewQuestions = mDNSNULL; in mDNS_Init()
7247 m->CurrentQuestion = mDNSNULL; in mDNS_Init()
7248 m->LocalOnlyQuestions = mDNSNULL; in mDNS_Init()
7249 m->NewLocalOnlyQuestions = mDNSNULL; in mDNS_Init()
7250 m->rrcache_size = 0; in mDNS_Init()
7251 m->rrcache_totalused = 0; in mDNS_Init()
7252 m->rrcache_active = 0; in mDNS_Init()
7253 m->rrcache_report = 10; in mDNS_Init()
7254 m->rrcache_free = mDNSNULL; in mDNS_Init()
7256 for (slot = 0; slot < CACHE_HASH_SLOTS; slot++) m->rrcache_hash[slot] = mDNSNULL; in mDNS_Init()
7258 mDNS_GrowCache_internal(m, rrcachestorage, rrcachesize); in mDNS_Init()
7261 m->hostlabel.c[0] = 0; in mDNS_Init()
7262 m->nicelabel.c[0] = 0; in mDNS_Init()
7263 m->MulticastHostname.c[0] = 0; in mDNS_Init()
7264 m->HIHardware.c[0] = 0; in mDNS_Init()
7265 m->HISoftware.c[0] = 0; in mDNS_Init()
7266 m->ResourceRecords = mDNSNULL; in mDNS_Init()
7267 m->DuplicateRecords = mDNSNULL; in mDNS_Init()
7268 m->NewLocalRecords = mDNSNULL; in mDNS_Init()
7269 m->CurrentRecord = mDNSNULL; in mDNS_Init()
7270 m->HostInterfaces = mDNSNULL; in mDNS_Init()
7271 m->ProbeFailTime = 0; in mDNS_Init()
7272 m->NumFailedProbes = 0; in mDNS_Init()
7273 m->SuppressProbes = 0; in mDNS_Init()
7276 uDNS_Init(m); in mDNS_Init()
7277 m->SuppressStdPort53Queries = 0; in mDNS_Init()
7279 result = mDNSPlatformInit(m); in mDNS_Init()
7284 mDNSexport void mDNSCoreInitComplete(mDNS *const m, mStatus result) in mDNSCoreInitComplete() argument
7286 m->mDNSPlatformStatus = result; in mDNSCoreInitComplete()
7287 if (m->MainCallback) in mDNSCoreInitComplete()
7289 mDNS_Lock(m); in mDNSCoreInitComplete()
7290 …m->mDNS_reentrancy++; // Increment to allow client to legally make mDNS API calls from the callback in mDNSCoreInitComplete()
7291 m->MainCallback(m, mStatus_NoError); in mDNSCoreInitComplete()
7292 m->mDNS_reentrancy--; // Decrement to block mDNS API calls again in mDNSCoreInitComplete()
7293 mDNS_Unlock(m); in mDNSCoreInitComplete()
7297 mDNSexport void mDNS_Close(mDNS *const m) in mDNS_Close() argument
7303 mDNS_Lock(m); in mDNS_Close()
7305 m->mDNS_shutdown = mDNStrue; in mDNS_Close()
7308 uDNS_Close(m); in mDNS_Close()
7310 rrcache_totalused = m->rrcache_totalused; in mDNS_Close()
7313 while(m->rrcache_hash[slot]) in mDNS_Close()
7315 CacheGroup *cg = m->rrcache_hash[slot]; in mDNS_Close()
7321 ReleaseCacheRecord(m, rr); in mDNS_Close()
7324 ReleaseCacheGroup(m, &m->rrcache_hash[slot]); in mDNS_Close()
7328 if (rrcache_active != m->rrcache_active) in mDNS_Close()
7329 …LogMsg("*** ERROR *** rrcache_active %lu != m->rrcache_active %lu", rrcache_active, m->rrcache_act… in mDNS_Close()
7331 for (intf = m->HostInterfaces; intf; intf = intf->next) in mDNS_Close()
7333 DeadvertiseInterface(m, intf); in mDNS_Close()
7336 if (m->CurrentRecord) LogMsg("mDNS_Close ERROR m->CurrentRecord already set"); in mDNS_Close()
7337 m->CurrentRecord = m->ResourceRecords; in mDNS_Close()
7338 while (m->CurrentRecord) in mDNS_Close()
7340 AuthRecord *rr = m->CurrentRecord; in mDNS_Close()
7344 mDNS_Deregister_internal(m, rr, mDNS_Dereg_normal); in mDNS_Close()
7347 m->CurrentRecord = rr->next; in mDNS_Close()
7350 if (m->ResourceRecords) debugf("mDNS_Close: Sending final packets for deregistering records"); in mDNS_Close()
7354 if (m->mDNSPlatformStatus != mStatus_NoError) DiscardDeregistrations(m); in mDNS_Close()
7355 else if (m->ResourceRecords) SendResponses(m); in mDNS_Close()
7356 …if (m->ResourceRecords) LogMsg("mDNS_Close failed to send goodbye for: %s", ARDisplayString(m, m->… in mDNS_Close()
7358 mDNS_Unlock(m); in mDNS_Close()
7360 mDNSPlatformClose(m); in mDNS_Close()