Skip to content

Commit 4474d70

Browse files
committed
Addressed copilot's review comments
1 parent 96a8d8d commit 4474d70

3 files changed

Lines changed: 53 additions & 12 deletions

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ Suite *wolf_suite(void)
313313
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_hit);
314314
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_miss_requests_arp_and_retains_queue);
315315
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);
316317
tcase_add_test(tc_utils, test_dhcp_client_init_and_bound);
317318
tcase_add_test(tc_utils, test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline);
318319
tcase_add_test(tc_utils, test_dhcp_send_request_rebinding_broadcasts_to_lease_expiry);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ START_TEST(test_dhcp_send_discover_send_failure_retries_next_tick)
952952

953953
ck_assert_int_eq(dhcp_send_discover(&s), -WOLFIP_EAGAIN);
954954
ck_assert_ptr_eq(fifo_peek(&ts->sock.udp.txbuf), NULL);
955-
ck_assert_int_eq(s.dhcp_state, DHCP_OFF);
955+
ck_assert_int_eq(s.dhcp_state, DHCP_DISCOVER_SENT);
956956
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.last_tick + 1U);
957957
}
958958
END_TEST
@@ -3516,6 +3516,38 @@ START_TEST(test_dhcp_timer_cb_paths)
35163516
}
35173517
END_TEST
35183518

3519+
START_TEST(test_dhcp_timer_cb_send_failure_does_not_consume_retry_budget)
3520+
{
3521+
struct wolfIP s;
3522+
struct tsocket *ts;
3523+
uint8_t tiny[2];
3524+
3525+
wolfIP_init(&s);
3526+
mock_link_init(&s);
3527+
s.dhcp_xid = 1U;
3528+
s.last_tick = 1000U;
3529+
3530+
s.dhcp_udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
3531+
ck_assert_int_gt(s.dhcp_udp_sd, 0);
3532+
ts = &s.udpsockets[SOCKET_UNMARK(s.dhcp_udp_sd)];
3533+
fifo_init(&ts->sock.udp.txbuf, tiny, sizeof(tiny));
3534+
3535+
s.dhcp_state = DHCP_DISCOVER_SENT;
3536+
s.dhcp_timeout_count = 0;
3537+
dhcp_timer_cb(&s);
3538+
ck_assert_int_eq(s.dhcp_timeout_count, 0);
3539+
ck_assert_int_eq(s.dhcp_state, DHCP_DISCOVER_SENT);
3540+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.last_tick + 1U);
3541+
3542+
s.dhcp_state = DHCP_REQUEST_SENT;
3543+
s.dhcp_timeout_count = 0;
3544+
dhcp_timer_cb(&s);
3545+
ck_assert_int_eq(s.dhcp_timeout_count, 0);
3546+
ck_assert_int_eq(s.dhcp_state, DHCP_REQUEST_SENT);
3547+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.last_tick + 1U);
3548+
}
3549+
END_TEST
3550+
35193551
START_TEST(test_dhcp_client_init_and_bound)
35203552
{
35213553
struct wolfIP s;

src/wolfip.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5221,22 +5221,25 @@ static void dhcp_schedule_lease_timer(struct wolfIP *s,
52215221
static void dhcp_timer_cb(void *arg)
52225222
{
52235223
struct wolfIP *s = (struct wolfIP *)arg;
5224+
int ret;
52245225
LOG("dhcp timeout\n");
52255226
if (!s)
52265227
return;
52275228
s->dhcp_timer = NO_TIMER;
52285229
switch(s->dhcp_state) {
52295230
case DHCP_DISCOVER_SENT:
52305231
if (s->dhcp_timeout_count < DHCP_DISCOVER_RETRIES) {
5231-
dhcp_send_discover(s);
5232-
s->dhcp_timeout_count++;
5232+
ret = dhcp_send_discover(s);
5233+
if (ret >= 0)
5234+
s->dhcp_timeout_count++;
52335235
} else
52345236
s->dhcp_state = DHCP_OFF;
52355237
break;
52365238
case DHCP_REQUEST_SENT:
52375239
if (s->dhcp_timeout_count < DHCP_REQUEST_RETRIES) {
5238-
dhcp_send_request(s);
5239-
s->dhcp_timeout_count++;
5240+
ret = dhcp_send_request(s);
5241+
if (ret >= 0)
5242+
s->dhcp_timeout_count++;
52405243
} else
52415244
s->dhcp_state = DHCP_OFF;
52425245
break;
@@ -5247,24 +5250,27 @@ static void dhcp_timer_cb(void *arg)
52475250
}
52485251
s->dhcp_state = DHCP_RENEWING;
52495252
s->dhcp_timeout_count = 0;
5250-
dhcp_send_request(s);
5251-
s->dhcp_timeout_count++;
5253+
ret = dhcp_send_request(s);
5254+
if (ret >= 0)
5255+
s->dhcp_timeout_count++;
52525256
break;
52535257
case DHCP_RENEWING:
52545258
if (s->dhcp_rebind_at != 0 && s->last_tick >= s->dhcp_rebind_at) {
52555259
s->dhcp_state = DHCP_REBINDING;
52565260
s->dhcp_timeout_count = 0;
52575261
}
5258-
dhcp_send_request(s);
5259-
s->dhcp_timeout_count++;
5262+
ret = dhcp_send_request(s);
5263+
if (ret >= 0)
5264+
s->dhcp_timeout_count++;
52605265
break;
52615266
case DHCP_REBINDING:
52625267
if (s->dhcp_lease_expires != 0 && s->last_tick >= s->dhcp_lease_expires) {
52635268
s->dhcp_state = DHCP_OFF;
52645269
break;
52655270
}
5266-
dhcp_send_request(s);
5267-
s->dhcp_timeout_count++;
5271+
ret = dhcp_send_request(s);
5272+
if (ret >= 0)
5273+
s->dhcp_timeout_count++;
52685274
break;
52695275
default:
52705276
break;
@@ -5738,8 +5744,10 @@ static int dhcp_send_discover(struct wolfIP *s)
57385744
ret = wolfIP_sock_sendto(s, s->dhcp_udp_sd, &disc, DHCP_HEADER_LEN + opt_sz, 0,
57395745
(struct wolfIP_sockaddr *)&sin, sizeof(struct wolfIP_sockaddr_in));
57405746
if (ret < 0) {
5741-
/* Retry on the next tick after local backpressure instead of
5747+
/* Enter discover-sent before retrying so dhcp_timer_cb() continues
5748+
* DHCP startup after local backpressure. Retry on the next tick instead of
57425749
* waiting a full discover timeout for a packet that never queued. */
5750+
s->dhcp_state = DHCP_DISCOVER_SENT;
57435751
dhcp_schedule_timer_at(s, retry_at);
57445752
return ret;
57455753
}

0 commit comments

Comments
 (0)