#include <netproto/key/key.h>
#endif
+/*
+ * Limit burst of new packets during SACK based fast recovery
+ * or extended limited transmit.
+ */
+#define TCP_SACK_MAXBURST 4
+
MALLOC_DEFINE(M_TSEGQ, "tseg_qent", "TCP segment queue entry");
static int log_in_vain = 0;
int nseg = 0; /* consecutive new segments */
int nseg_rexmt = 0; /* retransmitted segments */
int maxrexmt = 0;
-#define MAXBURST 4 /* limit burst of new packets on partial ack */
if (force) {
uint32_t unsacked = tcp_sack_first_unsacked_len(tp);
pipe = tcp_sack_compute_pipe(tp);
while (((tcp_seq_diff_t)(ocwnd - pipe) >= (tcp_seq_diff_t)tp->t_maxseg
|| (force && nseg_rexmt < maxrexmt && nseg == 0)) &&
- (!tcp_do_smartsack || nseg < MAXBURST)) {
+ (!tcp_do_smartsack || nseg < TCP_SACK_MAXBURST)) {
tcp_seq old_snd_max, old_rexmt_high, nextrexmt;
uint32_t sent, seglen;
boolean_t rescue;
if (cwnd_left < (tcp_seq_diff_t)tp->t_maxseg)
return FALSE;
+ if (tcp_do_smartsack)
+ cwnd_left = ulmin(cwnd_left, tp->t_maxseg * TCP_SACK_MAXBURST);
+
next = tp->snd_nxt = tp->snd_max;
tp->snd_cwnd = tp->snd_nxt - tp->snd_una +
rounddown(cwnd_left, tp->t_maxseg);