summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/mDNSCore
diff options
context:
space:
mode:
Diffstat (limited to 'mDNSResponder/mDNSCore')
-rw-r--r--mDNSResponder/mDNSCore/DNSCommon.c15
-rw-r--r--mDNSResponder/mDNSCore/DNSCommon.h2
-rw-r--r--mDNSResponder/mDNSCore/dnssec.c2
-rwxr-xr-xmDNSResponder/mDNSCore/mDNS.c51
-rwxr-xr-xmDNSResponder/mDNSCore/mDNSDebug.h1
-rwxr-xr-xmDNSResponder/mDNSCore/mDNSEmbeddedAPI.h22
-rwxr-xr-xmDNSResponder/mDNSCore/uDNS.c136
7 files changed, 126 insertions, 103 deletions
diff --git a/mDNSResponder/mDNSCore/DNSCommon.c b/mDNSResponder/mDNSCore/DNSCommon.c
index f3150762..15a92200 100644
--- a/mDNSResponder/mDNSCore/DNSCommon.c
+++ b/mDNSResponder/mDNSCore/DNSCommon.c
@@ -1790,8 +1790,8 @@ mDNSexport mDNSBool SameNameRecordAnswersQuestion(const ResourceRecord *const rr
// Resource record received via unicast, the resolver group ID should match ?
if (!rr->InterfaceID)
{
- mDNSu16 idr = (rr->rDNSServer ? rr->rDNSServer->resGroupID : 0);
- mDNSu16 idq = (q->qDNSServer ? q->qDNSServer->resGroupID : 0);
+ const mDNSu32 idr = rr->rDNSServer ? rr->rDNSServer->resGroupID : 0;
+ const mDNSu32 idq = q->qDNSServer ? q->qDNSServer->resGroupID : 0;
if (idr != idq) return(mDNSfalse);
if (!DNSSECRecordAnswersQuestion(rr, q, &checkType)) return mDNSfalse;
}
@@ -1924,8 +1924,8 @@ mDNSexport mDNSBool AnyTypeRecordAnswersQuestion(const ResourceRecord *const rr,
// both the DNSServers are assumed to be NULL in that case
if (!rr->InterfaceID)
{
- mDNSu16 idr = (rr->rDNSServer ? rr->rDNSServer->resGroupID : 0);
- mDNSu16 idq = (q->qDNSServer ? q->qDNSServer->resGroupID : 0);
+ const mDNSu32 idr = rr->rDNSServer ? rr->rDNSServer->resGroupID : 0;
+ const mDNSu32 idq = q->qDNSServer ? q->qDNSServer->resGroupID : 0;
if (idr != idq) return(mDNSfalse);
}
@@ -4551,3 +4551,10 @@ mDNSexport mDNSu32 mDNS_snprintf(char *sbuffer, mDNSu32 buflen, const char *fmt,
return(length);
}
+
+mDNSexport mDNSu32 mDNS_GetNextResolverGroupID(void)
+{
+ static mDNSu32 lastID = 0;
+ if (++lastID == 0) lastID = 1; // Valid resolver group IDs are non-zero.
+ return(lastID);
+}
diff --git a/mDNSResponder/mDNSCore/DNSCommon.h b/mDNSResponder/mDNSCore/DNSCommon.h
index 48dfe102..4291577e 100644
--- a/mDNSResponder/mDNSCore/DNSCommon.h
+++ b/mDNSResponder/mDNSCore/DNSCommon.h
@@ -98,6 +98,8 @@ extern mDNSInterfaceID GetNextActiveInterfaceID(const NetworkInterfaceInfo *intf
extern mDNSu32 mDNSRandom(mDNSu32 max); // Returns pseudo-random result from zero to max inclusive
+extern mDNSu32 mDNS_GetNextResolverGroupID(void);
+
// ***************************************************************************
#if COMPILER_LIKES_PRAGMA_MARK
#pragma mark -
diff --git a/mDNSResponder/mDNSCore/dnssec.c b/mDNSResponder/mDNSCore/dnssec.c
index 9525655f..3010d6f2 100644
--- a/mDNSResponder/mDNSCore/dnssec.c
+++ b/mDNSResponder/mDNSCore/dnssec.c
@@ -3084,7 +3084,7 @@ mDNSexport void VerifySignature(mDNS *const m, DNSSECVerifier *dv, DNSQuestion *
if (!dv)
{
first = mDNStrue;
- if (!q->qDNSServer || q->qDNSServer->cellIntf)
+ if (!q->qDNSServer || q->qDNSServer->isCell)
{
LogDNSSEC("VerifySignature: Disabled");
return;
diff --git a/mDNSResponder/mDNSCore/mDNS.c b/mDNSResponder/mDNSCore/mDNS.c
index bf1bce2f..4e70ef83 100755
--- a/mDNSResponder/mDNSCore/mDNS.c
+++ b/mDNSResponder/mDNSCore/mDNS.c
@@ -4170,7 +4170,7 @@ mDNSexport void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheReco
mDNSBool isForCellular;
queryName = q->metrics.originalQName ? q->metrics.originalQName : &q->qname;
- isForCellular = (q->qDNSServer && q->qDNSServer->cellIntf);
+ isForCellular = (q->qDNSServer && q->qDNSServer->isCell);
if (!q->metrics.answered)
{
if (q->metrics.querySendCount > 0)
@@ -4269,7 +4269,7 @@ mDNSexport void AnswerCurrentQuestionWithResourceRecord(mDNS *const m, CacheReco
#if USE_DNS64
if (DNS64ShouldAnswerQuestion(q, &rr->resrec))
{
- DNS64AnswerQuestion(m, q, &rr->resrec, AddRecord);
+ DNS64AnswerCurrentQuestion(m, &rr->resrec, AddRecord);
}
else
#endif
@@ -7410,8 +7410,8 @@ mDNSlocal CacheRecord *FindIdenticalRecordInCache(const mDNS *const m, const Res
{
if (!pktrr->InterfaceID)
{
- mDNSu16 id1 = (pktrr->rDNSServer ? pktrr->rDNSServer->resGroupID : 0);
- mDNSu16 id2 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
+ const mDNSu32 id1 = (pktrr->rDNSServer ? pktrr->rDNSServer->resGroupID : 0);
+ const mDNSu32 id2 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
match = (id1 == id2);
}
else match = (pktrr->InterfaceID == rr->resrec.InterfaceID);
@@ -8737,8 +8737,8 @@ mDNSlocal CacheRecord* mDNSCoreReceiveCacheCheck(mDNS *const m, const DNSMessage
// Resource record received via unicast, the resGroupID should match ?
if (!InterfaceID)
{
- mDNSu16 id1 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
- mDNSu16 id2 = (m->rec.r.resrec.rDNSServer ? m->rec.r.resrec.rDNSServer->resGroupID : 0);
+ const mDNSu32 id1 = (rr->resrec.rDNSServer ? rr->resrec.rDNSServer->resGroupID : 0);
+ const mDNSu32 id2 = (m->rec.r.resrec.rDNSServer ? m->rec.r.resrec.rDNSServer->resGroupID : 0);
match = (id1 == id2);
}
else
@@ -11031,14 +11031,14 @@ mDNSexport mDNSBool DomainEnumQuery(const domainname *qname)
// Note: InterfaceID is the InterfaceID of the question
mDNSlocal mDNSBool DNSServerMatch(DNSServer *d, mDNSInterfaceID InterfaceID, mDNSs32 ServiceID)
{
- // 1) Unscoped questions (NULL InterfaceID) should consider *only* unscoped DNSServers ( DNSServer
- // with "scoped" set to kScopeNone)
+ // 1) Unscoped questions (NULL InterfaceID) should consider *only* unscoped DNSServers ( DNSServer
+ // with scopeType set to kScopeNone)
//
// 2) Scoped questions (non-NULL InterfaceID) should consider *only* scoped DNSServers (DNSServer
- // with "scoped" set to kScopeInterfaceId) and their InterfaceIDs should match.
+ // with scopeType set to kScopeInterfaceID) and their InterfaceIDs should match.
//
// 3) Scoped questions (non-zero ServiceID) should consider *only* scoped DNSServers (DNSServer
- // with "scoped" set to kScopeServiceID) and their ServiceIDs should match.
+ // with scopeType set to kScopeServiceID) and their ServiceIDs should match.
//
// The first condition in the "if" statement checks to see if both the question and the DNSServer are
// unscoped. The question is unscoped only if InterfaceID is zero and ServiceID is -1.
@@ -11059,9 +11059,9 @@ mDNSlocal mDNSBool DNSServerMatch(DNSServer *d, mDNSInterfaceID InterfaceID, mDN
// Note: mDNSInterface_Unicast is used only by .local unicast questions and are treated as unscoped.
// If a question is scoped both to InterfaceID and ServiceID, the question will be scoped to InterfaceID.
- if (((d->scoped == kScopeNone) && ((!InterfaceID && ServiceID == -1) || InterfaceID == mDNSInterface_Unicast)) ||
- ((d->scoped == kScopeInterfaceID) && d->interface == InterfaceID) ||
- ((d->scoped == kScopeServiceID) && d->serviceID == ServiceID))
+ if (((d->scopeType == kScopeNone) && ((!InterfaceID && ServiceID == -1) || InterfaceID == mDNSInterface_Unicast)) ||
+ ((d->scopeType == kScopeInterfaceID) && d->interface == InterfaceID) ||
+ ((d->scopeType == kScopeServiceID) && d->serviceID == ServiceID))
{
return mDNStrue;
}
@@ -11099,14 +11099,16 @@ mDNSexport mDNSu32 SetValidDNSServers(mDNS *m, DNSQuestion *question)
// Note: DNS configuration change will help pick the new dns servers but currently it does not affect the timeout
// Skip DNSServers that are InterfaceID Scoped but have no valid interfaceid set OR DNSServers that are ServiceID Scoped but have no valid serviceid set
- if ((curr->scoped == kScopeInterfaceID && curr->interface == mDNSInterface_Any) || (curr->scoped == kScopeServiceID && curr->serviceID <= 0))
+ if (((curr->scopeType == kScopeInterfaceID) && (curr->interface == mDNSInterface_Any)) ||
+ ((curr->scopeType == kScopeServiceID) && (curr->serviceID <= 0)))
{
- LogInfo("SetValidDNSServers: ScopeType[%d] Skipping DNS server %#a (Domain %##s) Interface:[%p] Serviceid:[%d]", curr->scoped, &curr->addr, curr->domain.c, curr->interface, curr->serviceID);
+ LogInfo("SetValidDNSServers: ScopeType[%d] Skipping DNS server %#a (Domain %##s) Interface:[%p] Serviceid:[%d]",
+ (int)curr->scopeType, &curr->addr, curr->domain.c, curr->interface, curr->serviceID);
continue;
}
currcount = CountLabels(&curr->domain);
- if ((!curr->cellIntf || (!DEQuery && !(question->flags & kDNSServiceFlagsDenyCellular))) &&
+ if ((!curr->isCell || (!DEQuery && !(question->flags & kDNSServiceFlagsDenyCellular))) &&
(!curr->isExpensive || !(question->flags & kDNSServiceFlagsDenyExpensive)) &&
DNSServerMatch(curr, question->InterfaceID, question->ServiceID))
{
@@ -11130,7 +11132,7 @@ mDNSexport mDNSu32 SetValidDNSServers(mDNS *m, DNSQuestion *question)
curr->interface);
timeout += curr->timeout;
if (DEQuery)
- debugf("DomainEnumQuery: Question %##s, DNSServer %#a, cell %d", question->qname.c, &curr->addr, curr->cellIntf);
+ debugf("DomainEnumQuery: Question %##s, DNSServer %#a, cell %d", question->qname.c, &curr->addr, curr->isCell);
bit_set_opaque128(question->validDNSServers, index);
}
}
@@ -11999,7 +12001,7 @@ mDNSlocal void InitDNSSECProxyState(mDNS *const m, DNSQuestion *const question)
// at ValidationRequired setting also.
if (question->qDNSServer)
{
- if (question->qDNSServer->cellIntf)
+ if (question->qDNSServer->isCell)
{
debugf("InitDNSSECProxyState: Turning off validation for %##s (%s); going over cell", question->qname.c, DNSTypeName(question->qtype));
question->ValidationRequired = mDNSfalse;
@@ -12234,7 +12236,7 @@ mDNSexport mStatus mDNS_StopQuery_internal(mDNS *const m, DNSQuestion *const que
mDNSu32 durationMs;
queryName = question->metrics.originalQName ? question->metrics.originalQName : &question->qname;
- isForCell = (question->qDNSServer && question->qDNSServer->cellIntf);
+ isForCell = (question->qDNSServer && question->qDNSServer->isCell);
durationMs = ((m->timenow - question->metrics.firstQueryTime) * 1000) / mDNSPlatformOneSecond;
MetricsUpdateDNSQueryStats(queryName, question->qtype, mDNSNULL, question->metrics.querySendCount, question->metrics.expiredAnswerState, durationMs, isForCell);
}
@@ -13248,11 +13250,14 @@ mDNSexport void mDNS_DeregisterInterface(mDNS *const m, NetworkInterfaceInfo *se
// so that mDNS_RegisterInterface() knows how swiftly it needs to reactivate them
for (q = m->Questions; q; q=q->next)
{
- if (q->InterfaceID == set->InterfaceID) q->ThisQInterval = 0;
- if (!q->InterfaceID || q->InterfaceID == set->InterfaceID)
+ if (mDNSOpaque16IsZero(q->TargetQID)) // Only deactivate multicast quesstions. (Unicast questions are stopped when/if the associated DNS server group goes away.)
{
- q->FlappingInterface2 = q->FlappingInterface1;
- q->FlappingInterface1 = set->InterfaceID; // Keep history of the last two interfaces to go away
+ if (q->InterfaceID == set->InterfaceID) q->ThisQInterval = 0;
+ if (!q->InterfaceID || q->InterfaceID == set->InterfaceID)
+ {
+ q->FlappingInterface2 = q->FlappingInterface1;
+ q->FlappingInterface1 = set->InterfaceID; // Keep history of the last two interfaces to go away
+ }
}
}
diff --git a/mDNSResponder/mDNSCore/mDNSDebug.h b/mDNSResponder/mDNSCore/mDNSDebug.h
index d690fd2b..14b03c9e 100755
--- a/mDNSResponder/mDNSCore/mDNSDebug.h
+++ b/mDNSResponder/mDNSCore/mDNSDebug.h
@@ -166,6 +166,7 @@ extern void udns_validatelists(void *const v);
extern void LogMemCorruption(const char *format, ...);
#else
#define mallocL(X,Y) malloc(Y)
+#define callocL(X,Y) calloc(1, Y)
#define freeL(X,Y) free(Y)
#endif
diff --git a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
index e9f3bb8a..d714de49 100755
--- a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
+++ b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
@@ -1346,15 +1346,14 @@ enum {
};
typedef mDNSu8 MortalityState;
-// scoped values for DNSServer matching
-enum
+// ScopeType values for DNSServer matching
+typedef enum
{
kScopeNone = 0, // DNS server used by unscoped questions
kScopeInterfaceID = 1, // Scoped DNS server used only by scoped questions
- kScopeServiceID = 2, // Service specific DNS server used only by questions
+ kScopeServiceID = 2 // Service specific DNS server used only by questions
// have a matching serviceID
- kScopesMaxCount = 3 // Max count for scopes enum
-};
+} ScopeType;
// Note: DNSSECAware is set if we are able to get a valid response to
// a DNSSEC question. In some cases it is possible that the proxy
@@ -1373,11 +1372,11 @@ typedef struct DNSServer
mDNSu32 flags; // Set when we're planning to delete this from the list
domainname domain; // name->server matching for "split dns"
mDNSs32 penaltyTime; // amount of time this server is penalized
- mDNSu32 scoped; // See the scoped enum above
+ ScopeType scopeType; // See the ScopeType enum above
mDNSu32 timeout; // timeout value for questions
- mDNSu16 resGroupID; // ID of the resolver group that contains this DNSServer
+ mDNSu32 resGroupID; // ID of the resolver group that contains this DNSServer
mDNSu8 retransDO; // Total Retransmissions for queries sent with DO option
- mDNSBool cellIntf; // Resolver from Cellular Interface?
+ mDNSBool isCell; // Resolver from Cellular Interface?
mDNSBool req_A; // If set, send v4 query (DNSConfig allows A queries)
mDNSBool req_AAAA; // If set, send v6 query (DNSConfig allows AAAA queries)
mDNSBool req_DO; // If set, okay to send DNSSEC queries (EDNS DO bit is supported)
@@ -2616,7 +2615,7 @@ extern const mDNSOpaque64 zeroOpaque64;
extern const mDNSOpaque128 zeroOpaque128;
extern mDNSBool StrictUnicastOrdering;
-extern mDNSu8 NumUnicastDNSServers;
+extern int NumUnicastDNSServers;
#if APPLE_OSX_mDNSResponder
extern mDNSu8 NumUnreachableDNSServers;
#endif
@@ -3072,8 +3071,8 @@ extern void mDNS_AddDynDNSHostName(mDNS *m, const domainname *fqdn, mDNSRecordCa
extern void mDNS_RemoveDynDNSHostName(mDNS *m, const domainname *fqdn);
extern void mDNS_SetPrimaryInterfaceInfo(mDNS *m, const mDNSAddr *v4addr, const mDNSAddr *v6addr, const mDNSAddr *router);
extern DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, mDNSs32 serviceID, const mDNSAddr *addr,
- const mDNSIPPort port, mDNSu32 scoped, mDNSu32 timeout, mDNSBool cellIntf, mDNSBool isExpensive, mDNSBool isCLAT46,
- mDNSu16 resGroupID, mDNSBool reqA, mDNSBool reqAAAA, mDNSBool reqDO);
+ const mDNSIPPort port, ScopeType scopeType, mDNSu32 timeout, mDNSBool cellIntf, mDNSBool isExpensive, mDNSBool isCLAT46,
+ mDNSu32 resGroupID, mDNSBool reqA, mDNSBool reqAAAA, mDNSBool reqDO);
extern void PenalizeDNSServer(mDNS *const m, DNSQuestion *q, mDNSOpaque16 responseFlags);
extern void mDNS_AddSearchDomain(const domainname *const domain, mDNSInterfaceID InterfaceID);
@@ -3166,6 +3165,7 @@ extern void mDNSPlatformQsort (void *base, int nel, int width, int (*compa
#define mDNSPlatformMemAllocate(X) mallocL(# X, X)
#else
extern void * mDNSPlatformMemAllocate (mDNSu32 len);
+extern void * mDNSPlatformMemAllocateClear(mDNSu32 len);
#endif
extern void mDNSPlatformMemFree (void *mem);
diff --git a/mDNSResponder/mDNSCore/uDNS.c b/mDNSResponder/mDNSCore/uDNS.c
index 1f9b1543..6214c262 100755
--- a/mDNSResponder/mDNSCore/uDNS.c
+++ b/mDNSResponder/mDNSCore/uDNS.c
@@ -53,7 +53,7 @@ mDNSBool StrictUnicastOrdering = mDNSfalse;
// question. Bit position is the index into the DNS server list. This is done so to try all
// the servers exactly once before giving up. If we could allocate memory in the core, then
// arbitrary limitation of 128 DNSServers can be removed.
-mDNSu8 NumUnicastDNSServers = 0;
+int NumUnicastDNSServers = 0;
#define MAX_UNICAST_DNS_SERVERS 128
#if APPLE_OSX_mDNSResponder
mDNSu8 NumUnreachableDNSServers = 0;
@@ -118,11 +118,11 @@ mDNSlocal void SetRecordRetry(mDNS *const m, AuthRecord *rr, mDNSu32 random)
#define TrueFalseStr(X) ((X) ? "true" : "false")
mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, const mDNSs32 serviceID, const mDNSAddr *addr,
- const mDNSIPPort port, mDNSu32 scoped, mDNSu32 timeout, mDNSBool cellIntf, mDNSBool isExpensive, mDNSBool isCLAT46,
- mDNSu16 resGroupID, mDNSBool reqA, mDNSBool reqAAAA, mDNSBool reqDO)
+ const mDNSIPPort port, ScopeType scopeType, mDNSu32 timeout, mDNSBool isCell, mDNSBool isExpensive, mDNSBool isCLAT46,
+ mDNSu32 resGroupID, mDNSBool reqA, mDNSBool reqAAAA, mDNSBool reqDO)
{
- DNSServer **p = &m->DNSServers;
- DNSServer *tmp = mDNSNULL;
+ DNSServer **p;
+ DNSServer *server;
if ((NumUnicastDNSServers + 1) > MAX_UNICAST_DNS_SERVERS)
{
@@ -133,29 +133,39 @@ mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, cons
if (!d)
d = (const domainname *)"";
- LogInfo("mDNS_AddDNSServer(%d): Adding %#a for %##s, InterfaceID %p, serviceID %u, scoped %d, resGroupID %d req_A %s, req_AAAA %s, cell %s, expensive %s, CLAT46 %s, req_DO %s",
- NumUnicastDNSServers, addr, d->c, interface, serviceID, scoped, resGroupID,
- TrueFalseStr(reqA), TrueFalseStr(reqAAAA), TrueFalseStr(cellIntf), TrueFalseStr(isExpensive), TrueFalseStr(isCLAT46), TrueFalseStr(reqDO));
+ LogInfo("mDNS_AddDNSServer(%d): Adding %#a for %##s, InterfaceID %p, serviceID %u, scopeType %d, resGroupID %d req_A %s, req_AAAA %s, cell %s, expensive %s, CLAT46 %s, req_DO %s",
+ NumUnicastDNSServers, addr, d->c, interface, serviceID, (int)scopeType, resGroupID,
+ TrueFalseStr(reqA), TrueFalseStr(reqAAAA), TrueFalseStr(isCell), TrueFalseStr(isExpensive), TrueFalseStr(isCLAT46), TrueFalseStr(reqDO));
mDNS_CheckLock(m);
- while (*p) // Check if we already have this {interface,address,port,domain} tuple registered + reqA/reqAAAA bits
- {
- if ((*p)->scoped == scoped && (*p)->interface == interface && (*p)->serviceID == serviceID &&
- mDNSSameAddress(&(*p)->addr, addr) && mDNSSameIPPort((*p)->port, port) && SameDomainName(&(*p)->domain, d) &&
- (*p)->req_A == reqA && (*p)->req_AAAA == reqAAAA)
- {
- if (!((*p)->flags & DNSServer_FlagDelete))
+ for (p = &m->DNSServers; (server = *p) != mDNSNULL; p = &server->next)
+ {
+ if ((server->scopeType == scopeType) &&
+ (server->interface == interface) &&
+ (server->serviceID == serviceID) &&
+ mDNSSameAddress(&server->addr, addr) &&
+ mDNSSameIPPort(server->port, port) &&
+ (server->timeout == timeout) &&
+ (!!server->isCell == !!isCell) &&
+ (!!server->isExpensive == !!isExpensive) &&
+ (!!server->isCLAT46 == !!isCLAT46) &&
+ (!!server->req_A == !!reqA) &&
+ (!!server->req_AAAA == !!reqAAAA) &&
+ (!!server->req_DO == !!reqDO) &&
+ SameDomainName(&server->domain, d))
+ {
+ if (!(server->flags & DNSServer_FlagDelete))
debugf("Note: DNS Server %#a:%d for domain %##s (%p) registered more than once", addr, mDNSVal16(port), d->c, interface);
- tmp = *p;
- *p = tmp->next;
- tmp->next = mDNSNULL;
- }
- else
- {
- p=&(*p)->next;
+ *p = server->next;
+ server->next = mDNSNULL;
+ break;
}
}
+ while (*p)
+ {
+ p = &(*p)->next;
+ }
// NumUnicastDNSServers is the count of active DNS servers i.e., ones that are not marked
// with DNSServer_FlagDelete. We should increment it:
@@ -167,61 +177,59 @@ mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, cons
// We have already accounted for it when it was added for the first time. This case happens when
// we add DNS servers with the same address multiple times (mis-configuration).
- if (!tmp || (tmp->flags & DNSServer_FlagDelete))
+ if (!server || (server->flags & DNSServer_FlagDelete))
NumUnicastDNSServers++;
-
- if (tmp)
+ if (server)
{
-#if APPLE_OSX_mDNSResponder
- if (tmp->flags & DNSServer_FlagDelete)
+ if (server->flags & DNSServer_FlagDelete)
{
- tmp->flags &= ~DNSServer_FlagUnreachable;
- }
+#if APPLE_OSX_mDNSResponder
+ server->flags &= ~DNSServer_FlagUnreachable;
#endif
- tmp->flags &= ~DNSServer_FlagDelete;
- *p = tmp; // move to end of list, to ensure ordering from platform layer
+ server->flags &= ~DNSServer_FlagDelete;
+ }
+ *p = server; // move to end of list, to ensure ordering from platform layer
}
else
{
// allocate, add to list
- *p = mDNSPlatformMemAllocate(sizeof(**p));
- if (!*p)
+ server = (DNSServer *)mDNSPlatformMemAllocateClear(sizeof(*server));
+ if (!server)
{
LogMsg("Error: mDNS_AddDNSServer - malloc");
}
else
{
- (*p)->scoped = scoped;
- (*p)->interface = interface;
- (*p)->serviceID = serviceID;
- (*p)->addr = *addr;
- (*p)->port = port;
- (*p)->flags = DNSServer_FlagNew;
- (*p)->timeout = timeout;
- (*p)->cellIntf = cellIntf;
- (*p)->isExpensive = isExpensive;
- (*p)->isCLAT46 = isCLAT46;
- (*p)->req_A = reqA;
- (*p)->req_AAAA = reqAAAA;
- (*p)->req_DO = reqDO;
+ server->scopeType = scopeType;
+ server->interface = interface;
+ server->serviceID = serviceID;
+ server->addr = *addr;
+ server->port = port;
+ server->flags = DNSServer_FlagNew;
+ server->timeout = timeout;
+ server->isCell = isCell;
+ server->isExpensive = isExpensive;
+ server->isCLAT46 = isCLAT46;
+ server->req_A = reqA;
+ server->req_AAAA = reqAAAA;
+ server->req_DO = reqDO;
// We start off assuming that the DNS server is not DNSSEC aware and
// when we receive the first response to a DNSSEC question, we set
// it to true.
- (*p)->DNSSECAware = mDNSfalse;
- (*p)->retransDO = 0;
- AssignDomainName(&(*p)->domain, d);
- (*p)->next = mDNSNULL;
+ server->DNSSECAware = mDNSfalse;
+ server->retransDO = 0;
+ AssignDomainName(&server->domain, d);
+ *p = server;
}
}
- if (*p) {
- (*p)->penaltyTime = 0;
- // We always update the ID (not just when we allocate a new instance) because we could
- // be adding a new non-scoped resolver with a new ID and we want all the non-scoped
- // resolvers belong to the same group.
- (*p)->resGroupID = resGroupID;
+ if (server) {
+ server->penaltyTime = 0;
+ // We always update the ID (not just when we allocate a new instance) because we want
+ // all the resGroupIDs for a particular domain to match.
+ server->resGroupID = resGroupID;
}
- return(*p);
+ return(server);
}
// PenalizeDNSServer is called when the number of queries to the unicast
@@ -1331,7 +1339,7 @@ mDNSlocal void tcpCallback(TCPSocket *sock, void *context, mDNSBool ConnectionEs
// LLQ Polling mode or non-LLQ uDNS over TCP
InitializeDNSMessage(&tcpInfo->request.h, q->TargetQID, (DNSSECQuestion(q) ? DNSSecQFlags : uQueryFlags));
end = putQuestion(&tcpInfo->request, tcpInfo->request.data, tcpInfo->request.data + AbsoluteMaxDNSMessageData, &q->qname, q->qtype, q->qclass);
- if (DNSSECQuestion(q) && q->qDNSServer && !q->qDNSServer->cellIntf)
+ if (DNSSECQuestion(q) && q->qDNSServer && !q->qDNSServer->isCell)
{
if (q->ProxyQuestion)
end = DNSProxySetAttributes(q, &tcpInfo->request.h, &tcpInfo->request, end, tcpInfo->request.data + AbsoluteMaxDNSMessageData);
@@ -4725,7 +4733,7 @@ mDNSexport void uDNS_CheckCurrentQuestion(mDNS *const m)
InitializeDNSMessage(&m->omsg.h, q->TargetQID, (DNSSECQuestion(q) ? DNSSecQFlags : uQueryFlags));
end = putQuestion(&m->omsg, m->omsg.data, m->omsg.data + AbsoluteMaxDNSMessageData, &q->qname, q->qtype, q->qclass);
- if (DNSSECQuestion(q) && !q->qDNSServer->cellIntf)
+ if (DNSSECQuestion(q) && !q->qDNSServer->isCell)
{
if (q->ProxyQuestion)
end = DNSProxySetAttributes(q, &m->omsg.h, &m->omsg, end, m->omsg.data + AbsoluteMaxDNSMessageData);
@@ -4851,14 +4859,14 @@ mDNSexport void uDNS_CheckCurrentQuestion(mDNS *const m)
q->ThisQInterval = LLQ_POLL_INTERVAL;
LogInfo("uDNS_CheckCurrentQuestion: private non polling question for %##s (%s) will be retried in %d ms", q->qname.c, DNSTypeName(q->qtype), q->ThisQInterval);
}
- if (q->qDNSServer->cellIntf)
+ if (q->qDNSServer->isCell)
{
// We don't want to retransmit too soon. Schedule our first retransmisson at
// MIN_UCAST_RETRANS_TIMEOUT seconds.
if (q->ThisQInterval < MIN_UCAST_RETRANS_TIMEOUT)
q->ThisQInterval = MIN_UCAST_RETRANS_TIMEOUT;
}
- debugf("uDNS_CheckCurrentQuestion: Increased ThisQInterval to %d for %##s (%s), cell %d", q->ThisQInterval, q->qname.c, DNSTypeName(q->qtype), q->qDNSServer->cellIntf);
+ debugf("uDNS_CheckCurrentQuestion: Increased ThisQInterval to %d for %##s (%s), cell %d", q->ThisQInterval, q->qname.c, DNSTypeName(q->qtype), q->qDNSServer->isCell);
}
q->LastQTime = m->timenow;
}
@@ -6205,7 +6213,7 @@ mDNSexport mStatus mDNS_StopNATOperation(mDNS *const m, NATTraversalInfo *traver
}
mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, const mDNSInterfaceID interface, const mDNSs32 serviceID, const mDNSAddr *addr,
- const mDNSIPPort port, mDNSu32 scoped, mDNSu32 timeout, mDNSBool cellIntf, mDNSBool isExpensive, mDNSu16 resGroupID,
+ const mDNSIPPort port, ScopeType scopeType, mDNSu32 timeout, mDNSBool isCell, mDNSBool isExpensive, mDNSu32 resGroupID,
mDNSBool reqA, mDNSBool reqAAAA, mDNSBool reqDO)
{
(void) m;
@@ -6214,9 +6222,9 @@ mDNSexport DNSServer *mDNS_AddDNSServer(mDNS *const m, const domainname *d, cons
(void) serviceID;
(void) addr;
(void) port;
- (void) scoped;
+ (void) scopeType;
(void) timeout;
- (void) cellIntf;
+ (void) isCell;
(void) isExpensive;
(void) resGroupID;
(void) reqA;