PERFORCE change 165543 for review

Andre Oppermann andre at FreeBSD.org
Thu Jul 2 14:22:16 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165543

Change 165543 by andre at andre_flirtbox on 2009/07/02 14:21:57

	Use TCPSTAT_INC/ADD macro to update tcp statistics.
	
	Move empty queue test up and remove chained if test
	in later tests.

Affected files ...

.. //depot/projects/tcp_reass/netinet/tcp_reass.c#26 edit

Differences ...

==== //depot/projects/tcp_reass/netinet/tcp_reass.c#26 (text+ko) ====

@@ -295,8 +295,8 @@
 	 */
 	if (th_seq != tp->rcv_nxt &&
 	    tp->t_trqmcnt > (sbspace(&so->so_rcv) / 8 * 11)) {
-		tcpstat.tcps_reass_overflow++;
-		tcpstat.tcps_rcvmemdrop++;
+		TCPSTAT_INC(tcps_reass_overflow);
+		TCPSTAT_INC(tcps_rcvmemdrop);
 		m_freem(m);
 		*tlenp = 0;
 		return (0);
@@ -336,11 +336,15 @@
 	} else
 		thflags &= ~TH_FIN;
 
+	/* Check if this is the first segment. */
+	if (TAILQ_EMPTY(&tp->t_trq))
+		goto insert;
+
 	/* Starting point for the following tests. */
 	tqe = TAILQ_LAST(&tp->t_trq, trq_head);
 
 	/* Check if this segment directly attaches to the end. */
-	if (tqe && tqe->trq_seq + tqe->trq_len == th_seq) {
+	if (tqe->trq_seq + tqe->trq_len == th_seq) {
 		tqe->trq_len += *tlenp;
 		tqe->trq_mcnt += mcnt;
 		tp->t_trqmcnt += mcnt;
@@ -357,18 +361,14 @@
 			LIST_INSERT_HEAD(&tp->t_trq_sack, tqe, trq_s);
 		}
 		/* TCP statistics. */
-		tcpstat.tcps_rcvoopack++;
-		tcpstat.tcps_rcvoobyte += *tlenp;
-		tcpstat.tcps_reass_tail++;
+		TCPSTAT_INC(tcps_rcvoopack);
+		TCPSTAT_ADD(tcps_rcvoobyte, *tlenp);
+		TCPSTAT_INC(tcps_reass_tail);
 		return (0);
 	}
 
 	/* Check if beyond last block. */
-	if (tqe && SEQ_LT(tqe->trq_seq + tqe->trq_len, th_seq))
-		goto insert;
-
-	/* Check if this is the first segment. */
-	if (TAILQ_EMPTY(&tp->t_trq))
+	if (SEQ_LT(tqe->trq_seq + tqe->trq_len, th_seq))
 		goto insert;
 
 	/* Check if this is the missing segment. */
@@ -383,8 +383,8 @@
 				m_adj(m, -i);
 				*tlenp -= i;
 				/* TCP statistics. */
-				tcpstat.tcps_rcvpartduppack++;
-				tcpstat.tcps_rcvpartdupbyte += i;
+				TCPSTAT_INC(tcps_rcvpartduppack);
+				TCPSTAT_ADD(tcps_rcvpartdupbyte, i);
 				/* Update accounting. */
 				mcnt = m_storagesize(m);
 			}
@@ -399,9 +399,10 @@
 		}
 		goto insert;	/* No statistics, this segment is in line. */
 	}
+
+	/* TCP statistics. */
 	TCPSTAT_INC(tcps_rcvoopack);
 	TCPSTAT_ADD(tcps_rcvoobyte, *tlenp);
-	/* TCP statistics. */
 
 	/* See where it fits. */
 	TAILQ_FOREACH_SAFE(tqe, &tp->t_trq, trq_q, tqen) {
@@ -415,10 +416,13 @@
 		/* Segment is already fully covered. */
 		if (SEQ_LEQ(tqe->trq_seq, th_seq) &&
 		    SEQ_GEQ(tqe->trq_seq + tqe->trq_len, th_seq + *tlenp)) {
-			tcpstat.tcps_rcvduppack++;
-			tcpstat.tcps_rcvdupbyte += *tlenp;
-			tcpstat.tcps_reass_covered++;
-			/* XXXAO: What to SACK report when duplicate? */
+			TCPSTAT_INC(tcps_rcvduppack);
+			TCPSTAT_ADD(tcps_rcvdupbyte, *tlenp);
+			TCPSTAT_INC(tcps_reass_covered);
+			/*
+			 * XXXAO: What to SACK report when duplicate?
+			 * See RFC2883: D-SACK (Duplicate SACK)
+			 */
 			if (LIST_FIRST(&tp->t_trq_sack) != tqe) {
 				LIST_REMOVE(tqe, trq_s);
 				LIST_INSERT_HEAD(&tp->t_trq_sack, tqe, trq_s);
@@ -448,7 +452,7 @@
 				LIST_REMOVE(tqe, trq_s);
 				LIST_INSERT_HEAD(&tp->t_trq_sack, tqe, trq_s);
 			}
-			tcpstat.tcps_reass_replace++;
+			TCPSTAT_INC(tcps_reass_replace);
 			return (0);
 		}
 
@@ -463,8 +467,8 @@
 				m_adj(m, -i);
 				*tlenp -= i;
 				/* TCP statistics. */
-				tcpstat.tcps_rcvpartduppack++;
-				tcpstat.tcps_rcvpartdupbyte += i;
+				TCPSTAT_INC(tcps_rcvpartduppack);
+				TCPSTAT_ADD(tcps_rcvpartdupbyte, i);
 				/* Update accounting. */
 				mcnt = m_storagesize(m);
 			}
@@ -479,7 +483,7 @@
 				LIST_REMOVE(tqe, trq_s);
 				LIST_INSERT_HEAD(&tp->t_trq_sack, tqe, trq_s);
 			}
-			tcpstat.tcps_reass_prepend++;
+			TCPSTAT_INC(tcps_reass_prepend);
 			return (0);
 		}
 
@@ -492,8 +496,8 @@
 				m_adj(m, i);
 				*tlenp -= i;
 				/* TCP Statistics. */
-				tcpstat.tcps_rcvpartduppack++;
-				tcpstat.tcps_rcvpartdupbyte += i;
+				TCPSTAT_INC(tcps_rcvpartduppack);
+				TCPSTAT_ADD(tcps_rcvpartdupbyte, i);
 			}
 			tqe->trq_len += *tlenp;
 			tqe->trq_mcnt += mcnt;
@@ -508,7 +512,7 @@
 				LIST_REMOVE(tqe, trq_s);
 				LIST_INSERT_HEAD(&tp->t_trq_sack, tqe, trq_s);
 			}
-			tcpstat.tcps_reass_append++;
+			TCPSTAT_INC(tcps_reass_append);
 			return (0);
 		}
 	}
@@ -525,12 +529,12 @@
 	} else {
 		tqen = uma_zalloc(tcp_reass_zone, (M_NOWAIT|M_ZERO));
 		if (tqen == NULL) {
-			tcpstat.tcps_rcvmemdrop++;
+			TCPSTAT_INC(tcps_rcvmemdrop);
 			m_freem(m);
 			*tlenp = 0;
 			return (0);
 		}
-		tcpstat.tcps_reass_blocks++;
+		TCPSTAT_INC(tcps_reass_blocks);
 	}
 	tcp_reass_qsize++;
 	if (tcp_reass_spacetime) {
@@ -576,7 +580,7 @@
 	    ("%s: queue empty at present", __func__));
 	KASSERT((TAILQ_FIRST(&tp->t_trq))->trq_seq == tp->rcv_nxt,
 	    ("%s: first block does not match rcv_nxt", __func__));
-	tcpstat.tcps_reass_missingseg++;
+	TCPSTAT_INC(tcps_reass_missingseg);
 
 	SOCKBUF_LOCK(&so->so_rcv);
 	TAILQ_FOREACH_SAFE(tqe, &tp->t_trq, trq_q, tqen) {
@@ -634,8 +638,8 @@
 	/* Appended block may reach beyond next block. */
 	while (SEQ_GEQ(tqe->trq_seq + tqe->trq_len, tqen->trq_seq + tqen->trq_len)) {
 		/* TCP Statistics. */
-		tcpstat.tcps_rcvpartdupbyte += tqen->trq_len;
-		tcpstat.tcps_reass_covered++;
+		TCPSTAT_ADD(tcps_rcvpartdupbyte, tqen->trq_len);
+		TCPSTAT_INC(tcps_reass_covered);
 		tp->t_trqmcnt -= tqe->trq_mcnt;
 		m_freem(tqen->trq_m);
 		TAILQ_REMOVE(&tp->t_trq, tqen, trq_q);
@@ -651,7 +655,7 @@
 	if ((i = SEQ_DELTA(tqe->trq_seq + tqe->trq_len, tqen->trq_seq))) {
 		m_adj(tqen->trq_m, i);
 		tqen->trq_len -= i;
-		tcpstat.tcps_rcvpartdupbyte += i;		/* Statistics */
+		TCPSTAT_ADD(tcps_rcvpartdupbyte, i);		/* Statistics */
 		/* Dispose of empty mbufs. */
 		if (tcp_reass_spacetime) {
 			tqen->trq_m = m_trimhead(tqen->trq_m);
@@ -670,7 +674,7 @@
 	LIST_REMOVE(tqen, trq_s);
 	uma_zfree(tcp_reass_zone, tqen);
 	tcp_reass_qsize--;
-	tcpstat.tcps_reass_merge++;
+	TCPSTAT_INC(tcps_reass_merge);
 }
 
 /*


More information about the p4-projects mailing list