PERFORCE change 168295 for review
Andre Oppermann
andre at FreeBSD.org
Mon Sep 7 19:44:38 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=168295
Change 168295 by andre at andre_t61 on 2009/09/07 19:43:55
Update TODO list.
Fix spelling errors and improve comments.
Save DSACK start and end values.
Make use of TCP reassembly queue flush timeout.
tcp_reass_merge gives back overlap size for DSACK.
Affected files ...
.. //depot/projects/tcp_reass/netinet/tcp_reass.c#54 edit
Differences ...
==== //depot/projects/tcp_reass/netinet/tcp_reass.c#54 (text+ko) ====
@@ -95,9 +95,12 @@
* TODO:
* - Improve comments and annotate RFC references.
* - Style improvements.
- * - Acticate timeout on first insert.
+ * - Activate timeout on first insert.
* - Partial D-SACK support.
+ * - D-SACK when only one SACK slot available?
+ * - Direct pointer to last block in RB-tree.
* - Return flags should be same minus FIN.
+ * - Remove T/TCP gonk.
* - Lots of testing.
*/
@@ -258,7 +261,7 @@
/*
* Remove a single block from the reassembly queue
- * and free all its mbufs, if any.
+ * and free all of its mbufs, if any.
*/
static void
tcp_reass_free(struct tcpcb *tp, struct tcp_reass_block *trb)
@@ -355,7 +358,8 @@
/*
* Store TCP header information in local variables as
- * we may lose access to it after mbuf compacting.
+ * we may lose access to it after header dropping and
+ * mbuf compacting.
*/
thflags = th->th_flags;
th_seq = th->th_seq;
@@ -490,6 +494,8 @@
*/
if ((len = SEQ_DELTA(trbs.trb_seqs, trbs.trb_seqe)) > 0) {
tp->rcv_reass_size -= len;
+ tp->rcv_reass_dsack.start = trbs.trb_seqs;
+ tp->rcv_reass_dsack.end = trbs.trb_seqe;
TCPSTAT_INC(tcps_rcvpartduppack);
TCPSTAT_ADD(tcps_rcvpartdupbyte, len);
}
@@ -521,8 +527,11 @@
LIST_INSERT_HEAD(&tp->rcv_reass_sack, trb, trb_sack);
tp->rcv_reass_size += SEQ_DELTA(trbs.trb_seqs, trbs.trb_seqe);
tp->rcv_reass_blocks++;
- if (RB_EMPTY(&tp->rcv_reass))
+ if (RB_EMPTY(&tp->rcv_reass)) {
+ KASSERT(tcp_timer_active(tp, TT_REASS) == 0,
+ ("%s: ", __func__));
tcp_timer_activate(tp, TT_REASS, tcp_reass_timeout);
+ }
TCPSTAT_INC(tcps_reass_blocks);
} else {
/* Memory allocation failure. */
@@ -585,7 +594,7 @@
*/
if (tcp_reass_timeout && !RB_EMPTY(&tp->rcv_reass))
tcp_timer_activate(tp, TT_REASS, tcp_reass_timeout);
- else
+ else if (tcp_timer_active(tp, TT_REASS))
tcp_timer_activate(tp, TT_REASS, 0);
ND6_HINT(tp);
@@ -597,7 +606,7 @@
}
/*
- * Trim a SACK block.
+ * Trim a reassembly block.
* A positive value is from head, negative from tail.
*/
static void
@@ -630,6 +639,7 @@
tcp_reass_merge(struct tcp_reass_block *trb, struct tcp_reass_block *trbn)
{
int i;
+ tcp_seq s;
KASSERT(trb != NULL && trbn != NULL,
("%s: incomplete input", __func__));
@@ -644,6 +654,7 @@
SEQ_GEQ(trbn->trb_seqe, trb->trb_seqe)) {
i = SEQ_DELTA(trb->trb_seqs, trbn->trb_seqe);
+ s = trb->trb_seqs;
m_freem(trb->trb_m);
trb->trb_seqs = trbn->trb_seqs;
@@ -658,6 +669,7 @@
if ((i = SEQ_DELTA(trb->trb_seqs, trbn->trb_seqe)) > 0)
tcp_reass_trim(trbn, -i);
+ s = trb->trb_seqs;
trb->trb_seqs = trbn->trb_seqs;
trbn->trb_mt->m_next = trb->trb_m;
trb->trb_m = trbn->trb_m;
@@ -672,6 +684,7 @@
if ((i = SEQ_DELTA(trb->trb_seqe, trbn->trb_seqs)) > 0)
tcp_reass_trim(trbn, i);
+ s = trb->trb_seqe;
trb->trb_seqe = trbn->trb_seqe;
trb->trb_mt->m_next = trbn->trb_m;
@@ -684,8 +697,8 @@
} else
return (NULL);
- trbn->trb_seqs = 0;
- trbn->trb_seqe = i;
+ trbn->trb_seqs = s;
+ trbn->trb_seqe = trbn->trb_seqs + i;
trbn->trb_m = NULL;
trbn->trb_mt = NULL;
return (trbn);
More information about the p4-projects
mailing list