[U-Boot] [RFC PATCH v2 7/7] env: Automatically mark dynamic configuration info as "do not export"

Bernhard Nortmann bernhard.nortmann at web.de
Tue Nov 22 23:30:11 CET 2016


Hi Simon!

Am 19.11.2016 um 14:47 schrieb Simon Glass:
> Hi Bernhard,
>
> On 16 November 2016 at 03:30, Bernhard Nortmann
> <bernhard.nortmann at web.de> wrote:
>> This is an attempt to prevent such information from ending up
>> in exported environment data, especially when doing "saveenv".
>> (http://lists.denx.de/pipermail/u-boot/2015-September/227611.html)
>>
>> The patch makes use of the new setenv_transient() helper for
>> environment variables that get updated via network configuration:
>> BOOTP/DHCP (netboot_update_env), CDP (cdp_update_env) and
>> link-local protocol (do_link_local).
>>
>> Signed-off-by: Bernhard Nortmann <bernhard.nortmann at web.de>
>> ---
>>
>> Changes in v2: None
>>
>>   cmd/net.c | 34 +++++++++++++++++-----------------
>>   1 file changed, 17 insertions(+), 17 deletions(-)
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> How would you make these variables non-transient? Does the transient
> nature show up in 'printenv'?
>
> Regards,
> Simon

I think it's best to consider a practical example. I'm firing up my 
sunxi-based
device with these patches applied on top of U-Boot v2016.11, and 
interrupt the
autoboot.

The standard way to examine variables that have non-default flags is the 
"env
flags" command. In my case this outputs (discarding the explanations 
near the
top):

Static flags:
         Variable Name        Variable Type        Variable Access
         -------------        -------------        ---------------
         eth\d?addr           MAC address          write-once
         ipaddr               IP address           any
         gatewayip            IP address           any
         netmask              IP address           any
         serverip             IP address           any
         nvlan                decimal              any
         vlan                 decimal              any
         dnsip                IP address           any
         serial#              string               write-once
         fel_booted           boolean              system
         fel_scriptaddr       hexadecimal          system

Active flags:
         Variable Name        Variable Type        Variable Access
         -------------        -------------        ---------------
         serial#              string               write-once
         ethaddr              MAC address          write-once
         fel_booted           boolean              system

As you can see, patch 5/7 has sneaked in two new "system" flags and 
since I've
booted using the FEL mechanism, the "fel_booted" one is in effect 
("active").

Okay, now I use the command "setenv autoload no; dhcp" to auto-configure
networking. Let's check "env flags" again. The "Static flags" section is
unchanged, but at the bottom there's now:

Active flags:
         Variable Name        Variable Type        Variable Access
         -------------        -------------        ---------------
         ipaddr               IP address           transient
         serial#              string               write-once
         hostname             string               transient
         ethaddr              MAC address          write-once
         netmask              IP address           transient
         serverip             IP address           transient
         fel_booted           boolean              system
         dnsip                IP address           transient
         gatewayip            IP address           transient

 >Does the transient nature show up in 'printenv'?

No, it doesn't. "printenv" will give output that looks as usual / perfectly
normal. You're also not restricted in modifying "transient" variables, for
example I can do "ipaddr 10.11.12.13" with no problems.

But: The differences will become apparent when trying to export the 
environment
with something like "saveenv" or "env export":
=> env export 0x40000000
## Don't export "ipaddr"
## Don't export "hostname"
## Don't export "netmask"
## Don't export "serverip"
## Don't export "fel_booted"
## Don't export "dnsip"
## Don't export "gatewayip"

U-Boot refuses to store the 'volatile' information for those variables that
have been flagged accordingly, and informs the user about it. This is 
checked
individually per variable, i.e. the other ones will get exported normally.

At this point I decide that I want to set up a *static* IP configuration and
make it persistent with "saveenv". Houston, we have a problem!

 >How would you make these variables non-transient?

Well, again there's a standard U-Boot mechanism for this. The README 
mentions
it in the description of CONFIG_ENV_FLAGS_LIST_STATIC: "To override a 
setting
in the static list, simply add an entry for the same variable name to the
'.flags' variable.".

So we could do "setenv .flags ipaddr:i,netmask:i,gatewayip.i" to reset the
variables to access level "any", meaning they'll get exported again.

Admittedly, there's a slight inconsistency here. Due to the fact that
setenv_transient() only sets a temporary flag, and U-Boot will rebuild the
access flags list (from the "static" default one) when assigning ".flags",
the "transient" flags for the networking variables will get cleared anyway -
even when deleting ".flags".

The alternative would be to mark these variables "transient" from the 
beginning
(in the static flags), but I considered that more awkward - when taking into
account that users might want to setup (and "saveenv") the network manually
right from the start, and are less likely to override the values 
retrieved via
auto-configuration (DHCP etc.).

Regards, B. Nortmann


More information about the U-Boot mailing list