lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] low_level_output question


From: Fabian Koch
Subject: Re: [lwip-users] low_level_output question
Date: Tue, 7 Apr 2009 09:39:16 +0200


Hello everyone,

> 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

comments?

regards,
Fabian
reply via email to

[Prev in Thread] Current Thread [Next in Thread]