4 # Both server and client-side TFO support must be enabled in the
5 # kernel, 'sudo sh -c "echo 3 > /proc/sys/net/ipv4/tcp_fastopen"'.
7 # A packet capture on the loopback interface will show the TFO
8 # option on the SYN, but the fast-output SMTP banner will not
9 # be seen unless you also deliberately emulate a long path:
10 # 'sudo tc qdisc add dev lo root netem delay 50ms'
11 # You'll need iproute-tc installed, for the tc command.
12 # You'll need kernel-modules-extra installed, or you get
13 # an unhelpful error from RTNETLINK.
14 # To tidy up: 'sudo tc qdisc delete dev lo root'
17 # The kernel seems to have TFO enabled both ways as default.
18 # There is a net.inet.tcp.clear_tfocache parameter
21 # For network delays there is something called 'Network Link Conditioner'
22 # which might do the job. But how to manipulate it?
25 # FreeBSD: it looks like you have to compile a custom kernel, with
26 # 'options TCP_RFC7413' in the config. Also set
27 # 'net.inet.tcp.fastopen.server_enable=1' in /etc/sysctl.conf
28 # Seems to always claim TFO used by transport, if tried.
31 system ("tc qdisc add dev lo root netem delay 50ms");
35 # Disable the TFO blackhole detection, as we seem to be running foul of it.
36 # If bitten, we see the expected EINPROGRESS for sendto, yet no TFO cookie
40 system ("[ -e /proc/sys/net/ipv4/tcp_fastopen_blackhole_timeout_sec ] && echo 0 > /proc/sys/net/ipv4/tcp_fastopen_blackhole_timeout_sec");
43 # First time runs will see a TFO request option only; subsequent
44 # ones should see the TFO cookie and fast-output SMTP banner
45 # (currently on a separate packet after the server SYN,ACK but before
48 # The client log => line should have a "TFO" element.
49 # The server log <= line for a@test.ex should not.
51 # First clear any previously-obtained cookie:
53 system ("ip tcp_metrics delete 127.0.0.1");
58 exim -DSERVER=server -bd -oX PORT_D
66 # The server log <= line for b@test.ex should have a "TFO" element, but
67 # this will only be obtained when the above delay is inserted into the
77 system ("tc qdisc delete dev lo root");
78 system ("[ -e /proc/sys/net/ipv4/tcp_fastopen_blackhole_timeout_sec ] && echo 3600 > /proc/sys/net/ipv4/tcp_fastopen_blackhole_timeout_sec");