Skip to content

Commit f6aa529

Browse files
committed
Correctly parse ACK in TCP_CLOSING
F/689
1 parent 60444d8 commit f6aa529

2 files changed

Lines changed: 80 additions & 1 deletion

File tree

src/test/unit/unit.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15554,6 +15554,83 @@ START_TEST(test_tcp_input_close_wait_processes_ack)
1555415554
}
1555515555
END_TEST
1555615556

15557+
START_TEST(test_tcp_input_closing_processes_ack)
15558+
{
15559+
struct wolfIP s;
15560+
struct tsocket *ts;
15561+
struct tcp_seg_buf segbuf;
15562+
struct wolfIP_tcp_seg *queued;
15563+
struct wolfIP_tcp_seg ackseg;
15564+
struct pkt_desc *desc;
15565+
struct wolfIP_timer tmr;
15566+
15567+
wolfIP_init(&s);
15568+
mock_link_init(&s);
15569+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
15570+
15571+
ts = &s.tcpsockets[0];
15572+
memset(ts, 0, sizeof(*ts));
15573+
ts->proto = WI_IPPROTO_TCP;
15574+
ts->S = &s;
15575+
ts->sock.tcp.state = TCP_CLOSING;
15576+
ts->src_port = 1234;
15577+
ts->dst_port = 4321;
15578+
ts->local_ip = 0x0A000001U;
15579+
ts->remote_ip = 0x0A000002U;
15580+
ts->sock.tcp.last = 100;
15581+
ts->sock.tcp.snd_una = 100;
15582+
ts->sock.tcp.seq = 101;
15583+
ts->sock.tcp.bytes_in_flight = 1;
15584+
ts->sock.tcp.rto = 100;
15585+
ts->sock.tcp.ctrl_rto_active = 1;
15586+
ts->sock.tcp.ctrl_rto_retries = 2;
15587+
fifo_init(&ts->sock.tcp.txbuf, ts->txmem, TXBUF_SIZE);
15588+
15589+
memset(&segbuf, 0, sizeof(segbuf));
15590+
queued = &segbuf.seg;
15591+
queued->ip.len = ee16(IP_HEADER_LEN + TCP_HEADER_LEN + 1);
15592+
queued->hlen = TCP_HEADER_LEN << 2;
15593+
queued->seq = ee32(100);
15594+
ck_assert_int_eq(fifo_push(&ts->sock.tcp.txbuf, &segbuf, sizeof(segbuf)), 0);
15595+
desc = fifo_peek(&ts->sock.tcp.txbuf);
15596+
ck_assert_ptr_nonnull(desc);
15597+
desc->flags |= PKT_FLAG_SENT;
15598+
15599+
memset(&tmr, 0, sizeof(tmr));
15600+
tmr.cb = test_timer_cb;
15601+
tmr.expires = 200;
15602+
tmr.arg = ts;
15603+
ts->sock.tcp.tmr_rto = timers_binheap_insert(&s.timers, tmr);
15604+
ck_assert_int_ne(ts->sock.tcp.tmr_rto, NO_TIMER);
15605+
15606+
memset(&ackseg, 0, sizeof(ackseg));
15607+
ackseg.ip.ver_ihl = 0x45;
15608+
ackseg.ip.ttl = 64;
15609+
ackseg.ip.proto = WI_IPPROTO_TCP;
15610+
ackseg.ip.len = ee16(IP_HEADER_LEN + TCP_HEADER_LEN);
15611+
ackseg.ip.src = ee32(ts->remote_ip);
15612+
ackseg.ip.dst = ee32(ts->local_ip);
15613+
ackseg.src_port = ee16(ts->dst_port);
15614+
ackseg.dst_port = ee16(ts->src_port);
15615+
ackseg.hlen = TCP_HEADER_LEN << 2;
15616+
ackseg.flags = TCP_FLAG_ACK;
15617+
ackseg.ack = ee32(101);
15618+
ackseg.win = ee16(32);
15619+
fix_tcp_checksums(&ackseg);
15620+
15621+
tcp_input(&s, TEST_PRIMARY_IF, &ackseg,
15622+
(uint32_t)(ETH_HEADER_LEN + IP_HEADER_LEN + TCP_HEADER_LEN));
15623+
15624+
ck_assert_int_eq(ts->sock.tcp.state, TCP_TIME_WAIT);
15625+
ck_assert_uint_eq(ts->sock.tcp.snd_una, 101U);
15626+
ck_assert_uint_eq(ts->sock.tcp.bytes_in_flight, 0U);
15627+
ck_assert_ptr_eq(fifo_peek(&ts->sock.tcp.txbuf), NULL);
15628+
ck_assert_int_eq(ts->sock.tcp.tmr_rto, NO_TIMER);
15629+
ck_assert_uint_eq(ts->sock.tcp.ctrl_rto_active, 0U);
15630+
ck_assert_uint_eq(ts->sock.tcp.ctrl_rto_retries, 0U);
15631+
}
15632+
END_TEST
15633+
1555715634
START_TEST(test_tcp_sock_close_state_transitions)
1555815635
{
1555915636
struct wolfIP s;
@@ -19015,6 +19092,7 @@ Suite *wolf_suite(void)
1901519092
tcase_add_test(tc_utils, test_tcp_input_syn_bound_ip_mismatch);
1901619093
tcase_add_test(tc_utils, test_tcp_input_syn_rcvd_ack_wrong_flags);
1901719094
tcase_add_test(tc_utils, test_tcp_input_close_wait_processes_ack);
19095+
tcase_add_test(tc_utils, test_tcp_input_closing_processes_ack);
1901819096
tcase_add_test(tc_utils, test_tcp_input_established_ack_only_returns);
1901919097
tcase_add_test(tc_utils, test_tcp_input_syn_dst_not_local);
1902019098
tcase_add_test(tc_utils, test_tcp_input_syn_dst_outside_subnet);

src/wolfip.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3417,7 +3417,8 @@ static void tcp_input(struct wolfIP *S, unsigned int if_idx,
34173417
else if ((t->sock.tcp.state == TCP_ESTABLISHED) ||
34183418
(t->sock.tcp.state == TCP_CLOSE_WAIT) ||
34193419
(t->sock.tcp.state == TCP_FIN_WAIT_1) ||
3420-
(t->sock.tcp.state == TCP_FIN_WAIT_2)) {
3420+
(t->sock.tcp.state == TCP_FIN_WAIT_2) ||
3421+
(t->sock.tcp.state == TCP_CLOSING)) {
34213422

34223423
if (tcp->flags & TCP_FLAG_ACK) {
34233424
tcp_ack(t, tcp);

0 commit comments

Comments
 (0)