From: Apple Date: Thu, 2 Aug 2012 00:09:21 +0000 (+0000) Subject: mDNSResponder-379.27.1.tar.gz X-Git-Tag: mac-os-x-1081^0 X-Git-Url: https://git.saurik.com/apple/mdnsresponder.git/commitdiff_plain/e257a3439f1119037d632a4fa65ed447dc856a78 mDNSResponder-379.27.1.tar.gz --- diff --git a/Makefile b/Makefile index 2cc5f1b..a52bb1c 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ include $(MAKEFILEPATH)/pb_makefiles/platform.make -MVERS = "mDNSResponder-379.27" +MVERS = "mDNSResponder-379.27.1" DDNSWRITECONFIG = "$(DSTROOT)/Library/Application Support/Bonjour/ddnswriteconfig" VER = diff --git a/mDNSCore/mDNS.c b/mDNSCore/mDNS.c index 4729d7a..75d9b32 100755 --- a/mDNSCore/mDNS.c +++ b/mDNSCore/mDNS.c @@ -5507,12 +5507,56 @@ mDNSlocal void SendSleepGoodbyes(mDNS *const m) SendResponses(m); } +mDNSlocal mDNSBool skipSameSubnetRegistration(mDNS *const m, mDNSInterfaceID *regID, mDNSu32 count, mDNSInterfaceID intfid) +{ + NetworkInterfaceInfo *intf; + NetworkInterfaceInfo *newIntf; + mDNSu32 i; + + newIntf = FirstInterfaceForID(m, intfid); + if (newIntf == mDNSNULL) + { + LogMsg("%s : Could not get Interface for id %d", __func__, intfid); + return (mDNSfalse); + } + + for ( i = 0; i < count; i++) + { + intf = FirstInterfaceForID(m, regID[i]); + if (intf == mDNSNULL) + { + LogMsg("%s : Could not get Interface for id %d", __func__, regID[i]); + return (mDNSfalse); + } + + if ((newIntf->ip.type == mDNSAddrType_IPv4) && + (((intf->ip.ip.v4.NotAnInteger ^ newIntf->ip.ip.v4.NotAnInteger) & intf->mask.ip.v4.NotAnInteger) == 0)) + { + LogSPS("%s : Already registered for the same subnet (IPv4) for interface %s", __func__, intf->ifname); + return (mDNStrue); + } + + if ( (newIntf->ip.type == mDNSAddrType_IPv6) && + ((((intf->ip.ip.v6.l[0] ^ newIntf->ip.ip.v6.l[0]) & intf->mask.ip.v6.l[0]) == 0) && + (((intf->ip.ip.v6.l[1] ^ newIntf->ip.ip.v6.l[1]) & intf->mask.ip.v6.l[1]) == 0) && + (((intf->ip.ip.v6.l[2] ^ newIntf->ip.ip.v6.l[2]) & intf->mask.ip.v6.l[2]) == 0) && + (((intf->ip.ip.v6.l[3] ^ newIntf->ip.ip.v6.l[3]) & intf->mask.ip.v6.l[3]) == 0))) + { + LogSPS("%s : Already registered for the same subnet (IPv6) for interface %s", __func__, intf->ifname); + return (mDNStrue); + } + } + return (mDNSfalse); +} + // BeginSleepProcessing is called, with the lock held, from either mDNS_Execute or mDNSCoreMachineSleep mDNSlocal void BeginSleepProcessing(mDNS *const m) { mDNSBool SendGoodbyes = mDNStrue; const CacheRecord *sps[3] = { mDNSNULL }; mDNSOpaque64 updateIntID = zeroOpaque64; + mDNSInterfaceID registeredIntfIDS[128]; + mDNSu32 registeredCount = 0; m->NextScheduledSPRetry = m->timenow; @@ -5524,6 +5568,14 @@ mDNSlocal void BeginSleepProcessing(mDNS *const m) for (intf = GetFirstActiveInterface(m->HostInterfaces); intf; intf = GetFirstActiveInterface(intf->next)) { if (!intf->NetWake) LogSPS("BeginSleepProcessing: %-6s not capable of magic packet wakeup", intf->ifname); + + // Check if we have already registered with a sleep proxy for this subnet + if (skipSameSubnetRegistration(m, registeredIntfIDS, registeredCount, intf->InterfaceID)) + { + LogSPS("%s : Skipping sleep proxy registration on %s", __func__, intf->ifname); + continue; + } + #if APPLE_OSX_mDNSResponder else if (ActivateLocalProxy(m, intf->ifname) == mStatus_NoError) { @@ -5532,6 +5584,9 @@ mDNSlocal void BeginSleepProcessing(mDNS *const m) // This will leave m->SleepState set to SleepState_Transferring, // which is okay because with no outstanding resolves, or updates in flight, // mDNSCoreReadyForSleep() will conclude correctly that all the updates have already completed + + registeredIntfIDS[registeredCount] = intf->InterfaceID; + registeredCount++; } #endif // APPLE_OSX_mDNSResponder else @@ -5574,6 +5629,10 @@ mDNSlocal void BeginSleepProcessing(mDNS *const m) mDNS_SetupQuestion(&intf->NetWakeResolve[i], intf->InterfaceID, &sps[i]->resrec.rdata->u.name, kDNSType_SRV, NetWakeResolve, intf); intf->NetWakeResolve[i].ReturnIntermed = mDNStrue; mDNS_StartQuery_internal(m, &intf->NetWakeResolve[i]); + + // If we are registering with a Sleep Proxy for a new subnet, add it to our list + registeredIntfIDS[registeredCount] = intf->InterfaceID; + registeredCount++; } } } diff --git a/mDNSShared/dns_sd.h b/mDNSShared/dns_sd.h index c491ab7..b17944f 100644 --- a/mDNSShared/dns_sd.h +++ b/mDNSShared/dns_sd.h @@ -77,7 +77,7 @@ */ #ifndef _DNS_SD_H -#define _DNS_SD_H 3792700 +#define _DNS_SD_H 3792701 #ifdef __cplusplus extern "C" {