Author: tuexen
Date: Fri Mar  8 00:43:49 2013
New Revision: 248002
URL: http://svnweb.freebsd.org/changeset/base/248002

Log:
  MFC r242708,r242709:
  
  Improve PR-SCTP if used in combination with NR-SACK.
  Based on work done by Mohammad Rajiullah.

Modified:
  stable/8/sys/netinet/sctp_constants.h
  stable/8/sys/netinet/sctp_indata.c
  stable/8/sys/netinet/sctp_output.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/netinet/   (props changed)

Modified: stable/8/sys/netinet/sctp_constants.h
==============================================================================
--- stable/8/sys/netinet/sctp_constants.h       Fri Mar  8 00:41:20 2013        
(r248001)
+++ stable/8/sys/netinet/sctp_constants.h       Fri Mar  8 00:43:49 2013        
(r248002)
@@ -370,6 +370,7 @@ __FBSDID("$FreeBSD$");
 #define SCTP_DATAGRAM_ACKED            10010
 #define SCTP_DATAGRAM_MARKED           20010
 #define SCTP_FORWARD_TSN_SKIP          30010
+#define SCTP_DATAGRAM_NR_MARKED                40010
 
 /* chunk output send from locations */
 #define SCTP_OUTPUT_FROM_USR_SEND       0

Modified: stable/8/sys/netinet/sctp_indata.c
==============================================================================
--- stable/8/sys/netinet/sctp_indata.c  Fri Mar  8 00:41:20 2013        
(r248001)
+++ stable/8/sys/netinet/sctp_indata.c  Fri Mar  8 00:43:49 2013        
(r248002)
@@ -2975,9 +2975,10 @@ sctp_process_segment_range(struct sctp_t
                                         * All chunks NOT UNSENT fall through 
here and are marked
                                         * (leave PR-SCTP ones that are to skip 
alone though)
                                         */
-                                       if (tp1->sent != SCTP_FORWARD_TSN_SKIP)
+                                       if ((tp1->sent != 
SCTP_FORWARD_TSN_SKIP) &&
+                                           (tp1->sent != 
SCTP_DATAGRAM_NR_MARKED)) {
                                                tp1->sent = 
SCTP_DATAGRAM_MARKED;
-
+                                       }
                                        if (tp1->rec.data.chunk_was_revoked) {
                                                /* deflate the cwnd */
                                                tp1->whoTo->cwnd -= 
tp1->book_size;
@@ -2985,6 +2986,7 @@ sctp_process_segment_range(struct sctp_t
                                        }
                                        /* NR Sack code here */
                                        if (nr_sacking) {
+                                               tp1->sent = 
SCTP_DATAGRAM_NR_MARKED;
                                                if (tp1->data) {
                                                        /*
                                                         * sa_ignore
@@ -3600,12 +3602,14 @@ sctp_try_advance_peer_ack_point(struct s
        }
        TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) {
                if (tp1->sent != SCTP_FORWARD_TSN_SKIP &&
-                   tp1->sent != SCTP_DATAGRAM_RESEND) {
+                   tp1->sent != SCTP_DATAGRAM_RESEND &&
+                   tp1->sent != SCTP_DATAGRAM_NR_MARKED) {
                        /* no chance to advance, out of here */
                        break;
                }
                if (SCTP_BASE_SYSCTL(sctp_logging_level) & 
SCTP_LOG_TRY_ADVANCE) {
-                       if (tp1->sent == SCTP_FORWARD_TSN_SKIP) {
+                       if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) ||
+                           (tp1->sent == SCTP_DATAGRAM_NR_MARKED)) {
                                sctp_misc_ints(SCTP_FWD_TSN_CHECK,
                                    asoc->advanced_peer_ack_point,
                                    tp1->rec.data.TSN_seq, 0, 0);
@@ -3653,7 +3657,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_NR_MARKED)) {
                        /* advance PeerAckPoint goes forward */
                        if (SCTP_TSN_GT(tp1->rec.data.TSN_seq, 
asoc->advanced_peer_ack_point)) {
                                asoc->advanced_peer_ack_point = 
tp1->rec.data.TSN_seq;

Modified: stable/8/sys/netinet/sctp_output.c
==============================================================================
--- stable/8/sys/netinet/sctp_output.c  Fri Mar  8 00:41:20 2013        
(r248001)
+++ stable/8/sys/netinet/sctp_output.c  Fri Mar  8 00:43:49 2013        
(r248002)
@@ -10157,7 +10157,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_NR_MARKED)) {
                                /* 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