On Wed, 2009-06-24 at 14:16 +0100, David Ward wrote:
I'm using the RAW API.
This is the receive callback, I'm using.
The problem is quite simple in that case: your receive callback is only
handling a single pbuf. The pbuf passed can in fact be the head of a
chain of pbufs. Your callback is therefore dealing with the data in the
first buffer of the chain, throwing away and freeing the rest, but only
indicating the length of the first pbuf back to the stack via tcp_recved
().
Have a look at pbuf->next and pbuf->tot_len to handle the chain.
The only case that I think you get given a chain rather than a single
pbuf is the out-of-order segment handling, when any queued out of order
packets will be added to the list after the missing one is found. This
fits well with the symptoms you were seeing.