@@ -5599,8 +5599,10 @@ static int dhcp_send_request(struct wolfIP *s)
55995599 struct dhcp_option * opt = (struct dhcp_option * )(req .options );
56005600 struct wolfIP_sockaddr_in sin ;
56015601 struct ipconf * primary = wolfIP_primary_ipconf (s );
5602+ uint64_t retry_at = s ? (s -> last_tick + 1U ) : 0 ;
56025603 int renewing = (s -> dhcp_state == DHCP_RENEWING );
56035604 int rebinding = (s -> dhcp_state == DHCP_REBINDING );
5605+ int ret ;
56045606 uint32_t opt_sz = 0 ;
56055607 /* Prepare DHCP request */
56065608 memset (& req , 0 , sizeof (struct dhcp_msg ));
@@ -5655,13 +5657,21 @@ static int dhcp_send_request(struct wolfIP *s)
56555657 else
56565658 sin .sin_addr .s_addr = ee32 (0xFFFFFFFF ); /* Broadcast */
56575659 sin .sin_family = AF_INET ;
5658- wolfIP_sock_sendto (s , s -> dhcp_udp_sd , & req , DHCP_HEADER_LEN + opt_sz , 0 ,
5660+ ret = wolfIP_sock_sendto (s , s -> dhcp_udp_sd , & req , DHCP_HEADER_LEN + opt_sz , 0 ,
56595661 (struct wolfIP_sockaddr * )& sin , sizeof (struct wolfIP_sockaddr_in ));
56605662 if (!renewing && !rebinding ) {
56615663 /* Reset local_ip so DHCP ACK matches via DHCP_IS_RUNNING path in
56625664 * udp_try_recv(). wolfIP_sock_sendto() sets local_ip from conf->ip
56635665 * (the offered IP), but we haven't confirmed the lease yet. */
56645666 s -> udpsockets [SOCKET_UNMARK (s -> dhcp_udp_sd )].local_ip = 0 ;
5667+ }
5668+ if (ret < 0 ) {
5669+ /* Retry on the next tick after local backpressure instead of
5670+ * waiting a full DHCP timeout for a request that never queued. */
5671+ dhcp_schedule_timer_at (s , retry_at );
5672+ return ret ;
5673+ }
5674+ if (!renewing && !rebinding ) {
56655675 dhcp_schedule_retry_timer (s , 0 );
56665676 } else if (renewing ) {
56675677 dhcp_schedule_retry_timer (s , s -> dhcp_rebind_at );
@@ -5685,8 +5695,9 @@ static int dhcp_send_discover(struct wolfIP *s)
56855695{
56865696 struct dhcp_msg disc ;
56875697 struct dhcp_option * opt = (struct dhcp_option * )(disc .options );
5688- struct wolfIP_timer tmr = { };
56895698 struct wolfIP_sockaddr_in sin ;
5699+ uint64_t retry_at = s ? (s -> last_tick + 1U ) : 0 ;
5700+ int ret ;
56905701 uint32_t opt_sz = 0 ;
56915702 /* Prepare DHCP discover */
56925703 memset (& disc , 0 , sizeof (struct dhcp_msg ));
@@ -5722,14 +5733,16 @@ static int dhcp_send_discover(struct wolfIP *s)
57225733 sin .sin_port = ee16 (DHCP_SERVER_PORT );
57235734 sin .sin_addr .s_addr = ee32 (0xFFFFFFFF ); /* Broadcast */
57245735 sin .sin_family = AF_INET ;
5725- wolfIP_sock_sendto (s , s -> dhcp_udp_sd , & disc , DHCP_HEADER_LEN + opt_sz , 0 ,
5736+ ret = wolfIP_sock_sendto (s , s -> dhcp_udp_sd , & disc , DHCP_HEADER_LEN + opt_sz , 0 ,
57265737 (struct wolfIP_sockaddr * )& sin , sizeof (struct wolfIP_sockaddr_in ));
5727- tmr .expires = s -> last_tick + DHCP_DISCOVER_TIMEOUT + (wolfIP_getrandom () % 200 );
5728- tmr .arg = s ;
5729- tmr .cb = dhcp_timer_cb ;
5738+ if (ret < 0 ) {
5739+ /* Retry on the next tick after local backpressure instead of
5740+ * waiting a full discover timeout for a packet that never queued. */
5741+ dhcp_schedule_timer_at (s , retry_at );
5742+ return ret ;
5743+ }
5744+ dhcp_schedule_timer_at (s , s -> last_tick + DHCP_DISCOVER_TIMEOUT + (wolfIP_getrandom () % 200U ));
57305745 s -> dhcp_state = DHCP_DISCOVER_SENT ;
5731-
5732- s -> dhcp_timer = timers_binheap_insert (& s -> timers , tmr );
57335746 return 0 ;
57345747}
57355748
0 commit comments