Hackintosh built-in Ethernet: The right way to set the property on dual-port boards
Learn how to correctly set the built-in property for Hackintosh Ethernet controllers, especially on dual-port X79 and X99 motherboards. Avoid common mistakes with data types and PCI paths.
Setting the built-in property for your Ethernet controller is one of the most misunderstood steps in Hackintosh configuration. Many users mistakenly apply a Boolean value of 1 to the built-in key in DeviceProperties, only to find that iMessage activation still fails or the network interface shows as "External" in System Information. The correct value for a built-in interface is a Data type containing 01, but when dealing with a motherboard that has two integrated Ethernet ports — a common configuration on X79, X99, and workstation platforms — you must decide which port gets the built-in flag and how to differentiate them in the IORegistry.
What the built-in Property Actually Does
The built-in property does not enable the Ethernet hardware; it simply tells macOS that the network interface is physically internal to the machine. This flag is required for Apple services (iMessage, FaceTime, iCloud sign‑in) to recognise the system as a genuine Mac. Without it, the interface appears as an external Thunderbolt or USB adapter, and Apple’s activation servers may reject the hardware identifier. For legacy versions of macOS (10.9–10.14), this property is critical and must be injected with the correct data format.
Data Type and Syntax
In Clover’s config.plist (under DeviceProperties → Add) or OpenCore’s config.plist (DeviceProperties → Add), you specify a key named built-in with a value of type Data. The byte sequence is 01 00 00 00, but in little‑endian representation you write it as 01000000. Never use a Boolean (true or 1) — macOS ignores it and the interface stays external.
Example entry for a PCI device located at PciRoot(0x0)/Pci(0x19,0x0) on an Ivy Bridge board:
- Key:
built-in - Value (Data):
01000000
Dual Ethernet Ports: Which One to Mark as Built‑In
Motherboards with two integrated NICs — a typical feature of X79, X99, and C612/632 platforms — present a choice. Only one interface should carry the built-in property. macOS uses this flag to determine the primary built‑in network adapter. Setting it on both can cause conflicts in the IOEthernetController matching logic, leading to neither interface being recognised as internal.
Which port should you choose? If you are connected via the first port (often labeled LAN1 or port nearest the CPU), apply built-in to that device path. For the second port, either omit the property entirely or set the same key with value 0 (Data type 00000000). Do not use a Boolean alse — again, use Data.
Identifying the Correct PCI Path
Open IORegistryExplorer and search for your Ethernet controller by vendor ID (e.g. 8086 for Intel, 10ec for Realtek). Collapse the tree to find the full path — for example, PciRoot(0x0)/Pci(0x1c,0x3)/Pci(0x0,0x0). Each port has a distinct path. For dual‑port controllers (e.g., Intel I350), both functions may appear under the same bridge; you need to target each function separately using its Pci(…) segment.
Common Chipsets and Injection Methods
Intel I210 / I211 / I217 / I218 / I219
These require no kext patching for basic functionality in most macOS versions from Mavericks through High Sierra. Simply inject built-in via DeviceProperties. For the I219 on newer platforms (Skylake onward), you may also need to add device-id to spoof a compatible device.
Realtek RTL8111 / 8168
Realtek NICs generally work out‑of‑the‑box with the RealtekRTL8111.kext. After installing the kext, inject built-in to the same device path. Test with log show | grep -i built to verify the driver picks up the flag.
Verification Steps
- Open IORegistryExplorer and navigate to the Ethernet device.
- Look for a key named
built-inwith a single byte01inside a Data blob. If you see a False Boolean, the injection syntax is wrong. - Open System Information → Network. The interface should display “Built In” under the “Hardware” section. If it shows “External”, iMessage will likely fail.
- Check
ifconfigfrom Terminal: the interface will showstatus: activewithmedia: autoselect. If the built‑in flag is missing, the interface still works but the system might treat it as a different device type.
Handling Sleep and Wake
On legacy boards, the built-in property may be lost after system sleep on some UEFI implementations. If you notice the interface reverts to “External” after wake, you can use an ACPI _DSM method (via SSDT) to re‑inject the property on every wake cycle. Alternatively, apply the property in both DeviceProperties and an ACPI addProperties entry (OpenCore only). For older Clover, stick to DeviceProperties and verify the value persists after a deep sleep.
Limitations for Very Old macOS (10.9–10.11)
In Mavericks and Yosemite, the built-in property was also required but the activation server appleid.help.apple.com was less strict. Still, using the correct Data type is essential. If you are running 10.11 El Capitan, you may also need to set IOBuilt‑in under IOKitPersonalities in a custom SSDT. This is outside the scope of this guide, but the principle remains: only one port should receive the flag.
A Worked Example: X99 Dual‑Port Intel I210
Consider an ASUS X99‑E WS with two Intel I210‑AT NICs. The primary port (closest to the DIMMs) has path PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0). Add the following to your config.plist under DeviceProperties → Add:
<dict>
<key>PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)</key>
<dict>
<key>built-in</key>
<data>01 00 00 00</data>
</dict>
</dict>
For the second port (Pci(0x4,0x0)/Pci(0x0,0x0) depending on your board), either omit it or set built-in to 00 00 00 00. Do not apply the property to both. After rebooting, verify with IOReg that only one device carries the 01 value.
One final check: after a sleep cycle, confirm that the value remains in IOReg; if it resets, you may need to apply the property via an ACPI _DSM method instead of DeviceProperties.
