mirror of
https://github.com/owntone/owntone-server.git
synced 2025-02-03 09:56:00 -05:00
Synchronize mDNS to Apples 58.8 drop
This commit is contained in:
parent
cd91e5362d
commit
81ded39a63
83
src/mDNS.c
83
src/mDNS.c
@ -44,11 +44,26 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:00 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.4 2004/03/02 00:14:26 rpedde
|
Revision 1.307.2.8 2004/04/03 05:18:19 bradley
|
||||||
Update to mdns 58.3
|
Added cast to fix signed/unsigned warning due to int promotion.
|
||||||
|
|
||||||
|
Revision 1.307.2.7 2004/03/30 06:46:24 cheshire
|
||||||
|
Compiler warning fixes from Don Woodward at Roku Labs
|
||||||
|
|
||||||
|
Revision 1.307.2.6 2004/03/09 03:03:38 cheshire
|
||||||
|
<rdar://problem/3581961> Don't take lock until after mDNS_Update() has validated that the data is good
|
||||||
|
|
||||||
|
Revision 1.307.2.5 2004/03/02 02:55:24 cheshire
|
||||||
|
<rdar://problem/3549576> Properly support "_services._dns-sd._udp" meta-queries
|
||||||
|
|
||||||
|
Revision 1.307.2.4 2004/02/18 01:55:08 cheshire
|
||||||
|
<rdar://problem/3553472>: Increase delay to 400ms when answering queries with multi-packet KA lists
|
||||||
|
|
||||||
|
Revision 1.307.2.3 2004/01/28 23:08:45 cheshire
|
||||||
|
<rdar://problem/3488559>: Hard code domain enumeration functions to return ".local" only
|
||||||
|
|
||||||
Revision 1.307.2.2 2003/12/20 01:51:40 cheshire
|
Revision 1.307.2.2 2003/12/20 01:51:40 cheshire
|
||||||
<rdar://problem/3515876>: Error putting additional records into packets
|
<rdar://problem/3515876>: Error putting additional records into packets
|
||||||
@ -1102,10 +1117,10 @@ static const mDNSOpaque16 ResponseFlags = { { kDNSFlag0_QR_Response | kDNSFlag0_
|
|||||||
|
|
||||||
static const char *const mDNS_DomainTypeNames[] =
|
static const char *const mDNS_DomainTypeNames[] =
|
||||||
{
|
{
|
||||||
"_browse._mdns._udp.local.",
|
"_browse._dns-sd._udp.local.",
|
||||||
"_default._browse._mdns._udp.local.",
|
"_default._browse._dns-sd._udp.local.",
|
||||||
"_register._mdns._udp.local.",
|
"_register._dns-sd._udp.local.",
|
||||||
"_default._register._mdns._udp.local."
|
"_default._register._dns-sd._udp.local."
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AssignDomainName(DST, SRC) mDNSPlatformMemCopy((SRC).c, (DST).c, DomainNameLength(&(SRC)))
|
#define AssignDomainName(DST, SRC) mDNSPlatformMemCopy((SRC).c, (DST).c, DomainNameLength(&(SRC)))
|
||||||
@ -2195,13 +2210,13 @@ mDNSlocal mDNSu16 GetRDLength(const ResourceRecord *const rr, mDNSBool estimate)
|
|||||||
const domainname *const name = estimate ? &rr->name : mDNSNULL;
|
const domainname *const name = estimate ? &rr->name : mDNSNULL;
|
||||||
switch (rr->rrtype)
|
switch (rr->rrtype)
|
||||||
{
|
{
|
||||||
case kDNSType_A: return(sizeof(rd->ip)); break;
|
case kDNSType_A: return(sizeof(rd->ip));
|
||||||
case kDNSType_CNAME:// Same as PTR
|
case kDNSType_CNAME:// Same as PTR
|
||||||
case kDNSType_PTR: return(CompressedDomainNameLength(&rd->name, name));
|
case kDNSType_PTR: return(CompressedDomainNameLength(&rd->name, name));
|
||||||
case kDNSType_HINFO:return(mDNSu16)(2 + (int)rd->data[0] + (int)rd->data[1 + (int)rd->data[0]]);
|
case kDNSType_HINFO:return(mDNSu16)(2 + (int)rd->data[0] + (int)rd->data[1 + (int)rd->data[0]]);
|
||||||
case kDNSType_NULL: // Same as TXT -- not self-describing, so have to just trust rdlength
|
case kDNSType_NULL: // Same as TXT -- not self-describing, so have to just trust rdlength
|
||||||
case kDNSType_TXT: return(rr->rdlength); // TXT is not self-describing, so have to just trust rdlength
|
case kDNSType_TXT: return(rr->rdlength); // TXT is not self-describing, so have to just trust rdlength
|
||||||
case kDNSType_AAAA: return(sizeof(rd->ipv6)); break;
|
case kDNSType_AAAA: return(sizeof(rd->ipv6));
|
||||||
case kDNSType_SRV: return(mDNSu16)(6 + CompressedDomainNameLength(&rd->srv.target, name));
|
case kDNSType_SRV: return(mDNSu16)(6 + CompressedDomainNameLength(&rd->srv.target, name));
|
||||||
default: debugf("Warning! Don't know how to get length of resource type %d", rr->rrtype);
|
default: debugf("Warning! Don't know how to get length of resource type %d", rr->rrtype);
|
||||||
return(rr->rdlength);
|
return(rr->rdlength);
|
||||||
@ -2775,7 +2790,7 @@ mDNSlocal const mDNSu8 *FindCompressionPointer(const mDNSu8 *const base, const m
|
|||||||
mDNSlocal mDNSu8 *putDomainNameAsLabels(const DNSMessage *const msg,
|
mDNSlocal mDNSu8 *putDomainNameAsLabels(const DNSMessage *const msg,
|
||||||
mDNSu8 *ptr, const mDNSu8 *const limit, const domainname *const name)
|
mDNSu8 *ptr, const mDNSu8 *const limit, const domainname *const name)
|
||||||
{
|
{
|
||||||
const mDNSu8 *const base = (const mDNSu8 *const)msg;
|
const mDNSu8 *const base = (const mDNSu8 *)msg;
|
||||||
const mDNSu8 * np = name->c;
|
const mDNSu8 * np = name->c;
|
||||||
const mDNSu8 *const max = name->c + MAX_DOMAIN_NAME; // Maximum that's valid
|
const mDNSu8 *const max = name->c + MAX_DOMAIN_NAME; // Maximum that's valid
|
||||||
const mDNSu8 * pointer = mDNSNULL;
|
const mDNSu8 * pointer = mDNSNULL;
|
||||||
@ -3780,7 +3795,7 @@ mDNSlocal mDNSBool AccelerateThisQuery(mDNS *const m, DNSQuestion *q)
|
|||||||
if (TimeToSendThisQuestion(q, m->timenow + q->ThisQInterval/2))
|
if (TimeToSendThisQuestion(q, m->timenow + q->ThisQInterval/2))
|
||||||
{
|
{
|
||||||
// We forecast: qname (n) type (2) class (2)
|
// We forecast: qname (n) type (2) class (2)
|
||||||
mDNSu32 forecast = DomainNameLength(&q->qname) + 4;
|
mDNSu32 forecast = (mDNSu32)DomainNameLength(&q->qname) + 4;
|
||||||
CacheRecord *rr;
|
CacheRecord *rr;
|
||||||
for (rr=m->rrcache_hash[HashSlot(&q->qname)]; rr; rr=rr->next) // If we have a resource record in our cache,
|
for (rr=m->rrcache_hash[HashSlot(&q->qname)]; rr; rr=rr->next) // If we have a resource record in our cache,
|
||||||
if (rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
|
if (rr->resrec.rdlength <= SmallRecordLimit && // which is small enough to sensibly fit in the packet
|
||||||
@ -4953,7 +4968,7 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
CacheRecord **eap = &ExpectedAnswers;
|
CacheRecord **eap = &ExpectedAnswers;
|
||||||
DNSQuestion *DupQuestions = mDNSNULL; // Our questions that are identical to questions in this packet
|
DNSQuestion *DupQuestions = mDNSNULL; // Our questions that are identical to questions in this packet
|
||||||
DNSQuestion **dqp = &DupQuestions;
|
DNSQuestion **dqp = &DupQuestions;
|
||||||
mDNSBool delayresponse = mDNSfalse;
|
mDNSs32 delayresponse = 0;
|
||||||
mDNSBool HaveUnicastAnswer = mDNSfalse;
|
mDNSBool HaveUnicastAnswer = mDNSfalse;
|
||||||
const mDNSu8 *ptr = query->data;
|
const mDNSu8 *ptr = query->data;
|
||||||
mDNSu8 *responseptr = mDNSNULL;
|
mDNSu8 *responseptr = mDNSNULL;
|
||||||
@ -4961,7 +4976,7 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// If TC flag is set, it means we should expect that additional known answers may be coming in another packet.
|
// If TC flag is set, it means we should expect that additional known answers may be coming in another packet.
|
||||||
if (query->h.flags.b[0] & kDNSFlag0_TC) delayresponse = mDNStrue;
|
if (query->h.flags.b[0] & kDNSFlag0_TC) delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
|
||||||
|
|
||||||
// ***
|
// ***
|
||||||
// *** 1. Parse Question Section and mark potential answers
|
// *** 1. Parse Question Section and mark potential answers
|
||||||
@ -5031,7 +5046,7 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
CacheRecord *rr;
|
CacheRecord *rr;
|
||||||
// If we couldn't answer this question, someone else might be able to,
|
// If we couldn't answer this question, someone else might be able to,
|
||||||
// so use random delay on response to reduce collisions
|
// so use random delay on response to reduce collisions
|
||||||
if (NumAnswersForThisQuestion == 0) delayresponse = mDNStrue;
|
if (NumAnswersForThisQuestion == 0) delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
|
||||||
|
|
||||||
// Make a list indicating which of our own cache records we expect to see updated as a result of this query
|
// Make a list indicating which of our own cache records we expect to see updated as a result of this query
|
||||||
// Note: Records larger than 1K are not habitually multicast, so don't expect those to be updated
|
// Note: Records larger than 1K are not habitually multicast, so don't expect those to be updated
|
||||||
@ -5071,10 +5086,7 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
// ***
|
// ***
|
||||||
for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers
|
for (rr = m->ResourceRecords; rr; rr=rr->next) // Now build our list of potential answers
|
||||||
if (rr->NR_AnswerTo) // If we marked the record...
|
if (rr->NR_AnswerTo) // If we marked the record...
|
||||||
{
|
|
||||||
AddRecordToResponseList(&nrp, rr, mDNSNULL); // ... add it to the list
|
AddRecordToResponseList(&nrp, rr, mDNSNULL); // ... add it to the list
|
||||||
if (rr->resrec.RecordType == kDNSRecordTypeShared) delayresponse = mDNStrue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ***
|
// ***
|
||||||
// *** 3. Add additional records
|
// *** 3. Add additional records
|
||||||
@ -5217,6 +5229,11 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rr->resrec.RecordType == kDNSRecordTypeShared)
|
||||||
|
{
|
||||||
|
if (query->h.flags.b[0] & kDNSFlag0_TC) delayresponse = mDNSPlatformOneSecond * 20; // Divided by 50 = 400ms
|
||||||
|
else delayresponse = mDNSPlatformOneSecond; // Divided by 50 = 20ms
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (rr->NR_AdditionalTo && rr->NR_AdditionalTo->NR_AnswerTo == (mDNSu8*)~0)
|
else if (rr->NR_AdditionalTo && rr->NR_AdditionalTo->NR_AnswerTo == (mDNSu8*)~0)
|
||||||
{
|
{
|
||||||
@ -5232,10 +5249,22 @@ mDNSlocal mDNSu8 *ProcessQuery(mDNS *const m, const DNSMessage *const query, con
|
|||||||
// ***
|
// ***
|
||||||
// *** 7. If we think other machines are likely to answer these questions, set our packet suppression timer
|
// *** 7. If we think other machines are likely to answer these questions, set our packet suppression timer
|
||||||
// ***
|
// ***
|
||||||
if (delayresponse && !m->SuppressSending)
|
if (delayresponse && (!m->SuppressSending || (m->SuppressSending - m->timenow) < (delayresponse + 49) / 50))
|
||||||
{
|
{
|
||||||
// Pick a random delay between 20ms and 120ms.
|
// Pick a random delay:
|
||||||
m->SuppressSending = m->timenow + (mDNSPlatformOneSecond*2 + (mDNSs32)mDNSRandom((mDNSu32)mDNSPlatformOneSecond*10)) / 100;
|
// We start with the base delay chosen above (typically either 1 second or 20 seconds),
|
||||||
|
// and add a random value in the range 0-5 seconds (making 1-6 seconds or 20-25 seconds).
|
||||||
|
// This is an integer value, with resolution determined by the platform clock rate.
|
||||||
|
// We then divide that by 50 to get the delay value in ticks. We defer the division until last
|
||||||
|
// to get better results on platforms with coarse clock granularity (e.g. ten ticks per second).
|
||||||
|
// The +49 before dividing is to ensure we round up, not down, to ensure that even
|
||||||
|
// on platforms where the native clock rate is less than fifty ticks per second,
|
||||||
|
// we still guarantee that the final calculated delay is at least one platform tick.
|
||||||
|
// We want to make sure we don't ever allow the delay to be zero ticks,
|
||||||
|
// because if that happens we'll fail the Rendezvous Conformance Test.
|
||||||
|
// Our final computed delay is 20-120ms for normal delayed replies,
|
||||||
|
// or 400-500ms in the case of multi-packet known-answer lists.
|
||||||
|
m->SuppressSending = m->timenow + (delayresponse + (mDNSs32)mDNSRandom((mDNSu32)mDNSPlatformOneSecond*5) + 49) / 50;
|
||||||
if (m->SuppressSending == 0) m->SuppressSending = 1;
|
if (m->SuppressSending == 0) m->SuppressSending = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6085,7 +6114,11 @@ mDNSexport mStatus mDNS_GetDomains(mDNS *const m, DNSQuestion *const question, m
|
|||||||
question->qclass = kDNSClass_IN;
|
question->qclass = kDNSClass_IN;
|
||||||
question->QuestionCallback = Callback;
|
question->QuestionCallback = Callback;
|
||||||
question->QuestionContext = Context;
|
question->QuestionContext = Context;
|
||||||
return(mDNS_StartQuery(m, question));
|
|
||||||
|
// No sense doing this until we actually support unicast query/update
|
||||||
|
//return(mDNS_StartQuery(m, question));
|
||||||
|
(void)m; // Unused
|
||||||
|
return(mStatus_NoError);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
@ -6151,11 +6184,11 @@ mDNSexport mStatus mDNS_Update(mDNS *const m, AuthRecord *const rr, mDNSu32 newt
|
|||||||
const mDNSu16 newrdlength,
|
const mDNSu16 newrdlength,
|
||||||
RData *const newrdata, mDNSRecordUpdateCallback *Callback)
|
RData *const newrdata, mDNSRecordUpdateCallback *Callback)
|
||||||
{
|
{
|
||||||
mDNS_Lock(m);
|
|
||||||
|
|
||||||
if (!ValidateRData(rr->resrec.rrtype, newrdlength, newrdata))
|
if (!ValidateRData(rr->resrec.rrtype, newrdlength, newrdata))
|
||||||
{ LogMsg("Attempt to update record with invalid rdata: %s", GetRRDisplayString_rdb(m, &rr->resrec, &newrdata->u)); return(mStatus_Invalid); }
|
{ LogMsg("Attempt to update record with invalid rdata: %s", GetRRDisplayString_rdb(m, &rr->resrec, &newrdata->u)); return(mStatus_Invalid); }
|
||||||
|
|
||||||
|
mDNS_Lock(m);
|
||||||
|
|
||||||
// If TTL is unspecified, leave TTL unchanged
|
// If TTL is unspecified, leave TTL unchanged
|
||||||
if (newttl == 0) newttl = rr->resrec.rroriginalttl;
|
if (newttl == 0) newttl = rr->resrec.rroriginalttl;
|
||||||
|
|
||||||
@ -6638,7 +6671,7 @@ mDNSexport mStatus mDNS_RegisterService(mDNS *const m, ServiceRecordSet *sr,
|
|||||||
// Set up the record names
|
// Set up the record names
|
||||||
// For now we only create an advisory record for the main type, not for subtypes
|
// For now we only create an advisory record for the main type, not for subtypes
|
||||||
// We need to gain some operational experience before we decide if there's a need to create them for subtypes too
|
// We need to gain some operational experience before we decide if there's a need to create them for subtypes too
|
||||||
if (ConstructServiceName(&sr->RR_ADV.resrec.name, (domainlabel*)"\x09_services", (domainname*)"\x05_mdns\x04_udp", domain) == mDNSNULL)
|
if (ConstructServiceName(&sr->RR_ADV.resrec.name, (domainlabel*)"\x09_services", (domainname*)"\x07_dns-sd\x04_udp", domain) == mDNSNULL)
|
||||||
return(mStatus_BadParamErr);
|
return(mStatus_BadParamErr);
|
||||||
if (ConstructServiceName(&sr->RR_PTR.resrec.name, mDNSNULL, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
|
if (ConstructServiceName(&sr->RR_PTR.resrec.name, mDNSNULL, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
|
||||||
if (ConstructServiceName(&sr->RR_SRV.resrec.name, name, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
|
if (ConstructServiceName(&sr->RR_SRV.resrec.name, name, type, domain) == mDNSNULL) return(mStatus_BadParamErr);
|
||||||
|
@ -23,17 +23,28 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 2004/11/11 18:47:25 rpedde
|
Revision 1.4 2005/01/10 01:07:01 rpedde
|
||||||
fix typedefs for AMD64
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.2 2004/09/19 03:03:47 rpedde
|
Revision 1.114.2.9 2004/04/22 03:17:35 cheshire
|
||||||
Jim Buzbee's ARM patches for NSLU2
|
Fix use of "struct __attribute__((__packed__))" so it only applies on GCC >= 2.9
|
||||||
|
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.114.2.8 2004/03/30 06:55:37 cheshire
|
||||||
Flatten mdns stuff
|
Gave name to anonymous struct, to avoid errors on certain compilers.
|
||||||
|
(Thanks to ramaprasad.kr@hp.com for reporting this.)
|
||||||
|
|
||||||
Revision 1.2 2004/03/02 00:03:37 rpedde
|
Revision 1.114.2.7 2004/03/09 02:31:27 cheshire
|
||||||
Merge new rendezvous code
|
Remove erroneous underscore in 'packed_struct' (makes no difference now, but might in future)
|
||||||
|
|
||||||
|
Revision 1.114.2.6 2004/03/02 02:55:25 cheshire
|
||||||
|
<rdar://problem/3549576> Properly support "_services._dns-sd._udp" meta-queries
|
||||||
|
|
||||||
|
Revision 1.114.2.5 2004/02/18 23:35:17 cheshire
|
||||||
|
<rdar://problem/3488559>: Hard code domain enumeration functions to return ".local" only
|
||||||
|
Also make mDNS_StopGetDomains() a no-op too, so that we don't get warning messages in syslog
|
||||||
|
|
||||||
|
Revision 1.114.2.4 2004/01/28 23:29:20 cheshire
|
||||||
|
Fix structure packing (only affects third-party Darwin developers)
|
||||||
|
|
||||||
Revision 1.114.2.3 2003/12/05 00:03:34 cheshire
|
Revision 1.114.2.3 2003/12/05 00:03:34 cheshire
|
||||||
<rdar://problem/3487869> Use buffer size MAX_ESCAPED_DOMAIN_NAME instead of 256
|
<rdar://problem/3487869> Use buffer size MAX_ESCAPED_DOMAIN_NAME instead of 256
|
||||||
@ -426,15 +437,35 @@ Merge in license terms from Quinn's copy, in preparation for Darwin release
|
|||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// Function scope indicators
|
// Function scope indicators
|
||||||
|
|
||||||
// If you see "mDNSlocal" before a function name, it means the function is not callable outside this file
|
// If you see "mDNSlocal" before a function name in a C file, it means the function is not callable outside this file
|
||||||
#ifndef mDNSlocal
|
#ifndef mDNSlocal
|
||||||
#define mDNSlocal static
|
#define mDNSlocal static
|
||||||
#endif
|
#endif
|
||||||
// If you see "mDNSexport" before a symbol, it means the symbol is exported for use by clients
|
// If you see "mDNSexport" before a symbol in a C file, it means the symbol is exported for use by clients
|
||||||
|
// For every "mDNSexport" in a C file, there needs to be a corresponding "extern" declaration in some header file
|
||||||
|
// (When a C file #includes a header file, the "extern" declarations tell the compiler:
|
||||||
|
// "This symbol exists -- but not necessarily in this C file.")
|
||||||
#ifndef mDNSexport
|
#ifndef mDNSexport
|
||||||
#define mDNSexport
|
#define mDNSexport
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// Structure packing macro
|
||||||
|
|
||||||
|
// If we're not using GNUC, it's not fatal.
|
||||||
|
// Most compilers naturally pack the on-the-wire structures correctly anyway, so a plain "struct" is usually fine.
|
||||||
|
// In the event that structures are not packed correctly, mDNS_Init() will detect this and report an error, so the
|
||||||
|
// developer will know what's wrong, and can investigate what needs to be done on that compiler to provide proper packing.
|
||||||
|
#ifndef packedstruct
|
||||||
|
#if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
|
||||||
|
#define packedstruct struct __attribute__((__packed__))
|
||||||
|
#define packedunion union __attribute__((__packed__))
|
||||||
|
#else
|
||||||
|
#define packedstruct struct
|
||||||
|
#define packedunion union
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
#if 0
|
#if 0
|
||||||
#pragma mark - DNS Resource Record class and type constants
|
#pragma mark - DNS Resource Record class and type constants
|
||||||
@ -492,13 +523,18 @@ typedef signed char mDNSs8;
|
|||||||
typedef unsigned char mDNSu8;
|
typedef unsigned char mDNSu8;
|
||||||
typedef signed short mDNSs16;
|
typedef signed short mDNSs16;
|
||||||
typedef unsigned short mDNSu16;
|
typedef unsigned short mDNSu16;
|
||||||
|
#if _LP64
|
||||||
typedef signed int mDNSs32;
|
typedef signed int mDNSs32;
|
||||||
typedef unsigned int mDNSu32;
|
typedef unsigned int mDNSu32;
|
||||||
|
#else
|
||||||
|
typedef signed long mDNSs32;
|
||||||
|
typedef unsigned long mDNSu32;
|
||||||
|
#endif
|
||||||
|
|
||||||
// To enforce useful type checking, we make mDNSInterfaceID be a pointer to a dummy struct
|
// To enforce useful type checking, we make mDNSInterfaceID be a pointer to a dummy struct
|
||||||
// This way, mDNSInterfaceIDs can be assigned, and compared with each other, but not with other types
|
// This way, mDNSInterfaceIDs can be assigned, and compared with each other, but not with other types
|
||||||
// Declaring the type to be the typical generic "void *" would lack this type checking
|
// Declaring the type to be the typical generic "void *" would lack this type checking
|
||||||
typedef struct { void *dummy; } *mDNSInterfaceID;
|
typedef struct mDNSInterfaceID_dummystruct { void *dummy; } *mDNSInterfaceID;
|
||||||
|
|
||||||
// These types are for opaque two- and four-byte identifiers.
|
// These types are for opaque two- and four-byte identifiers.
|
||||||
// The "NotAnInteger" fields of the unions allow the value to be conveniently passed around in a
|
// The "NotAnInteger" fields of the unions allow the value to be conveniently passed around in a
|
||||||
@ -507,9 +543,9 @@ typedef struct { void *dummy; } *mDNSInterfaceID;
|
|||||||
// less than, add, multiply, increment, decrement, etc., are undefined for opaque identifiers,
|
// less than, add, multiply, increment, decrement, etc., are undefined for opaque identifiers,
|
||||||
// and if you make the mistake of trying to do those using the NotAnInteger field, then you'll
|
// and if you make the mistake of trying to do those using the NotAnInteger field, then you'll
|
||||||
// find you get code that doesn't work consistently on big-endian and little-endian machines.
|
// find you get code that doesn't work consistently on big-endian and little-endian machines.
|
||||||
typedef union { mDNSu8 b[2]; mDNSu16 NotAnInteger; } __attribute__ ((packed)) mDNSOpaque16;
|
typedef packedunion { mDNSu8 b[2]; mDNSu16 NotAnInteger; } mDNSOpaque16;
|
||||||
typedef union { mDNSu8 b[4]; mDNSu32 NotAnInteger; } __attribute__ ((packed)) mDNSOpaque32;
|
typedef packedunion { mDNSu8 b[4]; mDNSu32 NotAnInteger; } mDNSOpaque32;
|
||||||
typedef union { mDNSu8 b[16]; mDNSu16 w[8]; mDNSu32 l[4]; } __attribute__ ((packed)) mDNSOpaque128;
|
typedef packedunion { mDNSu8 b[16]; mDNSu16 w[8]; mDNSu32 l[4]; } mDNSOpaque128;
|
||||||
|
|
||||||
typedef mDNSOpaque16 mDNSIPPort; // An IP port is a two-byte opaque identifier (not an integer)
|
typedef mDNSOpaque16 mDNSIPPort; // An IP port is a two-byte opaque identifier (not an integer)
|
||||||
typedef mDNSOpaque32 mDNSv4Addr; // An IP address is a four-byte opaque identifier (not an integer)
|
typedef mDNSOpaque32 mDNSv4Addr; // An IP address is a four-byte opaque identifier (not an integer)
|
||||||
@ -527,7 +563,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
mDNSs32 type;
|
mDNSs32 type;
|
||||||
union { mDNSv6Addr v6; mDNSv4Addr v4; } ip;
|
union { mDNSv6Addr v6; mDNSv4Addr v4; } ip;
|
||||||
} __attribute__ ((packed)) mDNSAddr;
|
} mDNSAddr;
|
||||||
|
|
||||||
enum { mDNSfalse = 0, mDNStrue = 1 };
|
enum { mDNSfalse = 0, mDNStrue = 1 };
|
||||||
|
|
||||||
@ -677,8 +713,8 @@ enum
|
|||||||
kDNSRecordTypePacketUniqueMask = 0x20 // True for PacketAddUnique and PacketAnsUnique
|
kDNSRecordTypePacketUniqueMask = 0x20 // True for PacketAddUnique and PacketAnsUnique
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct { mDNSu16 priority; mDNSu16 weight; mDNSIPPort port; domainname target; } __attribute__ ((packed)) rdataSRV;
|
typedef packedstruct { mDNSu16 priority; mDNSu16 weight; mDNSIPPort port; domainname target; } rdataSRV;
|
||||||
typedef struct { mDNSu16 preference; domainname exchange; } __attribute__ ((packed)) rdataMX;
|
typedef packedstruct { mDNSu16 preference; domainname exchange; } rdataMX;
|
||||||
|
|
||||||
// StandardAuthRDSize is 264 (256+8), which is large enough to hold a maximum-sized SRV record
|
// StandardAuthRDSize is 264 (256+8), which is large enough to hold a maximum-sized SRV record
|
||||||
// MaximumRDSize is 8K the absolute maximum we support (at least for now)
|
// MaximumRDSize is 8K the absolute maximum we support (at least for now)
|
||||||
@ -881,7 +917,7 @@ struct ServiceRecordSet_struct
|
|||||||
AuthRecord *SubTypes;
|
AuthRecord *SubTypes;
|
||||||
mDNSBool Conflict; // Set if this record set was forcibly deregistered because of a conflict
|
mDNSBool Conflict; // Set if this record set was forcibly deregistered because of a conflict
|
||||||
domainname Host; // Set if this service record does not use the standard target host name
|
domainname Host; // Set if this service record does not use the standard target host name
|
||||||
AuthRecord RR_ADV; // e.g. _services._mdns._udp.local. PTR _printer._tcp.local.
|
AuthRecord RR_ADV; // e.g. _services._dns-sd._udp.local. PTR _printer._tcp.local.
|
||||||
AuthRecord RR_PTR; // e.g. _printer._tcp.local. PTR Name._printer._tcp.local.
|
AuthRecord RR_PTR; // e.g. _printer._tcp.local. PTR Name._printer._tcp.local.
|
||||||
AuthRecord RR_SRV; // e.g. Name._printer._tcp.local. SRV 0 0 port target
|
AuthRecord RR_SRV; // e.g. Name._printer._tcp.local. SRV 0 0 port target
|
||||||
AuthRecord RR_TXT; // e.g. Name._printer._tcp.local. TXT PrintQueueName
|
AuthRecord RR_TXT; // e.g. Name._printer._tcp.local. TXT PrintQueueName
|
||||||
@ -914,8 +950,8 @@ struct DNSQuestion_struct
|
|||||||
// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
|
// Internal state fields. These are used internally by mDNSCore; the client layer needn't be concerned with them.
|
||||||
DNSQuestion *next;
|
DNSQuestion *next;
|
||||||
mDNSu32 qnamehash;
|
mDNSu32 qnamehash;
|
||||||
mDNSs32 LastQTime; // Last scheduled tranmission of this Q on *all* applicable interfaces
|
mDNSs32 LastQTime; // Last scheduled transmission of this Q on *all* applicable interfaces
|
||||||
mDNSs32 ThisQInterval; // LastQTime + ThisQInterval is the next scheduled tranmission of this Q
|
mDNSs32 ThisQInterval; // LastQTime + ThisQInterval is the next scheduled transmission of this Q
|
||||||
// ThisQInterval > 0 for an active question;
|
// ThisQInterval > 0 for an active question;
|
||||||
// ThisQInterval = 0 for a suspended question that's still in the list
|
// ThisQInterval = 0 for a suspended question that's still in the list
|
||||||
// ThisQInterval = -1 for a cancelled question that's been removed from the list
|
// ThisQInterval = -1 for a cancelled question that's been removed from the list
|
||||||
@ -1097,6 +1133,7 @@ extern const mDNSAddr AllDNSLinkGroup_v6;
|
|||||||
// the appropriate steps to manually create the correct address records for those other machines.
|
// the appropriate steps to manually create the correct address records for those other machines.
|
||||||
// In principle, a proxy-like registration service could manually create address records for its own machine too,
|
// In principle, a proxy-like registration service could manually create address records for its own machine too,
|
||||||
// but this would be pointless extra effort when using mDNS_Init_AdvertiseLocalAddresses does that for you.
|
// but this would be pointless extra effort when using mDNS_Init_AdvertiseLocalAddresses does that for you.
|
||||||
|
//
|
||||||
// When mDNS has finished setting up the client's callback is called
|
// When mDNS has finished setting up the client's callback is called
|
||||||
// A client can also spin and poll the mDNSPlatformStatus field to see when it changes from mStatus_Waiting to mStatus_NoError
|
// A client can also spin and poll the mDNSPlatformStatus field to see when it changes from mStatus_Waiting to mStatus_NoError
|
||||||
//
|
//
|
||||||
@ -1122,6 +1159,7 @@ extern mStatus mDNS_Init (mDNS *const m, mDNS_PlatformSupport *const p,
|
|||||||
CacheRecord *rrcachestorage, mDNSu32 rrcachesize,
|
CacheRecord *rrcachestorage, mDNSu32 rrcachesize,
|
||||||
mDNSBool AdvertiseLocalAddresses,
|
mDNSBool AdvertiseLocalAddresses,
|
||||||
mDNSCallback *Callback, void *Context);
|
mDNSCallback *Callback, void *Context);
|
||||||
|
// See notes above on use of NoCache/ZeroCacheSize
|
||||||
#define mDNS_Init_NoCache mDNSNULL
|
#define mDNS_Init_NoCache mDNSNULL
|
||||||
#define mDNS_Init_ZeroCacheSize 0
|
#define mDNS_Init_ZeroCacheSize 0
|
||||||
// See notes above on use of Advertise/DontAdvertiseLocalAddresses
|
// See notes above on use of Advertise/DontAdvertiseLocalAddresses
|
||||||
@ -1211,7 +1249,10 @@ typedef enum
|
|||||||
} mDNS_DomainType;
|
} mDNS_DomainType;
|
||||||
|
|
||||||
extern mStatus mDNS_GetDomains(mDNS *const m, DNSQuestion *const question, mDNS_DomainType DomainType, const mDNSInterfaceID InterfaceID, mDNSQuestionCallback *Callback, void *Context);
|
extern mStatus mDNS_GetDomains(mDNS *const m, DNSQuestion *const question, mDNS_DomainType DomainType, const mDNSInterfaceID InterfaceID, mDNSQuestionCallback *Callback, void *Context);
|
||||||
#define mDNS_StopGetDomains mDNS_StopQuery
|
// In the Panther mDNSResponder we don't do unicast queries yet, so there's no point trying to do domain enumeration
|
||||||
|
// mDNS_GetDomains() and mDNS_StopGetDomains() are set to be no-ops so that clients don't try to do browse/register operations that will fail
|
||||||
|
//#define mDNS_StopGetDomains mDNS_StopQuery
|
||||||
|
#define mDNS_StopGetDomains(m,q) ((void)(m),(void)(q))
|
||||||
extern mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr, mDNS_DomainType DomainType, const mDNSInterfaceID InterfaceID, char *domname);
|
extern mStatus mDNS_AdvertiseDomains(mDNS *const m, AuthRecord *rr, mDNS_DomainType DomainType, const mDNSInterfaceID InterfaceID, char *domname);
|
||||||
#define mDNS_StopAdvertiseDomains mDNS_Deregister
|
#define mDNS_StopAdvertiseDomains mDNS_Deregister
|
||||||
|
|
||||||
@ -1310,7 +1351,7 @@ extern void IncrementLabelSuffix(domainlabel *name, mDNSBool RichText);
|
|||||||
// The definitions are placed here because sometimes clients do use these calls indirectly, via other supported client operations.
|
// The definitions are placed here because sometimes clients do use these calls indirectly, via other supported client operations.
|
||||||
// For example, AssignDomainName is a macro defined using mDNSPlatformMemCopy()
|
// For example, AssignDomainName is a macro defined using mDNSPlatformMemCopy()
|
||||||
|
|
||||||
typedef struct
|
typedef packedstruct
|
||||||
{
|
{
|
||||||
mDNSOpaque16 id;
|
mDNSOpaque16 id;
|
||||||
mDNSOpaque16 flags;
|
mDNSOpaque16 flags;
|
||||||
@ -1325,7 +1366,7 @@ typedef struct
|
|||||||
// 40 (IPv6 header) + 8 (UDP header) + 12 (DNS message header) + 1440 (DNS message body) = 1500 total
|
// 40 (IPv6 header) + 8 (UDP header) + 12 (DNS message header) + 1440 (DNS message body) = 1500 total
|
||||||
#define AbsoluteMaxDNSMessageData 8940
|
#define AbsoluteMaxDNSMessageData 8940
|
||||||
#define NormalMaxDNSMessageData 1440
|
#define NormalMaxDNSMessageData 1440
|
||||||
typedef struct
|
typedef packedstruct
|
||||||
{
|
{
|
||||||
DNSMessageHeader h; // Note: Size 12 bytes
|
DNSMessageHeader h; // Note: Size 12 bytes
|
||||||
mDNSu8 data[AbsoluteMaxDNSMessageData]; // 40 (IPv6) + 8 (UDP) + 12 (DNS header) + 8940 (data) = 9000
|
mDNSu8 data[AbsoluteMaxDNSMessageData]; // 40 (IPv6) + 8 (UDP) + 12 (DNS header) + 8940 (data) = 9000
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:01 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.2 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.14 2003/08/12 19:56:24 cheshire
|
Revision 1.14 2003/08/12 19:56:24 cheshire
|
||||||
Update to APSL 2.0
|
Update to APSL 2.0
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:01 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.2 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.22.2.1 2003/12/05 00:03:34 cheshire
|
Revision 1.22.2.1 2003/12/05 00:03:34 cheshire
|
||||||
<rdar://problem/3487869> Use buffer size MAX_ESCAPED_DOMAIN_NAME instead of 256
|
<rdar://problem/3487869> Use buffer size MAX_ESCAPED_DOMAIN_NAME instead of 256
|
||||||
|
@ -36,20 +36,11 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.4 2004/11/29 05:55:45 rpedde
|
Revision 1.5 2005/01/10 01:07:01 rpedde
|
||||||
Fix for OpenBSD
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.3 2004/11/13 07:14:26 rpedde
|
Revision 1.25.2.1 2004/04/09 17:57:31 cheshire
|
||||||
modularize debugging statements
|
Make sure to set the TxAndRx field so that duplicate suppression works correctly
|
||||||
|
|
||||||
Revision 1.2 2004/10/25 04:51:54 rpedde
|
|
||||||
tune down some of the logging
|
|
||||||
|
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
|
||||||
Flatten mdns stuff
|
|
||||||
|
|
||||||
Revision 1.4 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.25 2003/10/30 19:25:49 cheshire
|
Revision 1.25 2003/10/30 19:25:49 cheshire
|
||||||
Fix signed/unsigned warning on certain compilers
|
Fix signed/unsigned warning on certain compilers
|
||||||
@ -710,6 +701,7 @@ static int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, const cha
|
|||||||
// Set up the fields required by the mDNS core.
|
// Set up the fields required by the mDNS core.
|
||||||
SockAddrTomDNSAddr(intfAddr, &intf->coreIntf.ip, NULL);
|
SockAddrTomDNSAddr(intfAddr, &intf->coreIntf.ip, NULL);
|
||||||
intf->coreIntf.Advertise = m->AdvertiseLocalAddresses;
|
intf->coreIntf.Advertise = m->AdvertiseLocalAddresses;
|
||||||
|
intf->coreIntf.TxAndRx = mDNStrue;
|
||||||
|
|
||||||
// Set up the extra fields in PosixNetworkInterface.
|
// Set up the extra fields in PosixNetworkInterface.
|
||||||
assert(intf->intfName != NULL); // intf->intfName already set up above
|
assert(intf->intfName != NULL); // intf->intfName already set up above
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:01 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.2 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.9 2003/10/30 19:25:19 cheshire
|
Revision 1.9 2003/10/30 19:25:19 cheshire
|
||||||
Fix warning on certain compilers
|
Fix warning on certain compilers
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:01 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.3 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.12 2003/09/02 20:47:13 cheshire
|
Revision 1.12 2003/09/02 20:47:13 cheshire
|
||||||
Fix signed/unsigned warning
|
Fix signed/unsigned warning
|
||||||
|
@ -23,14 +23,8 @@
|
|||||||
Change History (most recent first):
|
Change History (most recent first):
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2004/03/29 17:55:17 rpedde
|
Revision 1.2 2005/01/10 01:07:01 rpedde
|
||||||
Flatten mdns stuff
|
Synchronize mDNS to Apples 58.8 drop
|
||||||
|
|
||||||
Revision 1.3 2004/03/16 05:11:18 rpedde
|
|
||||||
Fix obvious typecast bug
|
|
||||||
|
|
||||||
Revision 1.2 2004/03/02 00:03:37 rpedde
|
|
||||||
Merge new rendezvous code
|
|
||||||
|
|
||||||
Revision 1.8 2003/08/12 19:56:26 cheshire
|
Revision 1.8 2003/08/12 19:56:26 cheshire
|
||||||
Update to APSL 2.0
|
Update to APSL 2.0
|
||||||
@ -87,7 +81,7 @@ First checkin
|
|||||||
#define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : \
|
#define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : \
|
||||||
((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr))
|
((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr))
|
||||||
#else
|
#else
|
||||||
#define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr))
|
#define GET_SA_LEN(X) ((X).sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IFI_NAME 16 /* same as IFNAMSIZ in <net/if.h> */
|
#define IFI_NAME 16 /* same as IFNAMSIZ in <net/if.h> */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user