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).
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
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.
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.