Dear colleagues,

I'm  bit confused about the the TCP_WND option parameter.
First I understood that this value is the initial advertised TCP window
size. For instance, when I set it to 2*TCP_MSS,  my advertised window in
the TCP header of the SYNC segment is matches 2*TCP_MSS. Also, we can se
that tcp_recved correctly updates the TCP window size to be advertised with
TCP_WND as the upper limit:
pcb->rcv_wnd += len;
  if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
    pcb->rcv_wnd = TCP_WND_MAX(pcb);
  }

However, I was reading the Tuning TCP article (
http://lwip.wikia.com/wiki/Tuning_TCP), and it states, under "Window size
(TCP_WND)" :

"The TCP window size can be adjusted by changing the define TCP_WND.
However, do keep in mind that this should be at least twice the size of
TCP_MSS (thus on ethernet, where TCP_MSS is 1460, it should be set to at
least 2920). If memory allows it, set this as high as possible (16-bit, so
0xFFFF is the highest value), but keep in mind that for every active
connection, the full window may have to be buffered until it is *acknowledged
by the remote side* (although this buffer size can still be controlled by
TCP_SND_BUF and TCP_SND_QUEUELEN)."

So, I've got confused of the relation with TCP_WND with the sending buffer
and queue. I did not find anything relevant in the TCP output functions.
Just tcp_connect seems to also be using the value (maybe as a initial
parameter for the sending window?) In tcp_connect, we can find the fragment:


  /* Start with a window that does not need scaling. When window scaling is
     enabled and used, the window is enlarged when both sides agree on
scaling. */
  *pcb->rcv_wnd *= pcb->rcv_ann_wnd = TCPWND_MIN16(*TCP_WND*);
  pcb->rcv_ann_right_edge = pcb->rcv_nxt;
  *pcb->snd_wnd = TCP_WND;*

Could somebody put some light on the topic for me?

Thank you!
Vitor
_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to