[U-Boot] [PATCH v3 02/21] net: Move MAC-seeded rand out of bootp.c

Joe Hershberger joe.hershberger at gmail.com
Wed May 30 00:40:18 CEST 2012


Hi Michael,

On Tue, May 29, 2012 at 5:06 PM, Michael Walle <michael at walle.cc> wrote:
>
> Hi Joe,
>
> Am Dienstag 29 Mai 2012, 23:08:23 schrieb Joe Hershberger:
>> Hi Michael,
>>
>> On Tue, May 29, 2012 at 1:23 PM, Michael Walle <michael at walle.cc> wrote:
>> > Hi Joe,
>> >
>> > Am Dienstag 29 Mai 2012, 20:08:26 schrieb Joe Hershberger:
>> >> If you can verify that the functionality of the
>> >> CONFIG_BOOTP_RANDOM_DELAY and CONFIG_CMD_LINK_LOCAL are uneffected,
>> >> then I'm OK with it.
>> >>
>> >> One thing to note is that the link-local implementation needs to use a
>> >> MAC seeded random number.  That means we can't have other things
>> >> coming in and seeding it with a time.  It is nice that it is separate
>> >> for that reason.  Can you solve that and integrate it with your PRNG?
>> >
>> > I'm in a hurry, short answer for now:
>> > I thought of sth like this:
>> >
>> > static inline void srand_mac(void)
>> > {
>> >        unsigned char enetaddr[6];
>> >        unsigned int seed;
>> >
>> >        /* get our mac */
>> >        eth_getenv_enetaddr("ethaddr", enetaddr);
>> >
>> >        seed = enetaddr[5];
>> >        seed |= enetaddr[4] << 8;
>> >        seed |= enetaddr[3] << 16;
>> >        seed |= enetaddr[2] << 24;
>> >
>> >        srand(seed);
>> > }
>>
>> I'm not sure why you are only seeding with the last 4 bytes of the
>> MAC.  The original algorithm used all 6 (in its way).
> yeah i'll fix that.
>
>
>> You also haven't addressed the issue of isolating the link-local
>> algorithm from other non-MAC-seeded random numbers.
> Ah now i get it. But which other code may run and seed the NG with the timer
> only, while we are in the link local netloop? Shouldn't it be safe to first
> call srand(mac+timer) and then rand() multiple times? No other code can be run
> unless NetLoop(LINKLOCAL) returns, right?

It needs to run multiple times, yes.  But it will also process any
packets that are received when executing any other net command later.
The state machine will keep running.  There can obviously be other
commands that run in between.

Perhaps we can separate the state for the PRNG between the 2 cases but
share the code.

>> The most naive way around it
>> would be to rename the rand() in net to rand_mac() or something like
>> that and not attempt to combine them.
> i think we should focus on combining not reinventing the wheel multiple times.

Agreed, but we have to solve the problem above.

Thanks,
-Joe


More information about the U-Boot mailing list