From d7943a49aa9e849441197c5612910dcf301392e4 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Wed, 30 Sep 2020 11:16:47 +0200 Subject: [PATCH 1/2] net/eui48: reorder code Move eui48_set_local() and eui48_clear_group() to the top so we can use it later in the file. --- sys/include/net/eui48.h | 87 ++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/sys/include/net/eui48.h b/sys/include/net/eui48.h index 2a5fadfa9300..5dcbbf29b27a 100644 --- a/sys/include/net/eui48.h +++ b/sys/include/net/eui48.h @@ -36,6 +36,49 @@ typedef struct { uint8_t uint8[6]; /**< split into 6 8-bit words. */ } eui48_t; +/** + * @name EUI-48 bit flags contained in the first octet + * + * @see IEEE 802-2001 section 9.2 + * @{ + */ + +/** + * @brief Locally administered address. + */ +#define EUI48_LOCAL_FLAG 0x02 + +/** + * @brief Group type address. + */ +#define EUI48_GROUP_FLAG 0x01 +/** @} */ + +/** + * @brief Set the locally administrated bit in the EUI-48 address. + * + * @see IEEE 802-2001 section 9.2 + * + * @param addr ethernet address + */ +static inline void eui48_set_local(eui48_t *addr) +{ + addr->uint8[0] |= EUI48_LOCAL_FLAG; +} + +/** + * @brief Clear the group address bit to signal the address as individual + * address + * + * @see IEEE 802-2001 section 9.2 + * + * @param addr ethernet address + */ +static inline void eui48_clear_group(eui48_t *addr) +{ + addr->uint8[0] &= ~EUI48_GROUP_FLAG; +} + /** * @brief Generates an EUI-64 from a 48-bit device address * @@ -56,24 +99,6 @@ static inline void eui48_to_eui64(eui64_t *eui64, const eui48_t *addr) eui64->uint8[7] = addr->uint8[5]; } -/** - * @name EUI-48 bit flags contained in the first octet - * - * @see IEEE 802-2001 section 9.2 - * @{ - */ - -/** - * @brief Locally administered address. - */ -#define EUI48_LOCAL_FLAG 0x02 - -/** - * @brief Group type address. - */ -#define EUI48_GROUP_FLAG 0x01 -/** @} */ - /** * @brief Generates an IPv6 interface identifier from a 48-bit device address * @@ -106,32 +131,6 @@ static inline void eui48_from_ipv6_iid(eui48_t *addr, const eui64_t *iid) addr->uint8[5] = iid->uint8[7]; } -/** - * @brief Set the locally administrated bit in the EUI-48 address. - * - * @see IEEE 802-2001 section 9.2 - * - * @param addr ethernet address - */ -static inline void eui48_set_local(eui48_t *addr) -{ - addr->uint8[0] |= EUI48_LOCAL_FLAG; -} - -/** - * @brief Clear the group address bit to signal the address as individual - * address - * - * @see IEEE 802-2001 section 9.2 - * - * @param addr ethernet address - */ -static inline void eui48_clear_group(eui48_t *addr) -{ - addr->uint8[0] &= ~EUI48_GROUP_FLAG; -} - - #ifdef __cplusplus } #endif From 307ea6224a38fc44bf667b3758ac5bba6dcebb4d Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Wed, 30 Sep 2020 11:17:53 +0200 Subject: [PATCH 2/2] net/eui48: add eui64_to_eui48() Provide helper function to mangle a EUI-64 into an EUI-48. This can be useful to get predictable, locally unique addreses. --- sys/include/net/eui48.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/sys/include/net/eui48.h b/sys/include/net/eui48.h index 5dcbbf29b27a..50dd310afc81 100644 --- a/sys/include/net/eui48.h +++ b/sys/include/net/eui48.h @@ -99,6 +99,31 @@ static inline void eui48_to_eui64(eui64_t *eui64, const eui48_t *addr) eui64->uint8[7] = addr->uint8[5]; } +/** + * @brief Generates an EUI-48 from a 64-bit device address + * + * @warning The resulting EUI-48 is not guaranteed to be unique + * and, hence, marked as only locally unique. + * + * @param[out] eui48 the resulting EUI-48. + * @param[in] addr a 64-bit device address + */ +static inline void eui64_to_eui48(eui48_t *eui48, const eui64_t *addr) +{ + /* Preserve vendor id */ + eui48->uint8[0] = addr->uint8[0]; + eui48->uint8[1] = addr->uint8[1]; + eui48->uint8[2] = addr->uint8[2]; + + /* Use most volatile bits */ + eui48->uint8[3] = addr->uint8[5]; + eui48->uint8[4] = addr->uint8[6]; + eui48->uint8[5] = addr->uint8[7]; + + /* EUI is only locally unique */ + eui48_set_local(eui48); +} + /** * @brief Generates an IPv6 interface identifier from a 48-bit device address *