@@ -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.
@@ -1424,6 +1429,7 @@ static inline void dhcpv4_handle_msg_offer(struct net_if *iface,
1424
1429
switch (iface -> config .dhcpv4 .state ) {
1425
1430
case NET_DHCPV4_DISABLED :
1426
1431
case NET_DHCPV4_INIT :
1432
+ case NET_DHCPV4_INIT_REBOOT :
1427
1433
case NET_DHCPV4_REQUESTING :
1428
1434
case NET_DHCPV4_RENEWING :
1429
1435
case NET_DHCPV4_REBINDING :
@@ -1446,6 +1452,7 @@ static void dhcpv4_handle_msg_ack(struct net_if *iface)
1446
1452
case NET_DHCPV4_BOUND :
1447
1453
case NET_DHCPV4_DECLINE :
1448
1454
break ;
1455
+ case NET_DHCPV4_INIT_REBOOT :
1449
1456
case NET_DHCPV4_REQUESTING :
1450
1457
NET_INFO ("Received: %s" ,
1451
1458
net_sprint_ipv4_addr (& iface -> config .dhcpv4 .requested_ip ));
@@ -1480,6 +1487,7 @@ static void dhcpv4_handle_msg_nak(struct net_if *iface)
1480
1487
switch (iface -> config .dhcpv4 .state ) {
1481
1488
case NET_DHCPV4_DISABLED :
1482
1489
case NET_DHCPV4_INIT :
1490
+ case NET_DHCPV4_INIT_REBOOT :
1483
1491
case NET_DHCPV4_SELECTING :
1484
1492
case NET_DHCPV4_REQUESTING :
1485
1493
if (memcmp (& iface -> config .dhcpv4 .request_server_addr ,
@@ -1665,7 +1673,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
1665
1673
1666
1674
if (iface -> config .dhcpv4 .state == NET_DHCPV4_BOUND ) {
1667
1675
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 ;
1669
1679
NET_DBG ("enter state=%s" , net_dhcpv4_state_name (
1670
1680
iface -> config .dhcpv4 .state ));
1671
1681
/* Remove any bound address as interface is gone */
@@ -1753,6 +1763,7 @@ const char *net_dhcpv4_state_name(enum net_dhcpv4_state state)
1753
1763
static const char * const name [] = {
1754
1764
"disabled" ,
1755
1765
"init" ,
1766
+ "init-reboot" ,
1756
1767
"selecting" ,
1757
1768
"requesting" ,
1758
1769
"renewing" ,
@@ -1796,7 +1807,12 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
1796
1807
1797
1808
switch (iface -> config .dhcpv4 .state ) {
1798
1809
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
+ }
1800
1816
NET_DBG ("iface %p state=%s" , iface ,
1801
1817
net_dhcpv4_state_name (iface -> config .dhcpv4 .state ));
1802
1818
@@ -1838,6 +1854,7 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
1838
1854
1839
1855
break ;
1840
1856
case NET_DHCPV4_INIT :
1857
+ case NET_DHCPV4_INIT_REBOOT :
1841
1858
case NET_DHCPV4_SELECTING :
1842
1859
case NET_DHCPV4_REQUESTING :
1843
1860
case NET_DHCPV4_RENEWING :
@@ -1938,6 +1955,7 @@ void net_dhcpv4_stop(struct net_if *iface)
1938
1955
1939
1956
__fallthrough ;
1940
1957
case NET_DHCPV4_INIT :
1958
+ case NET_DHCPV4_INIT_REBOOT :
1941
1959
case NET_DHCPV4_SELECTING :
1942
1960
case NET_DHCPV4_REQUESTING :
1943
1961
case NET_DHCPV4_REBINDING :
@@ -2028,11 +2046,18 @@ bool net_dhcpv4_accept_unicast(struct net_pkt *pkt)
2028
2046
}
2029
2047
2030
2048
/* 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 :
2035
2054
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 ;
2036
2061
}
2037
2062
2038
2063
net_pkt_cursor_backup (pkt , & backup );
0 commit comments