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.
Details
Details
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 65535Without this patch, an INVARIANTS kernel panics with sacked_bytes < 0.
Diff Detail
Diff Detail
- Repository
- rG FreeBSD src repository
- Lint
- Lint Not Applicable 
- Unit
- Tests Not Applicable 
Event Timeline
Comment Actions
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