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