When counting the number of chunks in the

retransmission queue to validate the retran count, we
need to include the chunks in the control send queue
too. Otherwise the count will not match and you will get
the invarient warning if invarients are on.

MFC after:	2 weeks
This commit is contained in:
Randall Stewart 2010-07-26 09:20:55 +00:00
parent 6c0c240366
commit 6c065bbe06
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=210493

View File

@ -870,6 +870,26 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
}
#endif
*num_marked = num_mk;
/*
* Now check for a ECN Echo that may be stranded And include the
* cnt_mk'd to have all resends in the control queue.
*/
TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
if (chk->sent == SCTP_DATAGRAM_RESEND) {
cnt_mk++;
}
if ((chk->whoTo == net) &&
(chk->rec.chunk_id.id == SCTP_ECN_ECHO)) {
sctp_free_remote_addr(chk->whoTo);
chk->whoTo = alt;
if (chk->sent != SCTP_DATAGRAM_RESEND) {
chk->sent = SCTP_DATAGRAM_RESEND;
sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
cnt_mk++;
}
atomic_add_int(&alt->ref_count, 1);
}
}
if ((stcb->asoc.sent_queue_retran_cnt == 0) && (could_be_sent)) {
/* fix it so we retransmit the highest acked anyway */
sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
@ -885,19 +905,6 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
stcb->asoc.sent_queue_retran_cnt = cnt_mk;
#endif
}
/* Now check for a ECN Echo that may be stranded */
TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
if ((chk->whoTo == net) &&
(chk->rec.chunk_id.id == SCTP_ECN_ECHO)) {
sctp_free_remote_addr(chk->whoTo);
chk->whoTo = alt;
if (chk->sent != SCTP_DATAGRAM_RESEND) {
chk->sent = SCTP_DATAGRAM_RESEND;
sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
}
atomic_add_int(&alt->ref_count, 1);
}
}
if (audit_tf) {
SCTPDBG(SCTP_DEBUG_TIMER4,
"Audit total flight due to negative value net:%p\n",