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,
_______________________________________________
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