Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Apr 2009 12:52:05 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r190843 - head/sys/netinet
Message-ID:  <200904081252.n38Cq5gd059433@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Wed Apr  8 12:52:05 2009
New Revision: 190843
URL: http://svn.freebsd.org/changeset/base/190843

Log:
  Fix a FR bug. When doing PR-SCTP with number rtx
  set to a low number. The check for skipping was in the
  incorrect place. Which meant we would FR chunks we
  should not.
  MFC after:	1 Month

Modified:
  head/sys/netinet/sctp_indata.c

Modified: head/sys/netinet/sctp_indata.c
==============================================================================
--- head/sys/netinet/sctp_indata.c	Wed Apr  8 12:49:36 2009	(r190842)
+++ head/sys/netinet/sctp_indata.c	Wed Apr  8 12:52:05 2009	(r190843)
@@ -3621,19 +3621,6 @@ sctp_strike_gap_ack_chunks(struct sctp_t
 					continue;
 				}
 			}
-			if ((PR_SCTP_RTX_ENABLED(tp1->flags)) && tp1->sent < SCTP_DATAGRAM_ACKED) {
-				/* Has it been retransmitted tv_sec times? */
-				if (tp1->snd_count > tp1->rec.data.timetodrop.tv_sec) {
-					/* Yes, so drop it */
-					if (tp1->data != NULL) {
-						(void)sctp_release_pr_sctp_chunk(stcb, tp1,
-						    (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
-						    SCTP_SO_NOT_LOCKED);
-					}
-					tp1 = TAILQ_NEXT(tp1, sctp_next);
-					continue;
-				}
-			}
 		}
 		if (compare_with_wrap(tp1->rec.data.TSN_seq,
 		    asoc->this_sack_highest_gap, MAX_TSN)) {
@@ -3849,6 +3836,25 @@ sctp_strike_gap_ack_chunks(struct sctp_t
 			/* Increment the count to resend */
 			struct sctp_nets *alt;
 
+			if ((stcb->asoc.peer_supports_prsctp) &&
+			    (PR_SCTP_RTX_ENABLED(tp1->flags))) {
+				/*
+				 * Has it been retransmitted tv_sec times? -
+				 * we store the retran count there.
+				 */
+				if (tp1->snd_count > tp1->rec.data.timetodrop.tv_sec) {
+					/* Yes, so drop it */
+					if (tp1->data != NULL) {
+						(void)sctp_release_pr_sctp_chunk(stcb, tp1,
+						    (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
+						    SCTP_SO_NOT_LOCKED);
+					}
+					/* Make sure to flag we had a FR */
+					tp1->whoTo->net_ack++;
+					tp1 = TAILQ_NEXT(tp1, sctp_next);
+					continue;
+				}
+			}
 			/* printf("OK, we are now ready to FR this guy\n"); */
 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
 				sctp_log_fr(tp1->rec.data.TSN_seq, tp1->snd_count,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904081252.n38Cq5gd059433>