Hello Hans, On Wed, 27 Jul 2016 18:10:34 +0200 Hans de Goede <hdego...@redhat.com> wrote:
> It seems that bytes 13-14 of the SID / bytes 1-2 from word 3 of the SID > are always 0 on H3 making it a poor candidate to use as source for the > serialnr / mac-address, switch to word1 which seems to be more random. > > Cc: Chen-Yu Tsai <w...@csie.org> > Cc: Corentin LABBE <clabbe.montj...@gmail.com> > Cc: Amit Singh Tomar <amittome...@gmail.com> > Signed-off-by: Hans de Goede <hdego...@redhat.com> > --- > board/sunxi/board.c | 23 ++++++++++++++--------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/board/sunxi/board.c b/board/sunxi/board.c > index ef3fe26..bbe5340 100644 > --- a/board/sunxi/board.c > +++ b/board/sunxi/board.c > @@ -620,12 +620,17 @@ static void setup_environment(const void *fdt) > uint8_t mac_addr[6]; > char ethaddr[16]; > int i, ret; > +#ifdef CONFIG_MACH_SUN8I_H3 > + const int idx0 = 0, idx1 = 1; > +#else > + const int idx0 = 0, idx1 = 3; > +#endif > > ret = sunxi_get_sid(sid); > - if (ret == 0 && sid[0] != 0 && sid[3] != 0) { > + if (ret == 0 && sid[idx0] != 0 && sid[idx1] != 0) { > /* Ensure the NIC specific bytes of the mac are not all 0 */ > - if ((sid[3] & 0xffffff) == 0) > - sid[3] |= 0x800000; > + if ((sid[idx1] & 0xffffff) == 0) > + sid[idx1] |= 0x800000; > > for (i = 0; i < 4; i++) { > sprintf(ethaddr, "ethernet%d", i); > @@ -642,18 +647,18 @@ static void setup_environment(const void *fdt) > > /* Non OUI / registered MAC address */ > mac_addr[0] = (i << 4) | 0x02; > - mac_addr[1] = (sid[0] >> 0) & 0xff; > - mac_addr[2] = (sid[3] >> 24) & 0xff; > - mac_addr[3] = (sid[3] >> 16) & 0xff; > - mac_addr[4] = (sid[3] >> 8) & 0xff; > - mac_addr[5] = (sid[3] >> 0) & 0xff; > + mac_addr[1] = (sid[idx0] >> 0) & 0xff; > + mac_addr[2] = (sid[idx1] >> 24) & 0xff; > + mac_addr[3] = (sid[idx1] >> 16) & 0xff; > + mac_addr[4] = (sid[idx1] >> 8) & 0xff; > + mac_addr[5] = (sid[idx1] >> 0) & 0xff; > > eth_setenv_enetaddr(ethaddr, mac_addr); > } > > if (!getenv("serial#")) { > snprintf(serial_string, sizeof(serial_string), > - "%08x%08x", sid[0], sid[3]); > + "%08x%08x", sid[idx0], sid[idx1]); > > setenv("serial#", serial_string); > } Is it really a good idea trying to guess which parts of the SID are sufficiently unique, depending on the SoC generation? We can calculate some kind of hash (CRC32? SHA256?) over the whole SID. This will ensure that all the SID bits are accounted for. Also changing the MAC address generation algorithm is an invasive change, which is affecting the end users. So IMHO it's best to have it implemented properly right from the start, rather than evolving via a trial and error method. What if it turns out that word1 from the SID is actually not sufficiently random on H3? How large was your sample set? -- Best regards, Siarhei Siamashka _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot