From a0f5db952e36299be874173024395cc18d32731f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 12 Nov 2019 12:50:19 +0200 Subject: [PATCH] sys: byteorder: Add 48 bit variants This adds sys_*_*48 functions that operation on a 48 bits values. Signed-off-by: Luiz Augusto von Dentz --- include/sys/byteorder.h | 106 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/include/sys/byteorder.h b/include/sys/byteorder.h index b4ec2719b13..9ab353700bc 100644 --- a/include/sys/byteorder.h +++ b/include/sys/byteorder.h @@ -25,6 +25,12 @@ (((x) >> 8) & 0xff00) | \ (((x) & 0xff00) << 8) | \ (((x) & 0xff) << 24))) +#define __bswap_48(x) ((u64_t) ((((x) >> 40) & 0xff) | \ + (((x) >> 24) & 0xff00) | \ + (((x) >> 8) & 0xff0000) | \ + (((x) & 0xff0000) << 8) | \ + (((x) & 0xff00) << 24) | \ + (((x) & 0xff) << 40))) #define __bswap_64(x) ((u64_t) ((((x) >> 56) & 0xff) | \ (((x) >> 40) & 0xff00) | \ (((x) >> 24) & 0xff0000) | \ @@ -82,6 +88,22 @@ * @return 32-bit integer in little-endian format. */ +/** @def sys_le48_to_cpu + * @brief Convert 48-bit integer from little-endian to host endianness. + * + * @param val 48-bit integer in little-endian format. + * + * @return 48-bit integer in host endianness. + */ + +/** @def sys_cpu_to_le48 + * @brief Convert 48-bit integer from host endianness to little-endian. + * + * @param val 48-bit integer in host endianness. + * + * @return 48-bit integer in little-endian format. + */ + /** @def sys_be16_to_cpu * @brief Convert 16-bit integer from big-endian to host endianness. * @@ -130,6 +152,22 @@ * @return 32-bit integer in big-endian format. */ +/** @def sys_be48_to_cpu + * @brief Convert 48-bit integer from big-endian to host endianness. + * + * @param val 48-bit integer in big-endian format. + * + * @return 48-bit integer in host endianness. + */ + +/** @def sys_cpu_to_be48 + * @brief Convert 48-bit integer from host endianness to big-endian. + * + * @param val 48-bit integer in host endianness. + * + * @return 48-bit integer in big-endian format. + */ + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define sys_le16_to_cpu(val) (val) #define sys_cpu_to_le16(val) (val) @@ -137,6 +175,8 @@ #define sys_cpu_to_le24(val) (val) #define sys_le32_to_cpu(val) (val) #define sys_cpu_to_le32(val) (val) +#define sys_le48_to_cpu(val) (val) +#define sys_cpu_to_le48(val) (val) #define sys_le64_to_cpu(val) (val) #define sys_cpu_to_le64(val) (val) #define sys_be16_to_cpu(val) __bswap_16(val) @@ -145,6 +185,8 @@ #define sys_cpu_to_be24(val) __bswap_24(val) #define sys_be32_to_cpu(val) __bswap_32(val) #define sys_cpu_to_be32(val) __bswap_32(val) +#define sys_be48_to_cpu(val) __bswap_48(val) +#define sys_cpu_to_be48(val) __bswap_48(val) #define sys_be64_to_cpu(val) __bswap_64(val) #define sys_cpu_to_be64(val) __bswap_64(val) #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ @@ -154,6 +196,8 @@ #define sys_cpu_to_le24(val) __bswap_24(val) #define sys_le32_to_cpu(val) __bswap_32(val) #define sys_cpu_to_le32(val) __bswap_32(val) +#define sys_le48_to_cpu(val) __bswap_48(val) +#define sys_cpu_to_le48(val) __bswap_48(val) #define sys_le64_to_cpu(val) __bswap_64(val) #define sys_cpu_to_le64(val) __bswap_64(val) #define sys_be16_to_cpu(val) (val) @@ -162,6 +206,8 @@ #define sys_cpu_to_be24(val) (val) #define sys_be32_to_cpu(val) (val) #define sys_cpu_to_be32(val) (val) +#define sys_be48_to_cpu(val) (val) +#define sys_cpu_to_be48(val) (val) #define sys_be64_to_cpu(val) (val) #define sys_cpu_to_be64(val) (val) #else @@ -213,6 +259,21 @@ static inline void sys_put_be32(u32_t val, u8_t dst[4]) sys_put_be16(val, &dst[2]); } +/** + * @brief Put a 48-bit integer as big-endian to arbitrary location. + * + * Put a 48-bit integer, originally in host endianness, to a + * potentially unaligned memory location in big-endian format. + * + * @param val 48-bit integer in host endianness. + * @param dst Destination memory address to store the result. + */ +static inline void sys_put_be48(u64_t val, u8_t dst[6]) +{ + sys_put_be16(val >> 32, dst); + sys_put_be32(val, &dst[2]); +} + /** * @brief Put a 64-bit integer as big-endian to arbitrary location. * @@ -273,6 +334,21 @@ static inline void sys_put_le32(u32_t val, u8_t dst[4]) sys_put_le16(val >> 16, &dst[2]); } +/** + * @brief Put a 48-bit integer as little-endian to arbitrary location. + * + * Put a 48-bit integer, originally in host endianness, to a + * potentially unaligned memory location in little-endian format. + * + * @param val 48-bit integer in host endianness. + * @param dst Destination memory address to store the result. + */ +static inline void sys_put_le48(u64_t val, u8_t dst[6]) +{ + sys_put_le32(val, dst); + sys_put_le16(val >> 32, &dst[4]); +} + /** * @brief Put a 64-bit integer as little-endian to arbitrary location. * @@ -333,6 +409,21 @@ static inline u32_t sys_get_be32(const u8_t src[4]) return ((u32_t)sys_get_be16(&src[0]) << 16) | sys_get_be16(&src[2]); } +/** + * @brief Get a 48-bit integer stored in big-endian format. + * + * Get a 48-bit integer, stored in big-endian format in a potentially + * unaligned memory location, and convert it to the host endianness. + * + * @param src Location of the big-endian 48-bit integer to get. + * + * @return 48-bit integer in host endianness. + */ +static inline u64_t sys_get_be48(const u8_t src[6]) +{ + return ((u64_t)sys_get_be32(&src[0]) << 32) | sys_get_be16(&src[4]); +} + /** * @brief Get a 64-bit integer stored in big-endian format. * @@ -393,6 +484,21 @@ static inline u32_t sys_get_le32(const u8_t src[4]) return ((u32_t)sys_get_le16(&src[2]) << 16) | sys_get_le16(&src[0]); } +/** + * @brief Get a 48-bit integer stored in little-endian format. + * + * Get a 48-bit integer, stored in little-endian format in a potentially + * unaligned memory location, and convert it to the host endianness. + * + * @param src Location of the little-endian 48-bit integer to get. + * + * @return 48-bit integer in host endianness. + */ +static inline u64_t sys_get_le48(const u8_t src[6]) +{ + return ((u64_t)sys_get_le32(&src[2]) << 32) | sys_get_le16(&src[0]); +} + /** * @brief Get a 64-bit integer stored in little-endian format. *