More PR-SCTP bugs:

- Make sure that when you kick the streams you add correctly
    using a 16 bit unsigned.
  - Make sure when sending out you allow FWD-TSN to skip over
    and list the ACKED chunks in the stream/seq list (so the
    rcv will kick the stream)
MFC after:	3 days
This commit is contained in:
Randall Stewart 2010-05-12 18:00:15 +00:00
parent 7cd75bfd82
commit 83128708b4
2 changed files with 5 additions and 4 deletions

View File

@ -3750,7 +3750,8 @@ sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb,
* the chunk, advance our peer ack point and we can check * the chunk, advance our peer ack point and we can check
* the next chunk. * the next chunk.
*/ */
if (tp1->sent == SCTP_FORWARD_TSN_SKIP) { if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) ||
(tp1->sent == SCTP_DATAGRAM_ACKED)) {
/* advance PeerAckPoint goes forward */ /* advance PeerAckPoint goes forward */
if (compare_with_wrap(tp1->rec.data.TSN_seq, if (compare_with_wrap(tp1->rec.data.TSN_seq,
asoc->advanced_peer_ack_point, asoc->advanced_peer_ack_point,
@ -5351,7 +5352,7 @@ sctp_kick_prsctp_reorder_queue(struct sctp_tcb *stcb,
{ {
struct sctp_queued_to_read *ctl, *nctl; struct sctp_queued_to_read *ctl, *nctl;
struct sctp_association *asoc; struct sctp_association *asoc;
int tt; uint16_t tt;
asoc = &stcb->asoc; asoc = &stcb->asoc;
tt = strmin->last_sequence_delivered; tt = strmin->last_sequence_delivered;

View File

@ -9707,7 +9707,6 @@ send_forward_tsn(struct sctp_tcb *stcb,
chk->rec.chunk_id.can_take_data = 0; chk->rec.chunk_id.can_take_data = 0;
chk->asoc = asoc; chk->asoc = asoc;
chk->whoTo = NULL; chk->whoTo = NULL;
chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_DONTWAIT, 1, MT_DATA); chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_DONTWAIT, 1, MT_DATA);
if (chk->data == NULL) { if (chk->data == NULL) {
sctp_free_a_chunk(stcb, chk); sctp_free_a_chunk(stcb, chk);
@ -9734,7 +9733,8 @@ send_forward_tsn(struct sctp_tcb *stcb,
unsigned int cnt_of_skipped = 0; unsigned int cnt_of_skipped = 0;
TAILQ_FOREACH(at, &asoc->sent_queue, sctp_next) { TAILQ_FOREACH(at, &asoc->sent_queue, sctp_next) {
if (at->sent != SCTP_FORWARD_TSN_SKIP) { if ((at->sent != SCTP_FORWARD_TSN_SKIP) &&
(at->sent != SCTP_DATAGRAM_ACKED)) {
/* no more to look at */ /* no more to look at */
break; break;
} }