Skip to content

Commit 6f73884

Browse files
committed
net: lib: dhcpv4: Support INIT-REBOOT
Add the init-reboot state for DHCPv4 to request an already assigned IP address. Signed-off-by: Pieter De Gendt <[email protected]>
1 parent eff39fb commit 6f73884

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

include/zephyr/net/dhcpv4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ extern "C" {
3737
enum net_dhcpv4_state {
3838
NET_DHCPV4_DISABLED,
3939
NET_DHCPV4_INIT,
40+
NET_DHCPV4_INIT_REBOOT,
4041
NET_DHCPV4_SELECTING,
4142
NET_DHCPV4_REQUESTING,
4243
NET_DHCPV4_RENEWING,

include/zephyr/net/net_if.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ struct net_if_dhcpv4 {
503503
/** Timer start */
504504
int64_t timer_start;
505505

506-
/** Time for INIT, DISCOVER, REQUESTING, RENEWAL */
506+
/** Time for INIT, INIT-REBOOT, DISCOVER, REQUESTING, RENEWAL */
507507
uint32_t request_time;
508508

509509
uint32_t xid;

subsys/net/lib/dhcpv4/Kconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ config NET_DHCPV4_DNS_SERVER_VIA_INTERFACE
113113
server 198.51.100.53 when sending DNS query to the Ethernet
114114
interface.
115115

116+
config NET_DHCPV4_INIT_REBOOT
117+
bool "Support INIT-REBOOT"
118+
default y
119+
help
120+
Initialization with a known network address, if the DHCPv4 client has
121+
been assigned an address before, it begins in INIT-REBOOT state and
122+
sends a DHCPREQUEST message.
123+
116124
endif # NET_DHCPV4
117125

118126
config NET_DHCPV4_SERVER

subsys/net/lib/dhcpv4/dhcpv4.c

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
@@ -1420,6 +1425,7 @@ static inline void dhcpv4_handle_msg_offer(struct net_if *iface,
14201425
switch (iface->config.dhcpv4.state) {
14211426
case NET_DHCPV4_DISABLED:
14221427
case NET_DHCPV4_INIT:
1428+
case NET_DHCPV4_INIT_REBOOT:
14231429
case NET_DHCPV4_REQUESTING:
14241430
case NET_DHCPV4_RENEWING:
14251431
case NET_DHCPV4_REBINDING:
@@ -1442,6 +1448,7 @@ static void dhcpv4_handle_msg_ack(struct net_if *iface)
14421448
case NET_DHCPV4_BOUND:
14431449
case NET_DHCPV4_DECLINE:
14441450
break;
1451+
case NET_DHCPV4_INIT_REBOOT:
14451452
case NET_DHCPV4_REQUESTING:
14461453
NET_INFO("Received: %s",
14471454
net_sprint_ipv4_addr(&iface->config.dhcpv4.requested_ip));
@@ -1476,6 +1483,7 @@ static void dhcpv4_handle_msg_nak(struct net_if *iface)
14761483
switch (iface->config.dhcpv4.state) {
14771484
case NET_DHCPV4_DISABLED:
14781485
case NET_DHCPV4_INIT:
1486+
case NET_DHCPV4_INIT_REBOOT:
14791487
case NET_DHCPV4_SELECTING:
14801488
case NET_DHCPV4_REQUESTING:
14811489
if (memcmp(&iface->config.dhcpv4.request_server_addr,
@@ -1661,7 +1669,9 @@ static void dhcpv4_iface_event_handler(struct net_mgmt_event_callback *cb,
16611669

16621670
if (iface->config.dhcpv4.state == NET_DHCPV4_BOUND) {
16631671
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;
16651675
NET_DBG("enter state=%s", net_dhcpv4_state_name(
16661676
iface->config.dhcpv4.state));
16671677
/* Remove any bound address as interface is gone */
@@ -1749,6 +1759,7 @@ const char *net_dhcpv4_state_name(enum net_dhcpv4_state state)
17491759
static const char * const name[] = {
17501760
"disabled",
17511761
"init",
1762+
"init-reboot",
17521763
"selecting",
17531764
"requesting",
17541765
"renewing",
@@ -1792,7 +1803,12 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
17921803

17931804
switch (iface->config.dhcpv4.state) {
17941805
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+
}
17961812
NET_DBG("iface %p state=%s", iface,
17971813
net_dhcpv4_state_name(iface->config.dhcpv4.state));
17981814

@@ -1834,6 +1850,7 @@ static void dhcpv4_start_internal(struct net_if *iface, bool first_start)
18341850

18351851
break;
18361852
case NET_DHCPV4_INIT:
1853+
case NET_DHCPV4_INIT_REBOOT:
18371854
case NET_DHCPV4_SELECTING:
18381855
case NET_DHCPV4_REQUESTING:
18391856
case NET_DHCPV4_RENEWING:
@@ -1934,6 +1951,7 @@ void net_dhcpv4_stop(struct net_if *iface)
19341951

19351952
__fallthrough;
19361953
case NET_DHCPV4_INIT:
1954+
case NET_DHCPV4_INIT_REBOOT:
19371955
case NET_DHCPV4_SELECTING:
19381956
case NET_DHCPV4_REQUESTING:
19391957
case NET_DHCPV4_REBINDING:
@@ -2024,11 +2042,18 @@ bool net_dhcpv4_accept_unicast(struct net_pkt *pkt)
20242042
}
20252043

20262044
/* 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:
20312050
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;
20322057
}
20332058

20342059
net_pkt_cursor_backup(pkt, &backup);

0 commit comments

Comments
 (0)