Skip to content

Commit fa94e4b

Browse files
committed
Add tests proving ARP negotiation is triggered by UDP / ICMP traffic
1 parent 5666e7e commit fa94e4b

2 files changed

Lines changed: 77 additions & 2 deletions

File tree

src/test/unit/unit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,9 @@ 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);
314316
tcase_add_test(tc_utils, test_dhcp_client_init_and_bound);
315317
tcase_add_test(tc_utils, test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,7 +2638,7 @@ START_TEST(test_poll_tcp_ack_only_skips_send)
26382638
fifo_init(&ts->sock.tcp.txbuf, ts->txmem, TXBUF_SIZE);
26392639

26402640
ck_assert_int_eq(enqueue_tcp_tx(ts, 0, TCP_FLAG_ACK), 0);
2641-
(void)wolfIP_poll(&s, 100);
2641+
(void)wolfIP_poll(&s, 2000);
26422642

26432643
ck_assert_ptr_eq(fifo_peek(&ts->sock.tcp.txbuf), NULL);
26442644
ck_assert_uint_gt(last_frame_sent_size, 0);
@@ -3353,13 +3353,49 @@ START_TEST(test_poll_udp_send_on_arp_hit)
33533353
(struct wolfIP_sockaddr *)&sin, sizeof(sin));
33543354
ck_assert_int_eq(ret, (int)sizeof(payload));
33553355

3356-
(void)wolfIP_poll(&s, 100);
3356+
(void)wolfIP_poll(&s, 2000);
33573357
ck_assert_uint_gt(last_frame_sent_size, 0);
33583358
ck_assert_uint_eq(last_frame_sent[12], 0x08);
33593359
ck_assert_uint_eq(last_frame_sent[13], 0x00);
33603360
}
33613361
END_TEST
33623362

3363+
START_TEST(test_poll_udp_send_on_arp_miss_requests_arp_and_retains_queue)
3364+
{
3365+
struct wolfIP s;
3366+
int udp_sd;
3367+
struct tsocket *ts;
3368+
struct wolfIP_sockaddr_in sin;
3369+
uint8_t payload[4] = {1, 2, 3, 4};
3370+
int ret;
3371+
3372+
wolfIP_init(&s);
3373+
mock_link_init(&s);
3374+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
3375+
wolfIP_filter_set_callback(NULL, NULL);
3376+
last_frame_sent_size = 0;
3377+
3378+
udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
3379+
ck_assert_int_gt(udp_sd, 0);
3380+
ts = &s.udpsockets[SOCKET_UNMARK(udp_sd)];
3381+
memset(&sin, 0, sizeof(sin));
3382+
sin.sin_family = AF_INET;
3383+
sin.sin_port = ee16(1234);
3384+
sin.sin_addr.s_addr = ee32(0x0A000002U);
3385+
ret = wolfIP_sock_sendto(&s, udp_sd, payload, sizeof(payload), 0,
3386+
(struct wolfIP_sockaddr *)&sin, sizeof(sin));
3387+
ck_assert_int_eq(ret, (int)sizeof(payload));
3388+
ts->if_idx = TEST_PRIMARY_IF;
3389+
ck_assert_ptr_nonnull(fifo_peek(&ts->sock.udp.txbuf));
3390+
3391+
(void)wolfIP_poll(&s, 2000);
3392+
ck_assert_uint_gt(last_frame_sent_size, 0U);
3393+
ck_assert_uint_eq(last_frame_sent[12], 0x08);
3394+
ck_assert_uint_eq(last_frame_sent[13], 0x06);
3395+
ck_assert_ptr_nonnull(fifo_peek(&ts->sock.udp.txbuf));
3396+
}
3397+
END_TEST
3398+
33633399
START_TEST(test_poll_icmp_send_on_arp_hit)
33643400
{
33653401
struct wolfIP s;
@@ -3397,6 +3433,43 @@ START_TEST(test_poll_icmp_send_on_arp_hit)
33973433
}
33983434
END_TEST
33993435

3436+
START_TEST(test_poll_icmp_send_on_arp_miss_requests_arp_and_retains_queue)
3437+
{
3438+
struct wolfIP s;
3439+
int icmp_sd;
3440+
struct tsocket *ts;
3441+
struct wolfIP_sockaddr_in sin;
3442+
uint8_t payload[ICMP_HEADER_LEN + 1];
3443+
int ret;
3444+
3445+
wolfIP_init(&s);
3446+
mock_link_init(&s);
3447+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
3448+
wolfIP_filter_set_callback(NULL, NULL);
3449+
last_frame_sent_size = 0;
3450+
3451+
icmp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_ICMP);
3452+
ck_assert_int_gt(icmp_sd, 0);
3453+
ts = &s.icmpsockets[SOCKET_UNMARK(icmp_sd)];
3454+
memset(&sin, 0, sizeof(sin));
3455+
sin.sin_family = AF_INET;
3456+
sin.sin_addr.s_addr = ee32(0x0A000002U);
3457+
memset(payload, 0, sizeof(payload));
3458+
payload[0] = ICMP_ECHO_REQUEST;
3459+
ret = wolfIP_sock_sendto(&s, icmp_sd, payload, sizeof(payload), 0,
3460+
(struct wolfIP_sockaddr *)&sin, sizeof(sin));
3461+
ck_assert_int_eq(ret, (int)sizeof(payload));
3462+
ts->if_idx = TEST_PRIMARY_IF;
3463+
ck_assert_ptr_nonnull(fifo_peek(&ts->sock.udp.txbuf));
3464+
3465+
(void)wolfIP_poll(&s, 2000);
3466+
ck_assert_uint_gt(last_frame_sent_size, 0U);
3467+
ck_assert_uint_eq(last_frame_sent[12], 0x08);
3468+
ck_assert_uint_eq(last_frame_sent[13], 0x06);
3469+
ck_assert_ptr_nonnull(fifo_peek(&ts->sock.udp.txbuf));
3470+
}
3471+
END_TEST
3472+
34003473
START_TEST(test_dhcp_timer_cb_paths)
34013474
{
34023475
struct wolfIP s;

0 commit comments

Comments
 (0)