Skip to content

Commit b9d0ac3

Browse files
authored
Merge pull request #90 from danielinux/fixes-20260327
Compliance fixes + verification paths
2 parents 0fdb455 + 4474d70 commit b9d0ac3

6 files changed

Lines changed: 533 additions & 26 deletions

File tree

src/test/unit/unit.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Suite *wolf_suite(void)
227227
tcase_add_test(tc_utils, test_sock_setsockopt_recvttl);
228228
tcase_add_test(tc_utils, test_sock_setsockopt_invalid_socket);
229229
tcase_add_test(tc_utils, test_sock_setsockopt_recvttl_invalid_params);
230-
tcase_add_test(tc_utils, test_sock_getsockopt_recvttl_value);
230+
tcase_add_test(tc_utils, test_sock_getsockopt_recvttl_enabled_state);
231231
tcase_add_test(tc_utils, test_sock_getsockopt_invalid_socket);
232232
tcase_add_test(tc_utils, test_sock_can_read_write_paths);
233233
tcase_add_test(tc_utils, test_sock_getsockopt_recvttl_invalid_params);
@@ -309,11 +309,16 @@ Suite *wolf_suite(void)
309309
tcase_add_test(tc_utils, test_tcp_persist_cb_stops_when_window_reopens);
310310
tcase_add_test(tc_utils, test_poll_tcp_arp_request_on_miss);
311311
tcase_add_test(tc_utils, test_poll_udp_send_on_arp_hit);
312+
tcase_add_test(tc_utils, test_poll_udp_send_on_arp_miss_requests_arp_and_retains_queue);
312313
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_hit);
314+
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_miss_requests_arp_and_retains_queue);
313315
tcase_add_test(tc_utils, test_dhcp_timer_cb_paths);
316+
tcase_add_test(tc_utils, test_dhcp_timer_cb_send_failure_does_not_consume_retry_budget);
314317
tcase_add_test(tc_utils, test_dhcp_client_init_and_bound);
315318
tcase_add_test(tc_utils, test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline);
316319
tcase_add_test(tc_utils, test_dhcp_send_request_rebinding_broadcasts_to_lease_expiry);
320+
tcase_add_test(tc_utils, test_dhcp_send_request_send_failure_retries_next_tick);
321+
tcase_add_test(tc_utils, test_dhcp_send_discover_send_failure_retries_next_tick);
317322
tcase_add_test(tc_utils, test_dhcp_poll_offer_and_ack);
318323
tcase_add_test(tc_utils, test_dhcp_poll_renewing_ack_binds_client);
319324
tcase_add_test(tc_utils, test_dhcp_poll_rebinding_ack_binds_client);
@@ -370,6 +375,8 @@ Suite *wolf_suite(void)
370375
tcase_add_test(tc_utils, test_ll_send_frame_drops_oversize);
371376
tcase_add_test(tc_utils, test_ll_helpers_invalid_inputs);
372377
tcase_add_test(tc_utils, test_non_ethernet_recv_oversize_dropped);
378+
tcase_add_test(tc_utils, test_non_ethernet_recv_wrapper_delivers_udp_and_skips_eth_filter);
379+
tcase_add_test(tc_utils, test_non_ethernet_recv_ex_wrapper_delivers_udp_on_second_if);
373380
#endif
374381
tcase_add_test(tc_utils, test_dns_format_ptr_name);
375382
tcase_add_test(tc_utils, test_dns_skip_and_copy_name);
@@ -378,6 +385,7 @@ Suite *wolf_suite(void)
378385
tcase_add_test(tc_utils, test_dns_schedule_timer_initial_jitter_and_cancel);
379386
tcase_add_test(tc_utils, test_dns_schedule_timer_caps_large_retry_shift);
380387
tcase_add_test(tc_utils, test_dns_send_query_schedules_timeout);
388+
tcase_add_test(tc_utils, test_dns_send_query_send_failure_clears_outstanding_state);
381389
tcase_add_test(tc_utils, test_dns_resend_query_uses_stored_query_buffer);
382390
tcase_add_test(tc_utils, test_dns_resend_query_fails_without_valid_socket);
383391
tcase_add_test(tc_utils, test_dns_resend_query_fails_without_cached_query_buffer);

src/test/unit/unit_esp.c

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,62 @@ static uint32_t build_ip_packet(uint8_t *buf, size_t buf_size,
129129
return frame_len;
130130
}
131131

132+
static uint32_t build_udp_ip_packet(uint8_t *buf, size_t buf_size,
133+
uint32_t src_ip, uint32_t dst_ip,
134+
uint16_t src_port, uint16_t dst_port,
135+
const uint8_t *payload, uint16_t payload_len)
136+
{
137+
struct wolfIP_ip_packet *ip;
138+
struct wolfIP_udp_datagram *udp;
139+
uint32_t frame_len;
140+
uint16_t udp_len = (uint16_t)(UDP_HEADER_LEN + payload_len);
141+
142+
frame_len = build_ip_packet(buf, buf_size, WI_IPPROTO_UDP, NULL, udp_len);
143+
ip = (struct wolfIP_ip_packet *)buf;
144+
udp = (struct wolfIP_udp_datagram *)ip;
145+
146+
ip->src = ee32(src_ip);
147+
ip->dst = ee32(dst_ip);
148+
udp->src_port = ee16(src_port);
149+
udp->dst_port = ee16(dst_port);
150+
udp->len = ee16(udp_len);
151+
udp->csum = 0;
152+
if (payload_len > 0U) {
153+
memcpy(udp->data, payload, payload_len);
154+
}
155+
ip->csum = 0;
156+
iphdr_set_checksum(ip);
157+
158+
return frame_len;
159+
}
160+
132161
static void esp_setup(void)
133162
{
134163
int ret = wolfIP_esp_init();
135164
ck_assert_int_eq(ret, 0);
136165
}
137166

167+
static void esp_add_cbc_test_sas(void)
168+
{
169+
int ret;
170+
171+
ret = wolfIP_esp_sa_new_cbc_hmac(0, (uint8_t *)spi_rt,
172+
atoip4(T_SRC), atoip4(T_DST),
173+
(uint8_t *)k_aes128, sizeof(k_aes128),
174+
ESP_AUTH_SHA256_RFC4868,
175+
(uint8_t *)k_auth16, sizeof(k_auth16),
176+
ESP_ICVLEN_HMAC_128);
177+
ck_assert_int_eq(ret, 0);
178+
179+
ret = wolfIP_esp_sa_new_cbc_hmac(1, (uint8_t *)spi_rt,
180+
atoip4(T_SRC), atoip4(T_DST),
181+
(uint8_t *)k_aes128, sizeof(k_aes128),
182+
ESP_AUTH_SHA256_RFC4868,
183+
(uint8_t *)k_auth16, sizeof(k_auth16),
184+
ESP_ICVLEN_HMAC_128);
185+
ck_assert_int_eq(ret, 0);
186+
}
187+
138188
/* Creating an HMAC-only SA with valid params must succeed. */
139189
START_TEST(test_sa_hmac_good)
140190
{
@@ -1278,6 +1328,105 @@ START_TEST(test_wrap_rejects_ip_len_below_header)
12781328
}
12791329
END_TEST
12801330

1331+
START_TEST(test_ip_recv_esp_transport_delivers_udp_payload)
1332+
{
1333+
static uint8_t buf[LINK_MTU + 256];
1334+
struct wolfIP s;
1335+
struct wolfIP_ip_packet *ip = (struct wolfIP_ip_packet *)buf;
1336+
struct wolfIP_sockaddr_in sin;
1337+
uint8_t payload[] = { 'e', 's', 'p', '!' };
1338+
uint8_t rxbuf[sizeof(payload)] = {0};
1339+
uint32_t frame_len;
1340+
uint16_t ip_len;
1341+
int udp_sd;
1342+
int ret;
1343+
1344+
wolfIP_init(&s);
1345+
esp_setup();
1346+
esp_add_cbc_test_sas();
1347+
wolfIP_ipconfig_set(&s, atoip4(T_DST), 0xFFFFFF00U, 0);
1348+
1349+
udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
1350+
ck_assert_int_gt(udp_sd, 0);
1351+
1352+
memset(&sin, 0, sizeof(sin));
1353+
sin.sin_family = AF_INET;
1354+
sin.sin_port = ee16(1234);
1355+
sin.sin_addr.s_addr = ee32(atoip4(T_DST));
1356+
ck_assert_int_eq(wolfIP_sock_bind(&s, udp_sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin)), 0);
1357+
1358+
frame_len = build_udp_ip_packet(buf, sizeof(buf), atoip4(T_SRC), atoip4(T_DST),
1359+
4321, 1234, payload, sizeof(payload));
1360+
ip_len = (uint16_t)(frame_len - ETH_HEADER_LEN);
1361+
1362+
ret = esp_transport_wrap(ip, &ip_len);
1363+
ck_assert_int_eq(ret, 0);
1364+
1365+
frame_len = (uint32_t)ip_len + ETH_HEADER_LEN;
1366+
ip->proto = 0x32U;
1367+
ip->len = ee16(ip_len);
1368+
ip->csum = 0U;
1369+
iphdr_set_checksum(ip);
1370+
1371+
ip_recv(&s, 0, ip, frame_len);
1372+
1373+
ret = wolfIP_sock_recvfrom(&s, udp_sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1374+
ck_assert_int_eq(ret, (int)sizeof(payload));
1375+
ck_assert_mem_eq(rxbuf, payload, sizeof(payload));
1376+
}
1377+
END_TEST
1378+
1379+
START_TEST(test_ip_recv_esp_transport_unwrap_failure_drops_packet)
1380+
{
1381+
static uint8_t buf[LINK_MTU + 256];
1382+
struct wolfIP s;
1383+
struct wolfIP_ip_packet *ip = (struct wolfIP_ip_packet *)buf;
1384+
struct wolfIP_sockaddr_in sin;
1385+
uint8_t payload[] = { 'b', 'a', 'd', '!' };
1386+
uint8_t rxbuf[sizeof(payload)] = {0};
1387+
uint32_t frame_len;
1388+
uint16_t ip_len;
1389+
uint32_t esp_len;
1390+
int udp_sd;
1391+
int ret;
1392+
1393+
wolfIP_init(&s);
1394+
esp_setup();
1395+
esp_add_cbc_test_sas();
1396+
wolfIP_ipconfig_set(&s, atoip4(T_DST), 0xFFFFFF00U, 0);
1397+
1398+
udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
1399+
ck_assert_int_gt(udp_sd, 0);
1400+
1401+
memset(&sin, 0, sizeof(sin));
1402+
sin.sin_family = AF_INET;
1403+
sin.sin_port = ee16(1234);
1404+
sin.sin_addr.s_addr = ee32(atoip4(T_DST));
1405+
ck_assert_int_eq(wolfIP_sock_bind(&s, udp_sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin)), 0);
1406+
1407+
frame_len = build_udp_ip_packet(buf, sizeof(buf), atoip4(T_SRC), atoip4(T_DST),
1408+
4321, 1234, payload, sizeof(payload));
1409+
ip_len = (uint16_t)(frame_len - ETH_HEADER_LEN);
1410+
1411+
ret = esp_transport_wrap(ip, &ip_len);
1412+
ck_assert_int_eq(ret, 0);
1413+
1414+
frame_len = (uint32_t)ip_len + ETH_HEADER_LEN;
1415+
ip->proto = 0x32U;
1416+
ip->len = ee16(ip_len);
1417+
ip->csum = 0U;
1418+
iphdr_set_checksum(ip);
1419+
1420+
esp_len = frame_len - ETH_HEADER_LEN - IP_HEADER_LEN;
1421+
ip->data[esp_len - 1U] ^= 0xFFU;
1422+
1423+
ip_recv(&s, 0, ip, frame_len);
1424+
1425+
ret = wolfIP_sock_recvfrom(&s, udp_sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1426+
ck_assert_int_eq(ret, -WOLFIP_EAGAIN);
1427+
}
1428+
END_TEST
1429+
12811430
static Suite *esp_suite(void)
12821431
{
12831432
Suite *s;
@@ -1352,6 +1501,11 @@ static Suite *esp_suite(void)
13521501
tcase_add_test(tc, test_ciphertext_tamper_cbc_sha256);
13531502
suite_add_tcase(s, tc);
13541503

1504+
tc = tcase_create("ip_recv");
1505+
tcase_add_test(tc, test_ip_recv_esp_transport_delivers_udp_payload);
1506+
tcase_add_test(tc, test_ip_recv_esp_transport_unwrap_failure_drops_packet);
1507+
suite_add_tcase(s, tc);
1508+
13551509
/* No-SA outbound path */
13561510
tc = tcase_create("no_sa");
13571511
tcase_add_test(tc, test_wrap_no_matching_sa);

src/test/unit/unit_tests_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3358,7 +3358,7 @@ START_TEST(test_sock_setsockopt_invalid_socket)
33583358
}
33593359
END_TEST
33603360

3361-
START_TEST(test_sock_getsockopt_recvttl_value)
3361+
START_TEST(test_sock_getsockopt_recvttl_enabled_state)
33623362
{
33633363
struct wolfIP s;
33643364
int udp_sd;
@@ -3374,7 +3374,7 @@ START_TEST(test_sock_getsockopt_recvttl_value)
33743374
s.udpsockets[SOCKET_UNMARK(udp_sd)].last_pkt_ttl = 77;
33753375

33763376
ck_assert_int_eq(wolfIP_sock_getsockopt(&s, udp_sd, WOLFIP_SOL_IP, WOLFIP_IP_RECVTTL, &value, &len), 0);
3377-
ck_assert_int_eq(value, 77);
3377+
ck_assert_int_eq(value, 1);
33783378
}
33793379
END_TEST
33803380

0 commit comments

Comments
 (0)