On 27.11.2018 17:16, Pierre Chatelier wrote:
Hello,
I have a question regarding the expected behaviour with lwip incoming
TCP packets.
I have a my_tcp_recv_cb() callback that handles incoming TCP packets.
Usually, it just ends with
tcp_recved(pcb, p->tot_len);
pbuf_free(p);
However, if sometimes I do not have enough time or memory to handle
the packet, I would like to tell "do not ack this one, please send it
again later"
According to the doc (http://lwip.wikia.com/wiki/Raw/TCP), I
understand that I should :
I didn' know that one. The wiki is not as well maintained as it should
be, so it's always better to read the main documentation at
http://www.nongnu.org/lwip/
-call tcp_recved(pcb, written);//if I was still able to handle
"written" bytes, and in that case obviously "written" is less than
p->tot_len
-do *not* call pbuf_free(p);
-return an error (e.g. ERR_MEM)
No, you cannot combine "tcp_recved" with returning != ERR_OK. Because
when returning ERR_MEM, the stack will buffer this pbuf and pass it back
to you later. You'll end up with calling tcp_recved for some bytes more
than once.
" If there are no errors and the callback function returns ERR_OK,
then it is responsible for freeing the pbuf. Otherwise, it must not
free the pbuf so that lwIP core code can store it."
But in that case, it just starts to be a mess. Some packets begin to
be delivered very slowly (1 byte at a time in pbufs!), and it does not
seem to behave as expected.
Actually, that *is* expected. Returning ERR_MEM can only be the last
resort. It destroys some TCP assumptions. You should rather keep the
pbuf on a list for yourself and return ERR_OK and process it at some
later time, calling 'tcp_recved' after processing it. This will send
ACKs immediately (TCP depends on that) but the window will close and
will be reopened for the remote host to send more once you called
'tcp_recved'.
If you can't buffer all pbufs, decrease your TCP_WND size.
Simon
_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users