1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-23 16:01:42 +00:00

Fix a bug in the handling of unreliable messages

which results in stalled associations.

Approved by: re, rrs (mentor)
MFC after: immediately
This commit is contained in:
Michael Tuexen 2009-08-19 12:02:28 +00:00
parent bd578dcc97
commit 2f99457b0c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196376

View File

@ -4667,8 +4667,10 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
stcb->asoc.peers_rwnd += tp1->send_size; stcb->asoc.peers_rwnd += tp1->send_size;
stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh); stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh);
sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked); sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked);
sctp_m_freem(tp1->data); if (tp1->data) {
tp1->data = NULL; sctp_m_freem(tp1->data);
tp1->data = NULL;
}
do_wakeup_routine = 1; do_wakeup_routine = 1;
if (PR_SCTP_BUF_ENABLED(tp1->flags)) { if (PR_SCTP_BUF_ENABLED(tp1->flags)) {
stcb->asoc.sent_queue_cnt_removeable--; stcb->asoc.sent_queue_cnt_removeable--;
@ -4715,12 +4717,14 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
*/ */
chk = tp1; chk = tp1;
ret_sz += tp1->book_size; ret_sz += tp1->book_size;
sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked);
sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1);
sctp_m_freem(tp1->data); sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb, reason, tp1, so_locked);
if (tp1->data) {
sctp_m_freem(tp1->data);
tp1->data = NULL;
}
/* No flight involved here book the size to 0 */ /* No flight involved here book the size to 0 */
tp1->book_size = 0; tp1->book_size = 0;
tp1->data = NULL;
if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
foundeom = 1; foundeom = 1;
} }