Page MenuHomeFreeBSD

Fix passive ECN negotiation
ClosedPublic

Authored by rscheff on Jan 17 2020, 10:53 AM.
Tags
None
Referenced Files
Unknown Object (File)
Mar 7 2024, 8:42 PM
Unknown Object (File)
Jan 28 2024, 9:03 AM
Unknown Object (File)
Jan 19 2024, 1:48 PM
Unknown Object (File)
Dec 20 2023, 3:04 AM
Unknown Object (File)
Dec 11 2023, 3:55 AM
Unknown Object (File)
Dec 7 2023, 5:15 AM
Unknown Object (File)
Oct 29 2023, 2:17 AM
Unknown Object (File)
Oct 25 2023, 2:06 AM
Subscribers

Details

Summary

While testing ECN session setup,
a receiver could coax a passive ECN enabled
sender into running ECN, while the initial
SYN would not negotiate for ECN:

<SYN>      -->
           <-- <SYN,ECE>
:
[ect0]data -->
Test Plan

packetdrill script:

// Flush Hostcache
+0.00 `sysctl net.inet.tcp.ecn.enable=2`
+0.02 `sysctl net.inet.tcp.hostcache.purgenow=1`

// Create a connecting TCP socket.
+0.010 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0.005 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+0.005 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0.005 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1048576], 4) = 0
+0     setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4) = 0

// Establish a TCP connection
+0.035 connect(3, ..., ...) = -1 // EINPROGRESS

+0 >[noecn] S   0:0(0) win 65535 <mss 1460, nop,wscale 6,sackOK,TS val ... ecr 0>
// this may coax the sender into ECN mode
+0 <[noecn] SE. 0:0(0) ack 1 win 65535 <mss 1000, sackOK, wscale 10, eol, nop, nop>
+0 >[noecn]  .   1:1(0) ack 1 win 1031

+0.01 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+0.01 fcntl(3, F_SETFL, O_RDWR) = 0   // set back to blocking

// Send some data from server
+0.1 write(3, ..., 5000) = 5000
// if in ECN mode, the data would be sent with [ect0] here
+0 >[noecn] .       1:1001(1000) ack 1  // we drop this packet
+0 >[noecn] .    1001:2001(1000) ack 1
+0 >[noecn] .    2001:3001(1000) ack 1
+0 >[noecn] .    3001:4001(1000) ack 1
+0 >[noecn] P.   4001:5001(1000) ack 1

+0 <[noecn] .       1:1(0) ack 1 win 65535 <sack 1001:2001, eol, nop>
+0 <[noecn] .       1:1(0) ack 1 win 65535 <sack 1001:3001, eol, nop>
+0 <[noecn] .       1:1(0) ack 1 win 65535 <sack 1001:4001, eol, nop>

// the retransmission
+0 >[noecn] .       1:1001(1000) ack 1

+0 <[noecn] .       1:1(0) ack 1 win 65535 <sack 1001:5001, eol, nop>
+0 <[noecn] .       1:1(0) ack 5001 win 65535

// Send some data to server
+0.1 <[noecn] .     1001:2001(1000) ack 5001 win 65535
+0 >[noecn] .       5001:5001(0) ack 1 <nop, nop, sack 1001:2001>
+0 <[noecn] .       2001:3001(1000) ack 5001 win 65535
+0 >[noecn] .       5001:5001(0) ack 1 <nop, nop, sack 1001:3001>
+0 <[noecn] .       3001:4001(1000) ack 5001 win 65535
+0 >[noecn] .       5001:5001(0) ack 1 <nop, nop, sack 1001:4001>
+0 <[noecn] P.      4001:5001(1000) ack 5001 win 65535
+0 >[noecn] .       5001:5001(0) ack 1 <nop, nop, sack 1001:5001>

// the "re"transmission
+0 <[noecn] .          1:1001(1000) ack 5001 win 65535
+0 >[noecn] .       5001:5001(0) ack 5001

+0.100 close(3) = 0
+0 <[noecn] F. 5001:5001(0) ack 5001 win 65535
+0 >[noecn] F. 5001:5001(0) ack 5001
+0 <[noecn] . 5002:5002(0) ack 5002 win 65535
+0 >[noecn] F. 5001:5001(0) ack 5002

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Not Applicable
Unit
Tests Not Applicable