@@ -556,6 +556,10 @@ static uint32_t dhcpv4_send_request(struct net_if *iface)
556556 net_dhcpv4_state_name (iface -> config .dhcpv4 .state ));
557557 goto fail ;
558558 break ;
559+ case NET_DHCPV4_INIT_REBOOT :
560+ with_requested_ip = true;
561+ timeout = dhcpv4_update_message_timeout (& iface -> config .dhcpv4 );
562+ break ;
559563 case NET_DHCPV4_REQUESTING :
560564 with_server_id = true;
561565 with_requested_ip = true;
@@ -802,6 +806,7 @@ static uint32_t dhcpv4_manage_timers(struct net_if *iface, int64_t now)
802806 case NET_DHCPV4_SELECTING :
803807 /* Failed to get OFFER message, send DISCOVER again */
804808 return dhcpv4_send_discover (iface );
809+ case NET_DHCPV4_INIT_REBOOT :
805810 case NET_DHCPV4_REQUESTING :
806811 /* Maximum number of renewal attempts failed, so start
807812 * from the beginning.
@@ -1424,6 +1429,7 @@ static inline void dhcpv4_handle_msg_offer(struct net_if *iface,
14241429 switch (iface -> config .dhcpv4 .state ) {
14251430 case NET_DHCPV4_DISABLED :
14261431 case NET_DHCPV4_INIT :
1432+ case NET_DHCPV4_INIT_REBOOT :
14271433 case NET_DHCPV4_REQUESTING :
14281434 case NET_DHCPV4_RENEWING :
14291435 case NET_DHCPV4_REBINDING :
@@ -1446,6 +1452,7 @@ static void dhcpv4_handle_msg_ack(struct net_if *iface)
14461452 case NET_DHCPV4_BOUND :
14471453 case NET_DHCPV4_DECLINE :
14481454 break ;
1455+ case NET_DHCPV4_INIT_REBOOT :
14491456 case NET_DHCPV4_REQUESTING :
14501457 NET_INFO ("Received: %s" ,
14511458 net_sprint_ipv4_addr (& iface -> config .dhcpv4 .requested_ip ));
@@ -1480,6 +1487,7 @@ static void dhcpv4_handle_msg_nak(struct net_if *iface)
14801487 switch (iface -> config .dhcpv4 .state ) {
14811488 case NET_DHCPV4_DISABLED :
14821489 case NET_DHCPV4_INIT :
1490+ case NET_DHCPV4_INIT_REBOOT :
14831491 case NET_DHCPV4_SELECTING :
14841492 case NET_DHCPV4_REQUESTING :
14851493 if (memcmp (& iface -> config .dhcpv4 .request_server_addr ,
@@ -1665,7 +1673,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
16651673
16661674 if (iface -> config .dhcpv4 .state == NET_DHCPV4_BOUND ) {
16671675 iface -> config .dhcpv4 .attempts = 0U ;
1668- iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1676+ iface -> config .dhcpv4 .state = IS_ENABLED (CONFIG_NET_DHCPV4_INIT_REBOOT )
1677+ ? NET_DHCPV4_INIT_REBOOT
1678+ : NET_DHCPV4_INIT ;
16691679 NET_DBG ("enter state=%s" , net_dhcpv4_state_name (
16701680 iface -> config .dhcpv4 .state ));
16711681 /* Remove any bound address as interface is gone */
@@ -1753,6 +1763,7 @@ const char *net_dhcpv4_state_name(enum net_dhcpv4_state state)
17531763 static const char * const name [] = {
17541764 "disabled" ,
17551765 "init" ,
1766+ "init-reboot" ,
17561767 "selecting" ,
17571768 "requesting" ,
17581769 "renewing" ,
@@ -1796,7 +1807,12 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
17961807
17971808 switch (iface -> config .dhcpv4 .state ) {
17981809 case NET_DHCPV4_DISABLED :
1799- iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1810+ if (IS_ENABLED (CONFIG_NET_DHCPV4_INIT_REBOOT ) &&
1811+ iface -> config .dhcpv4 .requested_ip .s_addr != INADDR_ANY ) {
1812+ iface -> config .dhcpv4 .state = NET_DHCPV4_INIT_REBOOT ;
1813+ } else {
1814+ iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1815+ }
18001816 NET_DBG ("iface %p state=%s" , iface ,
18011817 net_dhcpv4_state_name (iface -> config .dhcpv4 .state ));
18021818
@@ -1838,6 +1854,7 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
18381854
18391855 break ;
18401856 case NET_DHCPV4_INIT :
1857+ case NET_DHCPV4_INIT_REBOOT :
18411858 case NET_DHCPV4_SELECTING :
18421859 case NET_DHCPV4_REQUESTING :
18431860 case NET_DHCPV4_RENEWING :
@@ -1938,6 +1955,7 @@ void net_dhcpv4_stop(struct net_if *iface)
19381955
19391956 __fallthrough ;
19401957 case NET_DHCPV4_INIT :
1958+ case NET_DHCPV4_INIT_REBOOT :
19411959 case NET_DHCPV4_SELECTING :
19421960 case NET_DHCPV4_REQUESTING :
19431961 case NET_DHCPV4_REBINDING :
@@ -2028,11 +2046,18 @@ bool net_dhcpv4_accept_unicast(struct net_pkt *pkt)
20282046 }
20292047
20302048 /* Only accept DHCPv4 packets during active query. */
2031- if (iface -> config .dhcpv4 .state != NET_DHCPV4_SELECTING &&
2032- iface -> config .dhcpv4 .state != NET_DHCPV4_REQUESTING &&
2033- iface -> config .dhcpv4 .state != NET_DHCPV4_RENEWING &&
2034- iface -> config .dhcpv4 .state != NET_DHCPV4_REBINDING ) {
2049+ switch (iface -> config .dhcpv4 .state ) {
2050+ case NET_DHCPV4_DISABLED :
2051+ case NET_DHCPV4_INIT :
2052+ case NET_DHCPV4_BOUND :
2053+ case NET_DHCPV4_DECLINE :
20352054 return false;
2055+ case NET_DHCPV4_INIT_REBOOT :
2056+ case NET_DHCPV4_SELECTING :
2057+ case NET_DHCPV4_REQUESTING :
2058+ case NET_DHCPV4_RENEWING :
2059+ case NET_DHCPV4_REBINDING :
2060+ break ;
20362061 }
20372062
20382063 net_pkt_cursor_backup (pkt , & backup );
0 commit comments