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+
112START_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}
110149END_TEST
111150
@@ -729,6 +768,80 @@ START_TEST(test_sock_connect_tcp_filter_drop)
729768}
730769END_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+
732845START_TEST (test_sock_connect_tcp_src_port_low )
733846{
734847 struct wolfIP s ;
@@ -2930,10 +3043,13 @@ END_TEST
29303043START_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}
29593087END_TEST
29603088
0 commit comments