tcp: Rack in a rare case we can get stuck sending a very small amount.
If a tlp sending new data fails, and then the peer starts talking to us again, we can be in a situation where the tlp_new_data count is set, we are not in recovery and we always send one packet every RTT. The failure has to occur when we send the TLP initially from the ip_output() which is rare. But if it occurs you are basically stuck. This fixes it so we use the new_data count and clear it so we know it will be cleared. If a failure occurs the tlp timer will regenerate a new amount anyway so it is un-needed to carry the value on. Reviewed by: Michael Tuexen Sponsored by: Netflix Inc. Differential Revision: https://reviews.freebsd.org/D33325
This commit is contained in:
parent
9935b0e8ea
commit
9b60296531
@ -17329,6 +17329,7 @@ rack_output(struct tcpcb *tp)
|
||||
} else {
|
||||
len = rack->r_ctl.rc_tlp_new_data;
|
||||
}
|
||||
rack->r_ctl.rc_tlp_new_data = 0;
|
||||
} else {
|
||||
len = rack_what_can_we_send(tp, rack, cwnd_to_use, avail, sb_offset);
|
||||
}
|
||||
@ -18972,10 +18973,6 @@ rack_output(struct tcpcb *tp)
|
||||
rack->rc_gp_saw_ss = 1;
|
||||
}
|
||||
}
|
||||
if (doing_tlp && (rsm == NULL)) {
|
||||
/* Make sure new data TLP cnt is clear */
|
||||
rack->r_ctl.rc_tlp_new_data = 0;
|
||||
}
|
||||
if (TCPS_HAVEESTABLISHED(tp->t_state) &&
|
||||
(tp->t_flags & TF_SACK_PERMIT) &&
|
||||
tp->rcv_numsacks > 0)
|
||||
|
Loading…
Reference in New Issue
Block a user