@@ -177,21 +177,23 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb)
177
177
}
178
178
}
179
179
180
- static void tcp_incr_quickack (struct sock * sk )
180
+ static void tcp_incr_quickack (struct sock * sk , unsigned int max_quickacks )
181
181
{
182
182
struct inet_connection_sock * icsk = inet_csk (sk );
183
183
unsigned int quickacks = tcp_sk (sk )-> rcv_wnd / (2 * icsk -> icsk_ack .rcv_mss );
184
184
185
185
if (quickacks == 0 )
186
186
quickacks = 2 ;
187
+ quickacks = min (quickacks , max_quickacks );
187
188
if (quickacks > icsk -> icsk_ack .quick )
188
- icsk -> icsk_ack .quick = min ( quickacks , TCP_MAX_QUICKACKS ) ;
189
+ icsk -> icsk_ack .quick = quickacks ;
189
190
}
190
191
191
- void tcp_enter_quickack_mode (struct sock * sk )
192
+ void tcp_enter_quickack_mode (struct sock * sk , unsigned int max_quickacks )
192
193
{
193
194
struct inet_connection_sock * icsk = inet_csk (sk );
194
- tcp_incr_quickack (sk );
195
+
196
+ tcp_incr_quickack (sk , max_quickacks );
195
197
icsk -> icsk_ack .pingpong = 0 ;
196
198
icsk -> icsk_ack .ato = TCP_ATO_MIN ;
197
199
}
@@ -236,15 +238,15 @@ static void __tcp_ecn_check_ce(struct tcp_sock *tp, const struct sk_buff *skb)
236
238
* it is probably a retransmit.
237
239
*/
238
240
if (tp -> ecn_flags & TCP_ECN_SEEN )
239
- tcp_enter_quickack_mode ((struct sock * )tp );
241
+ tcp_enter_quickack_mode ((struct sock * )tp , TCP_MAX_QUICKACKS );
240
242
break ;
241
243
case INET_ECN_CE :
242
244
if (tcp_ca_needs_ecn ((struct sock * )tp ))
243
245
tcp_ca_event ((struct sock * )tp , CA_EVENT_ECN_IS_CE );
244
246
245
247
if (!(tp -> ecn_flags & TCP_ECN_DEMAND_CWR )) {
246
248
/* Better not delay acks, sender can have a very low cwnd */
247
- tcp_enter_quickack_mode ((struct sock * )tp );
249
+ tcp_enter_quickack_mode ((struct sock * )tp , TCP_MAX_QUICKACKS );
248
250
tp -> ecn_flags |= TCP_ECN_DEMAND_CWR ;
249
251
}
250
252
tp -> ecn_flags |= TCP_ECN_SEEN ;
@@ -652,7 +654,7 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb)
652
654
/* The _first_ data packet received, initialize
653
655
* delayed ACK engine.
654
656
*/
655
- tcp_incr_quickack (sk );
657
+ tcp_incr_quickack (sk , TCP_MAX_QUICKACKS );
656
658
icsk -> icsk_ack .ato = TCP_ATO_MIN ;
657
659
} else {
658
660
int m = now - icsk -> icsk_ack .lrcvtime ;
@@ -668,7 +670,7 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb)
668
670
/* Too long gap. Apparently sender failed to
669
671
* restart window, so that we send ACKs quickly.
670
672
*/
671
- tcp_incr_quickack (sk );
673
+ tcp_incr_quickack (sk , TCP_MAX_QUICKACKS );
672
674
sk_mem_reclaim (sk );
673
675
}
674
676
}
@@ -4137,7 +4139,7 @@ static void tcp_send_dupack(struct sock *sk, const struct sk_buff *skb)
4137
4139
if (TCP_SKB_CB (skb )-> end_seq != TCP_SKB_CB (skb )-> seq &&
4138
4140
before (TCP_SKB_CB (skb )-> seq , tp -> rcv_nxt )) {
4139
4141
NET_INC_STATS_BH (sock_net (sk ), LINUX_MIB_DELAYEDACKLOST );
4140
- tcp_enter_quickack_mode (sk );
4142
+ tcp_enter_quickack_mode (sk , TCP_MAX_QUICKACKS );
4141
4143
4142
4144
if (tcp_is_sack (tp ) && sysctl_tcp_dsack ) {
4143
4145
u32 end_seq = TCP_SKB_CB (skb )-> end_seq ;
@@ -4639,7 +4641,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
4639
4641
tcp_dsack_set (sk , TCP_SKB_CB (skb )-> seq , TCP_SKB_CB (skb )-> end_seq );
4640
4642
4641
4643
out_of_window :
4642
- tcp_enter_quickack_mode (sk );
4644
+ tcp_enter_quickack_mode (sk , TCP_MAX_QUICKACKS );
4643
4645
inet_csk_schedule_ack (sk );
4644
4646
drop :
4645
4647
__kfree_skb (skb );
@@ -5675,7 +5677,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
5675
5677
* to stand against the temptation 8) --ANK
5676
5678
*/
5677
5679
inet_csk_schedule_ack (sk );
5678
- tcp_enter_quickack_mode (sk );
5680
+ tcp_enter_quickack_mode (sk , TCP_MAX_QUICKACKS );
5679
5681
inet_csk_reset_xmit_timer (sk , ICSK_TIME_DACK ,
5680
5682
TCP_DELACK_MAX , TCP_RTO_MAX );
5681
5683
0 commit comments