diff mbox series

[10/10] board: sl28: disable random MAC address generation

Message ID 20211115224551.3549744-11-michael@walle.cc
State Handled Elsewhere
Delegated to: Priyanka Jain
Headers show
Series board: sl28: add sl28cpld support and board cleanups | expand

Commit Message

Michael Walle Nov. 15, 2021, 10:45 p.m. UTC
Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
enetaddr to a random value if not set and then pass the randomly
generated MAC address to linux.

This is bad for the following reasons:
 (1) it makes it impossible for linux to detect this error
 (2) linux won't trigger any fallback mechanism for the case where
     it didn't find any valid MAC address
 (3) a saveenv will store this randomly generated MAC address in the
     environment

Probably, the user will also be unaware that something is wrong. He will
just get different MAC addresses on each reboot, asking himself why this
is the case.

As this board usually have a serial port, the user can just fix this by
setting the MAC address manually in the environment. Also disable the
netconsole just in case, because it cannot be guaranteed that it will
work in any case. After all, this was just a convenience option, because
the bootloader - right now - doesn't have the ability to read the MAC
address, which is stored in the OTP. But it is far more important to
have a clear view of whats wrong with a board and that means we can no
longer use this Kconfig option.

Signed-off-by: Michael Walle <michael@walle.cc>
---
 configs/kontron_sl28_defconfig | 2 --
 1 file changed, 2 deletions(-)

Comments

Tom Rini Nov. 16, 2021, 9:14 p.m. UTC | #1
On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:

> Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
> enetaddr to a random value if not set and then pass the randomly
> generated MAC address to linux.

First, for clarity I'm not nak'ing this.  I kind of would like to see a
slight reword as I think some things aren't 100% correct, even if the
"save random MAC to ethaddr environment variable" change goes in.  For
example, it's quite long standing that (dev|pdata)->enetaddr populates
"mac-address" and "local-mac-address" and it seems in some older cases
we only set the "local-mac-address" property.

> This is bad for the following reasons:
>  (1) it makes it impossible for linux to detect this error
>  (2) linux won't trigger any fallback mechanism for the case where
>      it didn't find any valid MAC address

This feels in some ways to be a limitation of the binding:
https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ethernet-controller.yaml

And it reads like we really must be populating "mac-address" with that
random one and while providing a blank "local-mac-address" would be a
way to say we don't know the true device one, it seems that wouldn't be
used / noticed?

>  (3) a saveenv will store this randomly generated MAC address in the
>      environment
> 
> Probably, the user will also be unaware that something is wrong. He will
> just get different MAC addresses on each reboot, asking himself why this
> is the case.
> 
> As this board usually have a serial port, the user can just fix this by
> setting the MAC address manually in the environment. Also disable the
> netconsole just in case, because it cannot be guaranteed that it will
> work in any case. After all, this was just a convenience option, because
> the bootloader - right now - doesn't have the ability to read the MAC
> address, which is stored in the OTP. But it is far more important to
> have a clear view of whats wrong with a board and that means we can no
> longer use this Kconfig option.
> 
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
>  configs/kontron_sl28_defconfig | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/configs/kontron_sl28_defconfig b/configs/kontron_sl28_defconfig
> index af907175f1..7fb6bdbe82 100644
> --- a/configs/kontron_sl28_defconfig
> +++ b/configs/kontron_sl28_defconfig
> @@ -59,8 +59,6 @@ CONFIG_OF_LIST=""
>  CONFIG_ENV_OVERWRITE=y
>  CONFIG_ENV_IS_IN_SPI_FLASH=y
>  CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
> -CONFIG_NET_RANDOM_ETHADDR=y
> -CONFIG_NETCONSOLE=y
>  CONFIG_SPL_DM_SEQ_ALIAS=y
>  CONFIG_SCSI_AHCI=y
>  CONFIG_SATA_CEVA=y

Now, an alternate solution here would be to enable these two options
still and write an ft_board_setup() with:
... if ethaddr is in the locally administered pool then
        fdt_delprop(... "mac-address");
        fdt_delprop(... "local-mac-address");

And that should cause the kernel to fall through the cases to find out
where to get the real MAC from.  I'm not super happy with this at first,
but I also don't see anything clever in the binding we can do.
Michael Walle Nov. 17, 2021, 4:45 p.m. UTC | #2
Am 2021-11-16 22:14, schrieb Tom Rini:
> On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:
> 
>> Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
>> enetaddr to a random value if not set and then pass the randomly
>> generated MAC address to linux.
> 
> First, for clarity I'm not nak'ing this.  I kind of would like to see a
> slight reword as I think some things aren't 100% correct, even if the
> "save random MAC to ethaddr environment variable" change goes in.  For
> example, it's quite long standing that (dev|pdata)->enetaddr populates
> "mac-address" and "local-mac-address" and it seems in some older cases
> we only set the "local-mac-address" property.

fdt_fixup_memory() in common/fdt_support.c does a env_get(mac).

I'm not even sure, if there is a connection between what is fixed up
in the kernel DT and the corresponding device in u-boot if
CONFIG_DM_SEQ_ALIAS is not set.

>> This is bad for the following reasons:
>>  (1) it makes it impossible for linux to detect this error
>>  (2) linux won't trigger any fallback mechanism for the case where
>>      it didn't find any valid MAC address
> 
> This feels in some ways to be a limitation of the binding:
> https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ethernet-controller.yaml

Agreed. But it doesn't render my argument invalid ;)

> And it reads like we really must be populating "mac-address" with that
> random one and while providing a blank "local-mac-address" would be a
> way to say we don't know the true device one, it seems that wouldn't be
> used / noticed?

I guess it will just use the one populated in mac-address, i.e. the
random one. Btw, the binding says "last used" what if u-boot never
actually used that ethernet controller, should it then be empty or
populated with the random mac address.

>>  (3) a saveenv will store this randomly generated MAC address in the
>>      environment
>> 
>> Probably, the user will also be unaware that something is wrong. He 
>> will
>> just get different MAC addresses on each reboot, asking himself why 
>> this
>> is the case.
>> 
>> As this board usually have a serial port, the user can just fix this 
>> by
>> setting the MAC address manually in the environment. Also disable the
>> netconsole just in case, because it cannot be guaranteed that it will
>> work in any case. After all, this was just a convenience option, 
>> because
>> the bootloader - right now - doesn't have the ability to read the MAC
>> address, which is stored in the OTP. But it is far more important to
>> have a clear view of whats wrong with a board and that means we can no
>> longer use this Kconfig option.
>> 
>> Signed-off-by: Michael Walle <michael@walle.cc>
>> ---
>>  configs/kontron_sl28_defconfig | 2 --
>>  1 file changed, 2 deletions(-)
>> 
>> diff --git a/configs/kontron_sl28_defconfig 
>> b/configs/kontron_sl28_defconfig
>> index af907175f1..7fb6bdbe82 100644
>> --- a/configs/kontron_sl28_defconfig
>> +++ b/configs/kontron_sl28_defconfig
>> @@ -59,8 +59,6 @@ CONFIG_OF_LIST=""
>>  CONFIG_ENV_OVERWRITE=y
>>  CONFIG_ENV_IS_IN_SPI_FLASH=y
>>  CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
>> -CONFIG_NET_RANDOM_ETHADDR=y
>> -CONFIG_NETCONSOLE=y
>>  CONFIG_SPL_DM_SEQ_ALIAS=y
>>  CONFIG_SCSI_AHCI=y
>>  CONFIG_SATA_CEVA=y
> 
> Now, an alternate solution here would be to enable these two options
> still and write an ft_board_setup() with:
> ... if ethaddr is in the locally administered pool then
>         fdt_delprop(... "mac-address");
>         fdt_delprop(... "local-mac-address");

Which would also trigger if a user sets a "locally administered"
mac himself. Even if unlikely, I'm opposed to such magic and
unexpected behavior. Sooner or later it will bite you.

> And that should cause the kernel to fall through the cases to find out
> where to get the real MAC from.  I'm not super happy with this at 
> first,
> but I also don't see anything clever in the binding we can do.

If I'll need this one again, then I'll just add the random mac
generation in board_eth_init(), I think.

-michael
Tom Rini Nov. 17, 2021, 6:24 p.m. UTC | #3
On Wed, Nov 17, 2021 at 05:45:58PM +0100, Michael Walle wrote:
> Am 2021-11-16 22:14, schrieb Tom Rini:
> > On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:
> > 
> > > Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
> > > enetaddr to a random value if not set and then pass the randomly
> > > generated MAC address to linux.
> > 
> > First, for clarity I'm not nak'ing this.  I kind of would like to see a
> > slight reword as I think some things aren't 100% correct, even if the
> > "save random MAC to ethaddr environment variable" change goes in.  For
> > example, it's quite long standing that (dev|pdata)->enetaddr populates
> > "mac-address" and "local-mac-address" and it seems in some older cases
> > we only set the "local-mac-address" property.
> 
> fdt_fixup_memory() in common/fdt_support.c does a env_get(mac).

Whoops, yes, I misrecalled this.

> I'm not even sure, if there is a connection between what is fixed up
> in the kernel DT and the corresponding device in u-boot if
> CONFIG_DM_SEQ_ALIAS is not set.

And then yes, the logic here can be further fragile at times with
multiple interfaces.

> > > This is bad for the following reasons:
> > >  (1) it makes it impossible for linux to detect this error
> > >  (2) linux won't trigger any fallback mechanism for the case where
> > >      it didn't find any valid MAC address
> > 
> > This feels in some ways to be a limitation of the binding:
> > https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ethernet-controller.yaml
> 
> Agreed. But it doesn't render my argument invalid ;)

"Bug" or "feature", but yes, OK.

> > And it reads like we really must be populating "mac-address" with that
> > random one and while providing a blank "local-mac-address" would be a
> > way to say we don't know the true device one, it seems that wouldn't be
> > used / noticed?
> 
> I guess it will just use the one populated in mac-address, i.e. the
> random one. Btw, the binding says "last used" what if u-boot never
> actually used that ethernet controller, should it then be empty or
> populated with the random mac address.

My gut feeling here is that we have an example of a binding that has
been formalized around what exists in the wild, and was not strictly
intentional and clear at all times.  What we do today in the case of
ethernet devices we haven't used is populate both, just like the one we
have used, based on the environment.  And popping over to current Linux
kernel git, the handful of boards that hard-code a non-zero mac-address
or local-mac-address in the dts just makes things even less-clear on
what to do.  Which probably leaves us with "populate mac-address with
whatever you can".

> > >  (3) a saveenv will store this randomly generated MAC address in the
> > >      environment
> > > 
> > > Probably, the user will also be unaware that something is wrong. He
> > > will
> > > just get different MAC addresses on each reboot, asking himself why
> > > this
> > > is the case.
> > > 
> > > As this board usually have a serial port, the user can just fix this
> > > by
> > > setting the MAC address manually in the environment. Also disable the
> > > netconsole just in case, because it cannot be guaranteed that it will
> > > work in any case. After all, this was just a convenience option,
> > > because
> > > the bootloader - right now - doesn't have the ability to read the MAC
> > > address, which is stored in the OTP. But it is far more important to
> > > have a clear view of whats wrong with a board and that means we can no
> > > longer use this Kconfig option.
> > > 
> > > Signed-off-by: Michael Walle <michael@walle.cc>
> > > ---
> > >  configs/kontron_sl28_defconfig | 2 --
> > >  1 file changed, 2 deletions(-)
> > > 
> > > diff --git a/configs/kontron_sl28_defconfig
> > > b/configs/kontron_sl28_defconfig
> > > index af907175f1..7fb6bdbe82 100644
> > > --- a/configs/kontron_sl28_defconfig
> > > +++ b/configs/kontron_sl28_defconfig
> > > @@ -59,8 +59,6 @@ CONFIG_OF_LIST=""
> > >  CONFIG_ENV_OVERWRITE=y
> > >  CONFIG_ENV_IS_IN_SPI_FLASH=y
> > >  CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
> > > -CONFIG_NET_RANDOM_ETHADDR=y
> > > -CONFIG_NETCONSOLE=y
> > >  CONFIG_SPL_DM_SEQ_ALIAS=y
> > >  CONFIG_SCSI_AHCI=y
> > >  CONFIG_SATA_CEVA=y
> > 
> > Now, an alternate solution here would be to enable these two options
> > still and write an ft_board_setup() with:
> > ... if ethaddr is in the locally administered pool then
> >         fdt_delprop(... "mac-address");
> >         fdt_delprop(... "local-mac-address");
> 
> Which would also trigger if a user sets a "locally administered"
> mac himself. Even if unlikely, I'm opposed to such magic and
> unexpected behavior. Sooner or later it will bite you.

A fair point, yes.

> > And that should cause the kernel to fall through the cases to find out
> > where to get the real MAC from.  I'm not super happy with this at first,
> > but I also don't see anything clever in the binding we can do.
> 
> If I'll need this one again, then I'll just add the random mac
> generation in board_eth_init(), I think.

OK.
Michael Walle Nov. 18, 2021, 8:29 a.m. UTC | #4
Am 2021-11-17 19:24, schrieb Tom Rini:
> On Wed, Nov 17, 2021 at 05:45:58PM +0100, Michael Walle wrote:
>> Am 2021-11-16 22:14, schrieb Tom Rini:
>> > On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:
>> >
>> > > Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
>> > > enetaddr to a random value if not set and then pass the randomly
>> > > generated MAC address to linux.
>> >
>> > First, for clarity I'm not nak'ing this.  I kind of would like to see a
>> > slight reword as I think some things aren't 100% correct, even if the
>> > "save random MAC to ethaddr environment variable" change goes in.  For
>> > example, it's quite long standing that (dev|pdata)->enetaddr populates
>> > "mac-address" and "local-mac-address" and it seems in some older cases
>> > we only set the "local-mac-address" property.
>> 
>> fdt_fixup_memory() in common/fdt_support.c does a env_get(mac).
> 
> Whoops, yes, I misrecalled this.

That means you are fine with this commit message?

-michael
Tom Rini Nov. 18, 2021, 2:58 p.m. UTC | #5
On Thu, Nov 18, 2021 at 09:29:51AM +0100, Michael Walle wrote:
> Am 2021-11-17 19:24, schrieb Tom Rini:
> > On Wed, Nov 17, 2021 at 05:45:58PM +0100, Michael Walle wrote:
> > > Am 2021-11-16 22:14, schrieb Tom Rini:
> > > > On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:
> > > >
> > > > > Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
> > > > > enetaddr to a random value if not set and then pass the randomly
> > > > > generated MAC address to linux.
> > > >
> > > > First, for clarity I'm not nak'ing this.  I kind of would like to see a
> > > > slight reword as I think some things aren't 100% correct, even if the
> > > > "save random MAC to ethaddr environment variable" change goes in.  For
> > > > example, it's quite long standing that (dev|pdata)->enetaddr populates
> > > > "mac-address" and "local-mac-address" and it seems in some older cases
> > > > we only set the "local-mac-address" property.
> > > 
> > > fdt_fixup_memory() in common/fdt_support.c does a env_get(mac).
> > 
> > Whoops, yes, I misrecalled this.
> 
> That means you are fine with this commit message?

Well, so long as it goes in after the change that makes
NET_RANDOM_ETHADDR update the environment, yes, it's all correct.
diff mbox series

Patch

diff --git a/configs/kontron_sl28_defconfig b/configs/kontron_sl28_defconfig
index af907175f1..7fb6bdbe82 100644
--- a/configs/kontron_sl28_defconfig
+++ b/configs/kontron_sl28_defconfig
@@ -59,8 +59,6 @@  CONFIG_OF_LIST=""
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_NETCONSOLE=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SCSI_AHCI=y
 CONFIG_SATA_CEVA=y