Author: tuexen
Date: Fri Feb 10 22:52:08 2012
New Revision: 231459
URL: http://svn.freebsd.org/changeset/base/231459

Log:
  MFC r225462:
  Improve implementation of the Nagle algorithm for SCTP:
  Don't delay the final fragment of a fragmented user message.

Modified:
  stable/8/sys/netinet/sctp_output.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/boot/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/e1000/   (props changed)

Modified: stable/8/sys/netinet/sctp_output.c
==============================================================================
--- stable/8/sys/netinet/sctp_output.c  Fri Feb 10 22:49:09 2012        
(r231458)
+++ stable/8/sys/netinet/sctp_output.c  Fri Feb 10 22:52:08 2012        
(r231459)
@@ -9821,19 +9821,22 @@ sctp_chunk_output(struct sctp_inpcb *inp
        unsigned int burst_cnt = 0;
        struct timeval now;
        int now_filled = 0;
-       int nagle_on = 0;
+       int nagle_on;
        int frag_point = sctp_get_frag_point(stcb, &stcb->asoc);
        int un_sent = 0;
        int fr_done;
        unsigned int tot_frs = 0;
 
        asoc = &stcb->asoc;
+       /* The Nagle algorithm is only applied when handling a send call. */
        if (from_where == SCTP_OUTPUT_FROM_USR_SEND) {
                if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NODELAY)) {
                        nagle_on = 0;
                } else {
                        nagle_on = 1;
                }
+       } else {
+               nagle_on = 0;
        }
        SCTP_TCB_LOCK_ASSERT(stcb);
 
@@ -10007,15 +10010,18 @@ sctp_chunk_output(struct sctp_inpcb *inp
                        }
                }
                if (nagle_on) {
-                       /*-
-                        * When nagle is on, we look at how much is un_sent, 
then
-                        * if its smaller than an MTU and we have data in
-                        * flight we stop.
+                       /*
+                        * When the Nagle algorithm is used, look at how
+                        * much is unsent, then if its smaller than an MTU
+                        * and we have data in flight we stop, except if we
+                        * are handling a fragmented user message.
                         */
                        un_sent = ((stcb->asoc.total_output_queue_size - 
stcb->asoc.total_flight) +
                            (stcb->asoc.stream_queue_cnt * sizeof(struct 
sctp_data_chunk)));
                        if ((un_sent < (int)(stcb->asoc.smallest_mtu - 
SCTP_MIN_OVERHEAD)) &&
-                           (stcb->asoc.total_flight > 0)) {
+                           (stcb->asoc.total_flight > 0) &&
+                           ((stcb->asoc.locked_on_sending == NULL) ||
+                           sctp_is_feature_on(inp, 
SCTP_PCB_FLAGS_EXPLICIT_EOR))) {
                                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