@@ -15554,6 +15554,83 @@ START_TEST(test_tcp_input_close_wait_processes_ack)
1555415554}
1555515555END_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+
1555715634START_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);
0 commit comments