// Testing DCTCP --tolerance_usecs=20000 // 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.05 `sysctl net.inet.tcp.cc.algorithm=dctcp` +0.05 `sysctl net.inet.tcp.cc.dctcp.alpha=512` +0.05 `sysctl net.inet.tcp.cc.dctcp.shift_g=1` // make alpha very depended on last window +0.05 `sysctl net.inet.tcp.initcwnd_segments=10` +0.05 `sysctl net.inet.tcp.ecn.enable=1` +0.05 `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.80 <[noecn] SEW 0:0(0) win 65535 +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 +1.0 write(4, ..., 22000) = 22000 // Send IW plus 1 segment, check ECN bits +0 %{ print("\t\t\tcwnd\tssthresh") print("initial window:\t\t\t{}\t{}".format(tcpi_snd_cwnd, tcpi_snd_ssthresh)) if (tcpi_snd_cwnd < 10000): print("Error - Initial Window smaller than 10 MSS!") assert tcpi_snd_cwnd >= 10000 }% +0 >[ect0] . 1:1001(1000) ack 1 win 1032 +0 >[ect0] . 1001:2001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[ect0] . 2001:3001(1000) ack 1 win 1032 +0 >[ect0] . 3001:4001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[ect0] . 4001:5001(1000) ack 1 win 1032 +0 >[ect0] . 5001:6001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[ect0] . 6001:7001(1000) ack 1 win 1032 +0 >[ect0] . 7001:8001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[ect0] . 8001:9001(1000) ack 1 win 1032 +0 >[ect0] . 9001:10001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[ect0] W. 10001:11001(1000) ack 1 win 1032 +0 >[ect0] . 11001:12001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 1 win 65535 +0 >[noecn] W. 1:1001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 12001 win 65535 +0 %{ print("after iw with all marks:\t{}\t{}".format(tcpi_snd_cwnd, tcpi_snd_ssthresh)) if not ((tcpi_snd_cwnd >= 2700) and (tcpi_snd_cwnd <= 3100)): print("Error - Window after loss and all marks not around 1/4 of initial window!") assert ((tcpi_snd_cwnd >= 2700) and (tcpi_snd_cwnd <= 3100)) }% +0 >[ect0] . 12001:13001(1000) ack 1 win 1032 +0 >[ect0] . 13001:14001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 14001 win 65535 +0 >[ect0] . 14001:15001(1000) ack 1 win 1032 +0 >[ect0] W. 15001:16001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 16001 win 65535 +0 >[ect0] . 16001:17001(1000) ack 1 win 1032 +0 >[ect0] . 17001:18001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 18001 win 65535 +0 >[ect0] . 18001:19001(1000) ack 1 win 1032 +0 >[ect0] . 19001:20001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 20001 win 65535 +0 >[ect0] W. 20001:21001(1000) ack 1 win 1032 +0 >[ect0] P. 21001:22001(1000) ack 1 win 1032 +0 <[noecn] E. 1:1(0) ack 22001 win 65535 +0 %{ print("final window with all marks:\t{}\t{}".format(tcpi_snd_cwnd, tcpi_snd_ssthresh)) if not ((tcpi_snd_cwnd >= 5000) and (tcpi_snd_cwnd <= 5100)): print("Error - Final window not around 5 MSS!") assert ((tcpi_snd_cwnd >= 5000) and (tcpi_snd_cwnd <= 5100)) }% +1.00 close(4) = 0 +0.00 >[noecn] F. 22001:22001(0) ack 1 <...> +0.10 <[noecn] F. 1:1(0) ack 22002 win 65535 +0.00 >[noecn] . 22002:22002(0) ack 2 <...> `sysctl net.inet.tcp.cc.algorithm=newreno`