@@ -556,6 +556,10 @@ static uint32_t dhcpv4_send_request(struct net_if *iface)
556
556
net_dhcpv4_state_name (iface -> config .dhcpv4 .state ));
557
557
goto fail ;
558
558
break ;
559
+ case NET_DHCPV4_INIT_REBOOT :
560
+ with_requested_ip = true;
561
+ timeout = dhcpv4_update_message_timeout (& iface -> config .dhcpv4 );
562
+ break ;
559
563
case NET_DHCPV4_REQUESTING :
560
564
with_server_id = true;
561
565
with_requested_ip = true;
@@ -802,6 +806,7 @@ static uint32_t dhcpv4_manage_timers(struct net_if *iface, int64_t now)
802
806
case NET_DHCPV4_SELECTING :
803
807
/* Failed to get OFFER message, send DISCOVER again */
804
808
return dhcpv4_send_discover (iface );
809
+ case NET_DHCPV4_INIT_REBOOT :
805
810
case NET_DHCPV4_REQUESTING :
806
811
/* Maximum number of renewal attempts failed, so start
807
812
* from the beginning.
@@ -1420,6 +1425,7 @@ static inline void dhcpv4_handle_msg_offer(struct net_if *iface,
1420
1425
switch (iface -> config .dhcpv4 .state ) {
1421
1426
case NET_DHCPV4_DISABLED :
1422
1427
case NET_DHCPV4_INIT :
1428
+ case NET_DHCPV4_INIT_REBOOT :
1423
1429
case NET_DHCPV4_REQUESTING :
1424
1430
case NET_DHCPV4_RENEWING :
1425
1431
case NET_DHCPV4_REBINDING :
@@ -1442,6 +1448,7 @@ static void dhcpv4_handle_msg_ack(struct net_if *iface)
1442
1448
case NET_DHCPV4_BOUND :
1443
1449
case NET_DHCPV4_DECLINE :
1444
1450
break ;
1451
+ case NET_DHCPV4_INIT_REBOOT :
1445
1452
case NET_DHCPV4_REQUESTING :
1446
1453
NET_INFO ("Received: %s" ,
1447
1454
net_sprint_ipv4_addr (& iface -> config .dhcpv4 .requested_ip ));
@@ -1476,6 +1483,7 @@ static void dhcpv4_handle_msg_nak(struct net_if *iface)
1476
1483
switch (iface -> config .dhcpv4 .state ) {
1477
1484
case NET_DHCPV4_DISABLED :
1478
1485
case NET_DHCPV4_INIT :
1486
+ case NET_DHCPV4_INIT_REBOOT :
1479
1487
case NET_DHCPV4_SELECTING :
1480
1488
case NET_DHCPV4_REQUESTING :
1481
1489
if (memcmp (& iface -> config .dhcpv4 .request_server_addr ,
@@ -1661,7 +1669,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
1661
1669
1662
1670
if (iface -> config .dhcpv4 .state == NET_DHCPV4_BOUND ) {
1663
1671
iface -> config .dhcpv4 .attempts = 0U ;
1664
- iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1672
+ iface -> config .dhcpv4 .state = IS_ENABLED (CONFIG_NET_DHCPV4_INIT_REBOOT )
1673
+ ? NET_DHCPV4_INIT_REBOOT
1674
+ : NET_DHCPV4_INIT ;
1665
1675
NET_DBG ("enter state=%s" , net_dhcpv4_state_name (
1666
1676
iface -> config .dhcpv4 .state ));
1667
1677
/* Remove any bound address as interface is gone */
@@ -1749,6 +1759,7 @@ const char *net_dhcpv4_state_name(enum net_dhcpv4_state state)
1749
1759
static const char * const name [] = {
1750
1760
"disabled" ,
1751
1761
"init" ,
1762
+ "init-reboot" ,
1752
1763
"selecting" ,
1753
1764
"requesting" ,
1754
1765
"renewing" ,
@@ -1792,7 +1803,12 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
1792
1803
1793
1804
switch (iface -> config .dhcpv4 .state ) {
1794
1805
case NET_DHCPV4_DISABLED :
1795
- iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1806
+ if (IS_ENABLED (CONFIG_NET_DHCPV4_INIT_REBOOT ) &&
1807
+ iface -> config .dhcpv4 .requested_ip .s_addr != INADDR_ANY ) {
1808
+ iface -> config .dhcpv4 .state = NET_DHCPV4_INIT_REBOOT ;
1809
+ } else {
1810
+ iface -> config .dhcpv4 .state = NET_DHCPV4_INIT ;
1811
+ }
1796
1812
NET_DBG ("iface %p state=%s" , iface ,
1797
1813
net_dhcpv4_state_name (iface -> config .dhcpv4 .state ));
1798
1814
@@ -1834,6 +1850,7 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
1834
1850
1835
1851
break ;
1836
1852
case NET_DHCPV4_INIT :
1853
+ case NET_DHCPV4_INIT_REBOOT :
1837
1854
case NET_DHCPV4_SELECTING :
1838
1855
case NET_DHCPV4_REQUESTING :
1839
1856
case NET_DHCPV4_RENEWING :
@@ -1934,6 +1951,7 @@ void net_dhcpv4_stop(struct net_if *iface)
1934
1951
1935
1952
__fallthrough ;
1936
1953
case NET_DHCPV4_INIT :
1954
+ case NET_DHCPV4_INIT_REBOOT :
1937
1955
case NET_DHCPV4_SELECTING :
1938
1956
case NET_DHCPV4_REQUESTING :
1939
1957
case NET_DHCPV4_REBINDING :
@@ -2024,11 +2042,18 @@ bool net_dhcpv4_accept_unicast(struct net_pkt *pkt)
2024
2042
}
2025
2043
2026
2044
/* Only accept DHCPv4 packets during active query. */
2027
- if (iface -> config .dhcpv4 .state != NET_DHCPV4_SELECTING &&
2028
- iface -> config .dhcpv4 .state != NET_DHCPV4_REQUESTING &&
2029
- iface -> config .dhcpv4 .state != NET_DHCPV4_RENEWING &&
2030
- iface -> config .dhcpv4 .state != NET_DHCPV4_REBINDING ) {
2045
+ switch (iface -> config .dhcpv4 .state ) {
2046
+ case NET_DHCPV4_DISABLED :
2047
+ case NET_DHCPV4_INIT :
2048
+ case NET_DHCPV4_BOUND :
2049
+ case NET_DHCPV4_DECLINE :
2031
2050
return false;
2051
+ case NET_DHCPV4_INIT_REBOOT :
2052
+ case NET_DHCPV4_SELECTING :
2053
+ case NET_DHCPV4_REQUESTING :
2054
+ case NET_DHCPV4_RENEWING :
2055
+ case NET_DHCPV4_REBINDING :
2056
+ break ;
2032
2057
}
2033
2058
2034
2059
net_pkt_cursor_backup (pkt , & backup );
0 commit comments