selftests/net: packetdrill: add TCP Accurate ECN cases

Linux Accurate ECN test sets using ACE counters and AccECN options to
cover several scenarios: Connection teardown, different ACK conditions,
counter wrapping, SACK space grabbing, fallback schemes, negotiation
retransmission/reorder/loss, AccECN option drop/loss, different
handshake reflectors, data with marking, and different sysctl values.

The packetdrill used is commit cbe405666c9c8698ac1e72f5e8ffc551216dfa56
of repo: https://github.com/minuscat/packetdrill/tree/upstream_accecn.
And corresponding patches are sent to google/packetdrill email list.

Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
Co-developed-by: Ilpo Järvinen <ij@kernel.org>
Signed-off-by: Ilpo Järvinen <ij@kernel.org>
Co-developed-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260131222515.8485-16-chia-yu.chang@nokia-bell-labs.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Chia-Yu Chang 2026-01-31 23:25:15 +01:00 committed by Paolo Abeni
parent 8ae3e8e6ce
commit f85d9c45f1
58 changed files with 1363 additions and 0 deletions

View File

@ -0,0 +1,24 @@
// 3rd ACK + 1st data segment lost, data segments with ce
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0.05 < SEWA 0:0(0) win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// 3rd ACK lost
// 1st data segment lost
+0.05 < [ce] EAP. 1001:2001(1000) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] WA. 1:1(0) ack 1 <ECN e1b 1 ceb 1000 e0b 1,nop,nop,nop,sack 1001:2001>
+.002 accept(3, ..., ...) = 4
+0.2 < [ce] EAP. 1:1001(1000) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.001 > [ect0] EWA. 1:1(0) ack 2001 <ECN e1b 1 ceb 2000 e0b 1,nop>
+0.05 < [ce] EAP. 2001:3001(1000) ack 1 win 264
+.001 > [ect0] . 1:1(0) ack 3001 <ECN e1b 1 ceb 3000 e0b 1,nop>

View File

@ -0,0 +1,30 @@
// 3rd ACK + 1st data segment lost, 2nd data segments with ce
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] SW. 0:0(0) ack 1 win 32767 <mss 1016,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
// 3rd ACK lost
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 write(4, ..., 2000) = 2000
// 1st data segment lost + 2nd gets CE
+.002 > [ect0] .5 1:1005(1004) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.000 > [ect0] P.5 1005:2001(996) ack 1 <ECN e1b 1 ceb 0 e0b 1, nop>
+0.05 < [ect0] .6 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 996 e1b 1,nop,nop,nop,sack 1005:2001>
+0.01 %{ assert tcpi_delivered_ce == 1, tcpi_delivered_ce }%
+0.002~+0.1 > [ect0] .5 1:1005(1004) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.05 < [ect0] .6 1:1(0) ack 2001 win 264 <ECN e0b 1005 ceb 996 e1b 1,nop>
+0.01 write(4, ..., 1000) = 1000
+0~+0.002 > [ect0] P.5 2001:3001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.1 < [ect0] .5 1:1001(1000) ack 3001 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+0~+0.01 > [ect0] .5 3001:3001(0) ack 1001 <ECN e1b 1 ceb 0 e0b 1001,nop>

View File

@ -0,0 +1,19 @@
// Test 3rd ACK flags when SYN-ACK is rexmitted
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.1 < [ect0] S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Our code currently sends a challenge ACK
// when it receives a SYN in ESTABLISHED state
// based on the latest SYN
+.002 > [ect0] A. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,18 @@
// Third ACK CE increases r.cep
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0.05 < SEWA 0:0(0) win 32767 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ce] W. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] WAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,22 @@
// 3rd ACK lost, CE for the first data segment
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0.05 < SEWA 0:0(0) win 32767 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// 3rd ACK lost
+0.05 < [ce] EAP. 1:1001(1000) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] WA. 1:1(0) ack 1001 <ECN e1b 1 ceb 1000 e0b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.05 < [ce] EAP. 1001:2001(1000) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.001 > [ect0] EWA. 1:1(0) ack 2001 <ECN e1b 1 ceb 2000 e0b 1 ,nop>

View File

@ -0,0 +1,26 @@
// Test SYN/ACK rexmit triggered 3rd ACK duplicate + CE on first data seg
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// SYN/ACK rexmitted => two 3rd ACKs in-flight
+1.0~+1.1 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Delivered 1st 3rd ACK
+0.05 < [ect0] W. 1:1(0) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
// Duplicate 3rd ACK delivered
+1.05 < [ect0] W. 1:1(0) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+0.05 < [ce] EAP. 1:1001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] WA. 1:1(0) ack 1001 <ECN e1b 1 ceb 1000 e0b 1,nop>
+0 read(4, ..., 1000) = 1000

View File

@ -0,0 +1,13 @@
// Test that when accurate ECN is disabled,
// client uses RFC3168 ECN for SYN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=1
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEW 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] S. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+.002 > [noecn] . 1:1(0) ack 1

View File

@ -0,0 +1,28 @@
// Test that SYN-ACK with ACE flags and without
// ACE flags got dropped. Although we disable ECN,
// we shouldn't consider this as blackholed as
// these are dropped due to congestion
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [ect0] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SA. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN
+0.1 < [noecn] S 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.1 < [noecn] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
// Write with AccECN option but with ip-noecn since we received one SYN with ACE=0
+0.01 write(4, ..., 100) = 100
+.002 > [noecn] P5. 1:101(100) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,18 @@
// Test AccECN -> RFC3168 fallback when sysctl asks for RFC3168 ECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=1
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SE. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < . 1:1(0) ack 1 win 320
+.002 accept(3, ..., ...) = 4
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] P. 1:1001(1000) ack 1

View File

@ -0,0 +1,34 @@
// Client negotiates AccECN and starts sending
// AccECN option in last ACK and data segments
// Middlebox drops AccECN option and client
// reverts to ACE flags only
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
sysctl -q net.ipv4.tcp_ecn_option_beacon=1
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.05 < [ect0] EAP. 1:1001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EA. 1:1(0) ack 1001 <ECN e1b 1 ceb 0 e0b 1001,nop>
+0 read(4, ..., 1000) = 1000
+0.05 < [ect0] EAP. 1:1001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EA. 1:1(0) ack 1001 <ECN e1b 1 ceb 0 e0b 2001,nop,nop,nop,sack 1:1001>
+0.05 < [ect0] EAP. 1:1001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EA. 1:1(0) ack 1001 <nop,nop,sack 1:1001>
+0.05 < [ect0] EAP. 1001:2001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EA. 1:1(0) ack 2001
+0 read(4, ..., 1000) = 1000

View File

@ -0,0 +1,38 @@
// Client negotiates AccECN and starts sending
// AccECN option in last ACK and data segments
// Middlebox accepts AccECN option but some packets
// are lost due to congestion. Client should
// continue to send AccECN option
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.102 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.1 < [ect0] SW. 0:0(0) ack 1 win 32767 <mss 1024,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] A. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Send
+0.01 write(4, ..., 3000) = 3000
+.002 > [ect0] .5 1:1013(1012) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.002 > [ect0] P.5 1013:2025(1012) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.002 > [ect0] P.5 2025:3001(976) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// First two segments were lost due to congestion as SACK was
// received acknowledging 3rd segment
+0.1 < [ect0] .5 1:1(0) ack 1 win 264 <ECN e1b 1 ceb 0 e0b 977,nop,nop,nop,sack 2025:3001>
// Since data with option was SACKed, we can
// continue to use AccECN option for the rest of
// the connection. This one is a rexmt
+.02~+0.5 > [ect0] .5 1:1013(1012) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.1 < [ect0] .5 1:1(0) ack 3001 win 264 <ECN e1b 1 ceb 0 e0b 3000,nop>
// Send new data, it should contain AccECN option
+0.01 write(4, ..., 2000) = 2000
+.002 > [ect0] .5 3001:4013(1012) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.002 > [ect0] P.5 4013:5001(988) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,12 @@
// AccECN sysctl server-side only, no ECN/AccECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=5
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < S. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+.002 > . 1:1(0) ack 1

View File

@ -0,0 +1,25 @@
// Test basic connection teardown where local process closes first:
// the local process calls close() first, so we send a FIN, and receive an ACK.
// Then we receive a FIN and ACK it.
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+.01...0.011 connect(3, ..., ...) = 0
+0 > [noecn] SEWA 0:0(0) <...>
+0 < [ect1] SW. 0:0(0) ack 1 win 32768 <mss 1000,nop,wscale 6,nop,nop,sackOK>
+0 > [ect0] EW. 1:1(0) ack 1
+0 write(3, ..., 1000) = 1000
+0 > [ect0] P5. 1:1001(1000) ack 1
+0 < [ect0] .5 1:1(0) ack 1001 win 257
+0 close(3) = 0
+0 > [ect0] F5. 1001:1001(0) ack 1
+0 < [ect0] .5 1:1(0) ack 1002 win 257
+0 < [ect0] F5. 1:1(0) ack 1002 win 257
+0 > [ect0] . 1002:1002(0) ack 2

View File

@ -0,0 +1,25 @@
// Test a large ACK (> ACE field max)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 14600) = 14600
+.002 > [ect0] P.5 1:14601(14600) ack 1
+0.05 < [ect0] .5 1:1(0) ack 1461 win 264
+0.05 < [ect0] .5 1:1(0) ack 14601 win 264
+0.01 %{ assert tcpi_delivered_ce == 8, tcpi_delivered_ce }%

View File

@ -0,0 +1,31 @@
// Test false overflow detection with option used to rule out overflow
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
// Stop sending option to allow easier testing
+0 `sysctl -q net.ipv4.tcp_ecn_option=0`
+0.002 write(4, ..., 14600) = 14600
+.002 > [ect0] P.5 1:14601(14600) ack 1
+0.05 < [ect0] .5 1:1(0) ack 1460 win 264 <ECN e0b 1461 ceb 0 e1b 1,nop>
+0.05 < [ect0] .5 1:1(0) ack 14601 win 264 <ECN e0b 14601 ceb 0 e1b 1,nop>
+0.01 %{
assert tcpi_delivered_ce == 0, tcpi_delivered_ce
assert tcpi_delivered_e0_bytes == 14600, tcpi_delivered_e0_bytes
}%

View File

@ -0,0 +1,24 @@
// Test a large ACK (> ACE field max)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 14600) = 14600
+.002 > [ect0] P.5 1:14601(14600) ack 1
+0.05 < [ect0] .5 1:1(0) ack 14601 win 264
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,25 @@
// Test a large ACK (> ACE field max)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 14600) = 14600
+.002 > [ect0] P.5 1:14601(14600) ack 1
// Fake CE
+0.05 < [ect0] .6 1:1(0) ack 14601 win 264
+0.01 %{ assert tcpi_delivered_ce == 1, tcpi_delivered_ce }%

View File

@ -0,0 +1,25 @@
// Test a large ACK (at ACE field max delta)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 14600) = 14600
+.002 > [ect0] P.5 1:14601(14600) ack 1
// Fake CE
+0.05 < [ect0] .4 1:1(0) ack 14601 win 264
+0.01 %{ assert tcpi_delivered_ce == 7, tcpi_delivered_ce }%

View File

@ -0,0 +1,70 @@
// Test basic AccECN CEP/CEB/E0B/E1B functionality & CEP wrapping
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{
assert tcpi_delivered_ce == 0, tcpi_delivered_ce
assert tcpi_delivered_ce_bytes == 0, tcpi_delivered_ce_bytes
}%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake CE
+0.05 < [ect0] WA. 1:1(0) ack 1001 win 264 <ECN e0b 1 ceb 1000 e1b 1,nop>
+0.01 %{
assert tcpi_delivered_ce == 1, tcpi_delivered_ce
assert tcpi_delivered_ce_bytes == 1000, tcpi_delivered_ce_bytes
}%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake ect0
+0.05 < [ect0] WA. 1:1(0) ack 2001 win 264 <ECN e0b 1001 ceb 1000 e1b 1,nop>
+0.01 %{
assert tcpi_delivered_ce == 1, tcpi_delivered_ce
assert tcpi_delivered_e0_bytes == 1000, tcpi_delivered_e0_bytes
}%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 2001:3001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake ce
+0.05 < [ect0] EWA. 1:1(0) ack 3001 win 264 <ECN e0b 1001 ceb 2000 e1b 1,nop>
+0.01 %{
assert tcpi_delivered_ce == 2, tcpi_delivered_ce
assert tcpi_delivered_ce_bytes == 2000, tcpi_delivered_ce_bytes
}%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 3001:4001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake ect1
+0.05 < [ect0] EWA. 1:1(0) ack 4001 win 264 <ECN e0b 1001 ceb 2000 e1b 1001,nop>
+0.01 %{
assert tcpi_delivered_ce == 2, tcpi_delivered_ce
assert tcpi_delivered_e1_bytes == 1000, tcpi_delivered_e1_bytes
}%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 4001:5001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake ce
+0.05 < [ect0] . 1:1(0) ack 5001 win 264 <ECN e0b 1001 ceb 3000 e1b 1001,nop>
+0.01 %{
assert tcpi_delivered_ce == 3, tcpi_delivered_ce
assert tcpi_delivered_ce_bytes == 3000, tcpi_delivered_ce_bytes
}%

View File

@ -0,0 +1,12 @@
// Test that tcp_ecn=4 uses RFC3168 ECN for SYN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=4
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.05 connect(4, ..., ...) = 0
+.002 > SEW 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > . 1:1(0) ack 1

View File

@ -0,0 +1,35 @@
// Test basic AccECN CEP/CEB/E0B/E1B functionality & CEP wrapping
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.05 < [ce] EAP. 1:1001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] WA. 1:1(0) ack 1001 <ECN e1b 1 ceb 1000 e0b 1,nop>
+0 read(4, ..., 1000) = 1000
+0.05 < [ect0] EAP. 1001:2001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] WA. 1:1(0) ack 2001 <ECN e1b 1 ceb 1000 e0b 1001,nop>
+0 read(4, ..., 1000) = 1000
+0.05 < [ce] EAP. 2001:3001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EWA. 1:1(0) ack 3001 <ECN e1b 1 ceb 2000 e0b 1001,nop>
+0 read(4, ..., 1000) = 1000
+0.05 < [ect1] EAP. 3001:4001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] EWA. 1:1(0) ack 4001 <ECN e1b 1001 ceb 2000 e0b 1001,nop>
+0 read(4, ..., 1000) = 1000
+0.05 < [ce] EAP. 4001:5001(1000) ack 1 win 257 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] . 1:1(0) ack 5001 <ECN e1b 1001 ceb 3000 e0b 1001,nop>
+0 read(4, ..., 1000) = 1000

View File

@ -0,0 +1,14 @@
// Test IP flags drop
--tolerance_usecs=50000
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 1.1 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+.02 ~ +1.1 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] . 1:1(0) ack 1

View File

@ -0,0 +1,16 @@
// SYN/ACK option drop test
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.02 ~+2 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.02 ~+5 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.02 ~+8 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>

View File

@ -0,0 +1,28 @@
// Test that SYN-ACK with ACE flags and without
// ACE flags got dropped. Although we disable ECN,
// we shouldn't consider this as blackholed as
// these are dropped due to congestion
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [noecn] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN-ACK without option
+1~+1.1 > [noecn] SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// SYN-ACK maybe getting blackholed, disable ECN
+2~+2.2 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+4~+4.4 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Received an ACK after sending 3rd retransmission, not a blackhole
+0.1 < [noecn] . 1:1(0) ack 1 win 320
+.002 accept(3, ..., ...) = 4

View File

@ -0,0 +1,18 @@
// Test that SYN with ACE flags and without
// ACE flags got dropped. Although we disable
// ECN, we shouldn't consider this as blackholed
// as these are dropped due to congestion
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 3.1 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+.02~+1.1 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+.02~+1.1 > [noecn] S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+.02~+1.1 > [noecn] S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.1 < [noecn] S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0~+0.01 > [noecn] . 1:1(0) ack 1

View File

@ -0,0 +1,23 @@
// Test AccECN flags bleach
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] . 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [noecn] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < [ect0] EAP. 1:1(0) ack 1001 win 320
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,23 @@
// Test basic AccECN negotiation
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+.05 < [ect0] EAP. 1:1(0) ack 1001 win 256 <ECN e0b 1001 ceb 0 e1b 0,nop>
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,26 @@
// Test basic AccECN negotiation
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < [ect0] EAP. 1:1(0) ack 1001 win 320
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,23 @@
// Test basic AccECN negotiation without option
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < SW. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1
+.05 < [ect0] EAP. 1:1(0) ack 1001 win 256
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,23 @@
// Test basic AccECN negotiation, late option enable
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < SW. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1
+.05 < [ect0] EAP. 1:1(0) ack 1001 win 256 <ECN e0b 1001 ceb 0 e1b 1,nop>
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,20 @@
// Test client behavior on receiving a non ECN SYN-ACK
// after receiving an AccECN SYN-ACK and moving to
// ESTABLISHED state
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
// Receive an AccECN SYN-ACK and move to ESTABLISHED
+0.05 < [noecn] SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Receive a non ECN SYN-ACK and send a challenge ACK with ACE feedback
+0.1 < [noecn] S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,27 @@
// Test basic AccECN negotiation with option off using sysctl
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1
+0.05 < [ect0] EAP. 1:1(0) ack 1001 win 320
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1001:2001(1000) ack 1

View File

@ -0,0 +1,27 @@
// Test no progress filtering
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
// Fake CE and claim no progress
+0.05 < [ect0] WA. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 1000 e1b 1,nop>
+0.01 %{
assert tcpi_delivered_ce == 0, tcpi_delivered_ce
assert tcpi_delivered_ce_bytes == 0, tcpi_delivered_ce_bytes
}%

View File

@ -0,0 +1,28 @@
// Test that SYN-ACK with ACE flags and without
// ACE flags got dropped. Although we disable ECN,
// we shouldn't consider this as blackholed as
// these are dropped due to congestion
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [noecn] S 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN
+0.1 < [ect0] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.1 < [noecn] . 1:1(0) ack 1 win 320
+.002 accept(3, ..., ...) = 4
// Write with AccECN option but with ip-noecn since we received one SYN with ACE=0
+0.01 write(4, ..., 100) = 100
+.002 > [noecn] P. 1:101(100) ack 1

View File

@ -0,0 +1,18 @@
// Test RFC3168 fallback when sysctl asks for AccECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEW 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SE. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < . 1:1(0) ack 1 win 320
+.002 accept(3, ..., ...) = 4
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] P. 1:1001(1000) ack 1

View File

@ -0,0 +1,18 @@
// Test RFC3168 ECN when sysctl asks for RFC3168 ECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=1
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEW 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SE. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.05 < . 1:1(0) ack 1 win 320
+.002 accept(3, ..., ...) = 4
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] P. 1:1001(1000) ack 1

View File

@ -0,0 +1,28 @@
// Test SACK space grab to fit AccECN option
--tcp_ts_tick_usecs=1000
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+.01 < [ect1] EAP. 1001:2001(1000) ack 1 win 264
+0.002 > [ect0] EA. 1:1(0) ack 1 <ECN e1b 1001 ceb 0 e0b 1,nop,nop,nop,sack 1001:2001>
+.01 < [ect0] EAP. 3001:4001(1000) ack 1 win 264
+0.002 > [ect0] EA. 1:1(0) ack 1 <ECN e1b 1001 ceb 0 e0b 1001,nop,nop,nop,sack 3001:4001 1001:2001>
+.01 < [ce] EAP. 5001:6001(1000) ack 1 win 264
+0.002 > [ect0] WA. 1:1(0) ack 1 <ECN e1b 1001 ceb 1000 e0b 1001,nop,nop,nop,sack 5001:6001 3001:4001 1001:2001>
// DSACK works?
+.01 < [ect0] EAP. 5001:6001(1000) ack 1 win 264
+0.002 > [ect0] WA. 1:1(0) ack 1 <ECN e1b 1001 ceb 1000 e0b 2001,nop,nop,nop,sack 5001:6001 5001:6001 3001:4001>
+.01 < [ect1] EAP. 6001:7001(1000) ack 1 win 264
+0.002 > [ect0] WA. 1:1(0) ack 1 <ECN e1b 2001 ceb 1000 e0b 2001,nop,nop,nop,sack 5001:7001 3001:4001 1001:2001>

View File

@ -0,0 +1,39 @@
// Test SACK space grab to fit AccECN option
--tcp_ts_tick_usecs=1000
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,sackOK,TS val 1 ecr 0,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,sackOK,TS val 100 ecr 1,ECN e1b 1 ceb 0 e0b 1,nop,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <nop,nop,TS val 2 ecr 100,ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
// One SACK block should allow all 3 AccECN fields:
+.01 < [ect1] EAP. 1001:2001(1000) ack 1 win 264 <nop,nop,TS val 3 ecr 100>
+0.002 > [ect0] EA. 1:1(0) ack 1 <nop,nop,TS val 160 ecr 2,ECN e1b 1001 ceb 0 e0b 1,nop,nop,nop,sack 1001:2001>
// Two SACK blocks should fit w/ AccECN if we only need to use 2 AccECN fields: check ect1 arriving.
+.01 < [ect1] EAP. 3001:4001(1000) ack 1 win 264 <nop,nop,TS val 4 ecr 100>
+0.002 > [ect0] EA. 1:1(0) ack 1 <nop,nop,TS val 172 ecr 2,ECN e1b 2001 ceb 0,nop,nop,sack 3001:4001 1001:2001>
// Two SACK blocks should fit w/ AccECN if we only need to use 2 AccECN fields: check CE arriving.
+.01 < [ce] EAP. 5001:6001(1000) ack 1 win 264 <nop,nop,TS val 5 ecr 100>
+0.002 > [ect0] WA. 1:1(0) ack 1 <nop,nop,TS val 184 ecr 2,ECN e1b 2001 ceb 1000,nop,nop,sack 5001:6001 3001:4001>
// Check that DSACK works, using 2 SACK blocks in total, if we only need to use 2 AccECN fields: check ect1 arriving.
+.01 < [ect1] EAP. 5001:6001(1000) ack 1 win 264 <nop,nop,TS val 5 ecr 100>
+0.002 > [ect0] WA. 1:1(0) ack 1 <nop,nop,TS val 196 ecr 2,ECN e1b 3001 ceb 1000,nop,nop,sack 5001:6001 5001:6001>
// Check the case where the AccECN option doesn't fit, because sending ect0
// with order 1 would rquire 3 AccECN fields,
// and TS (12 bytes) + 2 SACK blocks (20 bytes) + 3 AccECN fields (2 + 3*3 bytes) > 40 bytes.
// That's OK; Linux TCP AccECN is optimized for the ECT1 case, not ECT0.
+.01 < [ect0] EAP. 6001:7001(1000) ack 1 win 264 <nop,nop,TS val 5 ecr 100>
+0.002 > [ect0] WA. 1:1(0) ack 1 <nop,nop,TS val 204 ecr 2,nop,nop,sack 5001:7001 3001:4001 1001:2001>

View File

@ -0,0 +1,20 @@
// Test against classic ECN server
// Not-ECT on SYN and server sets 1|0|1 (AE is unused for classic ECN)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] SEA. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <nop, nop, TS val 200 ecr 700>
+0 write(4, ..., 100) = 100
+.002 > [ect0] P.5 1:101(100) ack 1 <nop,nop,TS val 300 ecr 700>
+0 close(4) = 0
+.002 > [ect0] F.5 101:101(0) ack 1 <nop,nop,TS val 400 ecr 700>
+0.1 < [noecn] R. 1:1(0) ack 102 win 4242

View File

@ -0,0 +1,20 @@
// Test against classic ECN server
// Not-ECT on SYN and server sets 0|0|1
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] SE. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 8>
+.002 > [noecn] . 1:1(0) ack 1 <nop, nop, TS val 200 ecr 700>
+0 write(4, ..., 100) = 100
+.002 > [ect0] P. 1:101(100) ack 1 <nop,nop,TS val 300 ecr 700>
+0 close(4) = 0
+0 > [noecn] F. 101:101(0) ack 1 <...>
+0.1 < R. 1:1(0) ack 102 win 4242

View File

@ -0,0 +1,19 @@
// Test against broken server (1|1|1)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] SEWA. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 8>
+.002 > [noecn] . 1:1(0) ack 1 <nop, nop, TS val 200 ecr 700>
+0 write(4, ..., 100) = 100
+.002 > [noecn] P. 1:101(100) ack 1 <nop,nop,TS val 300 ecr 700>
+0 close(4) = 0
+.002 > [noecn] F. 101:101(0) ack 1 <...>
+0.1 < [noecn] R. 1:1(0) ack 102 win 4242

View File

@ -0,0 +1,19 @@
// Test against Non ECN server (0|0|0)
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [noecn] S. 0:0(0) ack 1 win 32767 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 8>
+.002 > [noecn] . 1:1(0) ack 1 <nop, nop, TS val 200 ecr 700>
+0 write(4, ..., 100) = 100
+.002 > [noecn] P. 1:101(100) ack 1 <nop,nop,TS val 300 ecr 700>
+0 close(4) = 0
+.002 > [noecn] F. 101:101(0) ack 1 <nop,nop,TS val 400 ecr 700>
+0.1 < [noecn] R. 1:1(0) ack 102 win 4242

View File

@ -0,0 +1,18 @@
// Test AccECN with sysctl set to server-side only
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=5
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,18 @@
// Test that SYN with ACE flags was Acked
// after 2nd retransmission. In this case,
// since we got SYN-ACK that supports Accurate
// ECN, we consider this as successful negotiation
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 2.1 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+1~+1.1 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+1~+1.1 > [noecn] S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.1 < [noecn] SW. 0:0(0) ack 1 win 32767 <mss 1016,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+0~+0.01 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,16 @@
// Test that SYN with ACE flags got dropped
// We retry one more time with ACE and then
// fallback to disabled ECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 2.1 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+1~+1.1 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+1~+1.1 > [noecn] S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.1 < [noecn] S. 0:0(0) ack 1 win 32767 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0~+0.01 > [noecn] . 1:1(0) ack 1

View File

@ -0,0 +1,27 @@
// Test that SYN-ACK with ACE flags was Acked
// after 2nd retransmission. In this case,
// since we got the last ACK that supports Accurate
// ECN, we consider this as successful negotiation
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [noecn] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN-ACK without option
+1~+1.1 > [noecn] SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// SYN-ACK maybe getting blackholed, disable ECN
+2~+2.2 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Received an ACK with ACE flags, state should be set to negotiation succeeded
+0.1 < [noecn] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4

View File

@ -0,0 +1,26 @@
// Test that SYN-ACK with ACE flags got dropped
// We retry one more time with ACE and then
// fallback to disabled ECN
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [noecn] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN-ACK without option
+1~+1.1 > [noecn] SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// SYN-ACK maybe getting blackholed, disable ECN
+2~+2.2 > [noecn] S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
// Received an ACK with no ACE flags, state should be set to blackholed
+0.1 < [noecn] . 1:1(0) ack 1 win 320
+0 accept(3, ..., ...) = 4

View File

@ -0,0 +1,13 @@
// Test AccECN ECN field reflector in SYNACK
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [ce] SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SWA. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>

View File

@ -0,0 +1,13 @@
// Test AccECN ECN field reflector in SYNACK
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [ect0] SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SA. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>

View File

@ -0,0 +1,13 @@
// Test AccECN ECN field reflector in SYNACK
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [ect1] SEWA 0:0(0) win 32792 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SEW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>

View File

@ -0,0 +1,27 @@
// Test SYNACK CE & received_ce update
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > [noecn] SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [ce] SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] WA. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 write(4, ..., 100) = 100
+.002 > [ect0] P.6 1:101(100) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < [ect0] P.5 1:101(100) ack 101 win 256 <ECN e0b 101 ceb 0 e1b 1,nop>
+.002 > [ect0] .6 101:101(0) ack 101 <ECN e1b 1 ceb 0 e0b 101,nop>
+0.01 write(4, ..., 100) = 100
+.002 > [ect0] P.6 101:201(100) ack 101 <ECN e1b 1 ceb 0 e0b 101,nop>
+0.1 < [ect1] P.5 201:301(100) ack 201 win 256 <ECN e0b 101 ceb 0 e1b 1,nop>
+.002 > [ect0] .6 201:201(0) ack 101 <ECN e1b 101 ceb 0 e0b 101,nop,nop,nop,sack 201:301>
+0.01 < [ce] .6 401:501(100) ack 201 win 256 <ECN e0b 101 ceb 0 e1b 1,nop>
+.002 > [ect0] .7 201:201(0) ack 101 <ECN e1b 101 ceb 100 e0b 101,nop,nop,nop,sack 401:501 201:301>

View File

@ -0,0 +1,22 @@
// Reflected SYNACK CE mark increases delivered_ce
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_fallback=0
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0.05 < SEWA 0:0(0) win 32767 <mss 1050,nop,nop,sackOK,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Fake ce for prev, ECT validator must be disabled for this to work
+0.05 < [ect0] WA. 1:1(0) ack 1 win 264 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 1, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,24 @@
// Test SYN=0 reflector
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [ect0] SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] A. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 write(4, ..., 100) = 100
+.002 > [ect0] P.5 1:101(100) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < [ect0] P.5 1:1(0) ack 101 win 256 <ECN e0b 101 ceb 0 e1b 1,nop>
+0.01 < [ect0] P.5 1:101(100) ack 101 win 256 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] .5 101:101(0) ack 101 <ECN e1b 1 ceb 0 e0b 101,nop>
+0 read(4, ..., 100) = 100
+0 close(4) = 0
+0 > F.5 101:101(0) ack 101 <...>
+0.1 < R. 101:101(0) ack 102 win 4242

View File

@ -0,0 +1,24 @@
// Test SYN=0 reflector
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < [ect1] SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] EW. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.01 write(4, ..., 100) = 100
+.002 > [ect0] P.5 1:101(100) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < [ect1] P.5 1:1(0) ack 101 win 256 <ECN e0b 101 ceb 0 e1b 1,nop>
+0.01 < [ect1] P.5 1:101(100) ack 101 win 256 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 > [ect0] .5 101:101(0) ack 101 <ECN e1b 101 ceb 0 e0b 1,nop>
+0 read(4, ..., 100) = 100
+0 close(4) = 0
+0 > F5. 101:101(0) ack 101 <...>
+0.1 < R. 101:101(0) ack 102 win 4242

View File

@ -0,0 +1,15 @@
// Test 3rd ACK flags when SYN-ACK is rexmitted
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 4
+.002 ... 0.052 connect(4, ..., ...) = 0
+.002 > SEWA 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
+0.05 < SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>
+0.05 < SW. 0:0(0) ack 1 win 32767 <mss 1460,ECN e0b 1 ceb 0 e1b 1,nop,nop,nop,sackOK,nop,wscale 8>
+.002 > [ect0] W. 1:1(0) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,25 @@
// Test that we retransmit SYN-ACK with ACE and without
// AccECN options after
// SYN-ACK was lost and TCP moved to TCPS_SYN_RECEIVED
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
sysctl -q net.ipv4.tcp_ecn_option=2
`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < [noecn] SEWA 0:0(0) win 32792 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+.002 > [noecn] SW. 0:0(0) ack 1 <mss 1460,ECN e1b 1 ceb 0 e0b 1,nop,nop,nop,sackOK,nop,wscale 8>
// Retransmit SYN-ACK without option
+1~+1.1 > [noecn] SW. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+0.1 < [noecn] W. 1:1(0) ack 1 win 320 <ECN e0b 1 ceb 0 e1b 1,nop>
+.002 accept(3, ..., ...) = 4
// We try to write with AccECN option
+0.01 write(4, ..., 100) = 100
+.002 > [ect0] P5. 1:101(100) ack 1 <ECN e1b 1 ceb 0 e0b 1,nop>

View File

@ -0,0 +1,26 @@
// Test TS progress filtering
--tcp_ts_tick_usecs=1000
--tolerance_usecs=7000
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,sackOK,TS val 1 ecr 0,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,sackOK,TS val 10 ecr 1,ECN e1b 1 ceb 0 e0b 1,nop,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <nop,nop,TS val 2 ecr 10>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <nop,nop,TS val 83 ecr 2>
// Fake CE and claim no progress
+0.05 < [ect0] WA. 1:1(0) ack 1 win 264 <nop,nop,TS val 2 ecr 83>
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%

View File

@ -0,0 +1,25 @@
// Test TS progress filtering
--tcp_ts_tick_usecs=1000
`./defaults.sh
sysctl -q net.ipv4.tcp_ecn=3
`
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < SEWA 0:0(0) win 32792 <mss 1050,sackOK,TS val 1 ecr 0,nop,wscale 8>
+.002 > SW. 0:0(0) ack 1 <mss 1460,sackOK,TS val 10 ecr 1,ECN e1b 1 ceb 0 e0b 1,nop,nop,wscale 8>
+0.05 < [ect0] W. 1:1(0) ack 1 win 264 <nop,nop,TS val 2 ecr 10>
+.002 accept(3, ..., ...) = 4
+0.01 %{ assert tcpi_delivered_ce == 0, tcpi_delivered_ce }%
+0.01 write(4, ..., 1000) = 1000
+.002 > [ect0] EAP. 1:1001(1000) ack 1 <nop,nop,TS val 83 ecr 2>
// Fake CE and claim no progress
+0.05 < [ect0] WA. 1:1(0) ack 1 win 264 <nop,nop,TS val 3 ecr 83>
+0.01 %{ assert tcpi_delivered_ce == 1, tcpi_delivered_ce }%