<p>When booting iPXE over the network on a Mac via the method described at <a href="http://forum.ipxe.org/showthread.php?tid=7323&pid=11253#pid11253">http://forum.ipxe.org/showthread.php?tid=7323&pid=11253#pid11253</a> (wrapping snponly.efi into a .nbi bundle and serving that via Apple's NetBoot/NetInstall service), one can chainload Linux kernels and EFI binaries just fine.<br>
However, one cannot chainload Mac OS X 10.11 and higher because Apple does not use standard PXE EFI protocols to obtain the DHCP packet from EFI. For Mac OS X 10.10 and lower, this was no problem as the kernel contained a DHCP client (see <a href="http://opensource.apple.com//source/xnu/xnu-2782.40.9/bsd/kern/netboot.c">bsd/kern/netboot.c</a>, line 646) that was used when the DHCP packet could not be obtained from EFI. Mac OS X 10.11 removes that DHCP client and panics if no DHCP packet can be obtained from EFI.</p>

<p>This pull request adds support for the Apple NetBoot EFI protocol to iPXE so that iPXE can pass on its DHCP packet to the operating system.<br>
With this patch applied, Mac OS X 10.11 and higher can be chainloaded like this:</p>

<pre><code>set nbiname OSX-10111.nbi
set serverip ${next-server}
set tftpboot tftp://${serverip}
set netbootsp0 /Library/NetBoot/NetBootSP0
set root-path nfs:${serverip}:${netbootsp0}:${nbiname}/NetInstall.dmg
initrd --name x86_64\kernelcache ${tftpboot}/NetBoot/NetBootSP0/${nbiname}/i386/x86_64/kernelcache
kernel ${tftpboot}/NetBoot/NetBootSP0/${nbiname}/i386/booter
imgargs booter -v rp=${root-path}
boot
</code></pre>

<p>Without this patch applied, the above only worked on Mac OS X 10.10.5 and lower.</p>

<p><em>Acknowledgements</em>:<br>
The details about the Apple NetBoot EFI protocol came from <a href="https://github.com/Piker-Alpha/macosxbootloader/blob/master/sdk/include/Protocol/AppleNetBoot/AppleNetBoot.h">https://github.com/Piker-Alpha/macosxbootloader/blob/master/sdk/include/Protocol/AppleNetBoot/AppleNetBoot.h</a> as Apple has not, to my knowledge, published a specification about their EFI protocols.</p>

<hr>

<h4>You can view, comment on, or merge this pull request online at:</h4>
<p>  <a href='https://github.com/ipxe/ipxe/pull/54'>https://github.com/ipxe/ipxe/pull/54</a></p>

<h4>Commit Summary</h4>
<ul>
  <li>Apple NetBoot protocol</li>
  <li>Reimplement Apple NetBoot protocol</li>
  <li>Remove testing code</li>
  <li>Merge remote-tracking branch 'origin/master' into apple</li>
</ul>

<h4>File Changes</h4>
<ul>
  <li>
    <strong>M</strong>
    <a href="https://github.com/ipxe/ipxe/pull/54/files#diff-0">src/image/efi_image.c</a>
    (8)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/ipxe/ipxe/pull/54/files#diff-1">src/include/ipxe/applenetboot.h</a>
    (10)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/ipxe/ipxe/pull/54/files#diff-2">src/include/ipxe/efi/Protocol/AppleNetBoot.h</a>
    (67)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/ipxe/ipxe/pull/54/files#diff-3">src/interface/efi/efi_applenetboot.c</a>
    (68)
  </li>
</ul>

<h4>Patch Links:</h4>
<ul>
  <li><a href='https://github.com/ipxe/ipxe/pull/54.patch'>https://github.com/ipxe/ipxe/pull/54.patch</a></li>
  <li><a href='https://github.com/ipxe/ipxe/pull/54.diff'>https://github.com/ipxe/ipxe/pull/54.diff</a></li>
</ul>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/ipxe/ipxe/pull/54">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe/AArTVEoDxDbeGIMxa1uZD45kmRBIPIaMks5qGFXrgaJpZM4IpFx9">mute the thread</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/AArTVJ0g7bBw1QvojjPzsVXb3TpayQmWks5qGFXrgaJpZM4IpFx9.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
  <link itemprop="url" href="https://github.com/ipxe/ipxe/pull/54"></link>
  <meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>