]> git.saurik.com Git - apple/mdnsresponder.git/commitdiff
mDNSResponder-541.tar.gz v541
authorApple <opensource@apple.com>
Tue, 29 Oct 2013 15:04:59 +0000 (15:04 +0000)
committerApple <opensource@apple.com>
Tue, 29 Oct 2013 15:04:59 +0000 (15:04 +0000)
12 files changed:
Makefile
mDNSCore/mDNS.c
mDNSCore/mDNSEmbeddedAPI.h
mDNSMacOSX/BonjourEvents.c
mDNSMacOSX/helper.c
mDNSMacOSX/mDNSMacOSX.c
mDNSMacOSX/mDNSResponder-entitlements.plist
mDNSMacOSX/mDNSResponder.sb
mDNSMacOSX/mDNSResponder.xcodeproj/project.pbxproj
mDNSPosix/mDNSPosix.c
mDNSShared/dns_sd.h
mDNSWindows/mDNSWin32.c

index 35b1b5fe1e0e521cc8f33350b6c48d287bea6c47..b0d94aed57a1d5c82a61fcd0d20eef37310e65b4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@
 
 include $(MAKEFILEPATH)/pb_makefiles/platform.make
 
-MVERS = "mDNSResponder-522.92.1"
+MVERS = "mDNSResponder-541"
 
 DDNSWRITECONFIG = "$(DSTROOT)/Library/Application Support/Bonjour/ddnswriteconfig"
 VER = 
index ccd068075becbbff7f635949f94a41b28301150a..71c7a3957cb610c3263e0c40dee35ade952f852e 100755 (executable)
@@ -5562,13 +5562,26 @@ mDNSexport void mDNS_UpdateAllowSleep(mDNS *const m)
                     }
 
                     // Disallow sleep if there is no sleep proxy server
-                    if (FindSPSInCache1(m, &intf->NetWakeBrowse, mDNSNULL, mDNSNULL) == mDNSNULL)
+                    const CacheRecord *cr = FindSPSInCache1(m, &intf->NetWakeBrowse, mDNSNULL, mDNSNULL);
+                    if ( cr == mDNSNULL)
                     {
                         allowSleep = mDNSfalse;
                         mDNS_snprintf(reason, sizeof(reason), "No sleep proxy server on %s", intf->ifname);
                         LogInfo("mDNS_UpdateAllowSleep: Sleep disabled because %s has no sleep proxy server", intf->ifname);
                         break;
                     }
+                    else if (m->SPSType != 0)
+                    {
+                        mDNSu32 mymetric = LocalSPSMetric(m);
+                        mDNSu32 metric   = SPSMetric(cr->resrec.rdata->u.name.c);
+                        if (metric >= mymetric)
+                        {
+                            allowSleep = mDNSfalse;
+                            mDNS_snprintf(reason, sizeof(reason), "No sleep proxy server with better metric on %s", intf->ifname);
+                            LogInfo("mDNS_UpdateAllowSleep: Sleep disabled because %s has no sleep proxy server with a better metric", intf->ifname);
+                            break;
+                        }
+                    }
                 }
             }
         }
@@ -5577,9 +5590,8 @@ mDNSexport void mDNS_UpdateAllowSleep(mDNS *const m)
     // Call the platform code to enable/disable sleep
     mDNSPlatformSetAllowSleep(m, allowSleep, reason);
 #else
-       (void) m;
+    (void) m;
 #endif /* !defined(IDLESLEEPCONTROL_DISABLED) */
-       
 }
 
 mDNSlocal mDNSBool mDNSUpdateOkToSend(mDNS *const m, AuthRecord *rr, NetworkInterfaceInfo *const intf, mDNSu32 scopeid)
@@ -6237,6 +6249,10 @@ mDNSlocal void BeginSleepProcessing(mDNS *const m)
     else    // If we have at least one advertised service
     {
         NetworkInterfaceInfo *intf;
+
+        // Clear out the SCDynamic entry that stores the external SPS information
+        mDNSPlatformClearSPSMACAddr();
+
         for (intf = GetFirstActiveInterface(m->HostInterfaces); intf; intf = GetFirstActiveInterface(intf->next))
         {
             // Intialize it to false. These values make sense only when SleepState is set to Sleeping.
@@ -12447,8 +12463,15 @@ mDNSlocal void AdvertiseInterface(mDNS *const m, NetworkInterfaceInfo *set)
     primary = FindFirstAdvertisedInterface(m);
     if (!primary) primary = set; // If no existing advertised interface, this new NetworkInterfaceInfo becomes our new primary
 
+    // If interface is marked as a direct link, we can assume the address record is unique
+    // and does not need to go through the probe phase of the probe/announce packet sequence.
+    mDNSu8 recordType = (set->DirectLink ? kDNSRecordTypeKnownUnique : kDNSRecordTypeUnique);
+
+    if (set->DirectLink)
+        LogInfo("AdvertiseInterface: Marking address record as kDNSRecordTypeKnownUnique for %s", set->ifname);
+
     // Send dynamic update for non-linklocal IPv4 Addresses
-    mDNS_SetupResourceRecord(&set->RR_A,     mDNSNULL, set->InterfaceID, kDNSType_A,     kHostNameTTL, kDNSRecordTypeUnique,      AuthRecordAny, mDNS_HostNameCallback, set);
+    mDNS_SetupResourceRecord(&set->RR_A,     mDNSNULL, set->InterfaceID, kDNSType_A,     kHostNameTTL, recordType,      AuthRecordAny, mDNS_HostNameCallback, set);
     mDNS_SetupResourceRecord(&set->RR_PTR,   mDNSNULL, set->InterfaceID, kDNSType_PTR,   kHostNameTTL, kDNSRecordTypeKnownUnique, AuthRecordAny, mDNSNULL, mDNSNULL);
     mDNS_SetupResourceRecord(&set->RR_HINFO, mDNSNULL, set->InterfaceID, kDNSType_HINFO, kHostNameTTL, kDNSRecordTypeUnique,      AuthRecordAny, mDNSNULL, mDNSNULL);
 
@@ -12490,13 +12513,14 @@ mDNSlocal void AdvertiseInterface(mDNS *const m, NetworkInterfaceInfo *set)
 
     set->RR_A.RRSet = &primary->RR_A;           // May refer to self
 
+    mDNS_Register_internal(m, &set->RR_A);
+    mDNS_Register_internal(m, &set->RR_PTR);
+
 #if APPLE_OSX_mDNSResponder
+    // must be after the mDNS_Register_internal() calls so that records have complete rdata fields, etc
     D2D_start_advertising_interface(set);
 #endif // APPLE_OSX_mDNSResponder
 
-    mDNS_Register_internal(m, &set->RR_A);
-    mDNS_Register_internal(m, &set->RR_PTR);
-
     if (!NO_HINFO && m->HIHardware.c[0] > 0 && m->HISoftware.c[0] > 0 && m->HIHardware.c[0] + m->HISoftware.c[0] <= 254)
     {
         mDNSu8 *p = set->RR_HINFO.resrec.rdata->u.data;
index 8a72dc163c5f3fc7a5a514fa02923d3593060dda..785ed3fef63bb37c86a0b8b59415dfa45380d612 100755 (executable)
@@ -2138,6 +2138,8 @@ struct NetworkInterfaceInfo_struct
     mDNSu8 Loopback;                    // Set if this is the loopback interface
     mDNSu8 IgnoreIPv4LL;                // Set if IPv4 Link-Local addresses have to be ignored.
     mDNSu8 SendGoodbyes;                // Send goodbyes on this interface while sleeping
+    mDNSBool DirectLink;                // a direct link, indicating we can skip the probe for
+                                        // address records
 };
 
 #define SLE_DELETE                      0x00000001
@@ -3173,6 +3175,7 @@ extern void       mDNSPlatformSendKeepalive(mDNSAddr *sadd, mDNSAddr *dadd, mDNS
 extern mStatus    mDNSPlatformRetrieveTCPInfo(mDNS *const m, mDNSAddr *laddr, mDNSIPPort *lport, mDNSAddr *raddr,  mDNSIPPort *rport, mDNSTCPInfo *mti);
 extern mStatus    mDNSPlatformGetRemoteMacAddr(mDNS *const m, mDNSAddr *raddr);
 extern mStatus    mDNSPlatformStoreSPSMACAddr(mDNSAddr *spsaddr, char *ifname);
+extern mStatus    mDNSPlatformClearSPSMACAddr(void);
 
 // mDNSPlatformTLSSetupCerts/mDNSPlatformTLSTearDownCerts used by dnsextd
 extern mStatus    mDNSPlatformTLSSetupCerts(void);
@@ -3481,7 +3484,7 @@ extern void FindSPSInCache(mDNS *const m, const DNSQuestion *const q, const Cach
 #define ValidSPSName(X) ((X)[0] >= 5 && mDNSIsDigit((X)[1]) && mDNSIsDigit((X)[2]) && mDNSIsDigit((X)[4]) && mDNSIsDigit((X)[5]))
 #define SPSMetric(X) (!ValidSPSName(X) || PrototypeSPSName(X) ? 1000000 : \
                       ((X)[1]-'0') * 100000 + ((X)[2]-'0') * 10000 + ((X)[4]-'0') * 1000 + ((X)[5]-'0') * 100 + ((X)[7]-'0') * 10 + ((X)[8]-'0'))
-
+#define LocalSPSMetric(X) ( (X)->SPSType * 10000 + (X)->SPSPortability * 100 + (X)->SPSMarginalPower)
 #define SPSFeatures(X) ((X)[0] >= 13 && (X)[12] =='.' ? ((X)[13]-'0') : 0 )
 
 #define MD5_DIGEST_LENGTH   16          /* digest length in bytes */
index 811fa51a693ad728e04e9b81a3fa2b82511647d5..b930818939fcc35fd27d77cbf95ed55b0224fd2c 100644 (file)
@@ -747,16 +747,6 @@ void ServiceBrowserCallback (DNSServiceRef sdRef,
     }
 
     CFStringRef cfServiceName = CFStringCreateWithCString(NULL, serviceName, kCFStringEncodingUTF8);
-    if (cfServiceName == NULL)
-    {
-        static int msg_count = 0;
-        if (msg_count < 1000)
-        {
-            asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s:%s Can not create CFString for serviceName %s", sPluginIdentifier, __FUNCTION__, serviceName);
-            msg_count++;
-        }
-        return;
-    }
 
     if (flags & kDNSServiceFlagsAdd)
     {
index 813ab52942a49057f3d46737f61e3ad2a00e9511..36b92f8ec4341d210b13bb9917337fafe72bd078 100644 (file)
@@ -2784,10 +2784,14 @@ kern_return_t do_mDNSStoreSPSMACAddress(__unused mach_port_t port, int family, v
 {
     ethaddr_t              eth;
     char                   spsip[INET6_ADDRSTRLEN];
-    int                    ret   = 0;
-    CFStringRef            sckey = NULL;
-    SCDynamicStoreRef      store = NULL;
-    CFMutableDictionaryRef dict  = NULL;
+    int                    ret        = 0;
+    CFStringRef            sckey      = NULL;
+    SCDynamicStoreRef      store      = SCDynamicStoreCreate(NULL, CFSTR("mDNSResponder:StoreSPSMACAddress"), NULL, NULL);
+    SCDynamicStoreRef      ipstore    = SCDynamicStoreCreate(NULL, CFSTR("mDNSResponder:GetIPv6Addresses"), NULL, NULL);
+    CFMutableDictionaryRef dict       = NULL;
+    CFStringRef            entityname = NULL;
+    CFDictionaryRef        ipdict     = NULL;
+    CFArrayRef             addrs      = NULL;
 
     if (!authorized(&token))
     {
@@ -2795,6 +2799,12 @@ kern_return_t do_mDNSStoreSPSMACAddress(__unused mach_port_t port, int family, v
         return kmDNSHelperNotAuthorized;
     }
 
+    if ((store == NULL) || (ipstore == NULL))
+    {
+        helplog(ASL_LEVEL_ERR, "Unable to access SC Dynamic Store");
+        return KERN_FAILURE;
+    }
+
     // Get the MAC address of the Sleep Proxy Server
     memset(eth, 0, sizeof(eth));
     ret = do_mDNSGetRemoteMAC(port, family, spsaddr, eth, token);
@@ -2816,7 +2826,7 @@ kern_return_t do_mDNSStoreSPSMACAddress(__unused mach_port_t port, int family, v
 
     CFStringRef macaddr = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%02x:%02x:%02x:%02x:%02x:%02x"), eth[0], eth[1], eth[2], eth[3], eth[4], eth[5]);
     CFDictionarySetValue(dict, CFSTR("MACAddress"), macaddr);
-    CFRelease(macaddr);
+    if (NULL != macaddr) CFRelease(macaddr);
 
     if( NULL == inet_ntop(family, (void *)spsaddr, spsip, sizeof(spsip)))
     {
@@ -2827,17 +2837,30 @@ kern_return_t do_mDNSStoreSPSMACAddress(__unused mach_port_t port, int family, v
 
     CFStringRef ipaddr = CFStringCreateWithCString(NULL, spsip, kCFStringEncodingUTF8);
     CFDictionarySetValue(dict, CFSTR("IPAddress"), ipaddr);
-    CFRelease(ipaddr);
+    if (NULL != ipaddr) CFRelease(ipaddr);
 
+    // Get the current IPv6 addresses on this interface and store them so NAs can be sent on wakeup
+    if ((entityname = CFStringCreateWithFormat(NULL, NULL, CFSTR("State:/Network/Interface/%s/IPv6"), ifname)) != NULL)
+    {
+        if ((ipdict = SCDynamicStoreCopyValue(ipstore, entityname)) != NULL)
+        {
+            if((addrs = CFDictionaryGetValue(ipdict, CFSTR("Addresses"))) != NULL)
+            {
+                addrs = CFRetain(addrs);
+                CFDictionarySetValue(dict, CFSTR("RegisteredAddresses"), addrs);
+            }
+        }
+    }
     SCDynamicStoreSetValue(store, sckey, dict);
 
 fin:
-    if (NULL != store)
-        CFRelease(store);
-    if (NULL != sckey)
-        CFRelease(sckey);
-    if (NULL != dict)
-        CFRelease(dict);
+    if (store)      CFRelease(store);
+    if (ipstore)    CFRelease(ipstore);
+    if (sckey)      CFRelease(sckey);
+    if (dict)       CFRelease(dict);
+    if (ipdict)     CFRelease(ipdict);
+    if (entityname) CFRelease(entityname);
+    if (addrs)      CFRelease(addrs);
 
     update_idle_timer();
     return ret;
index ed130e9fec0a29596247783fa5607037f291654e..6547b10038d143a872e98322b87ca4dec2518a54 100644 (file)
@@ -209,9 +209,14 @@ mDNSexport void D2D_start_advertising_interface(NetworkInterfaceInfo *interface)
     // via the D2D interface layer.
     if (interface->InterfaceID == AWDLInterfaceID)
     {
-        LogInfo("D2D_start_advertising_interface: %s", interface->ifname);
-        external_start_advertising_service(&interface->RR_A.resrec, NULL);
-        external_start_advertising_service(&interface->RR_PTR.resrec, NULL);
+        // only log if we have a valid record to start advertising
+        if (interface->RR_A.resrec.RecordType || interface->RR_PTR.resrec.RecordType)
+            LogInfo("D2D_start_advertising_interface: %s", interface->ifname);
+
+        if (interface->RR_A.resrec.RecordType)
+            external_start_advertising_service(&interface->RR_A.resrec, NULL);
+        if (interface->RR_PTR.resrec.RecordType)
+            external_start_advertising_service(&interface->RR_PTR.resrec, NULL);
     }
 }
 
@@ -219,7 +224,10 @@ mDNSexport void D2D_stop_advertising_interface(NetworkInterfaceInfo *interface)
 {
     if (interface->InterfaceID == AWDLInterfaceID)
     {
-        LogInfo("D2D_stop_advertising_interface: %s", interface->ifname);
+        // only log if we have a valid record to stop advertising
+        if (interface->RR_A.resrec.RecordType || interface->RR_PTR.resrec.RecordType)
+            LogInfo("D2D_stop_advertising_interface: %s", interface->ifname);
+
         if (interface->RR_A.resrec.RecordType)
             external_stop_advertising_service(&interface->RR_A.resrec, NULL);
         if (interface->RR_PTR.resrec.RecordType)
@@ -240,10 +248,9 @@ mDNSlocal void PrintHex(mDNSu8 *data, mDNSu16 len);
 typedef struct D2DRecordListElem
 {
     struct D2DRecordListElem *next;
+    AuthRecord               ar;
     D2DServiceInstance       instanceHandle;
     D2DTransportType         transportType;
-    AuthRecord               ar;    // must be last in the structure to accomodate extra space
-                                    // allocated for large records.
 } D2DRecordListElem;
 
 static D2DRecordListElem *D2DRecords = NULL; // List of records returned with D2DServiceFound events
@@ -856,11 +863,6 @@ mDNSexport void external_start_advertising_service(const ResourceRecord *const r
     if (resourceRecord->rrtype == kDNSType_SRV)
         mDNSUpdatePacketFilter(NULL);
 
-    if (resourceRecord->rrtype == kDNSServiceType_A || resourceRecord->rrtype == kDNSServiceType_AAAA)
-    {
-        LogInfo("external_start_advertising_service: ignoring address record");
-        return;
-    }
     rhs = DNSNameCompressionBuildLHS(&lower, resourceRecord->rrtype);
     end = DNSNameCompressionBuildRHS(rhs, resourceRecord);
     PrintHelper(__func__, compression_lhs, rhs - compression_lhs, rhs, end - rhs);
@@ -895,11 +897,6 @@ mDNSexport void external_stop_advertising_service(const ResourceRecord *const re
     if (resourceRecord->rrtype == kDNSType_SRV)
         mDNSUpdatePacketFilter(resourceRecord);
 
-    if (resourceRecord->rrtype == kDNSServiceType_A || resourceRecord->rrtype == kDNSServiceType_AAAA)
-    {
-        LogInfo("external_stop_advertising_service: ignoring address record");
-        return;
-    }
     rhs = DNSNameCompressionBuildLHS(&lower, resourceRecord->rrtype);
     end = DNSNameCompressionBuildRHS(rhs, resourceRecord);
     PrintHelper(__func__, compression_lhs, rhs - compression_lhs, rhs, end - rhs);
@@ -2090,11 +2087,13 @@ mDNSexport void myKQSocketCallBack(int s1, short filter, void *context)
 
         // Note: When handling multiple packets in a batch, MUST reset InterfaceID before handling each packet
         mDNSInterfaceID InterfaceID = mDNSNULL;
-        //NetworkInterfaceInfo *intf = m->HostInterfaces;
-        //while (intf && strcmp(intf->ifname, packetifname)) intf = intf->next;
-
         NetworkInterfaceInfoOSX *intf = m->p->InterfaceList;
-        while (intf && strcmp(intf->ifinfo.ifname, packetifname)) intf = intf->next;
+        while (intf) 
+        {
+            if (intf->Exists && !strcmp(intf->ifinfo.ifname, packetifname))
+                break;
+            intf = intf->next;
+        }
 
         // When going to sleep we deregister all our interfaces, but if the machine
         // takes a few seconds to sleep we may continue to receive multicasts
@@ -3313,6 +3312,25 @@ mDNSexport void mDNSPlatformSendKeepalive(mDNSAddr *sadd, mDNSAddr *dadd, mDNSIP
     mDNSSendKeepalive(sadd->ip.v6.b, dadd->ip.v6.b, lport->NotAnInteger, rport->NotAnInteger, seq, ack, win);
 }
 
+mDNSexport mStatus  mDNSPlatformClearSPSMACAddr(void)
+{
+    SCDynamicStoreRef store = NULL;
+    CFStringRef  entityname = NULL;
+
+    if ((store = SCDynamicStoreCreate(NULL, CFSTR("mDNSResponder:ClearSPSMACAddress"), NULL, NULL)))
+    {
+        if ((entityname = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%s%s%s"), "State:/Network/Interface/", "[^/]", "/BonjourSleepProxyAddress")))
+        {
+            if (SCDynamicStoreRemoveValue(store, entityname) == false)
+                LogMsg("mDNSPlatformClearSPSMACAddr: Unable to remove key");
+        }
+    }
+
+    if (entityname) CFRelease(entityname);
+    if (store)      CFRelease(store);
+    return KERN_SUCCESS;
+}
+
 mDNSexport mStatus mDNSPlatformStoreSPSMACAddr(mDNSAddr *spsaddr, char *ifname)
 {
     int family = (spsaddr->type == mDNSAddrType_IPv4) ? AF_INET : AF_INET6;
@@ -4023,6 +4041,7 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(mDNS *const m, struct ifad
     i->ifinfo.McastTxRx   = mDNSfalse; // For now; will be set up later at the end of UpdateInterfaceList
     i->ifinfo.Loopback    = ((ifa->ifa_flags & IFF_LOOPBACK) != 0) ? mDNStrue : mDNSfalse;
     i->ifinfo.IgnoreIPv4LL = ((eflags & IFEF_ARPLL) != 0) ? mDNSfalse : mDNStrue;
+    i->ifinfo.DirectLink  = (eflags & IFEF_DIRECTLINK) ? mDNStrue: mDNSfalse;
 
     i->next            = mDNSNULL;
     i->m               = m;
@@ -4030,7 +4049,6 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(mDNS *const m, struct ifad
     i->Flashing        = mDNSfalse;
     i->Occulting       = mDNSfalse;
     i->D2DInterface    = (eflags & IFEF_LOCALNET_PRIVATE) ? mDNStrue: mDNSfalse;
-    i->DirectLink      = (eflags & IFEF_DIRECTLINK) ? mDNStrue: mDNSfalse;
     if (eflags & IFEF_AWDL)
     {
         AWDLInterfaceID = i->ifinfo.InterfaceID;
@@ -5412,7 +5430,7 @@ mDNSlocal int SetupActiveInterfaces(mDNS *const m, mDNSs32 utc)
                 // mDNS_RegisterInterface() changes the probe delay from 1/2 second to 5 seconds and
                 // logs a warning message to system.log noting frequent interface transitions.
                 // Same logic applies when IFEF_DIRECTLINK flag is set on the interface.
-                if ((strncmp(i->ifinfo.ifname, "p2p", 3) == 0) || i->DirectLink)
+                if ((strncmp(i->ifinfo.ifname, "p2p", 3) == 0) || i->ifinfo.DirectLink)
                 {
                     LogInfo("SetupActiveInterfaces: %s interface registering %s %s", i->ifinfo.ifname,
                             i->Flashing               ? " (Flashing)"  : "",
@@ -5534,7 +5552,7 @@ mDNSlocal int ClearInactiveInterfaces(mDNS *const m, mDNSs32 utc)
                 // stale data returned to the application even after the interface is removed. The application
                 // then starts to send data but the new interface is not yet created.
                 // Same logic applies when IFEF_DIRECTLINK flag is set on the interface.
-                if ((strncmp(i->ifinfo.ifname, "p2p", 3) == 0) || i->DirectLink)
+                if ((strncmp(i->ifinfo.ifname, "p2p", 3) == 0) || i->ifinfo.DirectLink)
                 {
                     LogInfo("ClearInactiveInterfaces: %s interface deregistering %s %s", i->ifinfo.ifname,
                             i->Flashing               ? " (Flashing)"  : "",
@@ -7113,6 +7131,25 @@ mDNSlocal void SetSPS(mDNS *const m)
     // computed value (currently 40 "Primary Network Infrastructure Software" or 80 "Incidentally Available Software")
     if (sps && OfferSleepProxyService && OfferSleepProxyService < 100) sps = OfferSleepProxyService;
 
+#ifdef NO_APPLETV_SLEEP_PROXY_ON_WIFI
+    // AppleTVs are not reliable sleep proxy servers on WiFi. Do not offer to be a BSP if the WiFi interface is active.
+    if (IsAppleTV())
+    {
+        NetworkInterfaceInfo *intf  = mDNSNULL;
+        mDNSEthAddr           bssid = zeroEthAddr;
+        for (intf = GetFirstActiveInterface(m->HostInterfaces); intf; intf = GetFirstActiveInterface(intf->next))
+        {
+            bssid = GetBSSID(intf->ifname);
+            if (!mDNSSameEthAddress(&bssid, &zeroEthAddr))
+            {
+                LogMsg("SetSPS: AppleTV on WiFi - not advertising BSP services");
+                sps = 0;
+                break;
+            }
+        }
+    }
+#endif  //  NO_APPLETV_SLEEP_PROXY_ON_WIFI
+
     mDNSCoreBeSleepProxyServer(m, sps, SPMetricPortability, SPMetricMarginalPower, SPMetricTotalPower, SPMetricFeatures);
 }
 
index 21b081088e9fbfd6e2d580562f8f122722403f2d..bb3f05e853f815b2a6cf3d6187f58504f503dfd9 100644 (file)
@@ -18,5 +18,7 @@
     <true/>
     <key>com.apple.private.snhelper</key>
     <true/>
+    <key>com.apple.telephony.cupolicy-monitor-access</key>
+    <true/>
 </dict>
 </plist>
index 65b31ba8decf52cee7178fdd4ebd48af28b901fe..eee623c81a70cb59e9a72cecc501165268eded72 100644 (file)
@@ -65,6 +65,7 @@
        (global-name "com.apple.wifi.manager")
        (global-name "com.apple.commcenter.cupolicy.xpc")
        (global-name "com.apple.blued")
+       (global-name "com.apple.mobilegestalt.xpc")
        (global-name "com.apple.snhelper"))
 
 (allow mach-register
index 597478f563fdcadac00d10bb65d5c78badbf326b..a5c44ef39e525fad8687ece6558fa8e764bd0cd1 100644 (file)
                                );
                                GCC_STRICT_ALIASING = YES;
                                GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
                                GCC_WARN_ABOUT_RETURN_TYPE = YES;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                        "$(inherited)",
                                );
                                GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
                                GCC_WARN_ABOUT_RETURN_TYPE = YES;
                                GCC_WARN_UNINITIALIZED_AUTOS = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
                                        "_BUILDING_XCODE_PROJECT_=1",
                                );
                                GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
                                MVERS = "\"(Engineering Build)\"";
                                OTHER_CFLAGS = (
                                        "-DUSE_SYSTEMCONFIGURATION_PRIVATE_HEADERS",
index 9af8ebc01ec86d0442a9b3bd98fe3ac8b39e6291..3218a75b19364bb5d9c79d05e6ee7914fe0cd7b6 100755 (executable)
@@ -882,6 +882,10 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
 #endif
     }
 
+    // If interface is a direct link, address record will be marked as kDNSRecordTypeKnownUnique
+    // and skip the probe phase of the probe/announce packet sequence.
+    intf->coreIntf.DirectLink = mDNSfalse;
+
     // The interface is all ready to go, let's register it with the mDNS core.
     if (err == 0)
         err = mDNS_RegisterInterface(m, &intf->coreIntf, mDNSfalse);
@@ -1521,6 +1525,11 @@ mDNSexport mStatus    mDNSPlatformStoreSPSMACAddr(mDNSAddr *spsaddr, char *ifnam
     return mStatus_NoError;
 }
 
+mDNSexport mStatus    mDNSPlatformClearSPSMACAddr(void)
+{
+    return mStatus_NoError;
+}
+
 mDNSexport mDNSu16 mDNSPlatformGetUDPPort(UDPSocket *sock)
 {
     (void) sock; // unused
index 88ca76965aebf37bf17921acd65fb595863d34fa..70ca06ea64be188e4c7977859c1048b8f83e625e 100644 (file)
@@ -77,7 +77,7 @@
  */
 
 #ifndef _DNS_SD_H
-#define _DNS_SD_H 5229201
+#define _DNS_SD_H 5410000
 
 #ifdef  __cplusplus
 extern "C" {
index 73954e601e651ea028a876936975e5026dddd2b3..bfab745f25c9b99bb6e134fea24154082e2b3186 100755 (executable)
@@ -2167,6 +2167,10 @@ mDNSexport  mStatus    mDNSPlatformStoreSPSMACAddr(mDNSAddr *spsaddr, char *ifna
        (void) ifname;  // Unused
        }
 
+mDNSexport  mStatus    mDNSPlatformClearSPSMACAddr(void)
+       {
+       }
+
 mDNSexport mStatus mDNSPlatformRetrieveTCPInfo(mDNS *const m, mDNSAddr *laddr, mDNSIPPort *lport, mDNSAddr *raddr, mDNSIPPort *rport, mDNSTCPInfo *mti)
        {
        (void) m;       // Unused
@@ -2879,6 +2883,10 @@ mDNSlocal mStatus        SetupInterface( mDNS * const inMDNS, const struct ifaddrs *inI
                require_noerr( err, exit );
        }
 
+    // If interface is a direct link, address record will be marked as kDNSRecordTypeKnownUnique
+    // and skip the probe phase of the probe/announce packet sequence.
+    ifd->interfaceInfo.DirectLink = mDNSfalse;
+
        err = mDNS_RegisterInterface( inMDNS, &ifd->interfaceInfo, mDNSfalse );
        require_noerr( err, exit );
        ifd->hostRegistered = mDNStrue;