I don't understand why the network drivers were written that way in the first place. Ethernet has always used some form of layered protocol, and the most efficient way to build the layers is to add each header to the front of the existing payload, not to create a whole new buffer and copy the payload from one buffer to the next. It just means that whatever creates the initial buffer must leave space at the front for the largest possible combined header size. I've written several LAN stacks for small, slow 8-bit CPUs, and if the payload had to be copied from one area of RAM to another 2 or three times per packet the performance hit would have made the device unusable. Even the Rx buffers were set up to have a lot of free space at the start in case the data was going to be retransmitted, in which case the appropriate Tx headers could be prepended and the Rx buffer used as the Tx buffer.