("SACK block count underflow: %d < 0", scb->nblocks));
sb = nb;
}
- if (sb && SEQ_GT(th_ack, sb->sblk_start))
- sb->sblk_start = th_ack; /* other side reneged? XXX */
+ if (sb && SEQ_GEQ(th_ack, sb->sblk_start)) {
+ /* Other side reneged? XXX */
+ tcpstat.tcps_sackrenege++;
+ tcp_sack_cleanup(scb);
+ }
}
/*
u_long tcps_mturesent; /* resends due to MTU discovery */
u_long tcps_listendrop; /* listen queue overflows */
u_long tcps_rcvbadsackopt; /* rcvd illegal SACK options */
+ u_long tcps_sackrenege; /* times other side reneged */
u_long tcps_sacksbupdate; /* times SACK scoreboard updated */
u_long tcps_sacksboverflow; /* times SACK scoreboard overflowed */
u_long tcps_sacksbreused; /* times SACK sb-block reused */
u_long tcps_sacksbfailed; /* times SACK sb update failed */
- u_long tcps_sacksbfast; /* timee SACK sb-block uses cache */
+ u_long tcps_sacksbfast; /* times SACK sb-block uses cache */
u_long tcps_sc_added; /* entry added to syncache */
u_long tcps_sc_retransmitted; /* syncache entry was retransmitted */
p(tcps_rcvbadoff, "\t\t%lu discarded for bad header offset field%s\n");
p1a(tcps_rcvshort, "\t\t%lu discarded because packet too short\n");
p(tcps_rcvbadsackopt, "\t\t%lu bad SACK option%s\n");
+ p1a(tcps_sackrenege, "\t\t%lu other side reneged\n");
p(tcps_connattempt, "\t%lu connection request%s\n");
p(tcps_accepts, "\t%lu connection accept%s\n");
p(tcps_badsyn, "\t%lu bad connection attempt%s\n");