Fix window update issue when scaling disabled
When the TCP window scale option is not used, and the window opens up enough in one soreceive, a window update will not be sent. For example, if recwin == 65535, so->so_rcv.sb_hiwat >= 262144, and so->so_rcv.sb_hiwat <= 524272, the window update will never be sent. This is because recwin and adv are clamped to TCP_MAXWIN << tp->rcv_scale, and so will never be >= so->so_rcv.sb_hiwat / 4 or <= so->so_rcv.sb_hiwat / 8. This patch ensures a window update is sent if the window opens by TCP_MAXWIN << tp->rcv_scale, which should only happen when the window size goes from zero to the max expressible. This issue looks like it was introduced in r306769 when recwin was clamped to TCP_MAXWIN << tp->rcv_scale. MFC after: 1 week Sponsored by: Limelight Networks Differential Revision: https://reviews.freebsd.org/D18821
This commit is contained in:
parent
d366f891b1
commit
500759395a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=343047
@ -656,7 +656,8 @@ tcp_output(struct tcpcb *tp)
|
||||
if (adv >= (int32_t)(2 * tp->t_maxseg) &&
|
||||
(adv >= (int32_t)(so->so_rcv.sb_hiwat / 4) ||
|
||||
recwin <= (so->so_rcv.sb_hiwat / 8) ||
|
||||
so->so_rcv.sb_hiwat <= 8 * tp->t_maxseg))
|
||||
so->so_rcv.sb_hiwat <= 8 * tp->t_maxseg ||
|
||||
adv >= TCP_MAXWIN << tp->rcv_scale))
|
||||
goto send;
|
||||
if (2 * adv >= (int32_t)so->so_rcv.sb_hiwat)
|
||||
goto send;
|
||||
|
Loading…
Reference in New Issue
Block a user