|
From: | David Empson |
Subject: | Re: [lwip-users] TCP: ACK problem? |
Date: | Tue, 27 Aug 2013 12:48:31 +1200 |
User-agent: | Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 |
A second opinion from someone more familiar with the LWIP memory allocator (we use a custom one so I haven't looked at LWIP's one in detail) and your particular target's network driver would be helpful, but from a quick look I think my theory about running out of pbufs is on the right track.
Your PBUF_POOL_SIZE is only 6. Depending on the implementation of your network driver and application, this pool may be used to store both received packets and packets which are copied for transmission by tcp_write().
With only 6 pbufs available for allocation and 3 of them occupied by unacknowledged outgoing packets, you would only need 3 more allocated anywhere else in the system to have none left for processing receive packets, resulting in your network driver discarding all incoming packets rather than being able to deliver them to ip_input().
As I alluded to in my first message, you should be able to confirm this by looking at the data generated by LWIP_STATS and see if you are getting memory allocation errors for the MEMP_PBUF_POOL type of memory pool, which go up each time another packet is received if I'm right. To see the error counting logic, follow the code through from pbuf.c:pbuf_alloc() to memp.c:memp_malloc(), with reference to stats.h.
If that error is confirmed, you will need to identify where the other three pbufs have got to and/or limit the number of consecutive calls you make to tcp_write() whiledata has been acknowledged and/or increase PBUF_POOL_SIZE (which would result in lwip being allocated more memory overall), or come up with some other strategy to limit the conflicting memory allocation.
On 2013-08-21 20:54, André P. wrote: > Hi David, > > Thank you for your fast response. I have attached my lwipopts.h file. On 2013-08-21 14:46, David Empson wrote:
On 2013-08-21 03:45, André P. wrote:Hi, I have an application where I stream data regularly from an LPC board to a laptop. This works fine, until after some time the transmitter sends two packets without waiting for an ACK, and the receiver almost immediately acknowledges both using one packet. Somehow, the LWIP stack does not accept this ACK, and keeps resending a package. I have attached the Flow Graph. Why does LWIP not accept the ACK message 166213? It keeps resending Seq 162622. I am using LWIP 1.4.0. Thank you for your support.The pattern looks like LWIP stopped processing the received ACK packets after the one with Ack=162622. LWIP subsequently sent three packets with new data (162622, 163648 and 165108), then timed out waiting for the ack for the oldest unacknowledged packet (162622), resending it with slowing retries: 1 second delay, then 3, 6, 12, 24, 48; all the subsequent ACKs were not processed. You'll probably need to look at LWIP's internal error counts to confirm this, but my guess is that you ran out of pbufs, due to having three outgoing packets occupying all remaining pbufs, and none are left to store the received ACKs. If so, you need to allocate more pbufs and/or limit the amount of transmit data you can have outstanding to ensure there will always be free buffers for received packets. A copy of your lwipopts.h might help to analyse the problem. _______________________________________________ lwip-users mailing list address@hidden https://lists.nongnu.org/mailman/listinfo/lwip-users
lwipopts.h
Description: Text document
[Prev in Thread] | Current Thread | [Next in Thread] |