svn commit: r248002 - stable/8/sys/netinet

Michael Tuexen tuexen at FreeBSD.org
Fri Mar 8 00:43:50 UTC 2013


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;
 			}


More information about the svn-src-stable-8 mailing list