+#ifdef USE_REGISTRY_ENTRY_ID
+static kern_return_t
+registerInterfaceWithIORegistryEntryID(io_connect_t connect,
+ uint64_t entryID,
+ CFNumberRef unit,
+ const int command)
+{
+ CFDataRef data;
+ CFMutableDictionaryRef dict;
+ kern_return_t kr;
+ CFNumberRef num;
+
+ dict = CFDictionaryCreateMutable(NULL, 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ num = CFNumberCreate(NULL, kCFNumberIntType, &command);
+ CFDictionarySetValue(dict, CFSTR(kIONetworkStackUserCommandKey), num);
+ CFRelease(num);
+ data = CFDataCreate(NULL, (void *) &entryID, sizeof(entryID));
+ CFDictionarySetValue(dict, CFSTR(kIORegistryEntryIDKey), data);
+ CFRelease(data);
+ CFDictionarySetValue(dict, CFSTR(kIOInterfaceUnit), unit);
+ kr = IOConnectSetCFProperties(connect, dict);
+ CFRelease(dict);
+ return kr;
+}
+
+static SCNetworkInterfaceRef
+lookupIORegistryEntryID(uint64_t entryID)
+{
+ io_registry_entry_t entry = MACH_PORT_NULL;
+ SCNetworkInterfaceRef interface = NULL;
+ io_iterator_t iterator = MACH_PORT_NULL;
+ kern_return_t kr;
+ mach_port_t masterPort = MACH_PORT_NULL;
+
+ kr = IOMasterPort(bootstrap_port, &masterPort);
+ if (kr != KERN_SUCCESS) {
+ SCLog(TRUE, LOG_ERR,
+ CFSTR(MY_PLUGIN_NAME ": IOMasterPort returned 0x%x"),
+ kr);
+ goto error;
+ }
+
+ kr = IOServiceGetMatchingServices(masterPort,
+ IORegistryEntryIDMatching(entryID),
+ &iterator);
+ if ((kr != KERN_SUCCESS) || (iterator == MACH_PORT_NULL)) {
+ SCLog(TRUE, LOG_ERR,
+ CFSTR(MY_PLUGIN_NAME ": IOServiceGetMatchingServices(0x%llx) returned 0x%x/%d"),
+ entryID,
+ kr,
+ iterator);
+ goto error;
+ }
+
+ entry = IOIteratorNext(iterator);
+ if (entry == MACH_PORT_NULL) {
+ SCLog(TRUE, LOG_ERR,
+ CFSTR(MY_PLUGIN_NAME ": IORegistryEntryIDMatching(0x%llx) failed"),
+ entryID);
+ goto error;
+ }
+
+ interface = _SCNetworkInterfaceCreateWithIONetworkInterfaceObject(entry);
+
+ error:
+ if (masterPort != MACH_PORT_NULL) {
+ mach_port_deallocate(mach_task_self(), masterPort);
+ }
+ if (entry != MACH_PORT_NULL) {
+ IOObjectRelease(entry);
+ }
+ if (iterator != MACH_PORT_NULL) {
+ IOObjectRelease(iterator);
+ }
+ return (interface);
+
+}
+#else // USE_REGISTRY_ENTRY_ID