Table of Contents
Guo-Fu Tseng: Implement and Port Ethernet Drivers for gPXE
Project Plan
Summary
In order to obtain better performance from JMicron Ethernet Card. Instead of using the UNDI driver, I would implement a better performance native driver for gPXE. The tg3 driver of gPXE project still using old etherboot API, I would buy a Broadcom NIC and try to port it into new gPXE API.
Implement TCP receive queue to handle out-of-order packets, and SACK, window scaleing support. To have better performance on high latency network(WAN), or unstable networks(Wireless).
Outline
Most of work for porting driver is to understand what original driver does, and remove all un-need code from the Linux driver. The JMicron driver should be much more easy for me since I've already written the Linux driver. But the broadcom tg3 driver might take me more time since I have to guess lots of things due to lack of chip spec.
Current gPXE limited the TCP window size at 4KB. Which makes sence when the TCP stack dose not handle out-of-order packets, in order to prevent large amount of useless packets on slow and unstable network(Such as wireless). That is
- The packet is dropped often.
- The bandwidth is narrow.
- The receiver
- Dose not queue non-contigious packets
- Advertived a large window.
- Any packet dropped:
- Sender have no idea about it.
- Send all remaining data to receiver until window is filled.
- Consume more bandwith in narrow bandwith, but useless.
- Makes the network worse.
But with receive queue and SACK implement, ideally the sender don't have to send any data that was received by the receiver. It would be much more better for above senariol with larger window size.
For long fat network the window size is important also. In order to have large enough window size, we need window scale option to breake the 64K window size limit.
But the original gPXE's heap was fixed at 128K due to A20 limit, and have to perserve the space for codes. We recently found that the all-driver image has almost reached the 1MB limit. This should be the issue we solve first.
After solving the heap memory limit, I'll have some benchmark to see what's the reasonable MAX TCP WINDOW SIZE, and advertice a reasonale window size.
Milestones and Timeline
JMicron Ethernet Driver
Tuning TCP stack
- Week 4-7: Studying for PhD qualify exam.
-
- Several TCP fixes
-
- TCP cleanup
- Trace gPXE boot initialize steps about memory environment setup.
-
- Cleanup TCP receive queue/SACK/Window scale patches
- Submit it on the list, having some test and feedback.
-
- Testing TCP performance with different window size, network environment.
- Discuss the testing results and find a reasonable size.
-
- Possible more TCP cleanup, tuning.
- gPXE scheduling and program flow documentation.
After GSoC period
- Help on porting tg3 driver.
Extra stuff from original plan
- Ethernet RX checksum offloading support
- TCP out-of-order receive queue
- TCP Selective acknowledgement [RFC 2018][RFC 1323]
- TCP Window scale [RFC 1323]
- TCP PAWS(Protect Against Wrapped Sequence Nunbers) [RFC 1323]
- Possible tunning TCP/HTTP xfer interface.
Postponed stuff from original plan
- tg3 driver for gPXE.