PERFORCE change 166462 for review

Andre Oppermann andre at FreeBSD.org
Thu Jul 23 17:07:19 UTC 2009


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

Change 166462 by andre at andre_flirtbox on 2009/07/23 17:07:03

	Simplify D-SACK handling tcp_reass_sack() and remove
	code duplication.

Affected files ...

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

Differences ...

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

@@ -594,7 +594,7 @@
 {
 	int nsacks = 0;
 	tcp_seq sack_seq;
-	struct tcp_reass_block *trb;
+	struct tcp_reass_block *trb, trbs;
 
 	INP_WLOCK_ASSERT(tp->t_inpcb);
 	KASSERT(numsacks > 0,
@@ -602,18 +602,12 @@
 	KASSERT(!LIST_EMPTY(&tp->rcv_reass_sack),
 	    ("%s: sack list empty", __func__));
 
-	/* DSACK */
-	if (tp->rcv_reass_dsack.start == tp->rcv_reass_dsack.end) {
-		sack_seq = htonl(tp->rcv_reass_dsack.start);
-		bcopy((u_char *)&sack_seq, optp, sizeof(sack_seq));
-		optp += sizeof(sack_seq);
-		sack_seq = htonl(tp->rcv_reass_dsack.end);
-		bcopy((u_char *)&sack_seq, optp, sizeof(sack_seq));
-		optp += sizeof(sack_seq);
-		tp->rcv_reass_dsack.start = 0;
-		tp->rcv_reass_dsack.end = 0;
-		numsacks--;
-		nsacks++;
+	/* Create D-SACK block and temporarily insert it. */
+	if (tp->rcv_reass_dsack.start != tp->rcv_reass_dsack.end) {
+		bzero(&trbs, sizeof(trbs));
+		trbs.trb_seqs = htonl(tp->rcv_reass_dsack.start);
+		trbs.trb_seqe = htonl(tp->rcv_reass_dsack.end);
+		LIST_INSERT_HEAD(&tp->rcv_reass_sack, &trbs, trb_sack);
 	}
 
 	/*
@@ -634,6 +628,13 @@
 		nsacks++;
 	}
 
+	/* Remove D-SACK block again. */
+	if (LIST_FIRST(&tp->rcv_reass_sack) == &trbs) {
+		LIST_REMOVE(&trbs, trb_sack);
+		tp->rcv_reass_dsack.start = 0;
+		tp->rcv_reass_dsack.end = 0;
+	}
+
 	return (nsacks);
 }
 


More information about the p4-projects mailing list