Synchronize mDNS to Apples 58.8 drop

This commit is contained in:
Ron Pedde 2005-01-10 01:07:01 +00:00
parent cd91e5362d
commit 81ded39a63
8 changed files with 138 additions and 90 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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> */