Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jan 2011 19:49:04 +0000 (UTC)
From:      Michael Tuexen <tuexen@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r217894 - head/sys/netinet
Message-ID:  <201101261949.p0QJn4ql087464@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tuexen
Date: Wed Jan 26 19:49:03 2011
New Revision: 217894
URL: http://svn.freebsd.org/changeset/base/217894

Log:
  Change infrastructure for SCTP_MAX_BURST to allow compliance
  with the latest socket API ID. Especially it can be disabled.
  
  Full compliance needs changing the structure used in the
  socket option. Since this breaks the API, it will be a
  seperate commit which will not be MFCed to stable/8.
  
  MFC after: 3 months.

Modified:
  head/sys/netinet/sctp_cc_functions.c
  head/sys/netinet/sctp_output.c
  head/sys/netinet/sctp_pcb.h
  head/sys/netinet/sctp_structs.h
  head/sys/netinet/sctp_sysctl.h
  head/sys/netinet/sctp_usrreq.c

Modified: head/sys/netinet/sctp_cc_functions.c
==============================================================================
--- head/sys/netinet/sctp_cc_functions.c	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_cc_functions.c	Wed Jan 26 19:49:03 2011	(r217894)
@@ -601,8 +601,11 @@ sctp_cwnd_update_after_packet_dropped(st
 		 * Take 1/4 of the space left or max burst up .. whichever
 		 * is less.
 		 */
-		incr = min((bw_avail - *on_queue) >> 2,
-		    stcb->asoc.max_burst * net->mtu);
+		incr = (bw_avail - *on_queue) >> 2;
+		if ((stcb->asoc.max_burst > 0) &&
+		    (stcb->asoc.max_burst * net->mtu < incr)) {
+			incr = stcb->asoc.max_burst * net->mtu;
+		}
 		net->cwnd += incr;
 	}
 	if (net->cwnd > bw_avail) {

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_output.c	Wed Jan 26 19:49:03 2011	(r217894)
@@ -9322,7 +9322,7 @@ sctp_chunk_output(struct sctp_inpcb *inp
 	struct sctp_association *asoc;
 	struct sctp_nets *net;
 	int error = 0, num_out = 0, tot_out = 0, ret = 0, reason_code = 0,
-	    burst_cnt = 0, burst_limit = 0;
+	    burst_cnt = 0;
 	struct timeval now;
 	int now_filled = 0;
 	int nagle_on = 0;
@@ -9425,12 +9425,11 @@ sctp_chunk_output(struct sctp_inpcb *inp
 			    &now, &now_filled, frag_point, so_locked);
 			return;
 		}
-		if (tot_frs > asoc->max_burst) {
+		if ((asoc->max_burst > 0) && (tot_frs > asoc->max_burst)) {
 			/* Hit FR burst limit */
 			return;
 		}
 		if ((num_out == 0) && (ret == 0)) {
-
 			/* No more retrans to send */
 			break;
 		}
@@ -9439,7 +9438,6 @@ sctp_chunk_output(struct sctp_inpcb *inp
 	sctp_auditing(12, inp, stcb, NULL);
 #endif
 	/* Check for bad destinations, if they exist move chunks around. */
-	burst_limit = asoc->max_burst;
 	TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
 		if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) ==
 		    SCTP_ADDR_NOT_REACHABLE) {
@@ -9468,24 +9466,29 @@ sctp_chunk_output(struct sctp_inpcb *inp
 			 * { burst_limit = asoc->max_burst *
 			 * SCTP_SAT_NETWORK_BURST_INCR; }
 			 */
-			if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst)) {
-				if ((net->flight_size + (burst_limit * net->mtu)) < net->cwnd) {
-					/*
-					 * JRS - Use the congestion control
-					 * given in the congestion control
-					 * module
-					 */
-					asoc->cc_functions.sctp_cwnd_update_after_output(stcb, net, burst_limit);
-					if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) {
-						sctp_log_maxburst(stcb, net, 0, burst_limit, SCTP_MAX_BURST_APPLIED);
+			if (asoc->max_burst > 0) {
+				if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst)) {
+					if ((net->flight_size + (asoc->max_burst * net->mtu)) < net->cwnd) {
+						/*
+						 * JRS - Use the congestion
+						 * control given in the
+						 * congestion control module
+						 */
+						asoc->cc_functions.sctp_cwnd_update_after_output(stcb, net, asoc->max_burst);
+						if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) {
+							sctp_log_maxburst(stcb, net, 0, asoc->max_burst, SCTP_MAX_BURST_APPLIED);
+						}
+						SCTP_STAT_INCR(sctps_maxburstqueued);
+					}
+					net->fast_retran_ip = 0;
+				} else {
+					if (net->flight_size == 0) {
+						/*
+						 * Should be decaying the
+						 * cwnd here
+						 */
+						;
 					}
-					SCTP_STAT_INCR(sctps_maxburstqueued);
-				}
-				net->fast_retran_ip = 0;
-			} else {
-				if (net->flight_size == 0) {
-					/* Should be decaying the cwnd here */
-					;
 				}
 			}
 		}
@@ -9540,11 +9543,13 @@ sctp_chunk_output(struct sctp_inpcb *inp
 			/* Nothing left to send */
 			break;
 		}
-	} while (num_out && (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) ||
-	    (burst_cnt < burst_limit)));
+	} while (num_out &&
+	    ((asoc->max_burst == 0) ||
+	    SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) ||
+	    (burst_cnt < asoc->max_burst)));
 
 	if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) == 0) {
-		if (burst_cnt >= burst_limit) {
+		if ((asoc->max_burst > 0) && (burst_cnt >= asoc->max_burst)) {
 			SCTP_STAT_INCR(sctps_maxburstqueued);
 			asoc->burst_limit_applied = 1;
 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) {

Modified: head/sys/netinet/sctp_pcb.h
==============================================================================
--- head/sys/netinet/sctp_pcb.h	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_pcb.h	Wed Jan 26 19:49:03 2011	(r217894)
@@ -317,7 +317,7 @@ struct sctp_pcb {
 	uint32_t initial_sequence_debug;
 	uint32_t adaptation_layer_indicator;
 	uint32_t store_at;
-	uint8_t max_burst;
+	uint32_t max_burst;
 	char current_secret_number;
 	char last_secret_number;
 };

Modified: head/sys/netinet/sctp_structs.h
==============================================================================
--- head/sys/netinet/sctp_structs.h	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_structs.h	Wed Jan 26 19:49:03 2011	(r217894)
@@ -1058,7 +1058,7 @@ struct sctp_association {
 	uint8_t send_sack;
 
 	/* max burst after fast retransmit completes */
-	uint8_t max_burst;
+	uint32_t max_burst;
 
 	uint8_t sat_network;	/* RTT is in range of sat net or greater */
 	uint8_t sat_network_lockout;	/* lockout code */

Modified: head/sys/netinet/sctp_sysctl.h
==============================================================================
--- head/sys/netinet/sctp_sysctl.h	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_sysctl.h	Wed Jan 26 19:49:03 2011	(r217894)
@@ -184,7 +184,7 @@ struct sctp_sysctl {
 
 /* maxburst: Default max burst for sctp endpoints */
 #define SCTPCTL_MAXBURST_DESC		"Default max burst for sctp endpoints"
-#define SCTPCTL_MAXBURST_MIN		1
+#define SCTPCTL_MAXBURST_MIN		0
 #define SCTPCTL_MAXBURST_MAX		0xFFFFFFFF
 #define SCTPCTL_MAXBURST_DEFAULT	SCTP_DEF_MAX_BURST
 

Modified: head/sys/netinet/sctp_usrreq.c
==============================================================================
--- head/sys/netinet/sctp_usrreq.c	Wed Jan 26 19:39:31 2011	(r217893)
+++ head/sys/netinet/sctp_usrreq.c	Wed Jan 26 19:49:03 2011	(r217894)
@@ -1972,7 +1972,11 @@ flags_out:
 			SCTP_CHECK_AND_CAST(value, optval, uint8_t, *optsize);
 
 			SCTP_INP_RLOCK(inp);
-			*value = inp->sctp_ep.max_burst;
+			if (inp->sctp_ep.max_burst < 256) {
+				*value = inp->sctp_ep.max_burst;
+			} else {
+				*value = 255;
+			}
 			SCTP_INP_RUNLOCK(inp);
 			*optsize = sizeof(uint8_t);
 		}
@@ -3591,9 +3595,7 @@ sctp_setopt(struct socket *so, int optna
 			SCTP_CHECK_AND_CAST(burst, optval, uint8_t, optsize);
 
 			SCTP_INP_WLOCK(inp);
-			if (*burst) {
-				inp->sctp_ep.max_burst = *burst;
-			}
+			inp->sctp_ep.max_burst = *burst;
 			SCTP_INP_WUNLOCK(inp);
 		}
 		break;



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