On Thu, 28 May 2015 15:38:32 +0300 Lennert Buytenhek <buytenh@xxxxxxxxxxxxxx> wrote: > Currently, ieee802154_random_extended_addr() has a 50% chance of > generating a group (multicast) address, while this function is used > for generating station addresses (which can't be group addresses) > for interfaces that don't have a hardware-provided address. > > Also, in case get_random_bytes() generates the EUI-64 address > 00:00:00:00:00:00:00:00 (extremely unlikely), which is an invalid > address, ieee802154_random_extended_addr() reacts by changing it > to 01:00:00:00:00:00:00:00, which is an invalid station address as > well, as it is a group address. > > This patch changes the address generation procedure to grab eight > random bytes, treat that as an EUI-64, and then clear the Group > address bit and set the Locally Administered bit, which is in > line with how eth_random_addr() generates random EUI-48s. Looks good to me. Even if this ends up being uneccessarily strict, we'll always have a huge pool of addresses we may generate. Note: the standard only says that the address shall be a 64 bit universal address (not excluding multicast), but not generating multicast EUIs seems like a good idea anyway. > Signed-off-by: Lennert Buytenhek <buytenh@xxxxxxxxxxxxxx> > --- > include/linux/ieee802154.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/include/linux/ieee802154.h b/include/linux/ieee802154.h > index 8872ca1..552210d 100644 > --- a/include/linux/ieee802154.h > +++ b/include/linux/ieee802154.h > @@ -244,9 +244,9 @@ static inline void > ieee802154_random_extended_addr(__le64 *addr) { > get_random_bytes(addr, IEEE802154_EXTENDED_ADDR_LEN); > > - /* toggle some bit if we hit an invalid extended addr */ > - if (!ieee802154_is_valid_extended_addr(*addr)) > - ((u8 *)addr)[IEEE802154_EXTENDED_ADDR_LEN - 1] ^= > 0x01; > + /* clear the group bit, and set the locally administered bit > */ > + ((u8 *)addr)[IEEE802154_EXTENDED_ADDR_LEN - 1] &= ~0x01; > + ((u8 *)addr)[IEEE802154_EXTENDED_ADDR_LEN - 1] |= 0x02; > } > > #endif /* LINUX_IEEE802154_H */ -- To unsubscribe from this list: send the line "unsubscribe linux-wpan" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html