+ TCP_Send(0,4,BLOB(TEST_IP), local_port, server_port, seq_tx, seq_exp,
+ TCP_ACK|TCP_PSH, our_window, testblob_len, testblob);
+ seq_tx += testblob_len;
+ // Expect burst delayed ACK
+ TEST_ASSERT_rx();
+ TEST_ASSERT( TCP_Pkt_Check(rxlen, rxbuf, &ofs, &len, 4, BLOB(TEST_IP),
+ server_port, local_port, seq_exp, seq_tx, TCP_ACK) );
+ TEST_ASSERT_REL( len, ==, 0 );
+
+ // Expect echoed reponse with ACK
+ TEST_ASSERT_rx();
+ TEST_ASSERT( TCP_Pkt_Check(rxlen, rxbuf, &ofs, &len, 4, BLOB(TEST_IP),
+ server_port, local_port, seq_exp, seq_tx, TCP_ACK|TCP_PSH) );
+ TEST_ASSERT_REL( len, ==, testblob_len );
+ TEST_ASSERT( memcmp(rxbuf + ofs, testblob, testblob_len) == 0 );
+ seq_exp += testblob_len;
+
+ // 2.6. Close connection (TCP FIN)
+ TCP_Send(0,4,BLOB(TEST_IP), local_port, server_port, seq_tx, seq_exp,
+ TCP_ACK|TCP_FIN, our_window, 0, NULL);
+ seq_tx ++; // Empty = 1 byte
+ // Expect ACK? (Does acess do delayed ACKs here?)
+ TEST_ASSERT_rx();
+ TEST_ASSERT( TCP_Pkt_Check(rxlen, rxbuf, &ofs, &len, 4, BLOB(TEST_IP),
+ server_port, local_port, seq_exp, seq_tx, TCP_ACK) );
+ TEST_ASSERT_REL( len, ==, 0 );
+ // >>> STATE: CLOSE WAIT
+
+ // Expect FIN
+ TEST_ASSERT_rx();
+ TEST_ASSERT( TCP_Pkt_Check(rxlen, rxbuf, &ofs, &len, 4, BLOB(TEST_IP),
+ server_port, local_port, seq_exp, 0, TCP_FIN) );
+ TEST_ASSERT_REL( len, ==, 0 );
+
+ // >>> STATE: LAST-ACK
+
+ // 2.7 Send ACK of FIN
+ TCP_Send(0,4,BLOB(TEST_IP), local_port, server_port, seq_tx, seq_exp,
+ TCP_ACK, our_window, 0, NULL);
+ // Expect no response
+ TEST_ASSERT_no_rx();
+
+ // >>> STATE: CLOSED