|
@@ -93,6 +93,7 @@ struct bictcp {
|
|
|
u32 ack_cnt; /* number of acks */
|
|
|
u32 tcp_cwnd; /* estimated tcp cwnd */
|
|
|
#define ACK_RATIO_SHIFT 4
|
|
|
+#define ACK_RATIO_LIMIT (32u << ACK_RATIO_SHIFT)
|
|
|
u16 delayed_ack; /* estimate the ratio of Packets/ACKs << 4 */
|
|
|
u8 sample_cnt; /* number of samples to decide curr_rtt */
|
|
|
u8 found; /* the exit point is found? */
|
|
@@ -398,8 +399,12 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)
|
|
|
u32 delay;
|
|
|
|
|
|
if (icsk->icsk_ca_state == TCP_CA_Open) {
|
|
|
- cnt -= ca->delayed_ack >> ACK_RATIO_SHIFT;
|
|
|
- ca->delayed_ack += cnt;
|
|
|
+ u32 ratio = ca->delayed_ack;
|
|
|
+
|
|
|
+ ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT;
|
|
|
+ ratio += cnt;
|
|
|
+
|
|
|
+ ca->delayed_ack = min(ratio, ACK_RATIO_LIMIT);
|
|
|
}
|
|
|
|
|
|
/* Some calls are for duplicates without timetamps */
|