Skip to content

Commit 26c7a8e

Browse files
committed
Add DHCP lease renewal scheduling
F/1167
1 parent f01a971 commit 26c7a8e

3 files changed

Lines changed: 280 additions & 22 deletions

File tree

src/test/unit/unit.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@ Suite *wolf_suite(void)
292292
tcase_add_test(tc_utils, test_poll_icmp_send_on_arp_hit);
293293
tcase_add_test(tc_utils, test_dhcp_timer_cb_paths);
294294
tcase_add_test(tc_utils, test_dhcp_client_init_and_bound);
295+
tcase_add_test(tc_utils, test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline);
296+
tcase_add_test(tc_utils, test_dhcp_send_request_rebinding_broadcasts_to_lease_expiry);
295297
tcase_add_test(tc_utils, test_dhcp_poll_offer_and_ack);
296298
tcase_add_test(tc_utils, test_dns_callback_ptr_response);
297299
tcase_add_test(tc_utils, test_udp_try_recv_short_frame);
@@ -645,6 +647,7 @@ Suite *wolf_suite(void)
645647
tcase_add_test(tc_proto, test_udp_recvfrom_src_equals_local_ip_does_not_persist_remote);
646648
tcase_add_test(tc_proto, test_dns_query_and_callback_a);
647649
tcase_add_test(tc_proto, test_dhcp_parse_offer_and_ack);
650+
tcase_add_test(tc_proto, test_dhcp_schedule_lease_timer_defaults_t1_t2);
648651
tcase_add_test(tc_proto, test_dhcp_parse_offer_defaults_mask_when_missing);
649652
tcase_add_test(tc_proto, test_dhcp_parse_offer_rejects_mismatched_xid);
650653
tcase_add_test(tc_proto, test_dhcp_parse_ack_rejects_mismatched_xid);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
static uint64_t find_timer_expiry(const struct wolfIP *s, uint32_t timer_id)
2+
{
3+
uint32_t i;
4+
5+
for (i = 0; i < s->timers.size; i++) {
6+
if (s->timers.timers[i].id == timer_id)
7+
return s->timers.timers[i].expires;
8+
}
9+
return 0;
10+
}
11+
112
START_TEST(test_wolfip_static_instance_apis)
213
{
314
struct wolfIP *s = NULL;
@@ -19,6 +30,7 @@ START_TEST(test_dhcp_parse_offer_and_ack)
1930
uint32_t router_ip = 0x0A000002U;
2031
uint32_t dns_ip = 0x08080808U;
2132
uint32_t mask = 0xFFFFFF00U;
33+
uint32_t lease_s = 120U;
2234

2335
wolfIP_init(&s);
2436
primary = wolfIP_primary_ipconf(&s);
@@ -54,6 +66,7 @@ START_TEST(test_dhcp_parse_offer_and_ack)
5466
ck_assert_uint_eq(s.dhcp_server_ip, server_ip);
5567
ck_assert_uint_eq(primary->mask, mask);
5668
ck_assert_int_eq(s.dhcp_state, DHCP_REQUEST_SENT);
69+
s.last_tick = 1000U;
5770

5871
memset(&msg, 0, sizeof(msg));
5972
msg.magic = ee32(DHCP_MAGIC);
@@ -90,6 +103,13 @@ START_TEST(test_dhcp_parse_offer_and_ack)
90103
opt->data[2] = (router_ip >> 8) & 0xFF;
91104
opt->data[3] = (router_ip >> 0) & 0xFF;
92105
opt = (struct dhcp_option *)((uint8_t *)opt + 6);
106+
opt->code = 51;
107+
opt->len = 4;
108+
opt->data[0] = (lease_s >> 24) & 0xFF;
109+
opt->data[1] = (lease_s >> 16) & 0xFF;
110+
opt->data[2] = (lease_s >> 8) & 0xFF;
111+
opt->data[3] = (lease_s >> 0) & 0xFF;
112+
opt = (struct dhcp_option *)((uint8_t *)opt + 6);
93113
opt->code = DHCP_OPTION_OFFER_IP;
94114
opt->len = 4;
95115
opt->data[0] = (offer_ip >> 24) & 0xFF;
@@ -106,6 +126,25 @@ START_TEST(test_dhcp_parse_offer_and_ack)
106126
ck_assert_uint_eq(primary->mask, mask);
107127
ck_assert_uint_eq(primary->gw, router_ip);
108128
ck_assert_uint_eq(s.dns_server, dns_ip);
129+
ck_assert_int_ne(s.dhcp_timer, NO_TIMER);
130+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), 61000U);
131+
}
132+
END_TEST
133+
134+
START_TEST(test_dhcp_schedule_lease_timer_defaults_t1_t2)
135+
{
136+
struct wolfIP s;
137+
138+
wolfIP_init(&s);
139+
s.last_tick = 1000U;
140+
141+
dhcp_schedule_lease_timer(&s, 120U, 0, 0);
142+
143+
ck_assert_int_ne(s.dhcp_timer, NO_TIMER);
144+
ck_assert_uint_eq(s.dhcp_renew_at, 61000U);
145+
ck_assert_uint_eq(s.dhcp_rebind_at, 106000U);
146+
ck_assert_uint_eq(s.dhcp_lease_expires, 121000U);
147+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.dhcp_renew_at);
109148
}
110149
END_TEST
111150

@@ -729,6 +768,80 @@ START_TEST(test_sock_connect_tcp_filter_drop)
729768
}
730769
END_TEST
731770

771+
START_TEST(test_dhcp_send_request_renewing_sets_ciaddr_and_rebind_deadline)
772+
{
773+
struct wolfIP s;
774+
struct tsocket *ts;
775+
struct ipconf *primary;
776+
struct pkt_desc *desc;
777+
struct wolfIP_udp_datagram *udp;
778+
struct dhcp_msg *req;
779+
780+
wolfIP_init(&s);
781+
mock_link_init(&s);
782+
primary = wolfIP_primary_ipconf(&s);
783+
ck_assert_ptr_nonnull(primary);
784+
primary->ip = 0x0A000064U;
785+
primary->mask = 0xFFFFFF00U;
786+
s.dhcp_server_ip = 0x0A000001U;
787+
s.dhcp_ip = primary->ip;
788+
s.dhcp_state = DHCP_RENEWING;
789+
s.dhcp_rebind_at = 1500U;
790+
s.last_tick = 1000U;
791+
792+
s.dhcp_udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
793+
ck_assert_int_gt(s.dhcp_udp_sd, 0);
794+
ts = &s.udpsockets[SOCKET_UNMARK(s.dhcp_udp_sd)];
795+
796+
ck_assert_int_eq(dhcp_send_request(&s), 0);
797+
ck_assert_uint_eq(ts->remote_ip, s.dhcp_server_ip);
798+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.dhcp_rebind_at);
799+
800+
desc = fifo_peek(&ts->sock.udp.txbuf);
801+
ck_assert_ptr_nonnull(desc);
802+
udp = (struct wolfIP_udp_datagram *)(ts->txmem + desc->pos + sizeof(*desc));
803+
req = (struct dhcp_msg *)udp->data;
804+
ck_assert_uint_eq(req->ciaddr, ee32(primary->ip));
805+
}
806+
END_TEST
807+
808+
START_TEST(test_dhcp_send_request_rebinding_broadcasts_to_lease_expiry)
809+
{
810+
struct wolfIP s;
811+
struct tsocket *ts;
812+
struct ipconf *primary;
813+
struct pkt_desc *desc;
814+
struct wolfIP_udp_datagram *udp;
815+
struct dhcp_msg *req;
816+
817+
wolfIP_init(&s);
818+
mock_link_init(&s);
819+
primary = wolfIP_primary_ipconf(&s);
820+
ck_assert_ptr_nonnull(primary);
821+
primary->ip = 0x0A000064U;
822+
primary->mask = 0xFFFFFF00U;
823+
s.dhcp_server_ip = 0x0A000001U;
824+
s.dhcp_ip = primary->ip;
825+
s.dhcp_state = DHCP_REBINDING;
826+
s.dhcp_lease_expires = 1300U;
827+
s.last_tick = 1000U;
828+
829+
s.dhcp_udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
830+
ck_assert_int_gt(s.dhcp_udp_sd, 0);
831+
ts = &s.udpsockets[SOCKET_UNMARK(s.dhcp_udp_sd)];
832+
833+
ck_assert_int_eq(dhcp_send_request(&s), 0);
834+
ck_assert_uint_eq(ts->remote_ip, 0xFFFFFFFFU);
835+
ck_assert_uint_eq(find_timer_expiry(&s, s.dhcp_timer), s.dhcp_lease_expires);
836+
837+
desc = fifo_peek(&ts->sock.udp.txbuf);
838+
ck_assert_ptr_nonnull(desc);
839+
udp = (struct wolfIP_udp_datagram *)(ts->txmem + desc->pos + sizeof(*desc));
840+
req = (struct dhcp_msg *)udp->data;
841+
ck_assert_uint_eq(req->ciaddr, ee32(primary->ip));
842+
}
843+
END_TEST
844+
732845
START_TEST(test_sock_connect_tcp_src_port_low)
733846
{
734847
struct wolfIP s;
@@ -2930,10 +3043,13 @@ END_TEST
29303043
START_TEST(test_dhcp_timer_cb_paths)
29313044
{
29323045
struct wolfIP s;
3046+
struct ipconf *primary;
29333047
int ret;
29343048

29353049
wolfIP_init(&s);
29363050
mock_link_init(&s);
3051+
primary = wolfIP_primary_ipconf(&s);
3052+
ck_assert_ptr_nonnull(primary);
29373053
s.dhcp_udp_sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
29383054
ck_assert_int_gt(s.dhcp_udp_sd, 0);
29393055
s.dhcp_xid = 1;
@@ -2955,6 +3071,18 @@ START_TEST(test_dhcp_timer_cb_paths)
29553071
ck_assert_int_eq(ret, 0);
29563072
dhcp_timer_cb(&s);
29573073
ck_assert_int_eq(s.dhcp_timeout_count, 1);
3074+
3075+
primary->ip = 0x0A000064U;
3076+
primary->mask = 0xFFFFFF00U;
3077+
s.dhcp_ip = primary->ip;
3078+
s.dhcp_server_ip = 0x0A000001U;
3079+
s.last_tick = 1000U;
3080+
s.dhcp_state = DHCP_BOUND;
3081+
last_frame_sent_size = 0;
3082+
dhcp_timer_cb(&s);
3083+
(void)wolfIP_poll(&s, s.last_tick);
3084+
ck_assert_uint_gt(last_frame_sent_size, 0U);
3085+
ck_assert_int_eq(s.dhcp_state, DHCP_RENEWING);
29583086
}
29593087
END_TEST
29603088

0 commit comments

Comments
 (0)