Hi Quentin,

On 1/15/2026 3:20 PM, Quentin Schulz wrote:
> Hi Jonas,
> 
> On 1/14/26 7:29 PM, Jonas Karlman wrote:
>> Hi Quentin,
>>
>> On 1/14/2026 6:08 PM, Quentin Schulz wrote:
>>> Hi Jonas,
>>>
>>> On 1/14/26 4:37 PM, Jonas Karlman wrote:
>>>> Hi Quentin,
>>>>
>>>> On 1/14/2026 4:01 PM, Quentin Schulz wrote:
>>>>> Hi Jonas,
>>>>>
>>>>> On 1/6/26 9:34 PM, Jonas Karlman wrote:
>>>>>> With the legacy networking stack, it is possible to use USE_SERVERIP,
>>>>>> SERVERIP and BOOTP_PREFER_SERVERIP Kconfg options to force use of a
>>>>>> specific TFTP server ip.
>>>>>>
>>>>>> Using the lwIP networking stack use of the 'tftpserverip' environment
>>>>>> variable provide the closest equivalent functionality.
>>>>>>
>>>>>
>>>>> It does read serverip environment variable if it's set, so this should
>>>>> match the behavior with the legacy network stack no?
>>>>
>>>> This is what I first thought, however it seem that the lwip stack differ
>>>> slightly from the legacy stack, in that the dhcp lookup always seem to
>>>> reset the serverip env var.
>>>>
>>>>> As for BOOTP_PREFER_SERVERIP, this would need to be implemented in lwip
>>>>> and isn't covered by this new variable is it?
>>>>
>>>> For the lwip stack it looks like the BOOTP_PREFER_SERVERIP Kconfig
>>>> option possible was replaced with use of a 'tftpserverip' env var.
>>>>
>>>> For legacy stack I had something like following in a .config fragment:
>>>>
>>>>     CONFIG_BOOTP_PREFER_SERVERIP=y
>>>>     CONFIG_SERVERIP="192.168.2.50"
>>>>     CONFIG_USE_SERVERIP=y
>>>>
>>>
>>> And this meant the serverip would not be overwritten by the dhcp command
>>> for example (in the legacy stack)? When doing PXE/TFTP, I always do
>>>
>>> setenv autoload no; dhcp; setenv serverip X.Y.Z.A; pxe get; pxe boot
>>
>> I tried to keep it as simple as possible, as I have not used network
>> boot before, and used something like following:
>>
>>    env set boot_targets pxe; bootflow scan -lbG
>>
>> and when I need to use a USB Ethernet dongle I use something like:
>>
>>    env delete -f ethaddr; env set boot_targets usb pxe; bootflow scan -lbG
>>
>>> When I control the DHCP server, I can actually set the TFTP server
>>> directly and can skip setting the serverip as it'll be set by the dhcp
>>> command correctly it seems?
>>
>> For my homelab I use UniFi and should be able to control DHCP options,
>> however looking at U-Boot it looks like option 66 or 150 is just ignored,
>> see [1].
>>
>>    case 66:  /* Ignore TFTP server name */
>>
>> [1] 
>> https://source.denx.de/u-boot/u-boot/-/blob/master/net/bootp.c?ref_type=heads#L952
>>
>>  From my very limited testing it looks like I am forced to set serverip
>> in env and cannot use a DHCP option to set the TFTP server to use.
>>
> 
> Still on my RK3588 Tiger (on a different network, legacy stack):
> 
> => env set boot_targets pxe; bootflow scan -lbG
> Scanning for bootflows in all bootdevs
> Seq  Method       State   Uclass    Part  Name                      Filename
> ---  -----------  ------  --------  ----  ------------------------ 
> ----------------
> pcie_dw_rockchip pcie@fe150000: PCIe-0 Link Fail
> Scanning bootdev '[email protected]':
> ethernet@fe1b0000 Waiting for PHY auto negotiation to complete...... done
> BOOTP broadcast 1
> DHCP client bound to address 192.168.1.144 (5 ms)
> missing environment variable: pxeuuid
> Retrieving file: pxelinux.cfg/01-aa-38-40-51-be-af
> Using ethernet@fe1b0000 device
> TFTP from server 192.168.1.211; our IP address is 192.168.1.144
> 
> My DHCP server is on OpenWRT at 192.168.1.1, and my TFTP server is on 
> 192.168.1.211, with the setup steps explained in my first answer. If I 
> don't boot (remove -b), then I can see serverip is set to 192.168.1.211.
> 
> So *something* is working here.

I took a closer look at how the UniFi dnsmasq config was generated and
noticed that I must configure the "Network Boot" option and not the
"TFTP Server" option to have a generated config that make dnsmasq
replace the DHCP siaddr field with the TFTP server ip :-S

And legacy stack seem to work as expected and correctly uses the
expected siaddr field to configure the internal net_server_ip var.

Following diff seem to make lwIP also pick up the siaddr as the
tftpserverip (in addition to serverip for the DHCP server):

diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
index 731b57de3ba4..a3445a48b15d 100644
--- a/net/lwip/dhcp.c
+++ b/net/lwip/dhcp.c
@@ -99,8 +99,11 @@ static int dhcp_loop(struct udevice *udev)
        env_set(ipstr, ip4addr_ntoa(&dhcp->offered_ip_addr));
        env_set(maskstr, ip4addr_ntoa(&dhcp->offered_sn_mask));
        env_set("serverip", ip4addr_ntoa(&dhcp->server_ip_addr));
-       if (dhcp->offered_gw_addr.addr != 0)
+       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)));

With something like that I do not think I will have any further use of
SERVERIP or TFTPSERVERIP Kconfig options for my labgrid farm, so can
probably drop this series and will instead send above diff as a separate
patch.

>> And when I then also tried lwIP, and that seem to result in new or
>> different issues, e.g.:
>>
>> - lwIP seem to be configured to allow very few packet fragments, trying
>>    to use a reasonoble tftp blocksize, e.g. TFTP_BLOCKSIZE=4096 or more
>>    seem to cause drop of packets.
>>
>> - lwIP is very very slow to timeout compared to legacy when serverip
>>    point to an invalid TFTP server and pxelinux.cfg files is looked up.
>>
>> - sometimes got hit with random SError issues when second file was
>>    loaded from TFTP, this issue was thankfully fixed with [2].
>>    
> 
> Rough first experience with lwIP :)

Hehe, and all while trying to figure out why dwc_eth_qos was not working
on my Rockchip RK3506 board (firewall blocked DMA to DRAM) and my
AX88179A/AX88772D USB Ethernet adapters also had driver issues :-D

At least this experience has helped generate a few forthcoming cleanup
patches for dwc_eth_qos and asix88179 drivers.

> Are you planning on new Rockchip board/SoC support to use lwIP?

Not sure, but at some point we probably should fully switch to use lwIP
for the Rockchip platform. The LWIP_DEBUG and LWIP_DEBUG_RXTX Kconfig
options can help a lot when debugging any issue with Ethernet drivers.

Regards,
Jonas

>> [2] 
>> https://patchwork.ozlabs.org/project/uboot/patch/[email protected]/
>>
>>>
>>>   From my notes, for an OpenWRT DHCP server:
>>>
>>> Network → DHCP and DNS → PXE/TFTP tab → Add button
>>>       Filename: default
>>>
>>>       Server name: fileserver
>>>
>>>       Server address: <TFTP server IP address>
>>>
>>>       Force: checked (may not be necessary)
>>>
>>> Save & Apply button
>>>
>>> I'm assuming you need this for your labgrid farm so hopefully you have a
>>> way to control the DHCP server :)
>>
>> Correct, I have been playing around with network boot in my labgrid farm
>> and hit a few mines along the way :-)
>>
>> Should result in a few network related patches in next few days.
>>
>>>
>>>> Adding NET_LWIP=y made pxe booting stop working and 'serverip' always
>>>> ended up as the dhpc server regardless if it was set to something else.
>>>>
>>>
>>> Interesting. With tiger-rk3588_defconfig (legacy stack), I get:
>>>
>>> => setenv serverip 192.192.192.192
>>> => setenv autoload no
>>> => dhcp
>>> ethernet@fe1b0000 Waiting for PHY auto negotiation to complete........ done
>>> BOOTP broadcast 1
>>> BOOTP broadcast 2
>>> BOOTP broadcast 3
>>> DHCP client bound to address 10.2.162.193 (1394 ms)
>>> => printenv serverip
>>> serverip=10.2.0.122
>>>
>>>> Since lwip instead prioritize the 'tftpserverip' env over the 'serverip'
>>>> env for tftp use, adding a similar env var Kconfig option was easy but
>>>> may be wrong path?
>>>>
>>>
>>> I don't mind the addition but I'm wondering if it's not a band-aid patch
>>> for something else? Maybe lwip missing setting the BOOTP server from a
>>> DHCP lease for example?
>>
>> Possible, setting tftp from dhcp also seem to be missing from legacy
>> stack, if I am not mistaken. I do think the separation of tftpserverip
>> and serverip for lwIP stack at least is a step in right direction, I am
>> new to network booting from U-Boot so what do I know :-)
>>
> 
> I'm not sure the point of lwip is to keep all the quirks from the legacy 
> stack, but it doesn't hurt to bring this up :)
> 
> Cheers,
> Quentin

Reply via email to