|
From: | address@hidden |
Subject: | Re: [lwip-users] Writing a proxy server - how "non-reentrant" is lwip raw API? |
Date: | Sat, 25 Jun 2011 11:58:55 +0200 |
User-agent: | Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 |
wurzel wrote:
A followup to this discussion; after further debugging I did find the cause of my "flaky behavior" and it was because the call to tcp_write above needs to have TCP_WRITE_FLAG_COPY set. I was optimistically hoping that since I called tcp_write and tcp_output() from my receive callback, that the transmit side would have what it needed by the time my receive callback exited. However, that doesn't appear to be the case; my packets were definitely coming out with some bytes overwritten until I added that flag.
The reason for this is that without the copy flag, you tell TCP to enqueue the data from original input pbufs for sending. This *can* work only if you postpone freeing the original pbuf (the one passed to your recv callback) until the copy you sent is ACKed. This would mean you have to hold a pointer to the original pbuf on a list and then free it in your sent-callback according to the number of bytes passed in to that callback.
However, while the no-copy version saves some memcpy() calls, it bears the risk of running out of PBUF_POOL pbufs: These are normally only used for RX packets - you would now use them for TX, too. Since they then stay allocated until the remote side ACKs them, you need more POOL pbufs than you would need when copying data (where data is copied to PBUF_RAM pbufs allocated on the mem-heap).
Simon
[Prev in Thread] | Current Thread | [Next in Thread] |