As usual, the problems were caused by a handful of subtle bugs:
1) When Athena responds to a SYN packet, it needs to set tcp->recv_ack to sequence number of SYN packet + 1. I didn't take endianness into account, so adding 1 to a big-endian number on a little endian system gave me the wrong ack number.
2) When Athena receives a SYN and ACK during the handshake, it needs to save copies of those packets. I wasn't copying the packets correctly, so when Athena would replay the handshake for the server, it would send empty packets.
3) The state machine in ct_update_connection() skipped the state that would complete the server's TCP handshake, so connections would never actually start sending data.
Now that I have a working TCP replay implementation, I'm going to move the relevant changes to my dev-tcpreplay branch, and start load testing with Vegeta.
@twood02 As of commit 0b5a7b1, TCP replay works.
As usual, the problems were caused by a handful of subtle bugs: 1) When Athena responds to a SYN packet, it needs to set
tcp->recv_ack
tosequence number of SYN packet + 1
. I didn't take endianness into account, so adding 1 to a big-endian number on a little endian system gave me the wrong ack number. 2) When Athena receives a SYN and ACK during the handshake, it needs to save copies of those packets. I wasn't copying the packets correctly, so when Athena would replay the handshake for the server, it would send empty packets. 3) The state machine inct_update_connection()
skipped the state that would complete the server's TCP handshake, so connections would never actually start sending data.Now that I have a working TCP replay implementation, I'm going to move the relevant changes to my dev-tcpreplay branch, and start load testing with Vegeta.