|
@@ -269,6 +269,7 @@ EXPORT_SYMBOL(tcp_select_initial_window);
|
|
|
static u16 tcp_select_window(struct sock *sk)
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
+ u32 old_win = tp->rcv_wnd;
|
|
|
u32 cur_win = tcp_receive_window(tp);
|
|
|
u32 new_win = __tcp_select_window(sk);
|
|
|
|
|
@@ -281,6 +282,9 @@ static u16 tcp_select_window(struct sock *sk)
|
|
|
*
|
|
|
* Relax Will Robinson.
|
|
|
*/
|
|
|
+ if (new_win == 0)
|
|
|
+ NET_INC_STATS(sock_net(sk),
|
|
|
+ LINUX_MIB_TCPWANTZEROWINDOWADV);
|
|
|
new_win = ALIGN(cur_win, 1 << tp->rx_opt.rcv_wscale);
|
|
|
}
|
|
|
tp->rcv_wnd = new_win;
|
|
@@ -298,8 +302,14 @@ static u16 tcp_select_window(struct sock *sk)
|
|
|
new_win >>= tp->rx_opt.rcv_wscale;
|
|
|
|
|
|
/* If we advertise zero window, disable fast path. */
|
|
|
- if (new_win == 0)
|
|
|
+ if (new_win == 0) {
|
|
|
tp->pred_flags = 0;
|
|
|
+ if (old_win)
|
|
|
+ NET_INC_STATS(sock_net(sk),
|
|
|
+ LINUX_MIB_TCPTOZEROWINDOWADV);
|
|
|
+ } else if (old_win == 0) {
|
|
|
+ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFROMZEROWINDOWADV);
|
|
|
+ }
|
|
|
|
|
|
return new_win;
|
|
|
}
|