Template of a packetdrill script to validate the proper
operation of the CE-reflector state-machine of DCTCP:
// Testing DCTCP
--tolerance_usecs=2000
// Load and enable DCTCP module and flush hostcache
0.0 `if kldstat | grep -q cc_dctcp; then echo dctcp already loaded;
else kldload cc_dctcp; fi`
+0.1 `sysctl net.inet.tcp.cc.algorithm=dctcp`
+0.1 `sysctl net.inet.tcp.cc.dctcp.alpha=0`
+0.1 `sysctl net.inet.tcp.initcwnd_segments=10`
+0.1 `sysctl net.inet.tcp.ecn.enable=1`
+0.1 `sysctl net.inet.tcp.hostcache.purgenow=1`
// Create a listening TCP socket.
+0.50 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0.01 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0.01 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1048576], 4) = 0
+0.01 setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4) = 0
+0.01 bind(3, ..., ...) = 0
+0.01 listen(3, 1) = 0
// Establish a TCP connection.
+0.04 <[noecn] SEW 0:0(0) win 65535 <mss 1012, sackOK, wscale 10, TS
+val 100 ecr 0, eol >
+0.00 >[noecn] SE. 0:0(0) ack 1 win 65535 <...>
+0.00 <[noecn] . 1:1(0) ack 1 win 65535
+0.00 accept(3, ..., ...) = 4
// Send IW plus 1 segment, check ECN bits
+1.0 <[ect0] . 1:1001(1000) ack 1 win 65535
+0 <[ect0] . 1001:2001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 2001 <...>
+0 <[ect0] . 2001:3001(1000) ack 1 win 65535
+0 <[ect0] . 3001:4001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 4001 <...>
+0 <[ect0] . 4001:5001(1000) ack 1 win 65535
+0 <[ect0] . 5001:6001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 6001 <...>
+0 <[ect0] . 6001:7001(1000) ack 1 win 65535
+0 <[ect0] . 7001:8001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 8001 <...>
+0 <[ce] . 8001:9001(1000) ack 1 win 65535
// should trigger a ACK,ECE here
+0 >[noecn] E. 1:1(0) ack 9001 <...>
+0 <[ce] . 9001:10001(1000) ack 1 win 65535
//+0 >[noecn] . 1:1(0) ack 10001 <...>
+0.0 read(4, ..., 10000) = 10000
+0 <[ce] . 10001:11001(1000) ack 1 win 65535
+0 >[noecn] E. 1:1(0) ack 11001 <...>
+0 <[ect0] . 11001:12001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 12001 <...>
+0 <[ect0] . 12001:13001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 13001 <...>
+0 <[ect0] . 13001:14001(1000) ack 1 win 65535
//+0 >[noecn] . 1:1(0) ack 14001 <...>
+0 <[ect0] . 14001:15001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 15001 <...>
+0 <[ect0] . 15001:16001(1000) ack 1 win 65535
//+0 >[noecn] . 1:1(0) ack 16001 <...>
+0 <[ect0] . 16001:17001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 17001 <...>
+0 <[ect0] . 17001:18001(1000) ack 1 win 65535
//+0 >[noecn] . 1:1(0) ack 18001 <...>
+0 <[ect0] . 18001:19001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 19001 <...>
+0 <[ect0] . 19001:20001(1000) ack 1 win 65535
+0 >[noecn] . 1:1(0) ack 20001 <...>
+1.00 close(4) = 0
+0.00 >[noecn] F. 1:1(0) ack 20001 <...>
+0.10 <[noecn] F. 20001:20001(0) ack 2 win 65535
+0.00 >[noecn] . 2:2(0) ack 20002 <...>