summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrrs <rrs@FreeBSD.org>2010-05-16 16:51:44 +0000
committerrrs <rrs@FreeBSD.org>2010-05-16 16:51:44 +0000
commit0bc7394c2cc30a69dea4973be008c969a9a154d8 (patch)
tree5d363c2e526794aaf143016eb232f47fe437a1d4
parentfaa62e8b7c226d7df5d2814f5a8a2510391a032b (diff)
downloadFreeBSD-src-0bc7394c2cc30a69dea4973be008c969a9a154d8.zip
FreeBSD-src-0bc7394c2cc30a69dea4973be008c969a9a154d8.tar.gz
MFC 207983
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)
-rw-r--r--sys/netinet/sctp_indata.c5
-rw-r--r--sys/netinet/sctp_output.c4
2 files changed, 5 insertions, 4 deletions
diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c
index 13b95ba..a8525f0 100644
--- a/sys/netinet/sctp_indata.c
+++ b/sys/netinet/sctp_indata.c
@@ -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 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 */
if (compare_with_wrap(tp1->rec.data.TSN_seq,
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_association *asoc;
- int tt;
+ uint16_t tt;
asoc = &stcb->asoc;
tt = strmin->last_sequence_delivered;
diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c
index 47590c7..522b52f 100644
--- a/sys/netinet/sctp_output.c
+++ b/sys/netinet/sctp_output.c
@@ -9707,7 +9707,6 @@ send_forward_tsn(struct sctp_tcb *stcb,
chk->rec.chunk_id.can_take_data = 0;
chk->asoc = asoc;
chk->whoTo = NULL;
-
chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_DONTWAIT, 1, MT_DATA);
if (chk->data == NULL) {
sctp_free_a_chunk(stcb, chk);
@@ -9734,7 +9733,8 @@ sctp_fill_in_rest:
unsigned int cnt_of_skipped = 0;
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 */
break;
}
OpenPOWER on IntegriCloud