diff options
author | rrs <rrs@FreeBSD.org> | 2009-04-04 11:43:32 +0000 |
---|---|---|
committer | rrs <rrs@FreeBSD.org> | 2009-04-04 11:43:32 +0000 |
commit | f72ef579b2bcf1c9f2abd735735fe92b2f8ada15 (patch) | |
tree | aa1f0e7c08d66758879376d7bd3ed3ff5a7c7bb3 /sys/netinet/sctp_input.c | |
parent | 3503cf99e3ac0111488d2a57341ab1b1088e2436 (diff) | |
download | FreeBSD-src-f72ef579b2bcf1c9f2abd735735fe92b2f8ada15.zip FreeBSD-src-f72ef579b2bcf1c9f2abd735735fe92b2f8ada15.tar.gz |
Many bug fixes (from the IETF hack-fest):
- PR-SCTP had major issues when skipping through a multi-part message.
o Did not look at socket buffer.
o Did not properly handle the reassmebly queue.
o The MARKED segments could interfere and un-skip a chunk causing
a problem with the proper FWD-TSN.
o No FR of FWD-TSN's was being done.
- NR-Sack code was basically disabled. It needed fixes that
never got into the real code.
- CMT code had issues when the two paths were NOT the same b/w. We
found a few small bugs, but also the critcal one here was not
dividing the rwnd amongst the paths.
Obtained from: Michael Tuexen and myself at the IETF hack-fest ;-)
Diffstat (limited to 'sys/netinet/sctp_input.c')
-rw-r--r-- | sys/netinet/sctp_input.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index 494929b..c962e4d 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -3150,8 +3150,10 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc, (uintptr_t) stcb, tp1->rec.data.TSN_seq); } - sctp_flight_size_decrease(tp1); - sctp_total_flight_decrease(stcb, tp1); + if (tp1->sent < SCTP_DATAGRAM_RESEND) { + sctp_flight_size_decrease(tp1); + sctp_total_flight_decrease(stcb, tp1); + } } { /* audit code */ unsigned int audit; @@ -5606,11 +5608,14 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, /* there was a gap before this data was processed */ was_a_gap = 1; } + stcb->asoc.send_sack = 1; sctp_sack_check(stcb, 1, was_a_gap, &abort_flag); if (abort_flag) { /* Again, we aborted so NO UNLOCK needed */ goto out_now; } + } else if (fwd_tsn_seen) { + stcb->asoc.send_sack = 1; } /* trigger send of any chunks in queue... */ trigger_send: |