]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCNetworkInterface.c
configd-1061.40.2.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCNetworkInterface.c
index ae1622afc58da395b0baf7f85c8b81962fbb57b5..32c6c61f2441e9da698d9b9a79726a6a1cc18ff0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2017 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2019 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  *
@@ -33,7 +33,6 @@
  */
 
 
-#include <Availability.h>
 #include <TargetConditionals.h>
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFRuntime.h>
 #define kPCIThunderboltString          "PCI-Thunderbolt"
 #endif
 
+#if    TARGET_OS_OSX
+#ifndef        kUSBSupportsIPhoneOS
+#define kUSBSupportsIPhoneOS           "SupportsIPhoneOS"
+#endif // !kUSBSupportsIPhoneOS
+#endif // TARGET_OS_OSX
+
 #ifndef        kIOUserEthernetInterfaceRoleKey
 #define        kIOUserEthernetInterfaceRoleKey "InterfaceRole"
 #endif
 #include <pthread.h>
 #include <ifaddrs.h>
 
+/* CrashReporter "Application Specific Information" */
+#include <CrashReporterClient.h>
+
 
 static CFStringRef     copy_interface_string                           (CFBundleRef bundle, CFStringRef key, Boolean localized);
 static CFStringRef     __SCNetworkInterfaceCopyDescription             (CFTypeRef cf);
@@ -103,12 +111,12 @@ static void               __SCNetworkInterfaceDeallocate                  (CFTypeRef cf);
 static Boolean         __SCNetworkInterfaceEqual                       (CFTypeRef cf1, CFTypeRef cf2);
 static CFHashCode      __SCNetworkInterfaceHash                        (CFTypeRef cf);
 static void            __SCNetworkInterfaceCacheAdd                    (CFStringRef bsdName, CFArrayRef matchingInterfaces);
-static Boolean         __SCNetworkInterfaceCacheIsOpen                 ();
+static Boolean         __SCNetworkInterfaceCacheIsOpen                 (void);
 static CFArrayRef      __SCNetworkInterfaceCacheCopy                   (CFStringRef bsdName);
 
 
 enum {
-       kSortInternalModem,
+       kSortInternalModem      = 0,
        kSortUSBModem,
        kSortModem,
        kSortBluetooth,
@@ -127,6 +135,7 @@ enum {
        kSortBluetoothPAN_NAP,
        kSortBluetoothPAN_U,
        kSortThunderbolt,
+       kSortCarPlay,
        kSortBond,
        kSortBridge,
        kSortVLAN,
@@ -134,6 +143,34 @@ enum {
 };
 
 
+static const char *sortOrderName[]     = {
+       "InternalModem",
+       "USBModem",
+       "Modem",
+       "Bluetooth",
+       "IrDA",
+       "SerialPort",
+       "WWAN",
+       "EthernetPPP",
+       "AirportPPP",
+       "Ethernet",
+       "FireWire",
+       "AirPort",
+       "OtherWireless",
+       "Tethered",
+       "WWANEthernet",
+       "BluetoothPAN_GN",
+       "BluetoothPAN_NAP",
+       "BluetoothPAN_U",
+       "Thunderbolt",
+       "CarPlay",
+       "Bond",
+       "Bridge",
+       "VLAN",
+       "Unknown"
+};
+
+
 const CFStringRef kSCNetworkInterfaceType6to4          = CFSTR("6to4");
 const CFStringRef kSCNetworkInterfaceTypeBluetooth     = CFSTR("Bluetooth");
 const CFStringRef kSCNetworkInterfaceTypeBond          = CFSTR("Bond");
@@ -225,7 +262,7 @@ static const struct {
        { &kSCNetworkInterfaceTypePPTP          , NULL                , FALSE,  doPPP,          &kSCValNetInterfaceSubTypePPTP,         doNone                                  },
 #pragma GCC diagnostic pop
        { &kSCNetworkInterfaceTypeSerial        , &kSCEntNetModem     , FALSE,  doPPP,          &kSCValNetInterfaceSubTypePPPSerial,    doNone                                  },
-       { &kSCNetworkInterfaceTypeVLAN          , &kSCEntNetEthernet  , TRUE ,  doNone,         NULL,                                   doDNS|doIPv4|doIPv6|doProxies|doSMB     },
+       { &kSCNetworkInterfaceTypeVLAN          , &kSCEntNetEthernet  , TRUE ,  doNone,         &kSCValNetInterfaceSubTypePPPoE,        doDNS|doIPv4|doIPv6|doProxies|doSMB     },
        { &kSCNetworkInterfaceTypeVPN           , &kSCEntNetVPN       , FALSE,  doNone,         NULL,                                   doDNS|doIPv4|doIPv6|doProxies|doSMB     },
        { &kSCNetworkInterfaceTypeWWAN          , &kSCEntNetModem     , FALSE,  doPPP,          &kSCValNetInterfaceSubTypePPPSerial,    doNone                                  },
        // =====================================  =================== ========== =============== ======================================= =========================================
@@ -333,6 +370,11 @@ __SCNetworkInterfaceCopyFormattingDescription(CFTypeRef cf, CFDictionaryRef form
        if (interfacePrivate->hidden) {
                CFStringAppendFormat(result, NULL, CFSTR(", hidden = TRUE"));
        }
+#if    TARGET_OS_IPHONE
+       if (interfacePrivate->trustRequired) {
+               CFStringAppendFormat(result, NULL, CFSTR(", trust required = TRUE"));
+       }
+#endif // TARGET_OS_IPHONE
        if (interfacePrivate->location != NULL) {
                CFStringAppendFormat(result, NULL, CFSTR(", location = %@"), interfacePrivate->location);
        }
@@ -380,9 +422,15 @@ __SCNetworkInterfaceCopyFormattingDescription(CFTypeRef cf, CFDictionaryRef form
                CFStringAppendFormat(result, NULL, CFSTR(", action = %@"), interfacePrivate->configurationAction);
        }
        if (interfacePrivate->overrides != NULL) {
-               CFStringAppendFormat(result, formatOptions, CFSTR(", overrides = %p"), interfacePrivate->overrides);
+               CFStringRef     str;
+
+               str = _SCCopyDescription(interfacePrivate->overrides, formatOptions);
+               CFStringAppendFormat(result, formatOptions, CFSTR(", overrides = %@"), str);
+               CFRelease(str);
        }
-       CFStringAppendFormat(result, NULL, CFSTR(", order = %d"), interfacePrivate->sort_order);
+       CFStringAppendFormat(result, NULL, CFSTR(", order = %d (%s)"),
+                            interfacePrivate->sort_order,
+                            interfacePrivate->sort_order <= kSortUnknown ? sortOrderName[interfacePrivate->sort_order] : "?");
        if (interfacePrivate->prefs != NULL) {
                CFStringAppendFormat(result, NULL, CFSTR(", prefs = %p"), interfacePrivate->prefs);
        }
@@ -1329,7 +1377,7 @@ pci_slot(io_registry_entry_t interface, CFTypeRef *pci_slot_name)
                                        if (*pci_slot_name != NULL) CFRelease(*pci_slot_name);
                                        *pci_slot_name = parent_pci_slot_name;
                                } else {
-                                       CFRelease(parent_pci_slot_name);
+                                       if (parent_pci_slot_name != NULL) CFRelease(parent_pci_slot_name);
                                }
                        }
 
@@ -1806,6 +1854,10 @@ processNetworkInterface(SCNetworkInterfacePrivateRef     interfacePrivate,
                                                        interfacePrivate->interface_type        = kSCNetworkInterfaceTypeEthernet;
                                                        interfacePrivate->entity_type           = kSCValNetInterfaceTypeEthernet;
                                                        interfacePrivate->sort_order            = kSortBluetoothPAN_U;
+                                               } else if (CFEqual(val, CFSTR("CarPlay"))) {
+                                                       interfacePrivate->interface_type        = kSCNetworkInterfaceTypeEthernet;
+                                                       interfacePrivate->entity_type           = kSCValNetInterfaceTypeEthernet;
+                                                       interfacePrivate->sort_order            = kSortCarPlay;
                                                }
                                        }
 
@@ -1813,6 +1865,25 @@ processNetworkInterface(SCNetworkInterfacePrivateRef     interfacePrivate,
                                }
                        }
 
+#if    TARGET_OS_OSX
+                       if (interfacePrivate->interface_type == NULL) {
+                               val = IORegistryEntrySearchCFProperty(interface,
+                                                                     kIOServicePlane,
+                                                                     CFSTR(kUSBSupportsIPhoneOS),
+                                                                     NULL,
+                                                                     kIORegistryIterateRecursively | kIORegistryIterateParents);
+                               if (val != NULL) {
+                                       if (isA_CFBoolean(val) && CFBooleanGetValue(val)) {
+                                               interfacePrivate->interface_type        = kSCNetworkInterfaceTypeEthernet;
+                                               interfacePrivate->entity_type           = kSCValNetInterfaceTypeEthernet;
+                                               interfacePrivate->sort_order            = kSortTethered;
+                                       }
+
+                                       CFRelease(val);
+                               }
+                       }
+#endif // TARGET_OS_OSX
+
                        if (interfacePrivate->interface_type == NULL) {
                                str = IODictionaryCopyCFStringValue(bus_dict, CFSTR("name"));
                                if (str != NULL) {
@@ -2531,8 +2602,6 @@ createInterface(io_registry_entry_t interface, processInterface func,
        CFTypeRef                       val;
 
        // Keys of interest
-#if    TARGET_OS_SIMULATOR || 1        // while waiting for rdar://19431723
-#else
        const CFStringRef interface_dict_keys[] = {
                CFSTR(kIOInterfaceType),
                CFSTR(kIOBuiltin),
@@ -2545,7 +2614,6 @@ createInterface(io_registry_entry_t interface, processInterface func,
                CFSTR(kIOSerialBSDTypeKey),
                CFSTR(kIOLocation)
        };
-#endif // !TARGET_OS_SIMULATOR
 
        const CFStringRef controller_dict_keys[] = {
                CFSTR(kIOFeatures),
@@ -2569,18 +2637,9 @@ createInterface(io_registry_entry_t interface, processInterface func,
                }
        }
 
-#if    TARGET_OS_SIMULATOR || 1        // while waiting for rdar://19431723
-       // get the dictionary associated with the [interface] node
-       kr = IORegistryEntryCreateCFProperties(interface, &interface_dict, NULL, kNilOptions);
-       if (kr != kIOReturnSuccess) {
-               SC_log(LOG_INFO, "IORegistryEntryCreateCFProperties() failed, kr = 0x%x", kr);
-               goto done;
-       }
-#else
         interface_dict = copyIORegistryProperties(interface,
                                                   interface_dict_keys,
                                                   sizeof(interface_dict_keys)/sizeof(interface_dict_keys[0]));
-#endif // !TARGET_OS_SIMULATOR
 
        // get the controller node
        kr = IORegistryEntryGetParentEntry(interface, kIOServicePlane, &controller);
@@ -2653,6 +2712,21 @@ createInterface(io_registry_entry_t interface, processInterface func,
                        interfacePrivate->hidden = TRUE;
                        CFRelease(val);
                }
+
+#if    TARGET_OS_IPHONE
+               // get TrustRequired preference
+               val = IORegistryEntrySearchCFProperty(interface,
+                                                     kIOServicePlane,
+                                                     kSCNetworkInterfaceTrustRequiredKey,
+                                                     NULL,
+                                                     kIORegistryIterateRecursively | kIORegistryIterateParents);
+               if (val != NULL) {
+                       if (isA_CFBoolean(val)) {
+                               interfacePrivate->trustRequired = CFBooleanGetValue(val);
+                       }
+                       CFRelease(val);
+               }
+#endif // TARGET_OS_IPHONE
        } else {
                CFRelease(interfacePrivate);
                interfacePrivate = NULL;
@@ -3125,6 +3199,13 @@ __SCNetworkInterfaceCopyInterfaceEntity(SCNetworkInterfaceRef interface)
                                     kSCNetworkInterfaceHiddenConfigurationKey,
                                     kCFBooleanTrue);
        }
+#if    TARGET_OS_IPHONE
+       if (interfacePrivate->trustRequired) {
+               CFDictionarySetValue(entity,
+                                    kSCNetworkInterfaceTrustRequiredKey,
+                                    kCFBooleanTrue);
+       }
+#endif // TARGET_OS_IPHONE
 
        // match the "hardware" with the lowest layer
        while (TRUE) {
@@ -3330,7 +3411,7 @@ _SCNetworkInterfaceCreateWithBSDName(CFAllocatorRef       allocator,
        struct ifreq            ifr;
        SCNetworkInterfaceRef   interface;
 
-       bzero(&ifr, sizeof(ifr));
+       memset(&ifr, 0, sizeof(ifr));
        if (_SC_cfstring_to_cstring(bsdName, ifr.ifr_name, sizeof(ifr.ifr_name), kCFStringEncodingASCII) != NULL) {
                int     s;
 
@@ -3846,8 +3927,9 @@ done:
 }
 
 
+__private_extern__
 void
-_SCNetworkInterfaceCacheOpen()
+_SCNetworkInterfaceCacheOpen(void)
 {
        if (!__SCNetworkInterfaceCacheIsOpen()) {
                S_interface_cache = CFDictionaryCreateMutable(NULL,
@@ -3859,8 +3941,9 @@ _SCNetworkInterfaceCacheOpen()
 }
 
 
+__private_extern__
 void
-_SCNetworkInterfaceCacheClose()
+_SCNetworkInterfaceCacheClose(void)
 {
        if (__SCNetworkInterfaceCacheIsOpen()) {
                SC_log(LOG_DEBUG, "SCNetworkInterface cache (%p): close", S_interface_cache);
@@ -3883,7 +3966,7 @@ __SCNetworkInterfaceCacheAdd(CFStringRef bsdName, CFArrayRef matchingInterfaces)
 
 
 static inline Boolean
-__SCNetworkInterfaceCacheIsOpen()
+__SCNetworkInterfaceCacheIsOpen(void)
 {
        return (S_interface_cache != NULL);
 }
@@ -4259,7 +4342,7 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef        allocator,
                            (((virtualInterface = findBridgeInterface(servicePref, ifDevice)) != NULL) ||
 #if    !TARGET_OS_IPHONE
                            ((virtualInterface = findBondInterface(servicePref,  ifDevice)) != NULL) ||
-#endif
+#endif // !TARGET_OS_IPHONE
                            ((virtualInterface = findVLANInterface(servicePref, ifDevice)) != NULL))) {
                                CFRelease(interfacePrivate);
                                interfacePrivate = (SCNetworkInterfacePrivateRef)virtualInterface;
@@ -4380,6 +4463,11 @@ _SCNetworkInterfaceCreateWithEntity(CFAllocatorRef       allocator,
                if (CFDictionaryContainsKey(interface_entity, kSCNetworkInterfaceHiddenConfigurationKey)) {
                        interfacePrivate->hidden = TRUE;
                }
+#if    TARGET_OS_IPHONE
+               if (CFDictionaryContainsKey(interface_entity, kSCNetworkInterfaceTrustRequiredKey)) {
+                       interfacePrivate->trustRequired = TRUE;
+               }
+#endif // TARGET_OS_IPHONE
        }
 
        if (service != NULL) {
@@ -4594,14 +4682,16 @@ add_interfaces(CFMutableArrayRef all_interfaces, CFArrayRef new_interfaces)
 static void
 __waitForInterfaces()
 {
-       CFStringRef             key;
+       CFStringRef             key     = NULL;
        CFArrayRef              keys;
        Boolean                 ok;
-       SCDynamicStoreRef       store;
+       SCDynamicStoreRef       store   = NULL;
+
+       CRSetCrashLogMessage("Waiting for IOKit to quiesce (or timeout)");
 
        store = SCDynamicStoreCreate(NULL, CFSTR("SCNetworkInterfaceCopyAll"), NULL, NULL);
        if (store == NULL) {
-               return;
+               goto done;
        }
 
        key = SCDynamicStoreKeyCreate(NULL, CFSTR("%@" "InterfaceNamer"), kSCDynamicStoreDomainPlugin);
@@ -4646,8 +4736,10 @@ __waitForInterfaces()
 
     done :
 
-       CFRelease(key);
-       CFRelease(store);
+       CRSetCrashLogMessage(NULL);
+
+       if (key != NULL) CFRelease(key);
+       if (store != NULL) CFRelease(store);
        return;
 }
 
@@ -4998,6 +5090,10 @@ SCNetworkInterfaceCreateWithInterface(SCNetworkInterfaceRef child, CFStringRef i
 
        parentPrivate->hidden = childPrivate->hidden;
 
+#if    TARGET_OS_IPHONE
+       parentPrivate->trustRequired = childPrivate->trustRequired;
+#endif // TARGET_OS_IPHONE
+
        if (childPrivate->overrides != NULL) {
                parentPrivate->overrides = CFDictionaryCreateMutableCopy(NULL, 0, childPrivate->overrides);
        }
@@ -5328,10 +5424,10 @@ copy_interface_string(CFBundleRef bundle, CFStringRef key, Boolean localized)
                                                                                                                         knownStrKey,
                                                                                                                         localized);
 
-#if TARGET_OS_IPHONE
+#if    TARGET_OS_IPHONE
                        /* ...and we want to know about it! */
                        _SC_crash("Failed to retrieve interface string", NULL, NULL);
-#endif //TARGET_OS_IPHONE
+#endif //TARGET_OS_IPHONE
                        reported = TRUE;
                }
 
@@ -5548,11 +5644,11 @@ SCNetworkInterfaceGetLocalizedDisplayName(SCNetworkInterfaceRef interface)
 
 
 __private_extern__
-CFDictionaryRef
+CFPropertyListRef
 __SCNetworkInterfaceGetTemplateOverrides(SCNetworkInterfaceRef interface, CFStringRef overrideType)
 {
        SCNetworkInterfacePrivateRef    interfacePrivate        = (SCNetworkInterfacePrivateRef)interface;
-       CFDictionaryRef                 overrides               = NULL;
+       CFPropertyListRef               overrides               = NULL;
 
        if (interfacePrivate->overrides != NULL) {
                overrides = CFDictionaryGetValue(interfacePrivate->overrides, overrideType);
@@ -5775,10 +5871,6 @@ SCNetworkInterfaceSetExtendedConfiguration(SCNetworkInterfaceRef interface,
 #pragma mark SCNetworkInterface [Refresh Configuration] API
 
 
-#ifndef kSCEntNetRefreshConfiguration
-#define kSCEntNetRefreshConfiguration  CFSTR("RefreshConfiguration")
-#endif // kSCEntNetRefreshConfiguration
-
 Boolean
 _SCNetworkInterfaceForceConfigurationRefresh(CFStringRef ifName)
 {
@@ -5888,11 +5980,13 @@ SCNetworkInterfaceForceConfigurationRefresh(SCNetworkInterfaceRef interface)
 }
 
 
+#if    !TARGET_OS_IPHONE
 Boolean
 SCNetworkInterfaceRefreshConfiguration(CFStringRef ifName)
 {
        return _SCNetworkInterfaceForceConfigurationRefresh(ifName);
 }
+#endif // !TARGET_OS_IPHONE
 
 
 #pragma mark -
@@ -6963,6 +7057,103 @@ SCNetworkInterfaceSetPassword(SCNetworkInterfaceRef             interface,
        return ok;
 }
 
+#pragma mark -
+#pragma mark SCNetworkInterface [Advisory] SPIs
+#if    TARGET_OS_SIMULATOR
+Boolean
+SCNetworkInterfaceSetAdvisory(SCNetworkInterfaceRef interface,
+                             SCNetworkInterfaceAdvisory advisory,
+                             CFStringRef reason)
+{
+#pragma unused(interface)
+#pragma unused(advisory)
+#pragma unused(reason)
+       return (FALSE);
+}
+
+Boolean
+SCNetworkInterfaceAdvisoryIsSet(SCNetworkInterfaceRef interface)
+{
+#pragma unused(interface)
+       return (FALSE);
+}
+
+CFStringRef
+SCNetworkInterfaceCopyAdvisoryNotificationKey(SCNetworkInterfaceRef interface)
+{
+#pragma unused(interface)
+       return (NULL);
+}
+
+#else /* TARGET_OS_SIMULATOR */
+Boolean
+SCNetworkInterfaceSetAdvisory(SCNetworkInterfaceRef interface,
+                             SCNetworkInterfaceAdvisory advisory,
+                             CFStringRef reason)
+{
+       IPMonitorControlRef             control;
+       SCNetworkInterfacePrivateRef    interfacePrivate =
+                                       (SCNetworkInterfacePrivateRef)interface;
+       CFStringRef                     ifName;
+
+       ifName = SCNetworkInterfaceGetBSDName(interface);
+       if (ifName == NULL) {
+               _SCErrorSet(kSCStatusInvalidArgument);
+               return (FALSE);
+       }
+       control = interfacePrivate->IPMonitorControl;
+       if (control == NULL) {
+               control = IPMonitorControlCreate();
+               if (control == NULL) {
+                       _SCErrorSet(kSCStatusFailed);
+                       return (FALSE);
+               }
+               interfacePrivate->IPMonitorControl = control;
+       }
+       return IPMonitorControlSetInterfaceAdvisory(control,
+                                                   ifName,
+                                                   advisory,
+                                                   reason);
+}
+
+Boolean
+SCNetworkInterfaceAdvisoryIsSet(SCNetworkInterfaceRef interface)
+{
+       IPMonitorControlRef             control;
+       SCNetworkInterfacePrivateRef    interfacePrivate =
+                                       (SCNetworkInterfacePrivateRef)interface;
+       CFStringRef                     ifName;
+
+       ifName = SCNetworkInterfaceGetBSDName(interface);
+       if (ifName == NULL) {
+               _SCErrorSet(kSCStatusInvalidArgument);
+               return (FALSE);
+       }
+       control = interfacePrivate->IPMonitorControl;
+       if (control == NULL) {
+               control = IPMonitorControlCreate();
+               if (control == NULL) {
+                       _SCErrorSet(kSCStatusFailed);
+                       return (FALSE);
+               }
+               interfacePrivate->IPMonitorControl = control;
+       }
+       return IPMonitorControlInterfaceAdvisoryIsSet(control, ifName);
+}
+
+CFStringRef
+SCNetworkInterfaceCopyAdvisoryNotificationKey(SCNetworkInterfaceRef interface)
+{
+       CFStringRef                     ifName;
+
+       ifName = SCNetworkInterfaceGetBSDName(interface);
+       if (ifName == NULL) {
+               _SCErrorSet(kSCStatusInvalidArgument);
+               return (NULL);
+       }
+       return IPMonitorControlCopyInterfaceAdvisoryNotificationKey(ifName);
+}
+#endif /* TARGET_OS_SIMULATOR */
 
 #pragma mark -
 #pragma mark SCNetworkInterface [InterfaceNamer] SPIs
@@ -7089,7 +7280,7 @@ update_ift_family(SCNetworkInterfaceRef interface)
                CFStringRef     bsdName = SCNetworkInterfaceGetBSDName(interface);
                struct ifreq    ifr;
 
-               bzero(&ifr, sizeof(ifr));
+               memset(&ifr, 0, sizeof(ifr));
                if ((bsdName != NULL) &&
                    _SC_cfstring_to_cstring(bsdName, ifr.ifr_name, sizeof(ifr.ifr_name), kCFStringEncodingASCII) != NULL) {
                        int     s;
@@ -7181,11 +7372,20 @@ _SCNetworkInterfaceIsBuiltin(SCNetworkInterfaceRef interface)
 }
 
 
+Boolean
+_SCNetworkInterfaceIsTrustRequired(SCNetworkInterfaceRef interface)
+{
+       SCNetworkInterfacePrivateRef    interfacePrivate        = (SCNetworkInterfacePrivateRef)interface;
+
+       return interfacePrivate->trustRequired;
+}
+
+
 #pragma mark -
 #pragma mark SCNetworkInterface SPIs
 
 
-#if    !TARGET_OS_EMBEDDED
+#if    TARGET_OS_OSX
 
 SCNetworkInterfaceRef
 _SCNetworkInterfaceCopyBTPANInterface(void)
@@ -7242,7 +7442,7 @@ _SCNetworkInterfaceCopyBTPANInterface(void)
 
        return interface;
 }
-#endif // !TARGET_OS_EMBEDDED
+#endif // TARGET_OS_OSX
 
 
 CFStringRef
@@ -7366,7 +7566,7 @@ _SCNetworkInterfaceIsApplePreconfigured(SCNetworkInterfaceRef interface)
 #else  // TARGET_OS_SIMULATOR
        SCNetworkInterfacePrivateRef    interfacePrivate        = (SCNetworkInterfacePrivateRef)interface;
 
-       if (!interfacePrivate->hidden) {
+       if (!_SCNetworkInterfaceIsHiddenConfiguration(interface)) {
                // if not HiddenConfiguration
                return FALSE;
        }
@@ -7378,11 +7578,16 @@ _SCNetworkInterfaceIsApplePreconfigured(SCNetworkInterfaceRef interface)
                return FALSE;
        }
 
-       if (interfacePrivate->builtin) {
+       if (_SCNetworkInterfaceIsBuiltin(interface)) {
                // if built-in (and overrides are present)
                return TRUE;
        }
 
+       if (_SCNetworkInterfaceIsCarPlay(interface)) {
+               // if CarPlay (and overrides are present)
+               return TRUE;
+       }
+
        if (isA_CFNumber(interfacePrivate->usb.vid)) {
                int             vid;
 
@@ -7425,6 +7630,15 @@ _SCNetworkInterfaceIsBluetoothP2P(SCNetworkInterfaceRef interface)
 }
 
 
+Boolean
+_SCNetworkInterfaceIsCarPlay(SCNetworkInterfaceRef interface)
+{
+       SCNetworkInterfacePrivateRef    interfacePrivate        = (SCNetworkInterfacePrivateRef)interface;
+
+       return (interfacePrivate->sort_order == kSortCarPlay);
+}
+
+
 Boolean
 _SCNetworkInterfaceIsHiddenConfiguration(SCNetworkInterfaceRef interface)
 {
@@ -7598,6 +7812,9 @@ __SCNetworkInterfaceCreateCopy(CFAllocatorRef             allocator,
                newPrivate->configurationAction = CFRetain(oldPrivate->configurationAction);
        }
        newPrivate->hidden                      = oldPrivate->hidden;
+#if    TARGET_OS_IPHONE
+       newPrivate->trustRequired               = oldPrivate->trustRequired;
+#endif // TARGET_OS_IPHONE
        if (oldPrivate->location != NULL) {
                newPrivate->location            = CFRetain(oldPrivate->location);
        }