Author: rrs
Date: Wed May 12 18:00:15 2010
New Revision: 207983
URL: http://svn.freebsd.org/changeset/base/207983

Log:
  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

Modified:
  head/sys/netinet/sctp_indata.c
  head/sys/netinet/sctp_output.c

Modified: head/sys/netinet/sctp_indata.c
==============================================================================
--- head/sys/netinet/sctp_indata.c      Wed May 12 17:53:05 2010        
(r207982)
+++ head/sys/netinet/sctp_indata.c      Wed May 12 18:00:15 2010        
(r207983)
@@ -3750,7 +3750,8 @@ sctp_try_advance_peer_ack_point(struct s
                 * 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 sc
 {
        struct sctp_queued_to_read *ctl, *nctl;
        struct sctp_association *asoc;
-       int tt;
+       uint16_t tt;
 
        asoc = &stcb->asoc;
        tt = strmin->last_sequence_delivered;

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c      Wed May 12 17:53:05 2010        
(r207982)
+++ head/sys/netinet/sctp_output.c      Wed May 12 18:00:15 2010        
(r207983)
@@ -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;
                        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to