PERFORCE change 165934 for review

Andre Oppermann andre at FreeBSD.org
Sat Jul 11 16:01:02 UTC 2009


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

Change 165934 by andre at andre_flirtbox on 2009/07/11 16:00:34

	Fixups for RB based SACK scoreboard.

Affected files ...

.. //depot/projects/tcp_new/netinet/tcp_input.c#13 edit
.. //depot/projects/tcp_new/netinet/tcp_output.c#11 edit
.. //depot/projects/tcp_new/netinet/tcp_sack.c#5 edit
.. //depot/projects/tcp_new/netinet/tcp_subr.c#7 edit
.. //depot/projects/tcp_new/netinet/tcp_timer.c#4 edit
.. //depot/projects/tcp_new/netinet/tcp_var.h#12 edit

Differences ...

==== //depot/projects/tcp_new/netinet/tcp_input.c#13 (text+ko) ====

@@ -1734,7 +1734,7 @@
 	 * Update send SACK information and tell us how much more
 	 * data has left the network (relative to last SACK we got).
 	 */
-	if ((to.to_flags & TOF_SACK) || !TAILQ_EMPTY(&tp->snd_holes))
+	if ((to.to_flags & TOF_SACK) || !RB_EMPTY(&tp->snd_sackblocks))
 		sacked = tcp_sack_doack(tp, &to, th->th_ack);
 	else
 		sacked = 0;

==== //depot/projects/tcp_new/netinet/tcp_output.c#11 (text+ko) ====


==== //depot/projects/tcp_new/netinet/tcp_sack.c#5 (text+ko) ====

@@ -42,10 +42,14 @@
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
 #include <sys/proc.h>		/* for proc0 declaration */
+#include <sys/socket.h>
+#include <sys/socketvar.h>
 #include <sys/systm.h>
 
 #include <vm/uma.h>
 
+#include <net/if.h>
+
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
@@ -104,15 +108,15 @@
 		return (0);
 }
 
-RB_PROTOTYPE(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp);
-RB_GENERATE(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp);
+RB_PROTOTYPE_STATIC(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp);
+RB_GENERATE_STATIC(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp);
 
 static void
-tcp_sack_free(struct tcp_sack_block *tps, struct tcp_sack_block *tsb)
+tcp_sack_free(struct tcpcb *tp, struct tcp_sack_block *tsb)
 {
 	struct tcp_sack_block *sb;
 
-	sb = RB_REMOVE(tcp_sackholes, tps, tsb);
+	sb = RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb);
 	KASSERT(sb != NULL, ("%s: RB_REMOVE failed", __func__));
 	uma_zfree(tcp_sackblock_zone, tsb);
 }
@@ -128,7 +132,7 @@
 		    SEQ_LEQ(tsb->tsb_blk.start, tp->snd_una) ||
 		    SEQ_GT(tsb->tsb_blk.end, tp->snd_nxt) ||
 		    (tsbn != NULL && SEQ_GEQ(tsb->tsb_blk.end, tsbn->tsb_blk.start)))
-			return (0)
+			return (0);
 	}
 	return (1);
 }
@@ -144,17 +148,17 @@
 
 	/* Remove any blocks from the scoreboard when full acked. */
 	RB_FOREACH_SAFE(tsb, tcp_sackblocks, &tp->snd_sackblocks, tsbn) {
-		if (SEQ_LT(th_ack, tqe->tsb_blk.start))
+		if (SEQ_LT(th_ack, tsb->tsb_blk.start))
 			break;
 		else
 			RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb);
 	}
 
-	if ((to->t_flags & TOF_SACK) && to->to_nsacks == 0) {
+	if ((to->to_flags & TOF_SACK) && to->to_nsacks == 0) {
 		/* remove all sack blocks, strange reneg */
 		tcp_sack_flush(tp);
 		return (0);
-	} else if (!(to->t_flags & TOF_SACK))
+	} else if (!(to->to_flags & TOF_SACK))
 		return (0);
 
 	/* Integrate SACK blocks from segment. */
@@ -172,7 +176,7 @@
 			continue;
 
 		/* XXXAO: Implicit-explicit reneg. */
-		if (sack.start == sack.end) {
+		if (sack.tsb_blk.start == sack.tsb_blk.end) {
 			/* Remove all sackblocks. */
 			tcp_sack_flush(tp);
 			continue;
@@ -194,7 +198,7 @@
 					//sacked -= SEQ_DELTA(sack.tsb_blk.start, tsbn->tsb_blk.start);
 					if (SEQ_GT(tsbn->tsb_blk.end, tsb->tsb_blk.end))
 						tsb->tsb_blk.end = tsbn->tsb_blk.end;
-					tcp_sack_free(&tp->snd_sackblocks, tsbn);
+					tcp_sack_free(tp, tsbn);
 				}
 			}
 			/* Extends the start. */
@@ -206,17 +210,17 @@
 					//sacked -= SEQ_DELTA();
 					if (SEQ_LT(tsbn->tsb_blk.start, tsb->tsb_blk.start))
 						tsb->tsb_blk.start = tsbn->tsb_blk.start;
-					tcp_sack_free(&tp->snd_sackblocks, tsbn);
+					tcp_sack_free(tp, tsbn);
 				}
 			}
-		} else if ((tsb = (struct sackblocks *)uma_zalloc(tcp_sackblock_zone, M_NOWAIT))) != NULL) {
+		} else if ((tsb = (struct tcp_sack_block *)uma_zalloc(tcp_sackblock_zone, M_NOWAIT)) != NULL) {
 			sacked += SEQ_DELTA(sack.tsb_blk.start, sack.tsb_blk.end);
 			tsb->tsb_blk.start = sack.tsb_blk.start;
 			tsb->tsb_blk.end = sack.tsb_blk.end;
 			tsbn = RB_INSERT(tcp_sackblocks, &tp->snd_sackblocks, tsb);
 			KASSERT(tsbn == NULL, ("%s: RB_INSERT failed", __func__));
-		} else
-			TCPSTAT_INC();		/* failed to allocate sackblock */
+		} /*else
+			TCPSTAT_INC();	*/	/* failed to allocate sackblock */
 	}
 
 	KASSERT(tcp_sack_verify(tp),
@@ -230,9 +234,9 @@
 {
 	struct tcp_sack_block *tsb, *tsbn;
 
-	RB_FOREACH_SAFE(tsb, tcp_sackholes, &tp->snd_sackholes, tsbn) {
-		RB_REMOVE(tcp_sackholes, &tp->snd_sackholes, tsb);
-		uma_zfree(tcp_sackbock_zone, tsb);
+	RB_FOREACH_SAFE(tsb, tcp_sackblocks, &tp->snd_sackblocks, tsbn) {
+		RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb);
+		uma_zfree(tcp_sackblock_zone, tsb);
 	}
 }
 
@@ -247,4 +251,4 @@
 		    tsb->tsb_blk.start, tsb->tsb_blk.end)
 	}
 }
-#endif+#endif

==== //depot/projects/tcp_new/netinet/tcp_subr.c#7 (text+ko) ====

@@ -579,7 +579,7 @@
 	//	tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP);
 	if (tcp_do_sack)
 		tp->t_flags |= TF_SACK_PERMIT;
-	TAILQ_INIT(&tp->snd_holes);
+	RB_INIT(&tp->snd_sackblocks);
 	tp->t_inpcb = inp;	/* XXX */
 	/*
 	 * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no

==== //depot/projects/tcp_new/netinet/tcp_timer.c#4 (text+ko) ====

@@ -205,7 +205,7 @@
 		return;
 	}
 	INP_LOCK(inp);
-	tcp_free_sackholes(tp);
+	tcp_sack_flush(tp);
 	if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
 	    !callout_active(&tp->t_timers->tt_2msl)) {
 		INP_UNLOCK(tp->t_inpcb);
@@ -408,7 +408,7 @@
 		return;
 	}
 	callout_deactivate(&tp->t_timers->tt_rexmt);
-	tcp_free_sackholes(tp);
+	tcp_sack_flush(tp);
 	/*
 	 * Retransmission timer went off.  Message has not
 	 * been acked within retransmit interval.  Back off

==== //depot/projects/tcp_new/netinet/tcp_var.h#12 (text+ko) ====

@@ -34,6 +34,7 @@
 #define _NETINET_TCP_VAR_H_
 
 #include <netinet/tcp.h>
+#include <sys/tree.h>
 
 /*
  * Kernel variables for tcp.
@@ -101,7 +102,7 @@
 };
 
 struct tcp_sack_block {
-	RB_ENTRY(tcp_sackblocks) tsb_rb;	/* scoreboard linkage */
+	RB_ENTRY(tcp_sack_block) tsb_rb;	/* scoreboard linkage */
 	struct sackblk tsb_blk;
 };
 
@@ -253,6 +254,7 @@
 	RB_HEAD(tcp_sackblocks, tcp_sack_block) snd_sackblocks;
 	int	snd_numholes;		/* number of holes seen by sender */
 	int	snd_sacked;		/* data currently ack'ed through SACK */
+	int	rcv_numsacks;
 
 /* Congestion control algorithms */
 	tcp_win	snd_cwnd_prev;		/* cwnd prior to retransmit */


More information about the p4-projects mailing list