102d00b516
The TCP three-way handshake completion (initiator's ACK after SYN-ACK) arrives on the ORIGINAL direction, not the reply direction. Previously the SynRecv→Established transition was gated on is_orig==false, which meant it would never fire after the initial SYN-ACK reply. Connections would stay in SynRecv state forever with ConnState::New. Fix: move SynRecv→Established from reply to orig direction, per Linux nf_conntrack_proto_tcp.c (TCP_CONNTRACK_SYN_RECV fires on IP_CT_DIR_ORIGINAL packets). Reply direction now only handles: - SYN-ACK from responder (SynSent→SynRecv) - FIN from responder (Established→FinWait) - Second FIN from responder (FinWait→TimeWait) - TimeWait timeout extension Orig direction now handles: - ACK from initiator (SynRecv→Established) - FIN from initiator (Established→FinWait) - Second FIN from initiator (FinWait→TimeWait) RST still closes from either direction. All 31 tests pass.