> Hi,
> I'm porting lwip (using an RTOS and the socket API) and I have a
> question regarding the low_level_output function.
> If I can't send the pbuf immediately (netif busy), to avoid copying
> the pbuf, I'd like to do the following:
> * Increment the reference count to prevent lwip
from re-using
> or freeing the pbuf.
> * Put the pbuf on my output queue and try to
send it later.
> * Return ERR_OK.
> Later when the netif is not busy...
> * Remove the pbuf from my output queue.
> * Send the pbuf.
> * Free the pbuf.
>
> Will this scheme work with lwip?
This is a very valid discussion point for the Stack,
IMHO. It is not really explicitly documented that the Stack
will free the pbufs for a packet after it handed it over to the driver
layer. If the Driver is sending asynchronously and the data
is not memcpy'd by the driver, the datablock might be allocated by someone
else and overwritten with other data. This might be an explaination for
mysteriously lost or changed packets. Also given the fact that LwIP is a zero-copy stack,
people might not expect to memcpy stuff on the driver layer?
I propose we do either of the following:
1) In the ethernetif-skeleton explicitly document
the behavior and tell the developer to memcpy the data if their transmission
is async. 2) See 1), but tell the developer to increment the
reference count and pbuf_free() themselves (probably faster than memcpy) 3) Remove the freeing of the pbuf after handing it
over to the driver layer and document that and leave it to the driver developer
to pbuf_free() after the xmit is really done