]> git.saurik.com Git - apple/mdnsresponder.git/commitdiff
mDNSResponder-379.27.1.tar.gz mac-os-x-1081 v379.27.1
authorApple <opensource@apple.com>
Thu, 2 Aug 2012 00:09:21 +0000 (00:09 +0000)
committerApple <opensource@apple.com>
Thu, 2 Aug 2012 00:09:21 +0000 (00:09 +0000)
Makefile
mDNSCore/mDNS.c
mDNSShared/dns_sd.h

index 2cc5f1b9f9f65d0e336c9bcf06819a299869a859..a52bb1ca5eef099de44e020c85372ee5b5a7a688 100644 (file)
--- 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 = 
index 4729d7a8d225446fc6a52d61dddaddfbcdbb966e..75d9b32ce0c2b1f2637389731ced04d78ec0f8b9 100755 (executable)
@@ -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++;
                         }
                     }
                 }
index c491ab7c4ad2369eacfb2cfe18991a5b8b4b2f96..b17944fd78361ec823f6d94452e438befa60b13b 100644 (file)
@@ -77,7 +77,7 @@
  */
 
 #ifndef _DNS_SD_H
-#define _DNS_SD_H 3792700
+#define _DNS_SD_H 3792701
 
 #ifdef  __cplusplus
 extern "C" {