]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
net: lwip: dhcp: Save DHCP siaddr field to tftpserverip env var
authorJonas Karlman <jonas@kwiboo.se>
Sat, 17 Jan 2026 00:24:41 +0000 (00:24 +0000)
committerJerome Forissier <jerome.forissier@arm.com>
Wed, 4 Feb 2026 08:04:36 +0000 (09:04 +0100)
The DHCP siaddr field contains the IP address of next server to use in
bootstrap. Typically this will be the IP address of a TFTP server or the
IP address of the DHCP server itself.

RFC 2131, 2. Protocol Summary, Page 10:

   DHCP clarifies the interpretation of the 'siaddr' field as the
   address of the server to use in the next step of the client's
   bootstrap process.  A DHCP server may return its own address in the
   'siaddr' field, if the server is prepared to supply the next
   bootstrap service (e.g., delivery of an operating system executable
   image).  A DHCP server always returns its own address in the 'server
   identifier' option.

Set the 'tftpserverip' env variable when the siaddr field contains an
IP address that is different compared to the DHCP server IP address.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Jerome Forissier <jerome.forissier@arm.com>
net/lwip/dhcp.c

index 4cd4184c42bb546770985e2d43291e87a2c2bd7a..acdf601d7eb50a68b8eb049f9bac37d57c253d78 100644 (file)
@@ -101,6 +101,9 @@ static int dhcp_loop(struct udevice *udev)
        env_set("serverip", ip4addr_ntoa(&dhcp->server_ip_addr));
        if (!ip4_addr_isany(&dhcp->offered_gw_addr))
                env_set(gwstr, ip4addr_ntoa(&dhcp->offered_gw_addr));
+       if (!ip4_addr_isany(&dhcp->offered_si_addr) &&
+           !ip4_addr_eq(&dhcp->offered_si_addr, &dhcp->server_ip_addr))
+               env_set("tftpserverip", ip4addr_ntoa(&dhcp->offered_si_addr));
 
 #ifdef CONFIG_PROT_DNS_LWIP
        env_set("dnsip", ip4addr_ntoa(dns_getserver(0)));