Page MenuHomeFreeBSD

tcp sack: improve computation of delivered_data
ClosedPublic

Authored by tuexen on Aug 3 2025, 7:35 PM.
Tags
None
Referenced Files
Unknown Object (File)
Tue, Oct 14, 4:38 PM
Unknown Object (File)
Sat, Oct 11, 4:34 PM
Unknown Object (File)
Sat, Oct 11, 1:56 AM
Unknown Object (File)
Thu, Oct 9, 3:23 PM
Unknown Object (File)
Thu, Oct 9, 3:23 PM
Unknown Object (File)
Thu, Oct 9, 3:23 PM
Unknown Object (File)
Thu, Oct 9, 2:12 PM
Unknown Object (File)
Tue, Oct 7, 4:21 AM

Details

Summary

delivered_data is the number of bytes, which have newly been delivered to the peer. This includes the number of bytes cumulatively acknowledged and selectively acknowledged.

Test Plan

Run the following packetdrill script:

--ip_version=ipv4

+0.000 `kldload -n cc_newreno`
+0.000 `sysctl kern.timecounter.alloweddeviation=0`
+0.000 `sysctl net.inet.tcp.initcwnd_segments=20`

+0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0.000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0.000 setsockopt(3, IPPROTO_TCP, TCP_FUNCTION_BLK, {function_set_name="freebsd",
                                                     pcbcnt=0}, 36) = 0
+0.000 setsockopt(3, IPPROTO_TCP, TCP_CONGESTION, "newreno", 8) = 0
+0.000 bind(3, ..., ...) = 0
+0.000 listen(3, 1) = 0
+0.000 < S      0:0(0)                  win 65535 <mss 1460,sackOK,eol,eol>
+0.000 > S.     0:0(0)        ack     1 win 65535 <mss 1460,sackOK,eol,eol>
+0.050 <  .     1:1(0)        ack     1 win 65535
+0.000 accept(3, ..., ...) = 4
+0.000 close(3) = 0
+0.000 setsockopt(4, IPPROTO_TCP, TCP_LOG, [TCP_LOG_STATE_CONTINUAL], 4) = 0
+0.100 send(4, ..., 14600, 0) = 14600
+0.000 >  .     1:1461(1460)  ack     1 win 65535
+0.000 >  .  1461:2921(1460)  ack     1 win 65535
+0.000 >  .  2921:4381(1460)  ack     1 win 65535
+0.000 >  .  4381:5841(1460)  ack     1 win 65535
+0.000 >  .  5841:7301(1460)  ack     1 win 65535
+0.000 >  .  7301:8761(1460)  ack     1 win 65535
+0.000 >  .  8761:10221(1460) ack     1 win 65535
+0.000 >  . 10221:11681(1460) ack     1 win 65535
+0.000 >  . 11681:13141(1460) ack     1 win 65535
+0.000 > P. 13141:14601(1460) ack     1 win 65535
+0.050 <  .     1:1(0)        ack     1 win 65535 <nop,nop,sack 1461:2921>
+0.000 <  .     1:1(0)        ack     1 win 65535 <nop,nop,sack 1461:4381>
+0.000 <  .     1:1(0)        ack     1 win 65535 <nop,nop,sack 1461:14601>
// Now the end point is in fast recovery with SND.FACK = SND.MAX
+0.000 >  .     1:1461(1460)  ack     1 win 65535
+0.050 <  .     1:1(0)        ack  5841 win 65535
+0.000 >  . 13141:13141(0)    ack     1 win 65535 // Failed Rescue Retransmit
+1.000 >  .  5841:7301(1460)  ack     1 win 65535 // Timer based retransmission
+0.050 <  .     1:1(0)        ack  7301 win 65535 // SEG.ACK < SND.FACK -> panic
+0.000 >  .  7301:8761(1460)  ack     1 win 65535
+0.000 >  .  8761:10221(1460) ack     1 win 65535
+0.050 <  .     1:1(0)        ack 10221 win 65535
+0.000 >  . 10221:11681(1460) ack     1 win 65535
+0.000 >  . 11681:13141(1460) ack     1 win 65535
+0.000 > P. 13141:14601(1460) ack     1 win 65535
+0.050 <  .     1:1(0)        ack 13141 win 65535
+0.040 <  .     1:1(0)        ack 14601 win 65535
+1.000 close(4) = 0
+0.000 > F. 14601:14601(0)    ack     1 win 65535
+0.050 < F.      1:1(0)       ack 14602 win 65535
+0.000 >  . 14602:14602(0)    ack     2 win 65535

Without this patch, an INVARIANTS kernel panics with sacked_bytes < 0.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

tuexen requested review of this revision.Aug 3 2025, 7:35 PM

I now wonder why i had the left_edge adjustment conditional on an fack adjustment only. But that may have preceeded some other modifications. LGTM

This revision is now accepted and ready to land.Aug 3 2025, 8:36 PM