Skip to content

Commit d9a1437

Browse files
committed
Fix regression in tcp_tx_desc_ip_len for non-ethernet devices
1 parent eeaa47a commit d9a1437

3 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ Suite *wolf_suite(void)
750750
tcase_add_test(tc_proto, test_regression_syn_on_last_ack_not_silently_processed);
751751
tcase_add_test(tc_proto, test_regression_full_txbuf_still_sends_pure_ack);
752752
tcase_add_test(tc_proto, test_regression_loopback_immediate_pure_ack_uses_loopback_ll);
753-
tcase_add_test(tc_proto, test_regression_tcp_tx_desc_payload_len_uses_link_type_not_length_heuristic);
753+
tcase_add_test(tc_proto, test_regression_tcp_tx_desc_payload_len_keeps_descriptor_layout_sanity);
754754
tcase_add_test(tc_proto, test_regression_fast_recovery_cwnd_ssthresh_rfc5681);
755755
tcase_add_test(tc_proto, test_regression_paws_rejects_stale_timestamp);
756756
tcase_add_test(tc_proto, test_regression_paws_accepts_wrapped_newer_timestamp);

src/test/unit/unit_tests_proto.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4800,7 +4800,7 @@ START_TEST(test_regression_loopback_immediate_pure_ack_uses_loopback_ll)
48004800
}
48014801
END_TEST
48024802

4803-
START_TEST(test_regression_tcp_tx_desc_payload_len_uses_link_type_not_length_heuristic)
4803+
START_TEST(test_regression_tcp_tx_desc_payload_len_keeps_descriptor_layout_sanity)
48044804
{
48054805
struct wolfIP s;
48064806
struct tsocket *ts;
@@ -4827,10 +4827,22 @@ START_TEST(test_regression_tcp_tx_desc_payload_len_uses_link_type_not_length_heu
48274827
ck_assert_uint_eq(tcp_tx_desc_ip_len(ts, &desc, &seg), 0U);
48284828
ck_assert_uint_eq(tcp_tx_desc_payload_len(ts, &desc, &seg), 0U);
48294829

4830-
/* The same descriptor length is valid on non-Ethernet/L3 links. */
4830+
/* Non-Ethernet links still use the same queued descriptor layout. */
4831+
s.ll_dev[TEST_PRIMARY_IF].non_ethernet = 1;
4832+
ck_assert_uint_eq(tcp_tx_desc_ip_len(ts, &desc, &seg), 0U);
4833+
ck_assert_uint_eq(tcp_tx_desc_payload_len(ts, &desc, &seg), 0U);
4834+
4835+
/* Once the descriptor includes stored link headroom, both paths decode
4836+
* the same IP and payload lengths. */
4837+
desc.len = ETH_HEADER_LEN + IP_HEADER_LEN + TCP_HEADER_LEN + 4;
4838+
s.ll_dev[TEST_PRIMARY_IF].non_ethernet = 0;
4839+
ck_assert_uint_eq(tcp_tx_desc_ip_len(ts, &desc, &seg),
4840+
IP_HEADER_LEN + TCP_HEADER_LEN + 4U);
4841+
ck_assert_uint_eq(tcp_tx_desc_payload_len(ts, &desc, &seg), 4U);
4842+
48314843
s.ll_dev[TEST_PRIMARY_IF].non_ethernet = 1;
48324844
ck_assert_uint_eq(tcp_tx_desc_ip_len(ts, &desc, &seg),
4833-
(uint32_t)desc.len);
4845+
IP_HEADER_LEN + TCP_HEADER_LEN + 4U);
48344846
ck_assert_uint_eq(tcp_tx_desc_payload_len(ts, &desc, &seg), 4U);
48354847
}
48364848
END_TEST

src/wolfip.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2829,17 +2829,13 @@ static uint32_t tcp_tx_desc_ip_len(const struct tsocket *t,
28292829
{
28302830
uint32_t seg_ip_len;
28312831
uint32_t seg_hdr_len;
2832-
unsigned int tx_if;
28332832

28342833
if (!t || !desc || !seg)
28352834
return 0;
28362835
seg_hdr_len = IP_HEADER_LEN + (uint32_t)(seg->hlen >> 2);
28372836
seg_ip_len = ee16(seg->ip.len);
28382837
if (seg_ip_len != 0)
28392838
return seg_ip_len;
2840-
tx_if = wolfIP_socket_if_idx(t);
2841-
if (wolfIP_ll_is_non_ethernet(t->S, tx_if))
2842-
return desc->len;
28432839
if (desc->len < (ETH_HEADER_LEN + seg_hdr_len))
28442840
return 0;
28452841
return desc->len - ETH_HEADER_LEN;

0 commit comments

Comments
 (0)