Hi Simon, I guess we have a communication problem here. Your proposal is exactly what I'm doing. There was a mistake in displaying my code sample. The line tcp_recved() was a part my comment. This is done in the "do_the_copy_to_buffer_task()" pseudo code. The tcp_recved() is not called directly in the tcp receive callback. tcp_recved() is only called when there pbuf is copied to buffer.
the "do_the_copy_to_buffer_task()" It look something like this: if(GetBufferFreeSize) // are there free space in the buffer? { pbuf_copy_partial (xxx, buf, GetBufferFreeSize, xxx ); tcp_recved(xxx, GetBufferFreeSize); copy_to_buffer(buf, GetBufferFreeSize); } It is by far not complete but I guess you understand what I mean. Back to my question: Lets say my buffer is full. the tcp callback is called by lwip. I cannot process the bpuf so I will not call tcp_recved(). What should I do will the pbuf? Or do you think the tcp receive callback is not called at all? Trex goldsi...@gmx.de wrote: > > trex7 <reynaldo.k...@istgroup.de> wrote: >> -I dont realy understand what you mean. I think, the scenario that I >> cannot >> process the incomming pbufs will always be there and I hope that lwip has >> a >> mechanism to handle this scenario without losing any data. >> >> Please correct me if I misunderstood anything. Thanks for you patience. > > > Consider this: > - your buffer size = 10000 bytes > - TCP_WND (tcp window) = 5000 bytes > - TCP_MSS (segment size) = 500 bytes > > 1. Buffer is empty, RX windows size = 10000 > 2. server sends a full window (5000 bytes) > -> to the server, the window is full, cannot send more > > Your code (or as I think it is): > 3. data received (buffer now contains 5000 bytes, 5000 bytes free), > tcp_recved() called > -> data is ACKed, window is updated > -> to the server, the window is empty -> can send another 5000 bytes > 4. server sends a full window (5000 bytes) > -> to the server, the window is full, cannot send more > 5. data received (buffer now contains 10000 bytes, 0 bytes free), > tcp_recved() called > -> data is ACKed, window is updated > -> to the server, the window is empty -> can send another 5000 bytes > 6. server sends a full window (5000 bytes) > -> to the server, the window is full, cannot send more > 7. you deny the first segment, lwIP drops the rest of the segments (4500 > bytes "lost") *THIS IS BAD* > -> server gets an ACK to the first segment only > 8. lwIP polls your recv callback every 250ms, eventually you take the > packet and call tcp_recved() > -> the server has to retransmit the 4500 bytes previously lost > > My proposal: > 3. data received, tcp_recved() called > -> data is ACKed, window is updated > -> to the server, the window is empty -> can send another 5000 bytes > 4. server sends a full window (5000 bytes) > -> to the server, the window is full, cannot send more > 5. data received (buffer now contains 10000 bytes, 0 bytes free), do *not* > call tcp_received, as you cannot buffer any more data > -> ACK is send, but the window is still full, so the server does not send > any more data > 6. your application consumes 1000 bytes from the buffer > -> there are now 100 bytes free in the buffer, call tcp_received(1000) to > tell the server it can send 1000 bytes > etc. > > -> In summary: > - as long as the number of free bytes in your buffer is >= TCP_WND, call > tcp_recved() from the recv callback > - when the number of free bytes in the buffer is < TCP_WND (before > dequeueing), call tcp_recved() after you dequeued from the buffer. > That way, the server never sends more data than you can buffer. > > > Simon > -- > Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir > belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de > > _______________________________________________ > lwip-users mailing list > lwip-users@nongnu.org > https://lists.nongnu.org/mailman/listinfo/lwip-users > > -- View this message in context: http://old.nabble.com/flow-of-lwip-as-a-stream-client-tp33420167p33428781.html Sent from the lwip-users mailing list archive at Nabble.com. _______________________________________________ lwip-users mailing list lwip-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/lwip-users