analysis: split TCP retransmissions into forward and return, and show both on the line cards

tcp.retrans.up counts retransmitted segments sent by the dialing side, tcp.retrans.down those sent by the listening side. The cards show RTT as a round trip (⇄) with forward (→) and return (←) rows for QUIC loss and TCP retransmission.
This commit is contained in:
justme committed 2026-10-21 16:26:34 +08:00
1 parent 48ffa56285
commit 9f5a6cf77a
9 files changed
+104 -37

No files matched your search

@@ -260,6 +260,23 @@ public sealed class OpTests
Assert.Equal(300UL, retrans.Denominator);
}
[Fact]
public void Retrans_ForwardAndReturnAreSplitBySide()
{
long ts = ChunkFactory.DialerUs(0);
var builder = new StreamBuilder(Kinds.TcpEcho.FindStream("tcp_info")!);
builder.Add(ts, 0, 40_000, 0, 10, 10, 1000, 0, 1);
builder.Add(ts, 1, 40_000, 0, 10, 100, 2000, 0, 1);
builder.Add(ts + 1_000_000, 0, 40_000, 0, 10, 11, 1100, 0, 1);
builder.Add(ts + 1_000_000, 1, 40_000, 0, 10, 102, 2200, 0, 1);
RawChunk chunk = ChunkFactory.Echo(s_agent, "tcp_echo", T0, 10, 100,
_ => new EchoPacket(false, false, 20_000, 20_000), extraStreams: [builder.Build()]);
var forward = (RatioAcc)EvaluateOneBucket(chunk, "tcp.retrans.up").Items["tcp.retrans.up"];
var back = (RatioAcc)EvaluateOneBucket(chunk, "tcp.retrans.down").Items["tcp.retrans.down"];
Assert.Equal((1UL, 100UL), (forward.Numerator, forward.Denominator));
Assert.Equal((2UL, 200UL), (back.Numerator, back.Denominator));
}
[Fact]
public void Connect_Outcomes_AreCountedByClass()
{