Skip to content

Commit 0b8c00b

Browse files
pdgendtkartben
authored andcommitted
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 <pieter.degendt@basalte.be>
1 parent 99a2893 commit 0b8c00b

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.
@@ -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

Comments
 (0)