PERFORCE change 166480 for review

Andre Oppermann andre at FreeBSD.org
Thu Jul 23 21:43:21 UTC 2009


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

Change 166480 by andre at andre_t61 on 2009/07/23 21:42:30

	Add statistics.
	Update TODO list.

Affected files ...

.. //depot/projects/tcp_reass/netinet/tcp_reass.c#45 edit
.. //depot/projects/tcp_reass/netinet/tcp_var.h#22 edit

Differences ...

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

@@ -62,10 +62,10 @@
  * optional parts marked as "SHOULD".
  *
  * TODO:
- * - Improve comments and RFC references.
+ * - Improve comments and annotate RFC references.
  * - Resizing of tcp_reass_globalmaxblocks through sysctl.
- * - TCP statistics.
  * - Style improvements.
+ * - Lots of testing.
  */
 
 #include "opt_inet.h"
@@ -379,6 +379,9 @@
 	else
 		thflags &= ~TH_FIN;
 
+	TCPSTAT_INC(tcps_rcvoopack);
+	TCPSTAT_ADD(tcps_rcvoobyte, len);
+
 	/*
 	 * Get rid of packet header and mtags.
 	 * Trim empty mbufs from head of chain.
@@ -409,19 +412,29 @@
 			tcp_reass_sacktrack(tp, trb);
 			tp->rcv_reass_dsack.start = trbs.trb_seqs;
 			tp->rcv_reass_dsack.end = trbs.trb_seqe;
+			TCPSTAT_INC(tcps_rcvduppack);
+			TCPSTAT_ADD(tcps_rcvdupbyte, len);
 			goto done;
 		}
+
 		tp->rcv_reass_size += SEQ_DELTA(trbs.trb_seqs, trbs.trb_seqe);
 
 		/* Merge in the new segment. */
 		(void)tcp_reass_merge(trb, &trbs);
 		tcp_reass_sacktrack(tp, trb);
 
+		if ((len = SEQ_DELTA(trbs.trb_seqs, trbs.trb_seqe)) > 0) {
+			tp->rcv_reass_size -= len;
+			TCPSTAT_INC(tcps_rcvpartduppack);
+			TCPSTAT_ADD(tcps_rcvpartdupbyte, len);
+		}
+
 		/* Merge in previous block(s) if there is overlap. */
 		while ((trbn = RB_PREV(tcp_ra, &tp->rcv_reass, trb)) != NULL &&
 		    SEQ_LEQ(trb->trb_seqs, trbn->trb_seqe)) {
 			trbn = tcp_reass_merge(trb, trbn);
 			tcp_reass_free(tp, trbn);
+			TCPSTAT_INC(tcps_reass_merge);
 		}
 
 		/* Merge in next block(s) if there is overlap. */
@@ -429,6 +442,7 @@
 		    SEQ_GEQ(trb->trb_seqe, trbn->trb_seqs)) {
 			trbn = tcp_reass_merge(trb, trbn);
 			tcp_reass_free(tp, trbn);
+			TCPSTAT_INC(tcps_reass_merge);
 		}
 
 	} else if (tp->rcv_nxt == th_seq) {
@@ -442,8 +456,10 @@
 		KASSERT(trbn == NULL, ("%s: RB_INSERT failed", __func__));
 		LIST_INSERT_HEAD(&tp->rcv_reass_sack, trb, trb_sack);
 		tp->rcv_reass_blocks++;
+		TCPSTAT_INC(tcps_reass_blocks);
 	} else {
 		/* Memory allocation failure. */
+		TCPSTAT_INC(tcps_rcvmemdrop);
 		goto done;
 	}
 	KASSERT(tcp_reass_verify(tp, 1),
@@ -462,6 +478,7 @@
 	    ("%s: queue empty at present", __func__));
 	KASSERT(trb->trb_seqs == tp->rcv_nxt,
 	    ("%s: first block does not match rcv_nxt", __func__));
+
 	TCPSTAT_INC(tcps_reass_missingseg);
 
 	SOCKBUF_LOCK(&so->so_rcv);
@@ -544,6 +561,8 @@
 		trb->trb_m = trbn->trb_m;
 		trb->trb_mt = trbn->trb_mt;
 
+		TCPSTAT_INC(tcps_reass_replace);
+
 	} else if (SEQ_LT(trbn->trb_seqs, trb->trb_seqs)) {
 
 		if ((i = SEQ_DELTA(trb->trb_seqs, trbn->trb_seqe)) > 0)

==== //depot/projects/tcp_reass/netinet/tcp_var.h#22 (text+ko) ====

@@ -444,9 +444,6 @@
 	u_long	tcps_reass_overflow;	/* reassembly queue overflows */
 	u_long	tcps_reass_tail;	/* packet appends to tail block */
 	u_long	tcps_reass_merge;	/* reassembly block merges */
-	u_long	tcps_reass_prepend;	/* packet prepends block */
-	u_long	tcps_reass_append;	/* packet appends block */
-	u_long	tcps_reass_covered;	/* block covered and removed */
 	u_long	tcps_reass_replace;	/* block replaced */
 	u_long	tcps_reass_flush;	/* queue flushes due to timeout */
 


More information about the p4-projects mailing list