Author: tuexen
Date: Sun Jan 17 12:07:47 2016
New Revision: 294210
URL: https://svnweb.freebsd.org/changeset/base/294210

Log:
  MFC r291700:
  Ensure that outgoing streams get reset when they run dry.

Modified:
  stable/10/sys/netinet/sctp_indata.c
  stable/10/sys/netinet/sctp_input.c
  stable/10/sys/netinet/sctp_output.c
  stable/10/sys/netinet/sctp_timer.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet/sctp_indata.c
==============================================================================
--- stable/10/sys/netinet/sctp_indata.c Sun Jan 17 12:05:44 2016        
(r294209)
+++ stable/10/sys/netinet/sctp_indata.c Sun Jan 17 12:07:47 2016        
(r294210)
@@ -2763,6 +2763,11 @@ sctp_process_segment_range(struct sctp_t
                                                        panic("No chunks on the 
queues for sid %u.", tp1->rec.data.stream_number);
 #endif
                                                }
+                                               if 
((stcb->asoc.strmout[tp1->rec.data.stream_number].chunks_on_queues == 0) &&
+                                                   
(stcb->asoc.strmout[tp1->rec.data.stream_number].state == 
SCTP_STREAM_RESET_PENDING) &&
+                                                   
TAILQ_EMPTY(&stcb->asoc.strmout[tp1->rec.data.stream_number].outqueue)) {
+                                                       
stcb->asoc.trigger_reset = 1;
+                                               }
                                                tp1->sent = 
SCTP_DATAGRAM_NR_ACKED;
                                                if (tp1->data) {
                                                        /*
@@ -3736,6 +3741,11 @@ sctp_express_handle_sack(struct sctp_tcb
 #endif
                                        }
                                }
+                               if 
((asoc->strmout[tp1->rec.data.stream_number].chunks_on_queues == 0) &&
+                                   
(asoc->strmout[tp1->rec.data.stream_number].state == SCTP_STREAM_RESET_PENDING) 
&&
+                                   
TAILQ_EMPTY(&asoc->strmout[tp1->rec.data.stream_number].outqueue)) {
+                                       asoc->trigger_reset = 1;
+                               }
                                TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next);
                                if (tp1->data) {
                                        /* sa_ignore NO_NULL_CHK */
@@ -4461,6 +4471,11 @@ sctp_handle_sack(struct mbuf *m, int off
 #endif
                        }
                }
+               if 
((asoc->strmout[tp1->rec.data.stream_number].chunks_on_queues == 0) &&
+                   (asoc->strmout[tp1->rec.data.stream_number].state == 
SCTP_STREAM_RESET_PENDING) &&
+                   
TAILQ_EMPTY(&asoc->strmout[tp1->rec.data.stream_number].outqueue)) {
+                       asoc->trigger_reset = 1;
+               }
                TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next);
                if (PR_SCTP_ENABLED(tp1->flags)) {
                        if (asoc->pr_sctp_cnt != 0)

Modified: stable/10/sys/netinet/sctp_input.c
==============================================================================
--- stable/10/sys/netinet/sctp_input.c  Sun Jan 17 12:05:44 2016        
(r294209)
+++ stable/10/sys/netinet/sctp_input.c  Sun Jan 17 12:07:47 2016        
(r294210)
@@ -6026,7 +6026,7 @@ trigger_send:
        if (!TAILQ_EMPTY(&stcb->asoc.control_send_queue)) {
                cnt_ctrl_ready = stcb->asoc.ctrl_queue_cnt - 
stcb->asoc.ecn_echo_cnt_onq;
        }
-       if (cnt_ctrl_ready ||
+       if (cnt_ctrl_ready || stcb->asoc.trigger_reset ||
            ((un_sent) &&
            (stcb->asoc.peers_rwnd > 0 ||
            (stcb->asoc.peers_rwnd <= 0 && stcb->asoc.total_flight == 0)))) {

Modified: stable/10/sys/netinet/sctp_output.c
==============================================================================
--- stable/10/sys/netinet/sctp_output.c Sun Jan 17 12:05:44 2016        
(r294209)
+++ stable/10/sys/netinet/sctp_output.c Sun Jan 17 12:07:47 2016        
(r294210)
@@ -9913,7 +9913,6 @@ sctp_chunk_output(struct sctp_inpcb *inp
        asoc = &stcb->asoc;
 do_it_again:
        /* The Nagle algorithm is only applied when handling a send call. */
-       stcb->asoc.trigger_reset = 0;
        if (from_where == SCTP_OUTPUT_FROM_USR_SEND) {
                if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NODELAY)) {
                        nagle_on = 0;
@@ -9930,7 +9929,8 @@ do_it_again:
        if ((un_sent <= 0) &&
            (TAILQ_EMPTY(&asoc->control_send_queue)) &&
            (TAILQ_EMPTY(&asoc->asconf_send_queue)) &&
-           (asoc->sent_queue_retran_cnt == 0)) {
+           (asoc->sent_queue_retran_cnt == 0) &&
+           (asoc->trigger_reset == 0)) {
                /* Nothing to do unless there is something to be sent left */
                return;
        }
@@ -11901,6 +11901,7 @@ sctp_send_stream_reset_out_if_possible(s
        uint32_t seq;
 
        asoc = &stcb->asoc;
+       asoc->trigger_reset = 0;
        if (asoc->stream_reset_outstanding) {
                return (EALREADY);
        }

Modified: stable/10/sys/netinet/sctp_timer.c
==============================================================================
--- stable/10/sys/netinet/sctp_timer.c  Sun Jan 17 12:05:44 2016        
(r294209)
+++ stable/10/sys/netinet/sctp_timer.c  Sun Jan 17 12:07:47 2016        
(r294210)
@@ -442,6 +442,11 @@ sctp_recover_sent_list(struct sctp_tcb *
                                        
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
                                }
                        }
+                       if 
((asoc->strmout[chk->rec.data.stream_number].chunks_on_queues == 0) &&
+                           (asoc->strmout[chk->rec.data.stream_number].state 
== SCTP_STREAM_RESET_PENDING) &&
+                           
TAILQ_EMPTY(&asoc->strmout[chk->rec.data.stream_number].outqueue)) {
+                               asoc->trigger_reset = 1;
+                       }
                        TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next);
                        if (PR_SCTP_ENABLED(chk->flags)) {
                                if (asoc->pr_sctp_cnt != 0)
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to