[U-Boot] [PATCH 1/2] net: Add option to prefer bootp/dhcp serverip

Joe Hershberger joe.hershberger at ni.com
Tue Jun 12 19:59:28 UTC 2018


On Wed, Jun 6, 2018 at 8:54 PM, Rick Chen <rickchen36 at gmail.com> wrote:
>> From: Alexander Graf [mailto:agraf at suse.de]
>> Sent: Wednesday, June 06, 2018 8:32 PM
>> To: u-boot at lists.denx.de
>> Cc: Rick Jian-Zhi Chen(陳建志); Joe Hershberger; Simon Glass
>> Subject: [PATCH 1/2] net: Add option to prefer bootp/dhcp serverip
>>
>> Currently we can choose between 2 different types of behavior for the serverip
>> variable:
>>
>>   1) Always overwrite it with the DHCP server IP address (default)
>>   2) Ignore what the DHCP server says (CONFIG_BOOTP_SERVERIP)
>>
>> This patch adds a 3rd option:
>>
>>   3) Use serverip from DHCP if no serverip is given
>>      (CONFIG_BOOTP_PREFER_SERVERIP)
>>
>> With this new option, we can have the default case that a boot file gets loaded
>> from the DHCP provided TFTP server work while allowing users to specify their
>> own serverip variable to explicitly use a different tftp server.
>>
>> Signed-off-by: Alexander Graf <agraf at suse.de>
>> ---
>>  README      | 5 +++++
>>  cmd/Kconfig | 9 +++++++++
>>  net/bootp.c | 7 ++++++-
>>  3 files changed, 20 insertions(+), 1 deletion(-)
>>
>> diff --git a/README b/README
>> index fb331f910d..d8a99281ca 100644
>> --- a/README
>> +++ b/README
>> @@ -1511,10 +1511,15 @@ The following options need to be configured:
>>               CONFIG_BOOTP_TIMEOFFSET
>>               CONFIG_BOOTP_VENDOREX
>>               CONFIG_BOOTP_MAY_FAIL
>> +             CONFIG_BOOTP_PREFER_SERVERIP
>>
>>               CONFIG_BOOTP_SERVERIP - TFTP server will be the serverip
>>               environment variable, not the BOOTP server.
>>
>> +             CONFIG_BOOTP_PREFER_SERVERIP - TFTP server will be the
>> +             serverip environment variable if previously unset, otherwise
>> +             the DHCP provided serverip is used.
>> +
>>               CONFIG_BOOTP_MAY_FAIL - If the DHCP server is not found
>>               after the configured retry count, the call will fail
>>               instead of starting over.  This can be used to fail over diff --git
>> a/cmd/Kconfig b/cmd/Kconfig index e283cb9a8a..e77a4131b3 100644
>> --- a/cmd/Kconfig
>> +++ b/cmd/Kconfig
>> @@ -1121,6 +1121,15 @@ config BOOTP_HOSTNAME
>>       help
>>         The name may or may not be qualified with the local domain name.
>>
>> +config BOOTP_PREFER_SERVERIP
>> +     bool "Leave serverip variable in place if existing"
>> +     default n
>> +     depends on CMD_BOOTP
>> +     help
>> +       By default a BOOTP/DHCP reply will overwrite the tftp target ip
>> +       address. With this option enabled, it will leave it alone if
>> +       already specified, but populate it if no serverip is specified.
>> +
>>  config BOOTP_SUBNETMASK
>>       bool "Request & store 'netmask' from BOOTP/DHCP server"
>>       default y
>> diff --git a/net/bootp.c b/net/bootp.c
>> index 9d7cb5d30c..91de4cd426 100644
>> --- a/net/bootp.c
>> +++ b/net/bootp.c
>> @@ -147,9 +147,14 @@ static void store_net_params(struct bootp_hdr *bp)
>> {  #if !defined(CONFIG_BOOTP_SERVERIP)
>>       struct in_addr tmp_ip;
>> +     bool overwrite_serverip = true;
>> +
>> +#if defined(CONFIG_BOOTP_PREFER_SERVERIP)
>> +     overwrite_serverip = false;
>> +#endif
>>
>>       net_copy_ip(&tmp_ip, &bp->bp_siaddr);
>> -     if (tmp_ip.s_addr != 0)
>> +     if (tmp_ip.s_addr != 0 && (overwrite_serverip ||
>> +!net_server_ip.s_addr))
>>               net_copy_ip(&net_server_ip, &bp->bp_siaddr);
>>       memcpy(net_server_ethaddr,
>>              ((struct ethernet_hdr *)net_rx_packet)->et_src, 6);
>> --
>> 2.12.3
>
> Hi Alex
>
> I have apply those two patchs and verify
> U-Boot-1-2-net-Add-option-to-prefer-bootp-dhcp-serverip.patch
> U-Boot-2-2-ax25-Switch-to-CONFIG_BOOTP_PREFER_SERVERIP.patch
>
> But it still fail in dhcp command as below
>
> case 1
> serverip is null
>
> RISC-V # set serverip
> RISC-V # env print
> baudrate=38400
> bootcmd=fatload mmc 0:1 0x20000000 ae350_64.dtb;fatload mmc 0:1 0x0
> bbl-ae350.bin;go 0x0
> bootdelay=3
> bootfile=pxelinux.0
> ethact=mac at e0100000
> fdtcontroladdr=3fedf290
> fileaddr=600000
> filesize=1bb7d34
> stderr=serial at f0300000
> stdin=serial at f0300000
> stdout=serial at f0300000
>
> Environment size: 304/8188 bytes
> RISC-V # dhcp 0x600000 10.0.4.97:boomimage-310y-ag101p.bin

You are explicitly setting the server IP in the DHCP command line, so
why would you expect the DHCP server IP to be used?

> BOOTP broadcast 1
> BOOTP broadcast 2
> BOOTP broadcast 3
> BOOTP broadcast 4
> DHCP client bound to address 10.0.4.191 (4603 ms)
> Using mac at e0100000 device
> TFTP from server 255.255.255.255; our IP address is 10.0.4.191;

This broadcast address is clearly not right. It should have been what
you had in the dhcp command. That should be assigned in net/tftp.c:
757...

>>                         tftp_remote_ip = string_to_ip(net_boot_file_name);

So something must be wrong with that somehow.

> sending through gateway 10.0.4.254
> Filename 'pxelinux.0'.

Why is this filename still set? That's from the environment and is set
by a env callback handler. That should happen before netboot_common()
which should be overwriting net_boot_file_name with the command line
filename.

> Load address: 0x600000
> Loading: *
> TFTP error: 'File not found' (1)
> Not retrying...
>
> TFTP error: 'File not found' (1)
> Not retrying...

Could you print out the env again? Did the server IP get set?

Also, you not finding a file assumes your TFTP server has a pxelinux.0
file on it... I don't think we have any reason from what you've
presented that it's the case. Especially since that's not the file you
specified on the command line.

>
> case 2
> serverip has value
>
> RISC-V # setenv serverip 10.0.4.97 ;
>
> RISC-V # dhcp 0x600000 boomimage-310y-ag101p.bin
> BOOTP broadcast 1
> BOOTP broadcast 2
> BOOTP broadcast 3
> BOOTP broadcast 4
> DHCP client bound to address 10.0.4.191 (4592 ms)
> Using mac at e0100000 device
> TFTP from server 10.0.4.97; our IP address is 10.0.4.191

You are getting the correct IP used as the server, so it seems that
this patch is working (though I don't know that your DHCP server isn't
the same as the hard-coded address).

> Filename 'pxelinux.0'.
> Load address: 0x600000
> Loading: *
> TFTP error: 'File not found' (1)
> Not retrying...
>
> TFTP error: 'File not found' (1)
> Not retrying...
> RISC-V #

What version of U-Boot are you using? This behavior doesn't match what
I'm seeing in the code.

-Joe


More information about the U-Boot mailing list