= Deliverables and expected timeline =

The initial target platform will be VMware, which provides e1000 and
vlance emulated NICs, which support PXE.

The architecture for the UNDI driver will be divided into two
portions: a userspace program for executing the UNDI code, which
passes packets to and from an in-kernel component.

Based on my understanding of the Etherboot code and (non-functional)
Grub UNDI driver, UNDI is typically implemented as real-mode code. The
natural way to execute the real-mode code is within some kind of
virtualization, with PIO or MMIO operations directed at the actual
hardware. The UNDI execution environment will be based on Virtual 8086
(vm86() functionality in Linux) or QEMU. The decision on which to use
will depend on performance, size, and cross-platform (e.g. suitability
for *BSD, non-x86) considerations.

For maximum compatibility with unmodified kernels, the in-kernel
component should be the standard TUN/TAP, with appropriate routing
rules applied. If this is unworkable, a stub network driver module
which communicates with the UNDI userspace code via control nodes in
/proc should be easy to develop, and would not require any
modifications to the kernel.

Week 1:
Build familiarity with UNDI
- Look at etherboot UNDI code
- Look at (nonfunctional) grub UNDI driver
-- Spend some time debugging it to get a feel for how to debug this stage of the
boot process, potential pitfalls in providing an environment for UNDI drivers

Week 2:
Evaluate vm86 vs QEMU tradeoffs
Extract UNDI code, etherboot UNDI interface, and import to virtualization system

Week 3+4+5:
Get VM environment working well enough to execute UNDI initialization code

Week 5+6+7:
Send/receive UNDI packets
- From within compat environment
- Integrate with kernel send

Week 8:
Test with full boot process:
- local disk boot
- nfs root
- ltsp
- etc

Week 9:
Evaluate on different hardware, with different UNDI stacks